@bitgo/abstract-utxo 10.17.0 → 10.18.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/cjs/src/abstractUtxoCoin.d.ts +5 -6
- package/dist/cjs/src/abstractUtxoCoin.d.ts.map +1 -1
- package/dist/cjs/src/abstractUtxoCoin.js +24 -5
- package/dist/cjs/src/address/fixedScript.d.ts +1 -5
- package/dist/cjs/src/address/fixedScript.d.ts.map +1 -1
- package/dist/cjs/src/address/fixedScript.js +3 -5
- package/dist/cjs/src/descriptor/NamedDescriptor.d.ts +4 -5
- package/dist/cjs/src/descriptor/NamedDescriptor.d.ts.map +1 -1
- package/dist/cjs/src/descriptor/NamedDescriptor.js +4 -6
- package/dist/cjs/src/descriptor/assertDescriptorWalletAddress.d.ts +2 -2
- package/dist/cjs/src/descriptor/assertDescriptorWalletAddress.d.ts.map +1 -1
- package/dist/cjs/src/descriptor/assertDescriptorWalletAddress.js +3 -38
- package/dist/cjs/src/descriptor/builder/builder.d.ts +2 -3
- package/dist/cjs/src/descriptor/builder/builder.d.ts.map +1 -1
- package/dist/cjs/src/descriptor/builder/builder.js +1 -1
- package/dist/cjs/src/descriptor/builder/parse.d.ts.map +1 -1
- package/dist/cjs/src/descriptor/builder/parse.js +3 -3
- package/dist/cjs/src/descriptor/createWallet/createDescriptors.d.ts +2 -2
- package/dist/cjs/src/descriptor/createWallet/createDescriptors.d.ts.map +1 -1
- package/dist/cjs/src/descriptor/createWallet/createDescriptors.js +1 -1
- package/dist/cjs/src/descriptor/descriptorWallet.d.ts +1 -1
- package/dist/cjs/src/descriptor/descriptorWallet.d.ts.map +1 -1
- package/dist/cjs/src/descriptor/descriptorWallet.js +1 -1
- package/dist/cjs/src/descriptor/index.d.ts +1 -1
- package/dist/cjs/src/descriptor/index.d.ts.map +1 -1
- package/dist/cjs/src/descriptor/index.js +1 -1
- package/dist/cjs/src/descriptor/validatePolicy.d.ts +3 -3
- package/dist/cjs/src/descriptor/validatePolicy.d.ts.map +1 -1
- package/dist/cjs/src/descriptor/validatePolicy.js +3 -3
- package/dist/cjs/src/impl/bch/bch.d.ts.map +1 -1
- package/dist/cjs/src/impl/bch/bch.js +6 -38
- package/dist/cjs/src/impl/doge/doge.d.ts +2 -1
- package/dist/cjs/src/impl/doge/doge.d.ts.map +1 -1
- package/dist/cjs/src/impl/doge/doge.js +1 -1
- package/dist/cjs/src/impl/ltc/ltc.d.ts +0 -1
- package/dist/cjs/src/impl/ltc/ltc.d.ts.map +1 -1
- package/dist/cjs/src/impl/ltc/ltc.js +3 -41
- package/dist/cjs/src/impl/ltc/tltc.d.ts +0 -1
- package/dist/cjs/src/impl/ltc/tltc.d.ts.map +1 -1
- package/dist/cjs/src/impl/ltc/tltc.js +3 -40
- package/dist/cjs/src/index.d.ts +2 -0
- package/dist/cjs/src/index.d.ts.map +1 -1
- package/dist/cjs/src/index.js +3 -1
- package/dist/cjs/src/offlineVault/OfflineVaultHalfSigned.js +2 -2
- package/dist/cjs/src/offlineVault/descriptor/transaction.d.ts +3 -2
- package/dist/cjs/src/offlineVault/descriptor/transaction.d.ts.map +1 -1
- package/dist/cjs/src/offlineVault/descriptor/transaction.js +5 -8
- package/dist/cjs/src/recovery/RecoveryProvider.d.ts +1 -3
- package/dist/cjs/src/recovery/RecoveryProvider.d.ts.map +1 -1
- package/dist/cjs/src/recovery/RecoveryProvider.js +1 -1
- package/dist/cjs/src/recovery/backupKeyRecovery.d.ts +73 -4
- package/dist/cjs/src/recovery/backupKeyRecovery.d.ts.map +1 -1
- package/dist/cjs/src/recovery/backupKeyRecovery.js +163 -129
- package/dist/cjs/src/recovery/crossChainRecovery.d.ts +5 -5
- package/dist/cjs/src/recovery/crossChainRecovery.d.ts.map +1 -1
- package/dist/cjs/src/recovery/crossChainRecovery.js +22 -121
- package/dist/cjs/src/recovery/psbt.d.ts +8 -31
- package/dist/cjs/src/recovery/psbt.d.ts.map +1 -1
- package/dist/cjs/src/recovery/psbt.js +14 -126
- package/dist/cjs/src/transaction/descriptor/explainPsbt.d.ts +3 -3
- package/dist/cjs/src/transaction/descriptor/explainPsbt.d.ts.map +1 -1
- package/dist/cjs/src/transaction/descriptor/explainPsbt.js +17 -54
- package/dist/cjs/src/transaction/descriptor/index.d.ts +1 -1
- package/dist/cjs/src/transaction/descriptor/index.d.ts.map +1 -1
- package/dist/cjs/src/transaction/descriptor/index.js +1 -1
- package/dist/cjs/src/transaction/descriptor/parse.d.ts +6 -4
- package/dist/cjs/src/transaction/descriptor/parse.d.ts.map +1 -1
- package/dist/cjs/src/transaction/descriptor/parse.js +24 -50
- package/dist/cjs/src/transaction/descriptor/signPsbt.d.ts +6 -7
- package/dist/cjs/src/transaction/descriptor/signPsbt.d.ts.map +1 -1
- package/dist/cjs/src/transaction/descriptor/signPsbt.js +19 -18
- package/dist/cjs/src/transaction/descriptor/verifyTransaction.d.ts +4 -4
- package/dist/cjs/src/transaction/descriptor/verifyTransaction.d.ts.map +1 -1
- package/dist/cjs/src/transaction/descriptor/verifyTransaction.js +10 -38
- package/dist/cjs/src/transaction/explainTransaction.d.ts +2 -1
- package/dist/cjs/src/transaction/explainTransaction.d.ts.map +1 -1
- package/dist/cjs/src/transaction/explainTransaction.js +3 -2
- package/dist/cjs/src/transaction/fixedScript/SigningError.d.ts +1 -3
- package/dist/cjs/src/transaction/fixedScript/SigningError.d.ts.map +1 -1
- package/dist/cjs/src/transaction/fixedScript/SigningError.js +1 -1
- package/dist/cjs/src/transaction/fixedScript/explainTransaction.d.ts +2 -1
- package/dist/cjs/src/transaction/fixedScript/explainTransaction.d.ts.map +1 -1
- package/dist/cjs/src/transaction/fixedScript/explainTransaction.js +1 -8
- package/dist/cjs/src/transaction/fixedScript/parseOutput.d.ts.map +1 -1
- package/dist/cjs/src/transaction/fixedScript/parseOutput.js +6 -11
- package/dist/cjs/src/transaction/fixedScript/signLegacyTransaction.d.ts +2 -2
- package/dist/cjs/src/transaction/fixedScript/signLegacyTransaction.d.ts.map +1 -1
- package/dist/cjs/src/transaction/fixedScript/signLegacyTransaction.js +4 -2
- package/dist/cjs/src/transaction/fixedScript/signPsbtUtxolib.d.ts +1 -1
- package/dist/cjs/src/transaction/fixedScript/signPsbtUtxolib.d.ts.map +1 -1
- package/dist/cjs/src/transaction/fixedScript/signPsbtUtxolib.js +1 -1
- package/dist/cjs/src/transaction/fixedScript/signPsbtWasm.d.ts +2 -2
- package/dist/cjs/src/transaction/fixedScript/signPsbtWasm.d.ts.map +1 -1
- package/dist/cjs/src/transaction/fixedScript/signPsbtWasm.js +4 -8
- package/dist/cjs/src/transaction/fixedScript/signTransaction.d.ts +6 -5
- package/dist/cjs/src/transaction/fixedScript/signTransaction.d.ts.map +1 -1
- package/dist/cjs/src/transaction/fixedScript/signTransaction.js +42 -7
- package/dist/cjs/src/transaction/signTransaction.d.ts.map +1 -1
- package/dist/cjs/src/transaction/signTransaction.js +10 -10
- package/dist/cjs/src/unspent.d.ts +55 -0
- package/dist/cjs/src/unspent.d.ts.map +1 -0
- package/dist/cjs/src/unspent.js +12 -0
- package/dist/cjs/src/wasmUtil.d.ts +29 -0
- package/dist/cjs/src/wasmUtil.d.ts.map +1 -0
- package/dist/cjs/src/wasmUtil.js +87 -0
- package/dist/cjs/test/unit/address.d.ts +1 -1
- package/dist/cjs/test/unit/address.d.ts.map +1 -1
- package/dist/cjs/test/unit/address.js +107 -137
- package/dist/cjs/test/unit/bip322.js +50 -1
- package/dist/cjs/test/unit/customSigner.js +5 -4
- package/dist/cjs/test/unit/descriptor/NamedDescriptor.js +37 -4
- package/dist/cjs/test/unit/descriptor/builder.js +10 -4
- package/dist/cjs/test/unit/descriptor/createWallet/createDescriptors.js +37 -4
- package/dist/cjs/test/unit/descriptor/descriptorWallet.js +40 -6
- package/dist/cjs/test/unit/descriptorAddress.d.ts.map +1 -1
- package/dist/cjs/test/unit/descriptorAddress.js +3 -3
- package/dist/cjs/test/unit/explainTransaction.js +26 -3
- package/dist/cjs/test/unit/keychains.js +40 -1
- package/dist/cjs/test/unit/postProcessPrebuild.d.ts +2 -0
- package/dist/cjs/test/unit/postProcessPrebuild.d.ts.map +1 -0
- package/dist/cjs/test/unit/postProcessPrebuild.js +62 -0
- package/dist/cjs/test/unit/prebuildAndSign.d.ts +0 -4
- package/dist/cjs/test/unit/prebuildAndSign.d.ts.map +1 -1
- package/dist/cjs/test/unit/prebuildAndSign.js +12 -32
- package/dist/cjs/test/unit/recovery/backupKeyRecovery.js +82 -259
- package/dist/cjs/test/unit/recovery/backupKeyRecoveryUnspentGathering.d.ts +2 -0
- package/dist/cjs/test/unit/recovery/backupKeyRecoveryUnspentGathering.d.ts.map +1 -0
- package/dist/cjs/test/unit/recovery/backupKeyRecoveryUnspentGathering.js +144 -0
- package/dist/cjs/test/unit/recovery/crossChainRecovery.js +38 -35
- package/dist/cjs/test/unit/recovery/formatBackupKeyRecoveryResult.d.ts +2 -0
- package/dist/cjs/test/unit/recovery/formatBackupKeyRecoveryResult.d.ts.map +1 -0
- package/dist/cjs/test/unit/recovery/formatBackupKeyRecoveryResult.js +186 -0
- package/dist/cjs/test/unit/recovery/mock.d.ts +15 -8
- package/dist/cjs/test/unit/recovery/mock.d.ts.map +1 -1
- package/dist/cjs/test/unit/recovery/mock.js +49 -77
- package/dist/cjs/test/unit/signTransaction.d.ts +2 -0
- package/dist/cjs/test/unit/signTransaction.d.ts.map +1 -0
- package/dist/cjs/test/unit/signTransaction.js +244 -0
- package/dist/cjs/test/unit/testSpoofTransaction.d.ts +2 -0
- package/dist/cjs/test/unit/testSpoofTransaction.d.ts.map +1 -0
- package/dist/cjs/test/unit/testSpoofTransaction.js +114 -0
- package/dist/cjs/test/unit/transaction/descriptor/explainPsbt.js +46 -12
- package/dist/cjs/test/unit/transaction/descriptor/fixtures.utils.d.ts.map +1 -1
- package/dist/cjs/test/unit/transaction/descriptor/fixtures.utils.js +38 -4
- package/dist/cjs/test/unit/transaction/descriptor/parse.js +22 -19
- package/dist/cjs/test/unit/transaction/descriptor/sign.js +60 -16
- package/dist/cjs/test/unit/transaction/descriptor/validatePolicy.js +43 -10
- package/dist/cjs/test/unit/transaction.js +6 -225
- package/dist/cjs/test/unit/util/address.d.ts +13 -0
- package/dist/cjs/test/unit/util/address.d.ts.map +1 -0
- package/dist/cjs/test/unit/util/address.js +15 -0
- package/dist/cjs/test/unit/util/index.d.ts +3 -0
- package/dist/cjs/test/unit/util/index.d.ts.map +1 -1
- package/dist/cjs/test/unit/util/index.js +4 -1
- package/dist/cjs/test/unit/util/keychains.d.ts +29 -0
- package/dist/cjs/test/unit/util/keychains.d.ts.map +1 -1
- package/dist/cjs/test/unit/util/keychains.js +51 -1
- package/dist/cjs/test/unit/util/nockBitGo.d.ts +8 -1
- package/dist/cjs/test/unit/util/nockBitGo.d.ts.map +1 -1
- package/dist/cjs/test/unit/util/nockBitGo.js +17 -1
- package/dist/cjs/test/unit/util/psbt.d.ts +19 -0
- package/dist/cjs/test/unit/util/psbt.d.ts.map +1 -0
- package/dist/cjs/test/unit/util/psbt.js +21 -0
- package/dist/cjs/test/unit/util/transaction.d.ts +8 -4
- package/dist/cjs/test/unit/util/transaction.d.ts.map +1 -1
- package/dist/cjs/test/unit/util/transaction.js +19 -1
- package/dist/cjs/test/unit/util/unspents.d.ts +66 -8
- package/dist/cjs/test/unit/util/unspents.d.ts.map +1 -1
- package/dist/cjs/test/unit/util/unspents.js +130 -15
- package/dist/cjs/test/unit/util/utxoCoins.d.ts +13 -0
- package/dist/cjs/test/unit/util/utxoCoins.d.ts.map +1 -1
- package/dist/cjs/test/unit/util/utxoCoins.js +33 -2
- package/dist/cjs/test/unit/wallet.js +4 -4
- package/dist/cjs/tsconfig.tsbuildinfo +1 -1
- package/dist/esm/abstractUtxoCoin.d.ts +5 -6
- package/dist/esm/abstractUtxoCoin.d.ts.map +1 -1
- package/dist/esm/abstractUtxoCoin.js +26 -7
- package/dist/esm/address/fixedScript.d.ts +1 -5
- package/dist/esm/address/fixedScript.d.ts.map +1 -1
- package/dist/esm/address/fixedScript.js +3 -5
- package/dist/esm/descriptor/NamedDescriptor.d.ts +4 -5
- package/dist/esm/descriptor/NamedDescriptor.d.ts.map +1 -1
- package/dist/esm/descriptor/NamedDescriptor.js +5 -7
- package/dist/esm/descriptor/assertDescriptorWalletAddress.d.ts +2 -2
- package/dist/esm/descriptor/assertDescriptorWalletAddress.d.ts.map +1 -1
- package/dist/esm/descriptor/assertDescriptorWalletAddress.js +3 -5
- package/dist/esm/descriptor/builder/builder.d.ts +2 -3
- package/dist/esm/descriptor/builder/builder.d.ts.map +1 -1
- package/dist/esm/descriptor/builder/builder.js +1 -1
- package/dist/esm/descriptor/builder/parse.d.ts.map +1 -1
- package/dist/esm/descriptor/builder/parse.js +3 -3
- package/dist/esm/descriptor/createWallet/createDescriptors.d.ts +2 -2
- package/dist/esm/descriptor/createWallet/createDescriptors.d.ts.map +1 -1
- package/dist/esm/descriptor/createWallet/createDescriptors.js +1 -1
- package/dist/esm/descriptor/descriptorWallet.d.ts +1 -1
- package/dist/esm/descriptor/descriptorWallet.d.ts.map +1 -1
- package/dist/esm/descriptor/descriptorWallet.js +1 -1
- package/dist/esm/descriptor/index.d.ts +1 -1
- package/dist/esm/descriptor/index.d.ts.map +1 -1
- package/dist/esm/descriptor/index.js +1 -1
- package/dist/esm/descriptor/validatePolicy.d.ts +3 -3
- package/dist/esm/descriptor/validatePolicy.d.ts.map +1 -1
- package/dist/esm/descriptor/validatePolicy.js +3 -3
- package/dist/esm/impl/bch/bch.d.ts.map +1 -1
- package/dist/esm/impl/bch/bch.js +6 -5
- package/dist/esm/impl/doge/doge.d.ts +2 -1
- package/dist/esm/impl/doge/doge.d.ts.map +1 -1
- package/dist/esm/impl/doge/doge.js +1 -1
- package/dist/esm/impl/ltc/ltc.d.ts +0 -1
- package/dist/esm/impl/ltc/ltc.d.ts.map +1 -1
- package/dist/esm/impl/ltc/ltc.js +3 -8
- package/dist/esm/impl/ltc/tltc.d.ts +0 -1
- package/dist/esm/impl/ltc/tltc.d.ts.map +1 -1
- package/dist/esm/impl/ltc/tltc.js +3 -7
- package/dist/esm/index.d.ts +2 -0
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +3 -1
- package/dist/esm/offlineVault/OfflineVaultHalfSigned.js +2 -2
- package/dist/esm/offlineVault/descriptor/transaction.d.ts +3 -2
- package/dist/esm/offlineVault/descriptor/transaction.d.ts.map +1 -1
- package/dist/esm/offlineVault/descriptor/transaction.js +5 -8
- package/dist/esm/recovery/RecoveryProvider.d.ts +1 -3
- package/dist/esm/recovery/RecoveryProvider.d.ts.map +1 -1
- package/dist/esm/recovery/RecoveryProvider.js +1 -1
- package/dist/esm/recovery/backupKeyRecovery.d.ts +73 -4
- package/dist/esm/recovery/backupKeyRecovery.d.ts.map +1 -1
- package/dist/esm/recovery/backupKeyRecovery.js +165 -100
- package/dist/esm/recovery/crossChainRecovery.d.ts +5 -5
- package/dist/esm/recovery/crossChainRecovery.d.ts.map +1 -1
- package/dist/esm/recovery/crossChainRecovery.js +24 -90
- package/dist/esm/recovery/psbt.d.ts +8 -31
- package/dist/esm/recovery/psbt.d.ts.map +1 -1
- package/dist/esm/recovery/psbt.js +14 -91
- package/dist/esm/transaction/descriptor/explainPsbt.d.ts +3 -3
- package/dist/esm/transaction/descriptor/explainPsbt.d.ts.map +1 -1
- package/dist/esm/transaction/descriptor/explainPsbt.js +14 -18
- package/dist/esm/transaction/descriptor/index.d.ts +1 -1
- package/dist/esm/transaction/descriptor/index.d.ts.map +1 -1
- package/dist/esm/transaction/descriptor/index.js +1 -1
- package/dist/esm/transaction/descriptor/parse.d.ts +6 -4
- package/dist/esm/transaction/descriptor/parse.d.ts.map +1 -1
- package/dist/esm/transaction/descriptor/parse.js +22 -15
- package/dist/esm/transaction/descriptor/signPsbt.d.ts +6 -7
- package/dist/esm/transaction/descriptor/signPsbt.d.ts.map +1 -1
- package/dist/esm/transaction/descriptor/signPsbt.js +19 -18
- package/dist/esm/transaction/descriptor/verifyTransaction.d.ts +4 -4
- package/dist/esm/transaction/descriptor/verifyTransaction.d.ts.map +1 -1
- package/dist/esm/transaction/descriptor/verifyTransaction.js +10 -5
- package/dist/esm/transaction/explainTransaction.d.ts +2 -1
- package/dist/esm/transaction/explainTransaction.d.ts.map +1 -1
- package/dist/esm/transaction/explainTransaction.js +3 -2
- package/dist/esm/transaction/fixedScript/SigningError.d.ts +1 -3
- package/dist/esm/transaction/fixedScript/SigningError.d.ts.map +1 -1
- package/dist/esm/transaction/fixedScript/SigningError.js +1 -1
- package/dist/esm/transaction/fixedScript/explainTransaction.d.ts +2 -1
- package/dist/esm/transaction/fixedScript/explainTransaction.d.ts.map +1 -1
- package/dist/esm/transaction/fixedScript/explainTransaction.js +1 -8
- package/dist/esm/transaction/fixedScript/parseOutput.d.ts.map +1 -1
- package/dist/esm/transaction/fixedScript/parseOutput.js +6 -11
- package/dist/esm/transaction/fixedScript/signLegacyTransaction.d.ts +2 -2
- package/dist/esm/transaction/fixedScript/signLegacyTransaction.d.ts.map +1 -1
- package/dist/esm/transaction/fixedScript/signLegacyTransaction.js +4 -2
- package/dist/esm/transaction/fixedScript/signPsbtUtxolib.d.ts +1 -1
- package/dist/esm/transaction/fixedScript/signPsbtUtxolib.d.ts.map +1 -1
- package/dist/esm/transaction/fixedScript/signPsbtUtxolib.js +1 -1
- package/dist/esm/transaction/fixedScript/signPsbtWasm.d.ts +2 -2
- package/dist/esm/transaction/fixedScript/signPsbtWasm.d.ts.map +1 -1
- package/dist/esm/transaction/fixedScript/signPsbtWasm.js +2 -6
- package/dist/esm/transaction/fixedScript/signTransaction.d.ts +6 -5
- package/dist/esm/transaction/fixedScript/signTransaction.d.ts.map +1 -1
- package/dist/esm/transaction/fixedScript/signTransaction.js +10 -8
- package/dist/esm/transaction/signTransaction.d.ts.map +1 -1
- package/dist/esm/transaction/signTransaction.js +10 -10
- package/dist/esm/unspent.d.ts +55 -0
- package/dist/esm/unspent.d.ts.map +1 -0
- package/dist/esm/unspent.js +8 -0
- package/dist/esm/wasmUtil.d.ts +29 -0
- package/dist/esm/wasmUtil.d.ts.map +1 -0
- package/dist/esm/wasmUtil.js +47 -0
- package/package.json +11 -12
- package/dist/cjs/test/unit/impl/btc/unit/btc.d.ts +0 -2
- package/dist/cjs/test/unit/impl/btc/unit/btc.d.ts.map +0 -1
- package/dist/cjs/test/unit/impl/btc/unit/btc.js +0 -220
- package/dist/cjs/test/unit/impl/btc/unit/fixtures/btcBackupKey.d.ts +0 -4
- package/dist/cjs/test/unit/impl/btc/unit/fixtures/btcBackupKey.d.ts.map +0 -1
- package/dist/cjs/test/unit/impl/btc/unit/fixtures/btcBackupKey.js +0 -10
- package/dist/cjs/test/unit/impl/btc/unit/fixtures/index.d.ts +0 -2
- package/dist/cjs/test/unit/impl/btc/unit/fixtures/index.d.ts.map +0 -1
- package/dist/cjs/test/unit/impl/btc/unit/fixtures/index.js +0 -18
- package/dist/cjs/test/unit/impl/ltc/unit/index.d.ts +0 -2
- package/dist/cjs/test/unit/impl/ltc/unit/index.d.ts.map +0 -1
- package/dist/cjs/test/unit/impl/ltc/unit/index.js +0 -39
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
const assert_1 = __importDefault(require("assert"));
|
|
40
|
+
const sinon = __importStar(require("sinon"));
|
|
41
|
+
const nock = require("nock");
|
|
42
|
+
const src_1 = require("../../../src");
|
|
43
|
+
const util_1 = require("../util");
|
|
44
|
+
const mock_1 = require("./mock");
|
|
45
|
+
nock.disableNetConnect();
|
|
46
|
+
const walletPassphrase = 'lol';
|
|
47
|
+
// Get default wasm wallet keys (xpubs, xprivs, and walletKeys)
|
|
48
|
+
const { walletKeys: wasmWalletKeys, xpubs, xprivs } = (0, util_1.getDefaultWasmWalletKeys)();
|
|
49
|
+
function getNamedKeys(keys, password) {
|
|
50
|
+
function encode(k) {
|
|
51
|
+
const base58 = k.toBase58();
|
|
52
|
+
// Check if it's a public key
|
|
53
|
+
const pubKeyMatch = util_1.keychainsBase58.find((kc) => kc.pub === base58);
|
|
54
|
+
if (pubKeyMatch) {
|
|
55
|
+
return base58;
|
|
56
|
+
}
|
|
57
|
+
// It's a private key - find and encrypt it
|
|
58
|
+
const keyBase58 = util_1.keychainsBase58.find((kc) => kc.prv === base58);
|
|
59
|
+
if (!keyBase58) {
|
|
60
|
+
throw new Error('Key not found in keychainsBase58');
|
|
61
|
+
}
|
|
62
|
+
return (0, util_1.encryptKeychain)(password, keyBase58);
|
|
63
|
+
}
|
|
64
|
+
return {
|
|
65
|
+
userKey: encode(keys[0]),
|
|
66
|
+
backupKey: encode(keys[1]),
|
|
67
|
+
bitgoKey: encode(keys[2]),
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
function getKeysForFullSignedRecovery(password) {
|
|
71
|
+
return getNamedKeys([xprivs[0], xprivs[1], xpubs[2]], password);
|
|
72
|
+
}
|
|
73
|
+
const keysFullSignedRecovery = getKeysForFullSignedRecovery(walletPassphrase);
|
|
74
|
+
/**
|
|
75
|
+
* Tests for unspent gathering via backupKeyRecovery with MockRecoveryProvider.
|
|
76
|
+
* This validates the address scanning and unspent collection logic separately
|
|
77
|
+
* from the transaction building logic tested in backupKeyRecovery.ts.
|
|
78
|
+
*/
|
|
79
|
+
describe('Backup Key Recovery - Unspent Gathering', function () {
|
|
80
|
+
const defaultFeeRateSatB = 100;
|
|
81
|
+
(0, util_1.getMinUtxoCoins)().forEach((coin) => {
|
|
82
|
+
describe(`Unspent Gathering [${coin.getChain()}]`, function () {
|
|
83
|
+
const { walletKeys: externalWallet } = (0, util_1.createWasmWalletKeys)('external');
|
|
84
|
+
const recoveryDestination = (0, util_1.getWalletAddress)(coin.name, externalWallet);
|
|
85
|
+
before('mock', function () {
|
|
86
|
+
sinon.stub(src_1.CoingeckoApi.prototype, 'getUSDPrice').resolves(69420);
|
|
87
|
+
});
|
|
88
|
+
after(function () {
|
|
89
|
+
sinon.restore();
|
|
90
|
+
});
|
|
91
|
+
it('gathers unspents from recovery provider and builds transaction', async function () {
|
|
92
|
+
this.timeout(10000);
|
|
93
|
+
// Use p2sh for all coins (universal support)
|
|
94
|
+
const scriptTypes = ['p2sh'];
|
|
95
|
+
// Create test unspents with prevTx using wasm-utxo only (no utxolib dependency)
|
|
96
|
+
const testUnspents = scriptTypes.flatMap((scriptType, index) => [
|
|
97
|
+
(0, util_1.toUnspentWithPrevTx)({ scriptType, value: BigInt(1e8) }, index, coin.name, wasmWalletKeys),
|
|
98
|
+
(0, util_1.toUnspentWithPrevTx)({ scriptType, value: BigInt(2e8) }, index, coin.name, wasmWalletKeys),
|
|
99
|
+
]);
|
|
100
|
+
// Convert to API format for BCH/BCHA if needed
|
|
101
|
+
const mockedApiUnspents = coin.getChain() === 'bch' || coin.getChain() === 'bcha'
|
|
102
|
+
? testUnspents.map((u) => ({
|
|
103
|
+
...u,
|
|
104
|
+
address: coin.canonicalAddress(u.address, 'cashaddr').split(':')[1],
|
|
105
|
+
}))
|
|
106
|
+
: testUnspents;
|
|
107
|
+
const mockProvider = new mock_1.MockRecoveryProvider(mockedApiUnspents);
|
|
108
|
+
// Verify mock provider works correctly
|
|
109
|
+
const fetchedUnspents = await mockProvider.getUnspentsForAddresses(mockedApiUnspents.map((u) => u.address));
|
|
110
|
+
assert_1.default.strictEqual(fetchedUnspents.length, mockedApiUnspents.length);
|
|
111
|
+
// Call backupKeyRecovery which should gather unspents via the mock provider
|
|
112
|
+
const recovery = await (0, src_1.backupKeyRecovery)(coin, util_1.defaultBitGo, {
|
|
113
|
+
walletPassphrase,
|
|
114
|
+
recoveryDestination,
|
|
115
|
+
scan: 5,
|
|
116
|
+
ignoreAddressTypes: [],
|
|
117
|
+
...keysFullSignedRecovery,
|
|
118
|
+
recoveryProvider: mockProvider,
|
|
119
|
+
feeRate: defaultFeeRateSatB,
|
|
120
|
+
});
|
|
121
|
+
// Verify recovery succeeded (transaction hex indicates unspents were gathered)
|
|
122
|
+
const txHex = recovery.transactionHex ??
|
|
123
|
+
recovery.txHex;
|
|
124
|
+
assert_1.default.ok(txHex, 'should have transaction hex from gathered unspents');
|
|
125
|
+
});
|
|
126
|
+
it('handles empty unspents from recovery provider', async function () {
|
|
127
|
+
this.timeout(10000);
|
|
128
|
+
const mockProvider = new mock_1.MockRecoveryProvider([]);
|
|
129
|
+
await assert_1.default.rejects(async () => {
|
|
130
|
+
await (0, src_1.backupKeyRecovery)(coin, util_1.defaultBitGo, {
|
|
131
|
+
walletPassphrase,
|
|
132
|
+
recoveryDestination,
|
|
133
|
+
scan: 2,
|
|
134
|
+
ignoreAddressTypes: [],
|
|
135
|
+
...keysFullSignedRecovery,
|
|
136
|
+
recoveryProvider: mockProvider,
|
|
137
|
+
feeRate: defaultFeeRateSatB,
|
|
138
|
+
});
|
|
139
|
+
}, /No input to recover/);
|
|
140
|
+
});
|
|
141
|
+
});
|
|
142
|
+
});
|
|
143
|
+
});
|
|
144
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFja3VwS2V5UmVjb3ZlcnlVbnNwZW50R2F0aGVyaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGVzdC91bml0L3JlY292ZXJ5L2JhY2t1cEtleVJlY292ZXJ5VW5zcGVudEdhdGhlcmluZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG9EQUE0QjtBQUU1Qiw2Q0FBK0I7QUFDL0IsNkJBQThCO0FBSTlCLHNDQUtzQjtBQUV0QixrQ0FVaUI7QUFFakIsaUNBQThDO0FBSTlDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO0FBRXpCLE1BQU0sZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO0FBUS9CLCtEQUErRDtBQUMvRCxNQUFNLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEdBQUcsSUFBQSwrQkFBd0IsR0FBRSxDQUFDO0FBRWpGLFNBQVMsWUFBWSxDQUFDLElBQW1CLEVBQUUsUUFBZ0I7SUFDekQsU0FBUyxNQUFNLENBQUMsQ0FBUTtRQUN0QixNQUFNLE1BQU0sR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDNUIsNkJBQTZCO1FBQzdCLE1BQU0sV0FBVyxHQUFHLHNCQUFlLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLE1BQU0sQ0FBQyxDQUFDO1FBQ3BFLElBQUksV0FBVyxFQUFFLENBQUM7WUFDaEIsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQztRQUNELDJDQUEyQztRQUMzQyxNQUFNLFNBQVMsR0FBRyxzQkFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxNQUFNLENBQUMsQ0FBQztRQUNsRSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDZixNQUFNLElB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LHVCQUFpQixFQUFDLElBQUksRUFBRSxtQkFBWSxFQUFFO3dCQUMxQyxnQkFBZ0I7d0JBQ2hCLG1CQUFtQjt3QkFDbkIsSUFBSSxFQUFFLENBQUM7d0JBQ1Asa0JBQWtCLEVBQUUsRUFBRTt3QkFDdEIsR0FBRyxzQkFBc0I7d0JBQ3pCLGdCQUFnQixFQUFFLFlBQVk7d0JBQzlCLE9BQU8sRUFBRSxrQkFBa0I7cUJBQzVCLENBQUMsQ0FBQztnQkFDTCxDQUFDLEVBQUUscUJBQXFCLENBQUMsQ0FBQztZQUM1QixDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcblxuaW1wb3J0ICogYXMgc2lub24gZnJvbSAnc2lub24nO1xuaW1wb3J0IG5vY2sgPSByZXF1aXJlKCdub2NrJyk7XG5pbXBvcnQgeyBCSVAzMiB9IGZyb20gJ0BiaXRnby93YXNtLXV0eG8nO1xuaW1wb3J0IHsgVHJpcGxlIH0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcblxuaW1wb3J0IHtcbiAgYmFja3VwS2V5UmVjb3ZlcnksXG4gIEJhY2t1cEtleVJlY292ZXJ5VHJhbnNhbnNhY3Rpb24sXG4gIENvaW5nZWNrb0FwaSxcbiAgRm9ybWF0dGVkT2ZmbGluZVZhdWx0VHhJbmZvLFxufSBmcm9tICcuLi8uLi8uLi9zcmMnO1xuaW1wb3J0IHR5cGUgeyBVbnNwZW50IH0gZnJvbSAnLi4vLi4vLi4vc3JjL3Vuc3BlbnQnO1xuaW1wb3J0IHtcbiAgY3JlYXRlV2FzbVdhbGxldEtleXMsXG4gIGRlZmF1bHRCaXRHbyxcbiAgZW5jcnlwdEtleWNoYWluLFxuICBnZXREZWZhdWx0V2FzbVdhbGxldEtleXMsXG4gIGdldE1pblV0eG9Db2lucyxcbiAgZ2V0V2FsbGV0QWRkcmVzcyxcbiAga2V5Y2hhaW5zQmFzZTU4LFxuICB0b1Vuc3BlbnRXaXRoUHJldlR4LFxuICBXYWxsZXRVbnNwZW50V2l0aFByZXZUeCxcbn0gZnJvbSAnLi4vdXRpbCc7XG5cbmltcG9ydCB7IE1vY2tSZWNvdmVyeVByb3ZpZGVyIH0gZnJvbSAnLi9tb2NrJztcblxudHlwZSBTY3JpcHRUeXBlMk9mMyA9ICdwMnNoJyB8ICdwMnNoUDJ3c2gnIHwgJ3Ayd3NoJyB8ICdwMnRyJyB8ICdwMnRyTXVzaWcyJztcblxubm9jay5kaXNhYmxlTmV0Q29ubmVjdCgpO1xuXG5jb25zdCB3YWxsZXRQYXNzcGhyYXNlID0gJ2xvbCc7XG5cbnR5cGUgTmFtZWRLZXlzID0ge1xuICB1c2VyS2V5OiBzdHJpbmc7XG4gIGJhY2t1cEtleTogc3RyaW5nO1xuICBiaXRnb0tleTogc3RyaW5nO1xufTtcblxuLy8gR2V0IGRlZmF1bHQgd2FzbSB3YWxsZXQga2V5cyAoeHB1YnMsIHhwcml2cywgYW5kIHdhbGxldEtleXMpXG5jb25zdCB7IHdhbGxldEtleXM6IHdhc21XYWxsZXRLZXlzLCB4cHVicywgeHByaXZzIH0gPSBnZXREZWZhdWx0V2FzbVdhbGxldEtleXMoKTtcblxuZnVuY3Rpb24gZ2V0TmFtZWRLZXlzKGtleXM6IFRyaXBsZTxCSVAzMj4sIHBhc3N3b3JkOiBzdHJpbmcpOiBOYW1lZEtleXMge1xuICBmdW5jdGlvbiBlbmNvZGUoazogQklQMzIpOiBzdHJpbmcge1xuICAgIGNvbnN0IGJhc2U1OCA9IGsudG9CYXNlNTgoKTtcbiAgICAvLyBDaGVjayBpZiBpdCdzIGEgcHVibGljIGtleVxuICAgIGNvbnN0IHB1YktleU1hdGNoID0ga2V5Y2hhaW5zQmFzZTU4LmZpbmQoKGtjKSA9PiBrYy5wdWIgPT09IGJhc2U1OCk7XG4gICAgaWYgKHB1YktleU1hdGNoKSB7XG4gICAgICByZXR1cm4gYmFzZTU4O1xuICAgIH1cbiAgICAvLyBJdCdzIGEgcHJpdmF0ZSBrZXkgLSBmaW5kIGFuZCBlbmNyeXB0IGl0XG4gICAgY29uc3Qga2V5QmFzZTU4ID0ga2V5Y2hhaW5zQmFzZTU4LmZpbmQoKGtjKSA9PiBrYy5wcnYgPT09IGJhc2U1OCk7XG4gICAgaWYgKCFrZXlCYXNlNTgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignS2V5IG5vdCBmb3VuZCBpbiBrZXljaGFpbnNCYXNlNTgnKTtcbiAgICB9XG4gICAgcmV0dXJuIGVuY3J5cHRLZXljaGFpbihwYXNzd29yZCwga2V5QmFzZTU4KTtcbiAgfVxuICByZXR1cm4ge1xuICAgIHVzZXJLZXk6IGVuY29kZShrZXlzWzBdKSxcbiAgICBiYWNrdXBLZXk6IGVuY29kZShrZXlzWzFdKSxcbiAgICBiaXRnb0tleTogZW5jb2RlKGtleXNbMl0pLFxuICB9O1xufVxuXG5mdW5jdGlvbiBnZXRLZXlzRm9yRnVsbFNpZ25lZFJlY292ZXJ5KHBhc3N3b3JkOiBzdHJpbmcpOiBOYW1lZEtleXMge1xuICByZXR1cm4gZ2V0TmFtZWRLZXlzKFt4cHJpdnNbMF0sIHhwcml2c1sxXSwgeHB1YnNbMl1dLCBwYXNzd29yZCk7XG59XG5cbmNvbnN0IGtleXNGdWxsU2lnbmVkUmVjb3ZlcnkgPSBnZXRLZXlzRm9yRnVsbFNpZ25lZFJlY292ZXJ5KHdhbGxldFBhc3NwaHJhc2UpO1xuXG4vKipcbiAqIFRlc3RzIGZvciB1bnNwZW50IGdhdGhlcmluZyB2aWEgYmFja3VwS2V5UmVjb3Zlcnkgd2l0aCBNb2NrUmVjb3ZlcnlQcm92aWRlci5cbiAqIFRoaXMgdmFsaWRhdGVzIHRoZSBhZGRyZXNzIHNjYW5uaW5nIGFuZCB1bnNwZW50IGNvbGxlY3Rpb24gbG9naWMgc2VwYXJhdGVseVxuICogZnJvbSB0aGUgdHJhbnNhY3Rpb24gYnVpbGRpbmcgbG9naWMgdGVzdGVkIGluIGJhY2t1cEtleVJlY292ZXJ5LnRzLlxuICovXG5kZXNjcmliZSgnQmFja3VwIEtleSBSZWNvdmVyeSAtIFVuc3BlbnQgR2F0aGVyaW5nJywgZnVuY3Rpb24gKCkge1xuICBjb25zdCBkZWZhdWx0RmVlUmF0ZVNhdEIgPSAxMDA7XG5cbiAgZ2V0TWluVXR4b0NvaW5zKCkuZm9yRWFjaCgoY29pbikgPT4ge1xuICAgIGRlc2NyaWJlKGBVbnNwZW50IEdhdGhlcmluZyBbJHtjb2luLmdldENoYWluKCl9XWAsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHsgd2FsbGV0S2V5czogZXh0ZXJuYWxXYWxsZXQgfSA9IGNyZWF0ZVdhc21XYWxsZXRLZXlzKCdleHRlcm5hbCcpO1xuICAgICAgY29uc3QgcmVjb3ZlcnlEZXN0aW5hdGlvbiA9IGdldFdhbGxldEFkZHJlc3MoY29pbi5uYW1lLCBleHRlcm5hbFdhbGxldCk7XG5cbiAgICAgIGJlZm9yZSgnbW9jaycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc2lub24uc3R1YihDb2luZ2Vja29BcGkucHJvdG90eXBlLCAnZ2V0VVNEUHJpY2UnKS5yZXNvbHZlcyg2OV80MjApO1xuICAgICAgfSk7XG5cbiAgICAgIGFmdGVyKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc2lub24ucmVzdG9yZSgpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdnYXRoZXJzIHVuc3BlbnRzIGZyb20gcmVjb3ZlcnkgcHJvdmlkZXIgYW5kIGJ1aWxkcyB0cmFuc2FjdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy50aW1lb3V0KDEwXzAwMCk7XG4gICAgICAgIC8vIFVzZSBwMnNoIGZvciBhbGwgY29pbnMgKHVuaXZlcnNhbCBzdXBwb3J0KVxuICAgICAgICBjb25zdCBzY3JpcHRUeXBlczogU2NyaXB0VHlwZTJPZjNbXSA9IFsncDJzaCddO1xuXG4gICAgICAgIC8vIENyZWF0ZSB0ZXN0IHVuc3BlbnRzIHdpdGggcHJldlR4IHVzaW5nIHdhc20tdXR4byBvbmx5IChubyB1dHhvbGliIGRlcGVuZGVuY3kpXG4gICAgICAgIGNvbnN0IHRlc3RVbnNwZW50czogV2FsbGV0VW5zcGVudFdpdGhQcmV2VHg8YmlnaW50PltdID0gc2NyaXB0VHlwZXMuZmxhdE1hcCgoc2NyaXB0VHlwZSwgaW5kZXgpID0+IFtcbiAgICAgICAgICB0b1Vuc3BlbnRXaXRoUHJldlR4KHsgc2NyaXB0VHlwZSwgdmFsdWU6IEJpZ0ludCgxZTgpIH0sIGluZGV4LCBjb2luLm5hbWUsIHdhc21XYWxsZXRLZXlzKSxcbiAgICAgICAgICB0b1Vuc3BlbnRXaXRoUHJldlR4KHsgc2NyaXB0VHlwZSwgdmFsdWU6IEJpZ0ludCgyZTgpIH0sIGluZGV4LCBjb2luLm5hbWUsIHdhc21XYWxsZXRLZXlzKSxcbiAgICAgICAgXSk7XG5cbiAgICAgICAgLy8gQ29udmVydCB0byBBUEkgZm9ybWF0IGZvciBCQ0gvQkNIQSBpZiBuZWVkZWRcbiAgICAgICAgY29uc3QgbW9ja2VkQXBpVW5zcGVudHM6IFVuc3BlbnQ8YmlnaW50PltdID1cbiAgICAgICAgICBjb2luLmdldENoYWluKCkgPT09ICdiY2gnIHx8IGNvaW4uZ2V0Q2hhaW4oKSA9PT0gJ2JjaGEnXG4gICAgICAgICAgICA/IHRlc3RVbnNwZW50cy5tYXAoKHUpID0+ICh7XG4gICAgICAgICAgICAgICAgLi4udSxcbiAgICAgICAgICAgICAgICBhZGRyZXNzOiBjb2luLmNhbm9uaWNhbEFkZHJlc3ModS5hZGRyZXNzLCAnY2FzaGFkZHInKS5zcGxpdCgnOicpWzFdLFxuICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgIDogdGVzdFVuc3BlbnRzO1xuXG4gICAgICAgIGNvbnN0IG1vY2tQcm92aWRlciA9IG5ldyBNb2NrUmVjb3ZlcnlQcm92aWRlcihtb2NrZWRBcGlVbnNwZW50cyk7XG5cbiAgICAgICAgLy8gVmVyaWZ5IG1vY2sgcHJvdmlkZXIgd29ya3MgY29ycmVjdGx5XG4gICAgICAgIGNvbnN0IGZldGNoZWRVbnNwZW50cyA9IGF3YWl0IG1vY2tQcm92aWRlci5nZXRVbnNwZW50c0ZvckFkZHJlc3Nlcyhtb2NrZWRBcGlVbnNwZW50cy5tYXAoKHUpID0+IHUuYWRkcmVzcykpO1xuICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZmV0Y2hlZFVuc3BlbnRzLmxlbmd0aCwgbW9ja2VkQXBpVW5zcGVudHMubGVuZ3RoKTtcblxuICAgICAgICAvLyBDYWxsIGJhY2t1cEtleVJlY292ZXJ5IHdoaWNoIHNob3VsZCBnYXRoZXIgdW5zcGVudHMgdmlhIHRoZSBtb2NrIHByb3ZpZGVyXG4gICAgICAgIGNvbnN0IHJlY292ZXJ5ID0gYXdhaXQgYmFja3VwS2V5UmVjb3ZlcnkoY29pbiwgZGVmYXVsdEJpdEdvLCB7XG4gICAgICAgICAgd2FsbGV0UGFzc3BocmFzZSxcbiAgICAgICAgICByZWNvdmVyeURlc3RpbmF0aW9uLFxuICAgICAgICAgIHNjYW46IDUsXG4gICAgICAgICAgaWdub3JlQWRkcmVzc1R5cGVzOiBbXSxcbiAgICAgICAgICAuLi5rZXlzRnVsbFNpZ25lZFJlY292ZXJ5LFxuICAgICAgICAgIHJlY292ZXJ5UHJvdmlkZXI6IG1vY2tQcm92aWRlcixcbiAgICAgICAgICBmZWVSYXRlOiBkZWZhdWx0RmVlUmF0ZVNhdEIsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFZlcmlmeSByZWNvdmVyeSBzdWNjZWVkZWQgKHRyYW5zYWN0aW9uIGhleCBpbmRpY2F0ZXMgdW5zcGVudHMgd2VyZSBnYXRoZXJlZClcbiAgICAgICAgY29uc3QgdHhIZXggPVxuICAgICAgICAgIChyZWNvdmVyeSBhcyBCYWNrdXBLZXlSZWNvdmVyeVRyYW5zYW5zYWN0aW9uKS50cmFuc2FjdGlvbkhleCA/P1xuICAgICAgICAgIChyZWNvdmVyeSBhcyBGb3JtYXR0ZWRPZmZsaW5lVmF1bHRUeEluZm8pLnR4SGV4O1xuICAgICAgICBhc3NlcnQub2sodHhIZXgsICdzaG91bGQgaGF2ZSB0cmFuc2FjdGlvbiBoZXggZnJvbSBnYXRoZXJlZCB1bnNwZW50cycpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdoYW5kbGVzIGVtcHR5IHVuc3BlbnRzIGZyb20gcmVjb3ZlcnkgcHJvdmlkZXInLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMudGltZW91dCgxMF8wMDApO1xuXG4gICAgICAgIGNvbnN0IG1vY2tQcm92aWRlciA9IG5ldyBNb2NrUmVjb3ZlcnlQcm92aWRlcihbXSk7XG5cbiAgICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGF3YWl0IGJhY2t1cEtleVJlY292ZXJ5KGNvaW4sIGRlZmF1bHRCaXRHbywge1xuICAgICAgICAgICAgd2FsbGV0UGFzc3BocmFzZSxcbiAgICAgICAgICAgIHJlY292ZXJ5RGVzdGluYXRpb24sXG4gICAgICAgICAgICBzY2FuOiAyLFxuICAgICAgICAgICAgaWdub3JlQWRkcmVzc1R5cGVzOiBbXSxcbiAgICAgICAgICAgIC4uLmtleXNGdWxsU2lnbmVkUmVjb3ZlcnksXG4gICAgICAgICAgICByZWNvdmVyeVByb3ZpZGVyOiBtb2NrUHJvdmlkZXIsXG4gICAgICAgICAgICBmZWVSYXRlOiBkZWZhdWx0RmVlUmF0ZVNhdEIsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sIC9ObyBpbnB1dCB0byByZWNvdmVyLyk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
|
|
@@ -36,15 +36,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
36
36
|
const assert = __importStar(require("assert"));
|
|
37
37
|
const should = require("should");
|
|
38
38
|
const nock = require("nock");
|
|
39
|
-
const utxolib = __importStar(require("@bitgo/utxo-lib"));
|
|
40
39
|
const sdk_test_1 = require("@bitgo/sdk-test");
|
|
40
|
+
const wasm_utxo_1 = require("@bitgo/wasm-utxo");
|
|
41
41
|
const sinon = __importStar(require("sinon"));
|
|
42
42
|
const src_1 = require("../../../src");
|
|
43
43
|
const names_1 = require("../../../src/names");
|
|
44
44
|
const util_1 = require("../util");
|
|
45
45
|
const nockBitGo_1 = require("../util/nockBitGo");
|
|
46
|
-
const transaction_1 = require("../util/transaction");
|
|
47
|
-
const keychains_1 = require("../util/keychains");
|
|
48
46
|
const mock_1 = require("./mock");
|
|
49
47
|
function getKeyId(k) {
|
|
50
48
|
return (0, sdk_test_1.getSeed)(k.pub).toString('hex');
|
|
@@ -93,9 +91,10 @@ function nockWalletAddress(coin, walletId, address) {
|
|
|
93
91
|
* @param sourceCoin - the coin to construct the transaction for
|
|
94
92
|
* @param recoveryCoin - the coin the receiving wallet was set up for
|
|
95
93
|
*/
|
|
94
|
+
// Get wasm wallet keys for signature verification
|
|
95
|
+
const { walletKeys: wasmWalletKeys, xprivs } = (0, util_1.getDefaultWasmWalletKeys)();
|
|
96
96
|
function run(sourceCoin, recoveryCoin) {
|
|
97
97
|
describe(`Cross-Chain Recovery [sourceCoin=${sourceCoin.getChain()} recoveryCoin=${recoveryCoin.getChain()}]`, function () {
|
|
98
|
-
const walletKeys = (0, util_1.getDefaultWalletKeys)();
|
|
99
98
|
const recoveryWalletId = '5abacebe28d72fbd07e0b8cbba0ff39e';
|
|
100
99
|
// the address the accidental deposit went to, in both sourceCoin and addressCoin formats
|
|
101
100
|
const [depositAddressSourceCoin, depositAddressRecoveryCoin] = [sourceCoin, recoveryCoin].map((coin) => ({
|
|
@@ -112,27 +111,11 @@ function run(sourceCoin, recoveryCoin) {
|
|
|
112
111
|
index,
|
|
113
112
|
});
|
|
114
113
|
const nocks = [];
|
|
115
|
-
|
|
116
|
-
function getDepositUnspents() {
|
|
117
|
-
return [
|
|
118
|
-
(0, util_1.mockUnspent)(sourceCoin.network, walletKeys, 'p2sh', 0, (sourceCoin.amountType === 'bigint' ? BigInt('10999999800000001') : 1e8)),
|
|
119
|
-
];
|
|
120
|
-
}
|
|
121
|
-
function getDepositTransaction() {
|
|
122
|
-
return (0, transaction_1.createFullSignedTransaction)(sourceCoin.network, getDepositUnspents(), depositAddressSourceCoin.address, (0, keychains_1.getDefaultWalletUnspentSigner)());
|
|
123
|
-
}
|
|
124
|
-
before('prepare deposit tx', function () {
|
|
125
|
-
depositTx = getDepositTransaction();
|
|
126
|
-
});
|
|
114
|
+
// Create recovery unspent using wasm-utxo (no utxolib dependency)
|
|
127
115
|
function getRecoveryUnspents() {
|
|
116
|
+
const depositValue = (sourceCoin.amountType === 'bigint' ? BigInt(1e8) : 1e8);
|
|
128
117
|
return [
|
|
129
|
-
|
|
130
|
-
id: depositTx.getId(),
|
|
131
|
-
address: depositAddressSourceCoin.address,
|
|
132
|
-
chain: chain,
|
|
133
|
-
index: index,
|
|
134
|
-
value: depositTx.outs[0].value,
|
|
135
|
-
},
|
|
118
|
+
(0, util_1.createWasmWalletUnspent)(depositAddressSourceCoin.address, chain, index, depositValue, sourceCoin.name),
|
|
136
119
|
];
|
|
137
120
|
}
|
|
138
121
|
before('setup nocks', function () {
|
|
@@ -163,22 +146,29 @@ function run(sourceCoin, recoveryCoin) {
|
|
|
163
146
|
(0, util_1.shouldEqualJSON)(recoveryObj, await (0, util_1.getFixture)(sourceCoin, `recovery/crossChainRecovery-${recoveryCoin.getChain()}-${name}`, recoveryObj));
|
|
164
147
|
}
|
|
165
148
|
function checkRecoveryPsbtSignature(psbtHex) {
|
|
166
|
-
|
|
149
|
+
// Parse using wasm-utxo for signature verification
|
|
150
|
+
const wasmPsbt = wasm_utxo_1.fixedScriptWallet.BitGoPsbt.fromBytes(Buffer.from(psbtHex, 'hex'), sourceCoin.name);
|
|
151
|
+
const parsed = wasmPsbt.parseTransactionWithWalletKeys(wasmWalletKeys, { publicKeys: [] });
|
|
167
152
|
const unspents = getRecoveryUnspents();
|
|
168
|
-
should.equal(
|
|
153
|
+
should.equal(parsed.inputs.length, unspents.length);
|
|
169
154
|
// Verify user key has signed each input (same pattern as backupKeyRecovery test)
|
|
170
|
-
|
|
171
|
-
const userSigned =
|
|
155
|
+
parsed.inputs.forEach((_, i) => {
|
|
156
|
+
const userSigned = wasmPsbt.verifySignature(i, xprivs[0]);
|
|
172
157
|
userSigned.should.eql(true, `Input ${i} should be signed by user key`);
|
|
173
158
|
});
|
|
174
159
|
}
|
|
175
160
|
it('should test signed cross chain recovery', async () => {
|
|
161
|
+
const depositUnspent = getRecoveryUnspents()[0];
|
|
162
|
+
// Parse txid from the unspent id (format: txid:vout)
|
|
163
|
+
const depositTxid = depositUnspent.id.split(':')[0];
|
|
164
|
+
// Use the deposit address as the input address (simulating a p2sh input)
|
|
165
|
+
const inputAddress = (0, src_1.generateAddress)(sourceCoin.name, { keychains: util_1.keychainsBase58, chain: 0, index: 2 });
|
|
176
166
|
const getRecoveryProviderStub = sinon
|
|
177
167
|
.stub(src_1.AbstractUtxoCoin.prototype, 'getRecoveryProvider')
|
|
178
|
-
.returns(new mock_1.
|
|
168
|
+
.returns(new mock_1.WasmCrossChainRecoveryProvider(sourceCoin, depositUnspent, [inputAddress]));
|
|
179
169
|
const params = {
|
|
180
170
|
recoveryCoin,
|
|
181
|
-
txid:
|
|
171
|
+
txid: depositTxid,
|
|
182
172
|
recoveryAddress,
|
|
183
173
|
wallet: recoveryWalletId,
|
|
184
174
|
};
|
|
@@ -193,12 +183,17 @@ function run(sourceCoin, recoveryCoin) {
|
|
|
193
183
|
checkRecoveryPsbtSignature(signedRecovery.txHex);
|
|
194
184
|
});
|
|
195
185
|
it('should test unsigned cross chain recovery', async () => {
|
|
186
|
+
const depositUnspent = getRecoveryUnspents()[0];
|
|
187
|
+
// Parse txid from the unspent id (format: txid:vout)
|
|
188
|
+
const depositTxid = depositUnspent.id.split(':')[0];
|
|
189
|
+
// Use the deposit address as the input address (simulating a p2sh input)
|
|
190
|
+
const inputAddress = (0, src_1.generateAddress)(sourceCoin.name, { keychains: util_1.keychainsBase58, chain: 0, index: 2 });
|
|
196
191
|
const getRecoveryProviderStub = sinon
|
|
197
192
|
.stub(src_1.AbstractUtxoCoin.prototype, 'getRecoveryProvider')
|
|
198
|
-
.returns(new mock_1.
|
|
193
|
+
.returns(new mock_1.WasmCrossChainRecoveryProvider(sourceCoin, depositUnspent, [inputAddress]));
|
|
199
194
|
const params = {
|
|
200
195
|
recoveryCoin,
|
|
201
|
-
txid:
|
|
196
|
+
txid: depositTxid,
|
|
202
197
|
recoveryAddress,
|
|
203
198
|
wallet: recoveryWalletId,
|
|
204
199
|
};
|
|
@@ -271,14 +266,22 @@ describe(`Cross-Chain Recovery getWallet`, async function () {
|
|
|
271
266
|
});
|
|
272
267
|
});
|
|
273
268
|
describe('convertLtcAddressToLegacyFormat', function () {
|
|
269
|
+
const scriptPubKey = Buffer.from('a9149f0bf51fab4d33ab21977e1b89f776f64161ef4287', 'hex');
|
|
274
270
|
it('should convert M... P2SH address to 3... legacy format', function () {
|
|
275
271
|
// These two addresses represent the same underlying script hash:
|
|
276
272
|
// - MNQ7zkgMsaV67rsjA3JuP59RC5wxRXpwgE is the LTC format (scriptHash 0x32)
|
|
277
273
|
// - 3GBygsGPvTdfKMbq4AKZZRu1sPMWPEsBfd is the BTC format (scriptHash 0x05)
|
|
278
|
-
const ltcAddress = 'MNQ7zkgMsaV67rsjA3JuP59RC5wxRXpwgE';
|
|
279
|
-
const
|
|
274
|
+
// const ltcAddress = 'MNQ7zkgMsaV67rsjA3JuP59RC5wxRXpwgE';
|
|
275
|
+
const ltcAddress = wasm_utxo_1.address.fromOutputScriptWithCoin(scriptPubKey, 'ltc');
|
|
276
|
+
const tltcAddress = wasm_utxo_1.address.fromOutputScriptWithCoin(scriptPubKey, 'tltc');
|
|
277
|
+
assert.strictEqual(ltcAddress, 'MNQ7zkgMsaV67rsjA3JuP59RC5wxRXpwgE');
|
|
278
|
+
assert.strictEqual(tltcAddress, 'Qb6wsd4fZ2C6fKzRMPyTG5KiE81W6QCxhU');
|
|
280
279
|
const legacyAddress = (0, src_1.convertLtcAddressToLegacyFormat)(ltcAddress, 'ltc');
|
|
281
|
-
|
|
280
|
+
const expectedLtcLegacyAddress = '3GBygsGPvTdfKMbq4AKZZRu1sPMWPEsBfd';
|
|
281
|
+
assert.strictEqual(legacyAddress, expectedLtcLegacyAddress);
|
|
282
|
+
const expectedTltcLegacyAddress = '2N7kBkcCRXv91X9ENjHwSBNtH5jZg8yye6r';
|
|
283
|
+
const tltcLegacyAddress = (0, src_1.convertLtcAddressToLegacyFormat)(tltcAddress, 'tltc');
|
|
284
|
+
assert.strictEqual(tltcLegacyAddress, expectedTltcLegacyAddress);
|
|
282
285
|
});
|
|
283
286
|
it('should convert MD68PsdheKxcYsrVLyZRXgoSDLnB1MdVtE to legacy format', function () {
|
|
284
287
|
const address = 'MD68PsdheKxcYsrVLyZRXgoSDLnB1MdVtE';
|
|
@@ -292,4 +295,4 @@ describe('convertLtcAddressToLegacyFormat', function () {
|
|
|
292
295
|
assert.strictEqual(result, bech32Address);
|
|
293
296
|
});
|
|
294
297
|
});
|
|
295
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3Jvc3NDaGFpblJlY292ZXJ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGVzdC91bml0L3JlY292ZXJ5L2Nyb3NzQ2hhaW5SZWNvdmVyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLCtDQUFpQztBQUVqQyxpQ0FBa0M7QUFDbEMsNkJBQThCO0FBQzlCLHlEQUEyQztBQUUzQyw4Q0FBMEM7QUFDMUMsNkNBQStCO0FBRS9CLHNDQVFzQjtBQUN0Qiw4Q0FBa0U7QUFDbEUsa0NBVWlCO0FBQ2pCLGlEQUE4QztBQUM5QyxxREFBa0U7QUFDbEUsaURBQWtFO0FBRWxFLGlDQUF3RDtBQUl4RCxTQUFTLFFBQVEsQ0FBQyxDQUFpQjtJQUNqQyxPQUFPLElBQUEsa0JBQU8sRUFBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3hDLENBQUM7QUFFRCxTQUFTLFVBQVUsQ0FBQyxJQUFzQixFQUFFLFFBQWdCLEVBQUUsVUFBa0M7SUFDOUYsT0FBTztRQUNMLElBQUEscUJBQVMsR0FBRTthQUNSLEdBQUcsQ0FBQyxXQUFXLElBQUksQ0FBQyxRQUFRLEVBQUUsV0FBVyxRQUFRLEVBQUUsQ0FBQzthQUNwRCxLQUFLLENBQUMsR0FBRyxFQUFFO1lBQ1YsRUFBRSxFQUFFLFFBQVE7WUFDWixJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNyQixLQUFLLEVBQUUsb0JBQW9CO1lBQzNCLElBQUksRUFBRSxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDekMsQ0FBQzthQUNELE9BQU8sRUFBRTtRQUNaLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQ3RCLElBQUEscUJBQVMsR0FBRTth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TUFBTSxVQUFVLEdBQUcsb0NBQW9DLENBQUM7UUFDeEQsTUFBTSxxQkFBcUIsR0FBRyxvQ0FBb0MsQ0FBQztRQUVuRSxNQUFNLGFBQWEsR0FBRyxJQUFBLHFDQUErQixFQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN6RSxNQUFNLENBQUMsV0FBVyxDQUFDLGFBQWEsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO0lBQzNELENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLG9FQUFvRSxFQUFFO1FBQ3ZFLE1BQU0sT0FBTyxHQUFHLG9DQUFvQyxDQUFDO1FBQ3JELE1BQU0sYUFBYSxHQUFHLElBQUEscUNBQStCLEVBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRXRFLGlEQUFpRDtRQUNqRCxNQUFNLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUUsNENBQTRDLGFBQWEsRUFBRSxDQUFDLENBQUM7SUFDeEcsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsb0NBQW9DLEVBQUU7UUFDdkMsTUFBTSxhQUFhLEdBQUcsNkNBQTZDLENBQUM7UUFDcEUsTUFBTSxNQUFNLEdBQUcsSUFBQSxxQ0FBK0IsRUFBQyxhQUFhLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDckUsTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDNUMsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5pbXBvcnQgc2hvdWxkID0gcmVxdWlyZSgnc2hvdWxkJyk7XG5pbXBvcnQgbm9jayA9IHJlcXVpcmUoJ25vY2snKTtcbmltcG9ydCAqIGFzIHV0eG9saWIgZnJvbSAnQGJpdGdvL3V0eG8tbGliJztcbmltcG9ydCB7IFRyaXBsZSB9IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQgeyBnZXRTZWVkIH0gZnJvbSAnQGJpdGdvL3Nkay10ZXN0JztcbmltcG9ydCAqIGFzIHNpbm9uIGZyb20gJ3Npbm9uJztcblxuaW1wb3J0IHtcbiAgQWJzdHJhY3RVdHhvQ29pbixcbiAgQ3Jvc3NDaGFpblJlY292ZXJ5U2lnbmVkLFxuICBDcm9zc0NoYWluUmVjb3ZlcnlVbnNpZ25lZCxcbiAgZ2V0V2FsbGV0LFxuICBzdXBwb3J0ZWRDcm9zc0NoYWluUmVjb3ZlcmllcyxcbiAgZ2VuZXJhdGVBZGRyZXNzLFxuICBjb252ZXJ0THRjQWRkcmVzc1RvTGVnYWN5Rm9ybWF0LFxufSBmcm9tICcuLi8uLi8uLi9zcmMnO1xuaW1wb3J0IHsgaXNNYWlubmV0Q29pbiwgaXNUZXN0bmV0Q29pbiB9IGZyb20gJy4uLy4uLy4uL3NyYy9uYW1lcyc7XG5pbXBvcnQge1xuICBnZXRGaXh0dXJlLFxuICBrZXljaGFpbnNCYXNlNTgsXG4gIEtleWNoYWluQmFzZTU4LFxuICBtb2NrVW5zcGVudCxcbiAgc2hvdWxkRXF1YWxKU09OLFxuICB1dHhvQ29pbnMsXG4gIGdldERlZmF1bHRXYWxsZXRLZXlzLFxuICBkZWZhdWx0Qml0R28sXG4gIGdldFV0eG9Db2luLFxufSBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7IG5vY2tCaXRHbyB9IGZyb20gJy4uL3V0aWwvbm9ja0JpdEdvJztcbmltcG9ydCB7IGNyZWF0ZUZ1bGxTaWduZWRUcmFuc2FjdGlvbiB9IGZyb20gJy4uL3V0aWwvdHJhbnNhY3Rpb24nO1xuaW1wb3J0IHsgZ2V0RGVmYXVsdFdhbGxldFVuc3BlbnRTaWduZXIgfSBmcm9tICcuLi91dGlsL2tleWNoYWlucyc7XG5cbmltcG9ydCB7IE1vY2tDcm9zc0NoYWluUmVjb3ZlcnlQcm92aWRlciB9IGZyb20gJy4vbW9jayc7XG5cbnR5cGUgV2FsbGV0VW5zcGVudDxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPiA9IHV0eG9saWIuYml0Z28uV2FsbGV0VW5zcGVudDxUTnVtYmVyPjtcblxuZnVuY3Rpb24gZ2V0S2V5SWQoazogS2V5Y2hhaW5CYXNlNTgpOiBzdHJpbmcge1xuICByZXR1cm4gZ2V0U2VlZChrLnB1YikudG9TdHJpbmcoJ2hleCcpO1xufVxuXG5mdW5jdGlvbiBub2NrV2FsbGV0KGNvaW46IEFic3RyYWN0VXR4b0NvaW4sIHdhbGxldElkOiBzdHJpbmcsIHdhbGxldEtleXM6IFRyaXBsZTxLZXljaGFpbkJhc2U1OD4pOiBub2NrLlNjb3BlW10ge1xuICByZXR1cm4gW1xuICAgIG5vY2tCaXRHbygpXG4gICAgICAuZ2V0KGAvYXBpL3YyLyR7Y29pbi5nZXRDaGFpbigpfS93YWxsZXQvJHt3YWxsZXRJZH1gKVxuICAgICAgLnJlcGx5KDIwMCwge1xuICAgICAgICBpZDogd2FsbGV0SWQsXG4gICAgICAgIGNvaW46IGNvaW4uZ2V0Q2hhaW4oKSxcbiAgICAgICAgbGFiZWw6ICdjcm9zc0NoYWluUmVjb3ZlcnknLFxuICAgICAgICBrZXlzOiB3YWxsZXRLZXlzLm1hcCgoaykgPT4gZ2V0S2V5SWQoaykpLFxuICAgICAgfSlcbiAgICAgIC5wZXJzaXN0KCksXG4gICAgLi4ud2FsbGV0S2V5cy5tYXAoKGspID0+XG4gICAgICBub2NrQml0R28oKVxuICAgICAgICAuZ2V0KGAvYXBpL3YyLyR7Y29pbi5nZXRDaGFpbigpfS9rZXkvJHtnZXRLZXlJZChrKX1gKVxuICAgICAgICAucmVwbHkoMjAwLCBrKVxuICAgICAgICAucGVyc2lzdCgpXG4gICAgKSxcbiAgXTtcbn1cblxudHlwZSBBZGRyZXNzID0ge1xuICBhZGRyZXNzOiBzdHJpbmc7XG4gIGNoYWluOiBudW1iZXI7XG4gIGluZGV4OiBudW1iZXI7XG59O1xuXG5mdW5jdGlvbiBub2NrV2FsbGV0QWRkcmVzcyhjb2luOiBBYnN0cmFjdFV0eG9Db2luLCB3YWxsZXRJZDogc3RyaW5nLCBhZGRyZXNzOiBBZGRyZXNzKTogbm9jay5TY29wZSB7XG4gIHJldHVybiBub2NrQml0R28oKVxuICAgIC5nZXQoYC9hcGkvdjIvJHtjb2luLmdldENoYWluKCl9L3dhbGxldC8ke3dhbGxldElkfS9hZGRyZXNzLyR7YWRkcmVzcy5hZGRyZXNzfWApXG4gICAgLnJlcGx5KDIwMCwge1xuICAgICAgYWRkcmVzczogYWRkcmVzcy5hZGRyZXNzLFxuICAgICAgY2hhaW46IGFkZHJlc3MuY2hhaW4sXG4gICAgICBpbmRleDogYWRkcmVzcy5pbmRleCxcbiAgICAgIGNvaW46IGNvaW4uZ2V0Q2hhaW4oKSxcbiAgICAgIHdhbGxldDogd2FsbGV0SWQsXG4gICAgfSlcbiAgICAucGVyc2lzdCgpO1xufVxuXG4vKipcbiAqIFNldHVwIHRlc3QgZm9yIGNyb3NzLWNoYWluIHJlY292ZXJ5LlxuICpcbiAqIFVzZXJzIGNhbiByZWNlaXZlIGRlcG9zaXRzIG9uIHdhbGxldCBhZGRyZXNzZXMgdGhhdCBhcmUgb24gYSBkaWZmZXJlbnQgY2hhaW4uXG4gKlxuICogRm9yIGluc3RhbmNlLCBhIHVzZXIgY2FuIHJlY2VpdmUgbGl0ZWNvaW4gb24gYSBiaXRjb2luIHdhbGxldC5cbiAqIFRoaXMgbWVhbnMgdGhhdCB0aGUgbGl0ZWNvaW4gYmxvY2tjaGFpbiBoYXMgYSB0cmFuc2FjdGlvbiB3aXRoIG91dHB1dHMgdGhhdCBhcmUgc3BlbmRhYmxlXG4gKiB3aXRoIGtleXMgdGhhdCB3ZXJlIG9yaWdpbmFsbHkgY3JlYXRlZCBmb3IgYSBCaXRHbyBCVEMgd2FsbGV0LlxuICogSW4gdGhpcyBleGFtcGxlLCBMVEMgaXMgdGhlIFwic291cmNlIGNvaW5cIiBhbmQgQlRDIGlzIHRoZSBcInJlY292ZXJ5IGNvaW5cIlxuICogSW4gY2FzZXMgbGlrZSB0aGVzZSB3ZSBtdXN0IHVzZSBjb25zdHJ1Y3QgYSB0cmFuc2FjdGlvbiBmb3IgbGl0ZWNvaW4gbmV0d29yayB1c2luZyBrZXlzIG9mIHRoZVxuICogYml0Y29pbiB3YWxsZXQuXG4gKlxuICogQHBhcmFtIHNvdXJjZUNvaW4gLSB0aGUgY29pbiB0byBjb25zdHJ1Y3QgdGhlIHRyYW5zYWN0aW9uIGZvclxuICogQHBhcmFtIHJlY292ZXJ5Q29pbiAtIHRoZSBjb2luIHRoZSByZWNlaXZpbmcgd2FsbGV0IHdhcyBzZXQgdXAgZm9yXG4gKi9cbmZ1bmN0aW9uIHJ1bjxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPihzb3VyY2VDb2luOiBBYnN0cmFjdFV0eG9Db2luLCByZWNvdmVyeUNvaW46IEFic3RyYWN0VXR4b0NvaW4pIHtcbiAgZGVzY3JpYmUoYENyb3NzLUNoYWluIFJlY292ZXJ5IFtzb3VyY2VDb2luPSR7c291cmNlQ29pbi5nZXRDaGFpbigpfSByZWNvdmVyeUNvaW49JHtyZWNvdmVyeUNvaW4uZ2V0Q2hhaW4oKX1dYCwgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHdhbGxldEtleXMgPSBnZXREZWZhdWx0V2FsbGV0S2V5cygpO1xuICAgIGNvbnN0IHJlY292ZXJ5V2FsbGV0SWQgPSAnNWFiYWNlYmUyOGQ3MmZiZDA3ZTBiOGNiYmEwZmYzOWUnO1xuICAgIC8vIHRoZSBhZGRyZXNzIHRoZSBhY2NpZGVudGFsIGRlcG9zaXQgd2VudCB0bywgaW4gYm90aCBzb3VyY2VDb2luIGFuZCBhZGRyZXNzQ29pbiBmb3JtYXRzXG4gICAgY29uc3QgW2RlcG9zaXRBZGRyZXNzU291cmNlQ29pbiwgZGVwb3NpdEFkZHJlc3NSZWNvdmVyeUNvaW5dID0gW3NvdXJjZUNvaW4sIHJlY292ZXJ5Q29pbl0ubWFwKChjb2luKSA9PiAoe1xuICAgICAgYWRkcmVzczogZ2VuZXJhdGVBZGRyZXNzKGNvaW4ubmFtZSwgeyBrZXljaGFpbnM6IGtleWNoYWluc0Jhc2U1OCwgY2hhaW46IDAsIGluZGV4OiAwIH0pLFxuICAgICAgY2hhaW46IDAsXG4gICAgICBpbmRleDogMCxcbiAgICB9KSk7XG4gICAgY29uc3QgY2hhaW4gPSAwO1xuICAgIGNvbnN0IGluZGV4ID0gMTtcbiAgICAvLyB0aGUgYWRkcmVzcyB3aGVyZSB3ZSB3YW50IHRvIHJlY292ZXIgb3VyIGZ1bmRzIHRvXG4gICAgY29uc3QgcmVjb3ZlcnlBZGRyZXNzID0gZ2VuZXJhdGVBZGRyZXNzKHNvdXJjZUNvaW4ubmFtZSwge1xuICAgICAga2V5Y2hhaW5zOiBrZXljaGFpbnNCYXNlNTgsXG4gICAgICBjaGFpbixcbiAgICAgIGluZGV4LFxuICAgIH0pO1xuICAgIGNvbnN0IG5vY2tzOiBub2NrLlNjb3BlW10gPSBbXTtcblxuICAgIGxldCBkZXBvc2l0VHg6IHV0eG9saWIuYml0Z28uVXR4b1RyYW5zYWN0aW9uPFROdW1iZXI+O1xuXG4gICAgZnVuY3Rpb24gZ2V0RGVwb3NpdFVuc3BlbnRzKCk6IHV0eG9saWIuYml0Z28uVW5zcGVudDxUTnVtYmVyPltdIHtcbiAgICAgIHJldHVybiBbXG4gICAgICAgIG1vY2tVbnNwZW50PFROdW1iZXI+KFxuICAgICAgICAgIHNvdXJjZUNvaW4ubmV0d29yayxcbiAgICAgICAgICB3YWxsZXRLZXlzLFxuICAgICAgICAgICdwMnNoJyxcbiAgICAgICAgICAwLFxuICAgICAgICAgIChzb3VyY2VDb2luLmFtb3VudFR5cGUgPT09ICdiaWdpbnQnID8gQmlnSW50KCcxMDk5OTk5OTgwMDAwMDAwMScpIDogMWU4KSBhcyBUTnVtYmVyXG4gICAgICAgICksXG4gICAgICBdO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldERlcG9zaXRUcmFuc2FjdGlvbigpOiB1dHhvbGliLmJpdGdvLlV0eG9UcmFuc2FjdGlvbjxUTnVtYmVyPiB7XG4gICAgICByZXR1cm4gY3JlYXRlRnVsbFNpZ25lZFRyYW5zYWN0aW9uPFROdW1iZXI+KFxuICAgICAgICBzb3VyY2VDb2luLm5ldHdvcmssXG4gICAgICAgIGdldERlcG9zaXRVbnNwZW50cygpLFxuICAgICAgICBkZXBvc2l0QWRkcmVzc1NvdXJjZUNvaW4uYWRkcmVzcyxcbiAgICAgICAgZ2V0RGVmYXVsdFdhbGxldFVuc3BlbnRTaWduZXIoKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBiZWZvcmUoJ3ByZXBhcmUgZGVwb3NpdCB0eCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGRlcG9zaXRUeCA9IGdldERlcG9zaXRUcmFuc2FjdGlvbigpO1xuICAgIH0pO1xuXG4gICAgZnVuY3Rpb24gZ2V0UmVjb3ZlcnlVbnNwZW50cygpOiBXYWxsZXRVbnNwZW50PFROdW1iZXI+W10ge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAge1xuICAgICAgICAgIGlkOiBkZXBvc2l0VHguZ2V0SWQoKSxcbiAgICAgICAgICBhZGRyZXNzOiBkZXBvc2l0QWRkcmVzc1NvdXJjZUNvaW4uYWRkcmVzcyxcbiAgICAgICAgICBjaGFpbjogY2hhaW4sXG4gICAgICAgICAgaW5kZXg6IGluZGV4LFxuICAgICAgICAgIHZhbHVlOiBkZXBvc2l0VHgub3V0c1swXS52YWx1ZSxcbiAgICAgICAgfSxcbiAgICAgIF07XG4gICAgfVxuXG4gICAgYmVmb3JlKCdzZXR1cCBub2NrcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIG5vY2tzLnB1c2goLi4ubm9ja1dhbGxldChyZWNvdmVyeUNvaW4sIHJlY292ZXJ5V2FsbGV0SWQsIGtleWNoYWluc0Jhc2U1OCkpO1xuICAgICAgbm9ja3MucHVzaChub2NrV2FsbGV0QWRkcmVzcyhyZWNvdmVyeUNvaW4sIHJlY292ZXJ5V2FsbGV0SWQsIGRlcG9zaXRBZGRyZXNzUmVjb3ZlcnlDb2luKSk7XG4gICAgfSk7XG5cbiAgICBhZnRlcihmdW5jdGlvbiAoKSB7XG4gICAgICBub2Nrcy5mb3JFYWNoKChuKSA9PiBuLmRvbmUoKSk7XG4gICAgfSk7XG5cbiAgICBhZnRlcihmdW5jdGlvbiAoKSB7XG4gICAgICBub2NrLmNsZWFuQWxsKCk7XG4gICAgfSk7XG5cbiAgICBhZnRlckVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgc2lub24ucmVzdG9yZSgpO1xuICAgIH0pO1xuXG4gICAgYXN5bmMgZnVuY3Rpb24gbWF0Y2hGaXh0dXJlKFxuICAgICAgbmFtZTogc3RyaW5nLFxuICAgICAgcmVjb3Zlcnk6IENyb3NzQ2hhaW5SZWNvdmVyeVNpZ25lZDxUTnVtYmVyPiB8IENyb3NzQ2hhaW5SZWNvdmVyeVVuc2lnbmVkPFROdW1iZXI+XG4gICAgKSB7XG4gICAgICBsZXQgcmVjb3ZlcnlPYmo6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0geyAuLi5yZWNvdmVyeSB9O1xuICAgICAgaWYgKHNvdXJjZUNvaW4uYW1vdW50VHlwZSA9PT0gJ2JpZ2ludCcpIHtcbiAgICAgICAgcmVjb3ZlcnlPYmogPSBKU09OLnBhcnNlKFxuICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHJlY292ZXJ5T2JqLCAoaywgdikgPT4ge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB2ID09PSAnYmlnaW50Jykge1xuICAgICAgICAgICAgICByZXR1cm4gdi50b1N0cmluZygpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHNob3VsZEVxdWFsSlNPTihcbiAgICAgICAgcmVjb3ZlcnlPYmosXG4gICAgICAgIGF3YWl0IGdldEZpeHR1cmUoc291cmNlQ29pbiwgYHJlY292ZXJ5L2Nyb3NzQ2hhaW5SZWNvdmVyeS0ke3JlY292ZXJ5Q29pbi5nZXRDaGFpbigpfS0ke25hbWV9YCwgcmVjb3ZlcnlPYmopXG4gICAgICApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNoZWNrUmVjb3ZlcnlQc2J0U2lnbmF0dXJlKHBzYnRIZXg6IHN0cmluZykge1xuICAgICAgY29uc3QgcHNidCA9IHV0eG9saWIuYml0Z28uY3JlYXRlUHNidEZyb21IZXgocHNidEhleCwgc291cmNlQ29pbi5uZXR3b3JrKTtcbiAgICAgIGNvbnN0IHVuc3BlbnRzID0gZ2V0UmVjb3ZlcnlVbnNwZW50cygpO1xuICAgICAgc2hvdWxkLmVxdWFsKHBzYnQuZGF0YS5pbnB1dHMubGVuZ3RoLCB1bnNwZW50cy5sZW5ndGgpO1xuICAgICAgLy8gVmVyaWZ5IHVzZXIga2V5IGhhcyBzaWduZWQgZWFjaCBpbnB1dCAoc2FtZSBwYXR0ZXJuIGFzIGJhY2t1cEtleVJlY292ZXJ5IHRlc3QpXG4gICAgICBwc2J0LmRhdGEuaW5wdXRzLmZvckVhY2goKGlucHV0LCBpKSA9PiB7XG4gICAgICAgIGNvbnN0IHVzZXJTaWduZWQgPSBwc2J0LnZhbGlkYXRlU2lnbmF0dXJlc09mSW5wdXRIRChpLCB3YWxsZXRLZXlzLnVzZXIpO1xuICAgICAgICB1c2VyU2lnbmVkLnNob3VsZC5lcWwodHJ1ZSwgYElucHV0ICR7aX0gc2hvdWxkIGJlIHNpZ25lZCBieSB1c2VyIGtleWApO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaXQoJ3Nob3VsZCB0ZXN0IHNpZ25lZCBjcm9zcyBjaGFpbiByZWNvdmVyeScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGdldFJlY292ZXJ5UHJvdmlkZXJTdHViID0gc2lub25cbiAgICAgICAgLnN0dWIoQWJzdHJhY3RVdHhvQ29pbi5wcm90b3R5cGUsICdnZXRSZWNvdmVyeVByb3ZpZGVyJylcbiAgICAgICAgLnJldHVybnMobmV3IE1vY2tDcm9zc0NoYWluUmVjb3ZlcnlQcm92aWRlcjxUTnVtYmVyPihzb3VyY2VDb2luLCBnZXREZXBvc2l0VW5zcGVudHMoKSwgZGVwb3NpdFR4KSk7XG4gICAgICBjb25zdCBwYXJhbXMgPSB7XG4gICAgICAgIHJlY292ZXJ5Q29pbixcbiAgICAgICAgdHhpZDogZGVwb3NpdFR4LmdldElkKCksXG4gICAgICAgIHJlY292ZXJ5QWRkcmVzcyxcbiAgICAgICAgd2FsbGV0OiByZWNvdmVyeVdhbGxldElkLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHNpZ25lZFJlY292ZXJ5ID0gKGF3YWl0IHNvdXJjZUNvaW4ucmVjb3ZlckZyb21Xcm9uZ0NoYWluPFROdW1iZXI+KHtcbiAgICAgICAgLi4ucGFyYW1zLFxuICAgICAgICB4cHJ2OiBrZXljaGFpbnNCYXNlNThbMF0ucHJ2LFxuICAgICAgfSkpIGFzIENyb3NzQ2hhaW5SZWNvdmVyeVNpZ25lZDxUTnVtYmVyPjtcbiAgICAgIHNob3VsZC5lcXVhbChnZXRSZWNvdmVyeVByb3ZpZGVyU3R1Yi5jYWxsQ291bnQsIDEpO1xuXG4gICAgICAvLyBWZXJpZnkgZml4dHVyZSBtYXRjaFxuICAgICAgYXdhaXQgbWF0Y2hGaXh0dXJlKCdzaWduZWQnLCBzaWduZWRSZWNvdmVyeSk7XG5cbiAgICAgIC8vIFZlcmlmeSBQU0JUIGhhcyB2YWxpZCBzaWduYXR1cmVzICh1c2VyIGtleSBzaWduZWQpXG4gICAgICBjaGVja1JlY292ZXJ5UHNidFNpZ25hdHVyZShzaWduZWRSZWNvdmVyeS50eEhleCBhcyBzdHJpbmcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0ZXN0IHVuc2lnbmVkIGNyb3NzIGNoYWluIHJlY292ZXJ5JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZ2V0UmVjb3ZlcnlQcm92aWRlclN0dWIgPSBzaW5vblxuICAgICAgICAuc3R1YihBYnN0cmFjdFV0eG9Db2luLnByb3RvdHlwZSwgJ2dldFJlY292ZXJ5UHJvdmlkZXInKVxuICAgICAgICAucmV0dXJucyhuZXcgTW9ja0Nyb3NzQ2hhaW5SZWNvdmVyeVByb3ZpZGVyPFROdW1iZXI+KHNvdXJjZUNvaW4sIGdldERlcG9zaXRVbnNwZW50cygpLCBkZXBvc2l0VHgpKTtcbiAgICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgICAgcmVjb3ZlcnlDb2luLFxuICAgICAgICB0eGlkOiBkZXBvc2l0VHguZ2V0SWQoKSxcbiAgICAgICAgcmVjb3ZlcnlBZGRyZXNzLFxuICAgICAgICB3YWxsZXQ6IHJlY292ZXJ5V2FsbGV0SWQsXG4gICAgICB9O1xuICAgICAgY29uc3QgdW5zaWduZWRSZWNvdmVyeSA9IChhd2FpdCBzb3VyY2VDb2luLnJlY292ZXJGcm9tV3JvbmdDaGFpbjxUTnVtYmVyPih7XG4gICAgICAgIC4uLnBhcmFtcyxcbiAgICAgICAgc2lnbmVkOiBmYWxzZSxcbiAgICAgIH0pKSBhcyBDcm9zc0NoYWluUmVjb3ZlcnlVbnNpZ25lZDxUTnVtYmVyPjtcbiAgICAgIHNob3VsZC5lcXVhbChnZXRSZWNvdmVyeVByb3ZpZGVyU3R1Yi5jYWxsQ291bnQsIDEpO1xuXG4gICAgICAvLyBWZXJpZnkgZml4dHVyZSBtYXRjaFxuICAgICAgYXdhaXQgbWF0Y2hGaXh0dXJlKCd1bnNpZ25lZCcsIHVuc2lnbmVkUmVjb3ZlcnkpO1xuXG4gICAgICAvLyBWZXJpZnkgdGhlIHVuc2lnbmVkIFBTQlQgY2FuIGJlIHNpZ25lZFxuICAgICAgY29uc3Qgc2lnbmVkVHggPSBhd2FpdCBzb3VyY2VDb2luLnNpZ25UcmFuc2FjdGlvbjxUTnVtYmVyPih7XG4gICAgICAgIHR4UHJlYnVpbGQ6IHVuc2lnbmVkUmVjb3ZlcnksXG4gICAgICAgIHBydjoga2V5Y2hhaW5zQmFzZTU4WzBdLnBydixcbiAgICAgICAgcHViczoga2V5Y2hhaW5zQmFzZTU4Lm1hcCgoaykgPT4gay5wdWIpIGFzIFRyaXBsZTxzdHJpbmc+LFxuICAgICAgfSk7XG4gICAgICBjaGVja1JlY292ZXJ5UHNidFNpZ25hdHVyZSgoc2lnbmVkVHggYXMgeyB0eEhleDogc3RyaW5nIH0pLnR4SGV4KTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGlzU3VwcG9ydGVkQ3Jvc3NDaGFpblJlY292ZXJ5KHNvdXJjZUNvaW46IEFic3RyYWN0VXR4b0NvaW4sIHJlY292ZXJ5Q29pbjogQWJzdHJhY3RVdHhvQ29pbik6IGJvb2xlYW4ge1xuICByZXR1cm4gc3VwcG9ydGVkQ3Jvc3NDaGFpblJlY292ZXJpZXNbc291cmNlQ29pbi5nZXRGYW1pbHkoKV0/LmluY2x1ZGVzKHJlY292ZXJ5Q29pbi5nZXRGYW1pbHkoKSk7XG59XG5cbnV0eG9Db2lucy5mb3JFYWNoKChjb2luKSA9PiB7XG4gIHV0eG9Db2luc1xuICAgIC5maWx0ZXIoXG4gICAgICAob3RoZXJDb2luKSA9PlxuICAgICAgICBjb2luICE9PSBvdGhlckNvaW4gJiZcbiAgICAgICAgaXNTdXBwb3J0ZWRDcm9zc0NoYWluUmVjb3ZlcnkoY29pbiwgb3RoZXJDb2luKSAmJlxuICAgICAgICAoKGlzTWFpbm5ldENvaW4oY29pbi5uYW1lKSAmJiBpc01haW5uZXRDb2luKG90aGVyQ29pbi5uYW1lKSkgfHxcbiAgICAgICAgICAoaXNUZXN0bmV0Q29pbihjb2luLm5hbWUpICYmIGlzVGVzdG5ldENvaW4ob3RoZXJDb2luLm5hbWUpKSlcbiAgICApXG4gICAgLmZvckVhY2goKG90aGVyQ29pbikgPT4ge1xuICAgICAgaWYgKGNvaW4uYW1vdW50VHlwZSA9PT0gJ2JpZ2ludCcpIHtcbiAgICAgICAgcnVuPGJpZ2ludD4oY29pbiwgb3RoZXJDb2luKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJ1bihjb2luLCBvdGhlckNvaW4pO1xuICAgICAgfVxuICAgIH0pO1xufSk7XG5cbmRlc2NyaWJlKGBDcm9zcy1DaGFpbiBSZWNvdmVyeSBnZXRXYWxsZXRgLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IGJpdGdvID0gZGVmYXVsdEJpdEdvO1xuICBjb25zdCByZWNvdmVyeUNvaW4gPSBnZXRVdHhvQ29pbignYnRjJyk7XG4gIGNvbnN0IHJlY292ZXJ5V2FsbGV0SWQgPSAnNWFiYWNlYmUyOGQ3MmZiZDA3ZTBiOGNiYmEwZmYzOWUnO1xuXG4gIGl0KCdzaG91bGQgc2VhcmNoIHYxIHdhbGxldHMgaWYgdGhlIHYyIGVuZHBvaW50IHJlc3BvbmRzIHdpdGggYSA0eHggZXJyb3InLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgZXJyb3JSZXNwb25zZXMgPSBbNDAwLCA0MDRdO1xuXG4gICAgZm9yIChjb25zdCBlcnJvciBvZiBlcnJvclJlc3BvbnNlcykge1xuICAgICAgY29uc3Qgbm9ja1YyV2FsbGV0ID0gbm9ja0JpdEdvKGJpdGdvKVxuICAgICAgICAuZ2V0KGAvYXBpL3YyLyR7cmVjb3ZlcnlDb2luLmdldENoYWluKCl9L3dhbGxldC8ke3JlY292ZXJ5V2FsbGV0SWR9YClcbiAgICAgICAgLnJlcGx5KGVycm9yKTtcbiAgICAgIGNvbnN0IG5vY2tWMVdhbGxldCA9IG5vY2tCaXRHbyhiaXRnbykuZ2V0KGAvYXBpL3YxL3dhbGxldC8ke3JlY292ZXJ5V2FsbGV0SWR9YCkucmVwbHkoZXJyb3IpO1xuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoXG4gICAgICAgICgpID0+IGdldFdhbGxldChiaXRnbywgcmVjb3ZlcnlDb2luLCByZWNvdmVyeVdhbGxldElkKSxcbiAgICAgICAgRXJyb3IoYGNvdWxkIG5vdCBnZXQgd2FsbGV0ICR7cmVjb3ZlcnlXYWxsZXRJZH0gZnJvbSB2MSBvciB2MjogQXBpUmVzcG9uc2VFcnJvcjogJHtlcnJvcn1gKVxuICAgICAgKTtcbiAgICAgIG5vY2tWMldhbGxldC5kb25lKCk7XG4gICAgICBub2NrVjFXYWxsZXQuZG9uZSgpO1xuICAgIH1cbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCB0aHJvdyBhbiBlcnJvciBpZiB0aGUgdjIgZW5kcG9pbnQgcmVzcG9uZHMgd2l0aCBhIDV4eCBlcnJvcicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBlcnJvclJlc3BvbnNlcyA9IFs1MDBdO1xuICAgIGZvciAoY29uc3QgZXJyb3Igb2YgZXJyb3JSZXNwb25zZXMpIHtcbiAgICAgIGNvbnN0IG5vY2tWMldhbGxldCA9IG5vY2tCaXRHbyhiaXRnbylcbiAgICAgICAgLmdldChgL2FwaS92Mi8ke3JlY292ZXJ5Q29pbi5nZXRDaGFpbigpfS93YWxsZXQvJHtyZWNvdmVyeVdhbGxldElkfWApXG4gICAgICAgIC5yZXBseShlcnJvcik7XG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cygoKSA9PiBnZXRXYWxsZXQoYml0Z28sIHJlY292ZXJ5Q29pbiwgcmVjb3ZlcnlXYWxsZXRJZCksIHtcbiAgICAgICAgbmFtZTogJ0FwaVJlc3BvbnNlRXJyb3InLFxuICAgICAgICBzdGF0dXM6IDUwMCxcbiAgICAgICAgcmVzdWx0OiB7fSxcbiAgICAgICAgaW52YWxpZFRva2VuOiBmYWxzZSxcbiAgICAgICAgbmVlZHNPVFA6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgICBub2NrVjJXYWxsZXQuZG9uZSgpO1xuICAgIH1cbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoJ2NvbnZlcnRMdGNBZGRyZXNzVG9MZWdhY3lGb3JtYXQnLCBmdW5jdGlvbiAoKSB7XG4gIGl0KCdzaG91bGQgY29udmVydCBNLi4uIFAyU0ggYWRkcmVzcyB0byAzLi4uIGxlZ2FjeSBmb3JtYXQnLCBmdW5jdGlvbiAoKSB7XG4gICAgLy8gVGhlc2UgdHdvIGFkZHJlc3NlcyByZXByZXNlbnQgdGhlIHNhbWUgdW5kZXJseWluZyBzY3JpcHQgaGFzaDpcbiAgICAvLyAtIE1OUTd6a2dNc2FWNjdyc2pBM0p1UDU5UkM1d3hSWHB3Z0UgaXMgdGhlIExUQyBmb3JtYXQgKHNjcmlwdEhhc2ggMHgzMilcbiAgICAvLyAtIDNHQnlnc0dQdlRkZktNYnE0QUtaWlJ1MXNQTVdQRXNCZmQgaXMgdGhlIEJUQyBmb3JtYXQgKHNjcmlwdEhhc2ggMHgwNSlcbiAgICBjb25zdCBsdGNBZGRyZXNzID0gJ01OUTd6a2dNc2FWNjdyc2pBM0p1UDU5UkM1d3hSWHB3Z0UnO1xuICAgIGNvbnN0IGV4cGVjdGVkTGVnYWN5QWRkcmVzcyA9ICczR0J5Z3NHUHZUZGZLTWJxNEFLWlpSdTFzUE1XUEVzQmZkJztcblxuICAgIGNvbnN0IGxlZ2FjeUFkZHJlc3MgPSBjb252ZXJ0THRjQWRkcmVzc1RvTGVnYWN5Rm9ybWF0KGx0Y0FkZHJlc3MsICdsdGMnKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwobGVnYWN5QWRkcmVzcywgZXhwZWN0ZWRMZWdhY3lBZGRyZXNzKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBjb252ZXJ0IE1ENjhQc2RoZUt4Y1lzclZMeVpSWGdvU0RMbkIxTWRWdEUgdG8gbGVnYWN5IGZvcm1hdCcsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBhZGRyZXNzID0gJ01ENjhQc2RoZUt4Y1lzclZMeVpSWGdvU0RMbkIxTWRWdEUnO1xuICAgIGNvbnN0IGxlZ2FjeUFkZHJlc3MgPSBjb252ZXJ0THRjQWRkcmVzc1RvTGVnYWN5Rm9ybWF0KGFkZHJlc3MsICdsdGMnKTtcblxuICAgIC8vIFNob3VsZCBzdGFydCB3aXRoICczJyAobGVnYWN5IEJUQyBQMlNIIGZvcm1hdClcbiAgICBhc3NlcnQub2sobGVnYWN5QWRkcmVzcy5zdGFydHNXaXRoKCczJyksIGBFeHBlY3RlZCBhZGRyZXNzIHRvIHN0YXJ0IHdpdGggJzMnLCBnb3Q6ICR7bGVnYWN5QWRkcmVzc31gKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBub3QgbW9kaWZ5IGJlY2gzMiBhZGRyZXNzZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgYmVjaDMyQWRkcmVzcyA9ICdsdGMxcWdybDh6cG5kc2tsYWE5c3dnZDV2ZXZ5eG14NXg2M3Zjcmw3ZGs0JztcbiAgICBjb25zdCByZXN1bHQgPSBjb252ZXJ0THRjQWRkcmVzc1RvTGVnYWN5Rm9ybWF0KGJlY2gzMkFkZHJlc3MsICdsdGMnKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVzdWx0LCBiZWNoMzJBZGRyZXNzKTtcbiAgfSk7XG59KTtcbiJdfQ==
|
|
298
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3Jvc3NDaGFpblJlY292ZXJ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGVzdC91bml0L3JlY292ZXJ5L2Nyb3NzQ2hhaW5SZWNvdmVyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLCtDQUFpQztBQUVqQyxpQ0FBa0M7QUFDbEMsNkJBQThCO0FBRTlCLDhDQUEwQztBQUMxQyxnREFBNkU7QUFDN0UsNkNBQStCO0FBRS9CLHNDQVFzQjtBQUN0Qiw4Q0FBa0U7QUFFbEUsa0NBVWlCO0FBQ2pCLGlEQUE4QztBQUU5QyxpQ0FBd0Q7QUFFeEQsU0FBUyxRQUFRLENBQUMsQ0FBaUI7SUFDakMsT0FBTyxJQUFBLGtCQUFPLEVBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUN4QyxDQUFDO0FBRUQsU0FBUyxVQUFVLENBQUMsSUFBc0IsRUFBRSxRQUFnQixFQUFFLFVBQWtDO0lBQzlGLE9BQU87UUFDTCxJQUFBLHFCQUFTLEdBQUU7YUFDUixHQUFHLENBQUMsV0FBVyxJQUFJLENBQUMsUUFBUSxFQUFFLFdBQVcsUUFBUSxFQUFFLENBQUM7YUFDcEQsS0FBSyxDQUFDLEdBQUcsRUFBRTtZQUNWLEVBQUUsRUFBRSxRQUFRO1lBQ1osSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDckIsS0FBSyxFQUFFLG9CQUFvQjtZQUMzQixJQUFJLEVBQUUsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ3pDLENBQUM7YUFDRCxPQUFPLEVBQUU7UUFDWixHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUN0QixJQUFBLHFCQUFTLEdBQUU7YUFDUixHQUFHLENBQUMsV0FBVyxJQUFJLENB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Q25FLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLG9FQUFvRSxFQUFFO1FBQ3ZFLE1BQU0sT0FBTyxHQUFHLG9DQUFvQyxDQUFDO1FBQ3JELE1BQU0sYUFBYSxHQUFHLElBQUEscUNBQStCLEVBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRXRFLGlEQUFpRDtRQUNqRCxNQUFNLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUUsNENBQTRDLGFBQWEsRUFBRSxDQUFDLENBQUM7SUFDeEcsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsb0NBQW9DLEVBQUU7UUFDdkMsTUFBTSxhQUFhLEdBQUcsNkNBQTZDLENBQUM7UUFDcEUsTUFBTSxNQUFNLEdBQUcsSUFBQSxxQ0FBK0IsRUFBQyxhQUFhLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDckUsTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDNUMsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5pbXBvcnQgc2hvdWxkID0gcmVxdWlyZSgnc2hvdWxkJyk7XG5pbXBvcnQgbm9jayA9IHJlcXVpcmUoJ25vY2snKTtcbmltcG9ydCB7IFRyaXBsZSB9IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQgeyBnZXRTZWVkIH0gZnJvbSAnQGJpdGdvL3Nkay10ZXN0JztcbmltcG9ydCB7IGFkZHJlc3MgYXMgd2FzbUFkZHJlc3MsIGZpeGVkU2NyaXB0V2FsbGV0IH0gZnJvbSAnQGJpdGdvL3dhc20tdXR4byc7XG5pbXBvcnQgKiBhcyBzaW5vbiBmcm9tICdzaW5vbic7XG5cbmltcG9ydCB7XG4gIEFic3RyYWN0VXR4b0NvaW4sXG4gIENyb3NzQ2hhaW5SZWNvdmVyeVNpZ25lZCxcbiAgQ3Jvc3NDaGFpblJlY292ZXJ5VW5zaWduZWQsXG4gIGdldFdhbGxldCxcbiAgc3VwcG9ydGVkQ3Jvc3NDaGFpblJlY292ZXJpZXMsXG4gIGdlbmVyYXRlQWRkcmVzcyxcbiAgY29udmVydEx0Y0FkZHJlc3NUb0xlZ2FjeUZvcm1hdCxcbn0gZnJvbSAnLi4vLi4vLi4vc3JjJztcbmltcG9ydCB7IGlzTWFpbm5ldENvaW4sIGlzVGVzdG5ldENvaW4gfSBmcm9tICcuLi8uLi8uLi9zcmMvbmFtZXMnO1xuaW1wb3J0IHR5cGUgeyBXYWxsZXRVbnNwZW50IH0gZnJvbSAnLi4vLi4vLi4vc3JjL3Vuc3BlbnQnO1xuaW1wb3J0IHtcbiAgZ2V0Rml4dHVyZSxcbiAga2V5Y2hhaW5zQmFzZTU4LFxuICBLZXljaGFpbkJhc2U1OCxcbiAgc2hvdWxkRXF1YWxKU09OLFxuICB1dHhvQ29pbnMsXG4gIGdldERlZmF1bHRXYXNtV2FsbGV0S2V5cyxcbiAgZGVmYXVsdEJpdEdvLFxuICBnZXRVdHhvQ29pbixcbiAgY3JlYXRlV2FzbVdhbGxldFVuc3BlbnQsXG59IGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgbm9ja0JpdEdvIH0gZnJvbSAnLi4vdXRpbC9ub2NrQml0R28nO1xuXG5pbXBvcnQgeyBXYXNtQ3Jvc3NDaGFpblJlY292ZXJ5UHJvdmlkZXIgfSBmcm9tICcuL21vY2snO1xuXG5mdW5jdGlvbiBnZXRLZXlJZChrOiBLZXljaGFpbkJhc2U1OCk6IHN0cmluZyB7XG4gIHJldHVybiBnZXRTZWVkKGsucHViKS50b1N0cmluZygnaGV4Jyk7XG59XG5cbmZ1bmN0aW9uIG5vY2tXYWxsZXQoY29pbjogQWJzdHJhY3RVdHhvQ29pbiwgd2FsbGV0SWQ6IHN0cmluZywgd2FsbGV0S2V5czogVHJpcGxlPEtleWNoYWluQmFzZTU4Pik6IG5vY2suU2NvcGVbXSB7XG4gIHJldHVybiBbXG4gICAgbm9ja0JpdEdvKClcbiAgICAgIC5nZXQoYC9hcGkvdjIvJHtjb2luLmdldENoYWluKCl9L3dhbGxldC8ke3dhbGxldElkfWApXG4gICAgICAucmVwbHkoMjAwLCB7XG4gICAgICAgIGlkOiB3YWxsZXRJZCxcbiAgICAgICAgY29pbjogY29pbi5nZXRDaGFpbigpLFxuICAgICAgICBsYWJlbDogJ2Nyb3NzQ2hhaW5SZWNvdmVyeScsXG4gICAgICAgIGtleXM6IHdhbGxldEtleXMubWFwKChrKSA9PiBnZXRLZXlJZChrKSksXG4gICAgICB9KVxuICAgICAgLnBlcnNpc3QoKSxcbiAgICAuLi53YWxsZXRLZXlzLm1hcCgoaykgPT5cbiAgICAgIG5vY2tCaXRHbygpXG4gICAgICAgIC5nZXQoYC9hcGkvdjIvJHtjb2luLmdldENoYWluKCl9L2tleS8ke2dldEtleUlkKGspfWApXG4gICAgICAgIC5yZXBseSgyMDAsIGspXG4gICAgICAgIC5wZXJzaXN0KClcbiAgICApLFxuICBdO1xufVxuXG50eXBlIEFkZHJlc3MgPSB7XG4gIGFkZHJlc3M6IHN0cmluZztcbiAgY2hhaW46IG51bWJlcjtcbiAgaW5kZXg6IG51bWJlcjtcbn07XG5cbmZ1bmN0aW9uIG5vY2tXYWxsZXRBZGRyZXNzKGNvaW46IEFic3RyYWN0VXR4b0NvaW4sIHdhbGxldElkOiBzdHJpbmcsIGFkZHJlc3M6IEFkZHJlc3MpOiBub2NrLlNjb3BlIHtcbiAgcmV0dXJuIG5vY2tCaXRHbygpXG4gICAgLmdldChgL2FwaS92Mi8ke2NvaW4uZ2V0Q2hhaW4oKX0vd2FsbGV0LyR7d2FsbGV0SWR9L2FkZHJlc3MvJHthZGRyZXNzLmFkZHJlc3N9YClcbiAgICAucmVwbHkoMjAwLCB7XG4gICAgICBhZGRyZXNzOiBhZGRyZXNzLmFkZHJlc3MsXG4gICAgICBjaGFpbjogYWRkcmVzcy5jaGFpbixcbiAgICAgIGluZGV4OiBhZGRyZXNzLmluZGV4LFxuICAgICAgY29pbjogY29pbi5nZXRDaGFpbigpLFxuICAgICAgd2FsbGV0OiB3YWxsZXRJZCxcbiAgICB9KVxuICAgIC5wZXJzaXN0KCk7XG59XG5cbi8qKlxuICogU2V0dXAgdGVzdCBmb3IgY3Jvc3MtY2hhaW4gcmVjb3ZlcnkuXG4gKlxuICogVXNlcnMgY2FuIHJlY2VpdmUgZGVwb3NpdHMgb24gd2FsbGV0IGFkZHJlc3NlcyB0aGF0IGFyZSBvbiBhIGRpZmZlcmVudCBjaGFpbi5cbiAqXG4gKiBGb3IgaW5zdGFuY2UsIGEgdXNlciBjYW4gcmVjZWl2ZSBsaXRlY29pbiBvbiBhIGJpdGNvaW4gd2FsbGV0LlxuICogVGhpcyBtZWFucyB0aGF0IHRoZSBsaXRlY29pbiBibG9ja2NoYWluIGhhcyBhIHRyYW5zYWN0aW9uIHdpdGggb3V0cHV0cyB0aGF0IGFyZSBzcGVuZGFibGVcbiAqIHdpdGgga2V5cyB0aGF0IHdlcmUgb3JpZ2luYWxseSBjcmVhdGVkIGZvciBhIEJpdEdvIEJUQyB3YWxsZXQuXG4gKiBJbiB0aGlzIGV4YW1wbGUsIExUQyBpcyB0aGUgXCJzb3VyY2UgY29pblwiIGFuZCBCVEMgaXMgdGhlIFwicmVjb3ZlcnkgY29pblwiXG4gKiBJbiBjYXNlcyBsaWtlIHRoZXNlIHdlIG11c3QgdXNlIGNvbnN0cnVjdCBhIHRyYW5zYWN0aW9uIGZvciBsaXRlY29pbiBuZXR3b3JrIHVzaW5nIGtleXMgb2YgdGhlXG4gKiBiaXRjb2luIHdhbGxldC5cbiAqXG4gKiBAcGFyYW0gc291cmNlQ29pbiAtIHRoZSBjb2luIHRvIGNvbnN0cnVjdCB0aGUgdHJhbnNhY3Rpb24gZm9yXG4gKiBAcGFyYW0gcmVjb3ZlcnlDb2luIC0gdGhlIGNvaW4gdGhlIHJlY2VpdmluZyB3YWxsZXQgd2FzIHNldCB1cCBmb3JcbiAqL1xuLy8gR2V0IHdhc20gd2FsbGV0IGtleXMgZm9yIHNpZ25hdHVyZSB2ZXJpZmljYXRpb25cbmNvbnN0IHsgd2FsbGV0S2V5czogd2FzbVdhbGxldEtleXMsIHhwcml2cyB9ID0gZ2V0RGVmYXVsdFdhc21XYWxsZXRLZXlzKCk7XG5cbmZ1bmN0aW9uIHJ1bjxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPihzb3VyY2VDb2luOiBBYnN0cmFjdFV0eG9Db2luLCByZWNvdmVyeUNvaW46IEFic3RyYWN0VXR4b0NvaW4pIHtcbiAgZGVzY3JpYmUoYENyb3NzLUNoYWluIFJlY292ZXJ5IFtzb3VyY2VDb2luPSR7c291cmNlQ29pbi5nZXRDaGFpbigpfSByZWNvdmVyeUNvaW49JHtyZWNvdmVyeUNvaW4uZ2V0Q2hhaW4oKX1dYCwgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHJlY292ZXJ5V2FsbGV0SWQgPSAnNWFiYWNlYmUyOGQ3MmZiZDA3ZTBiOGNiYmEwZmYzOWUnO1xuICAgIC8vIHRoZSBhZGRyZXNzIHRoZSBhY2NpZGVudGFsIGRlcG9zaXQgd2VudCB0bywgaW4gYm90aCBzb3VyY2VDb2luIGFuZCBhZGRyZXNzQ29pbiBmb3JtYXRzXG4gICAgY29uc3QgW2RlcG9zaXRBZGRyZXNzU291cmNlQ29pbiwgZGVwb3NpdEFkZHJlc3NSZWNvdmVyeUNvaW5dID0gW3NvdXJjZUNvaW4sIHJlY292ZXJ5Q29pbl0ubWFwKChjb2luKSA9PiAoe1xuICAgICAgYWRkcmVzczogZ2VuZXJhdGVBZGRyZXNzKGNvaW4ubmFtZSwgeyBrZXljaGFpbnM6IGtleWNoYWluc0Jhc2U1OCwgY2hhaW46IDAsIGluZGV4OiAwIH0pLFxuICAgICAgY2hhaW46IDAsXG4gICAgICBpbmRleDogMCxcbiAgICB9KSk7XG4gICAgY29uc3QgY2hhaW4gPSAwO1xuICAgIGNvbnN0IGluZGV4ID0gMTtcbiAgICAvLyB0aGUgYWRkcmVzcyB3aGVyZSB3ZSB3YW50IHRvIHJlY292ZXIgb3VyIGZ1bmRzIHRvXG4gICAgY29uc3QgcmVjb3ZlcnlBZGRyZXNzID0gZ2VuZXJhdGVBZGRyZXNzKHNvdXJjZUNvaW4ubmFtZSwge1xuICAgICAga2V5Y2hhaW5zOiBrZXljaGFpbnNCYXNlNTgsXG4gICAgICBjaGFpbixcbiAgICAgIGluZGV4LFxuICAgIH0pO1xuICAgIGNvbnN0IG5vY2tzOiBub2NrLlNjb3BlW10gPSBbXTtcblxuICAgIC8vIENyZWF0ZSByZWNvdmVyeSB1bnNwZW50IHVzaW5nIHdhc20tdXR4byAobm8gdXR4b2xpYiBkZXBlbmRlbmN5KVxuICAgIGZ1bmN0aW9uIGdldFJlY292ZXJ5VW5zcGVudHMoKTogV2FsbGV0VW5zcGVudDxUTnVtYmVyPltdIHtcbiAgICAgIGNvbnN0IGRlcG9zaXRWYWx1ZSA9IChzb3VyY2VDb2luLmFtb3VudFR5cGUgPT09ICdiaWdpbnQnID8gQmlnSW50KDFlOCkgOiAxZTgpIGFzIFROdW1iZXI7XG4gICAgICByZXR1cm4gW1xuICAgICAgICBjcmVhdGVXYXNtV2FsbGV0VW5zcGVudDxUTnVtYmVyPihkZXBvc2l0QWRkcmVzc1NvdXJjZUNvaW4uYWRkcmVzcywgY2hhaW4sIGluZGV4LCBkZXBvc2l0VmFsdWUsIHNvdXJjZUNvaW4ubmFtZSksXG4gICAgICBdO1xuICAgIH1cblxuICAgIGJlZm9yZSgnc2V0dXAgbm9ja3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBub2Nrcy5wdXNoKC4uLm5vY2tXYWxsZXQocmVjb3ZlcnlDb2luLCByZWNvdmVyeVdhbGxldElkLCBrZXljaGFpbnNCYXNlNTgpKTtcbiAgICAgIG5vY2tzLnB1c2gobm9ja1dhbGxldEFkZHJlc3MocmVjb3ZlcnlDb2luLCByZWNvdmVyeVdhbGxldElkLCBkZXBvc2l0QWRkcmVzc1JlY292ZXJ5Q29pbikpO1xuICAgIH0pO1xuXG4gICAgYWZ0ZXIoZnVuY3Rpb24gKCkge1xuICAgICAgbm9ja3MuZm9yRWFjaCgobikgPT4gbi5kb25lKCkpO1xuICAgIH0pO1xuXG4gICAgYWZ0ZXIoZnVuY3Rpb24gKCkge1xuICAgICAgbm9jay5jbGVhbkFsbCgpO1xuICAgIH0pO1xuXG4gICAgYWZ0ZXJFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIHNpbm9uLnJlc3RvcmUoKTtcbiAgICB9KTtcblxuICAgIGFzeW5jIGZ1bmN0aW9uIG1hdGNoRml4dHVyZShcbiAgICAgIG5hbWU6IHN0cmluZyxcbiAgICAgIHJlY292ZXJ5OiBDcm9zc0NoYWluUmVjb3ZlcnlTaWduZWQ8VE51bWJlcj4gfCBDcm9zc0NoYWluUmVjb3ZlcnlVbnNpZ25lZDxUTnVtYmVyPlxuICAgICkge1xuICAgICAgbGV0IHJlY292ZXJ5T2JqOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHsgLi4ucmVjb3ZlcnkgfTtcbiAgICAgIGlmIChzb3VyY2VDb2luLmFtb3VudFR5cGUgPT09ICdiaWdpbnQnKSB7XG4gICAgICAgIHJlY292ZXJ5T2JqID0gSlNPTi5wYXJzZShcbiAgICAgICAgICBKU09OLnN0cmluZ2lmeShyZWNvdmVyeU9iaiwgKGssIHYpID0+IHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdiA9PT0gJ2JpZ2ludCcpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHYudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiB2O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBzaG91bGRFcXVhbEpTT04oXG4gICAgICAgIHJlY292ZXJ5T2JqLFxuICAgICAgICBhd2FpdCBnZXRGaXh0dXJlKHNvdXJjZUNvaW4sIGByZWNvdmVyeS9jcm9zc0NoYWluUmVjb3ZlcnktJHtyZWNvdmVyeUNvaW4uZ2V0Q2hhaW4oKX0tJHtuYW1lfWAsIHJlY292ZXJ5T2JqKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjaGVja1JlY292ZXJ5UHNidFNpZ25hdHVyZShwc2J0SGV4OiBzdHJpbmcpIHtcbiAgICAgIC8vIFBhcnNlIHVzaW5nIHdhc20tdXR4byBmb3Igc2lnbmF0dXJlIHZlcmlmaWNhdGlvblxuICAgICAgY29uc3Qgd2FzbVBzYnQgPSBmaXhlZFNjcmlwdFdhbGxldC5CaXRHb1BzYnQuZnJvbUJ5dGVzKEJ1ZmZlci5mcm9tKHBzYnRIZXgsICdoZXgnKSwgc291cmNlQ29pbi5uYW1lKTtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IHdhc21Qc2J0LnBhcnNlVHJhbnNhY3Rpb25XaXRoV2FsbGV0S2V5cyh3YXNtV2FsbGV0S2V5cywgeyBwdWJsaWNLZXlzOiBbXSB9KTtcbiAgICAgIGNvbnN0IHVuc3BlbnRzID0gZ2V0UmVjb3ZlcnlVbnNwZW50cygpO1xuICAgICAgc2hvdWxkLmVxdWFsKHBhcnNlZC5pbnB1dHMubGVuZ3RoLCB1bnNwZW50cy5sZW5ndGgpO1xuICAgICAgLy8gVmVyaWZ5IHVzZXIga2V5IGhhcyBzaWduZWQgZWFjaCBpbnB1dCAoc2FtZSBwYXR0ZXJuIGFzIGJhY2t1cEtleVJlY292ZXJ5IHRlc3QpXG4gICAgICBwYXJzZWQuaW5wdXRzLmZvckVhY2goKF8sIGkpID0+IHtcbiAgICAgICAgY29uc3QgdXNlclNpZ25lZCA9IHdhc21Qc2J0LnZlcmlmeVNpZ25hdHVyZShpLCB4cHJpdnNbMF0pO1xuICAgICAgICB1c2VyU2lnbmVkLnNob3VsZC5lcWwodHJ1ZSwgYElucHV0ICR7aX0gc2hvdWxkIGJlIHNpZ25lZCBieSB1c2VyIGtleWApO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaXQoJ3Nob3VsZCB0ZXN0IHNpZ25lZCBjcm9zcyBjaGFpbiByZWNvdmVyeScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGRlcG9zaXRVbnNwZW50ID0gZ2V0UmVjb3ZlcnlVbnNwZW50cygpWzBdO1xuICAgICAgLy8gUGFyc2UgdHhpZCBmcm9tIHRoZSB1bnNwZW50IGlkIChmb3JtYXQ6IHR4aWQ6dm91dClcbiAgICAgIGNvbnN0IGRlcG9zaXRUeGlkID0gZGVwb3NpdFVuc3BlbnQuaWQuc3BsaXQoJzonKVswXTtcbiAgICAgIC8vIFVzZSB0aGUgZGVwb3NpdCBhZGRyZXNzIGFzIHRoZSBpbnB1dCBhZGRyZXNzIChzaW11bGF0aW5nIGEgcDJzaCBpbnB1dClcbiAgICAgIGNvbnN0IGlucHV0QWRkcmVzcyA9IGdlbmVyYXRlQWRkcmVzcyhzb3VyY2VDb2luLm5hbWUsIHsga2V5Y2hhaW5zOiBrZXljaGFpbnNCYXNlNTgsIGNoYWluOiAwLCBpbmRleDogMiB9KTtcbiAgICAgIGNvbnN0IGdldFJlY292ZXJ5UHJvdmlkZXJTdHViID0gc2lub25cbiAgICAgICAgLnN0dWIoQWJzdHJhY3RVdHhvQ29pbi5wcm90b3R5cGUsICdnZXRSZWNvdmVyeVByb3ZpZGVyJylcbiAgICAgICAgLnJldHVybnMobmV3IFdhc21Dcm9zc0NoYWluUmVjb3ZlcnlQcm92aWRlcjxUTnVtYmVyPihzb3VyY2VDb2luLCBkZXBvc2l0VW5zcGVudCwgW2lucHV0QWRkcmVzc10pKTtcbiAgICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgICAgcmVjb3ZlcnlDb2luLFxuICAgICAgICB0eGlkOiBkZXBvc2l0VHhpZCxcbiAgICAgICAgcmVjb3ZlcnlBZGRyZXNzLFxuICAgICAgICB3YWxsZXQ6IHJlY292ZXJ5V2FsbGV0SWQsXG4gICAgICB9O1xuICAgICAgY29uc3Qgc2lnbmVkUmVjb3ZlcnkgPSAoYXdhaXQgc291cmNlQ29pbi5yZWNvdmVyRnJvbVdyb25nQ2hhaW48VE51bWJlcj4oe1xuICAgICAgICAuLi5wYXJhbXMsXG4gICAgICAgIHhwcnY6IGtleWNoYWluc0Jhc2U1OFswXS5wcnYsXG4gICAgICB9KSkgYXMgQ3Jvc3NDaGFpblJlY292ZXJ5U2lnbmVkPFROdW1iZXI+O1xuICAgICAgc2hvdWxkLmVxdWFsKGdldFJlY292ZXJ5UHJvdmlkZXJTdHViLmNhbGxDb3VudCwgMSk7XG5cbiAgICAgIC8vIFZlcmlmeSBmaXh0dXJlIG1hdGNoXG4gICAgICBhd2FpdCBtYXRjaEZpeHR1cmUoJ3NpZ25lZCcsIHNpZ25lZFJlY292ZXJ5KTtcblxuICAgICAgLy8gVmVyaWZ5IFBTQlQgaGFzIHZhbGlkIHNpZ25hdHVyZXMgKHVzZXIga2V5IHNpZ25lZClcbiAgICAgIGNoZWNrUmVjb3ZlcnlQc2J0U2lnbmF0dXJlKHNpZ25lZFJlY292ZXJ5LnR4SGV4IGFzIHN0cmluZyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRlc3QgdW5zaWduZWQgY3Jvc3MgY2hhaW4gcmVjb3ZlcnknLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBkZXBvc2l0VW5zcGVudCA9IGdldFJlY292ZXJ5VW5zcGVudHMoKVswXTtcbiAgICAgIC8vIFBhcnNlIHR4aWQgZnJvbSB0aGUgdW5zcGVudCBpZCAoZm9ybWF0OiB0eGlkOnZvdXQpXG4gICAgICBjb25zdCBkZXBvc2l0VHhpZCA9IGRlcG9zaXRVbnNwZW50LmlkLnNwbGl0KCc6JylbMF07XG4gICAgICAvLyBVc2UgdGhlIGRlcG9zaXQgYWRkcmVzcyBhcyB0aGUgaW5wdXQgYWRkcmVzcyAoc2ltdWxhdGluZyBhIHAyc2ggaW5wdXQpXG4gICAgICBjb25zdCBpbnB1dEFkZHJlc3MgPSBnZW5lcmF0ZUFkZHJlc3Moc291cmNlQ29pbi5uYW1lLCB7IGtleWNoYWluczoga2V5Y2hhaW5zQmFzZTU4LCBjaGFpbjogMCwgaW5kZXg6IDIgfSk7XG4gICAgICBjb25zdCBnZXRSZWNvdmVyeVByb3ZpZGVyU3R1YiA9IHNpbm9uXG4gICAgICAgIC5zdHViKEFic3RyYWN0VXR4b0NvaW4ucHJvdG90eXBlLCAnZ2V0UmVjb3ZlcnlQcm92aWRlcicpXG4gICAgICAgIC5yZXR1cm5zKG5ldyBXYXNtQ3Jvc3NDaGFpblJlY292ZXJ5UHJvdmlkZXI8VE51bWJlcj4oc291cmNlQ29pbiwgZGVwb3NpdFVuc3BlbnQsIFtpbnB1dEFkZHJlc3NdKSk7XG4gICAgICBjb25zdCBwYXJhbXMgPSB7XG4gICAgICAgIHJlY292ZXJ5Q29pbixcbiAgICAgICAgdHhpZDogZGVwb3NpdFR4aWQsXG4gICAgICAgIHJlY292ZXJ5QWRkcmVzcyxcbiAgICAgICAgd2FsbGV0OiByZWNvdmVyeVdhbGxldElkLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHVuc2lnbmVkUmVjb3ZlcnkgPSAoYXdhaXQgc291cmNlQ29pbi5yZWNvdmVyRnJvbVdyb25nQ2hhaW48VE51bWJlcj4oe1xuICAgICAgICAuLi5wYXJhbXMsXG4gICAgICAgIHNpZ25lZDogZmFsc2UsXG4gICAgICB9KSkgYXMgQ3Jvc3NDaGFpblJlY292ZXJ5VW5zaWduZWQ8VE51bWJlcj47XG4gICAgICBzaG91bGQuZXF1YWwoZ2V0UmVjb3ZlcnlQcm92aWRlclN0dWIuY2FsbENvdW50LCAxKTtcblxuICAgICAgLy8gVmVyaWZ5IGZpeHR1cmUgbWF0Y2hcbiAgICAgIGF3YWl0IG1hdGNoRml4dHVyZSgndW5zaWduZWQnLCB1bnNpZ25lZFJlY292ZXJ5KTtcblxuICAgICAgLy8gVmVyaWZ5IHRoZSB1bnNpZ25lZCBQU0JUIGNhbiBiZSBzaWduZWRcbiAgICAgIGNvbnN0IHNpZ25lZFR4ID0gYXdhaXQgc291cmNlQ29pbi5zaWduVHJhbnNhY3Rpb248VE51bWJlcj4oe1xuICAgICAgICB0eFByZWJ1aWxkOiB1bnNpZ25lZFJlY292ZXJ5LFxuICAgICAgICBwcnY6IGtleWNoYWluc0Jhc2U1OFswXS5wcnYsXG4gICAgICAgIHB1YnM6IGtleWNoYWluc0Jhc2U1OC5tYXAoKGspID0+IGsucHViKSBhcyBUcmlwbGU8c3RyaW5nPixcbiAgICAgIH0pO1xuICAgICAgY2hlY2tSZWNvdmVyeVBzYnRTaWduYXR1cmUoKHNpZ25lZFR4IGFzIHsgdHhIZXg6IHN0cmluZyB9KS50eEhleCk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBpc1N1cHBvcnRlZENyb3NzQ2hhaW5SZWNvdmVyeShzb3VyY2VDb2luOiBBYnN0cmFjdFV0eG9Db2luLCByZWNvdmVyeUNvaW46IEFic3RyYWN0VXR4b0NvaW4pOiBib29sZWFuIHtcbiAgcmV0dXJuIHN1cHBvcnRlZENyb3NzQ2hhaW5SZWNvdmVyaWVzW3NvdXJjZUNvaW4uZ2V0RmFtaWx5KCldPy5pbmNsdWRlcyhyZWNvdmVyeUNvaW4uZ2V0RmFtaWx5KCkpO1xufVxuXG51dHhvQ29pbnMuZm9yRWFjaCgoY29pbikgPT4ge1xuICB1dHhvQ29pbnNcbiAgICAuZmlsdGVyKFxuICAgICAgKG90aGVyQ29pbikgPT5cbiAgICAgICAgY29pbiAhPT0gb3RoZXJDb2luICYmXG4gICAgICAgIGlzU3VwcG9ydGVkQ3Jvc3NDaGFpblJlY292ZXJ5KGNvaW4sIG90aGVyQ29pbikgJiZcbiAgICAgICAgKChpc01haW5uZXRDb2luKGNvaW4ubmFtZSkgJiYgaXNNYWlubmV0Q29pbihvdGhlckNvaW4ubmFtZSkpIHx8XG4gICAgICAgICAgKGlzVGVzdG5ldENvaW4oY29pbi5uYW1lKSAmJiBpc1Rlc3RuZXRDb2luKG90aGVyQ29pbi5uYW1lKSkpXG4gICAgKVxuICAgIC5mb3JFYWNoKChvdGhlckNvaW4pID0+IHtcbiAgICAgIGlmIChjb2luLmFtb3VudFR5cGUgPT09ICdiaWdpbnQnKSB7XG4gICAgICAgIHJ1bjxiaWdpbnQ+KGNvaW4sIG90aGVyQ29pbik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBydW4oY29pbiwgb3RoZXJDb2luKTtcbiAgICAgIH1cbiAgICB9KTtcbn0pO1xuXG5kZXNjcmliZShgQ3Jvc3MtQ2hhaW4gUmVjb3ZlcnkgZ2V0V2FsbGV0YCwgYXN5bmMgZnVuY3Rpb24gKCkge1xuICBjb25zdCBiaXRnbyA9IGRlZmF1bHRCaXRHbztcbiAgY29uc3QgcmVjb3ZlcnlDb2luID0gZ2V0VXR4b0NvaW4oJ2J0YycpO1xuICBjb25zdCByZWNvdmVyeVdhbGxldElkID0gJzVhYmFjZWJlMjhkNzJmYmQwN2UwYjhjYmJhMGZmMzllJztcblxuICBpdCgnc2hvdWxkIHNlYXJjaCB2MSB3YWxsZXRzIGlmIHRoZSB2MiBlbmRwb2ludCByZXNwb25kcyB3aXRoIGEgNHh4IGVycm9yJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGVycm9yUmVzcG9uc2VzID0gWzQwMCwgNDA0XTtcblxuICAgIGZvciAoY29uc3QgZXJyb3Igb2YgZXJyb3JSZXNwb25zZXMpIHtcbiAgICAgIGNvbnN0IG5vY2tWMldhbGxldCA9IG5vY2tCaXRHbyhiaXRnbylcbiAgICAgICAgLmdldChgL2FwaS92Mi8ke3JlY292ZXJ5Q29pbi5nZXRDaGFpbigpfS93YWxsZXQvJHtyZWNvdmVyeVdhbGxldElkfWApXG4gICAgICAgIC5yZXBseShlcnJvcik7XG4gICAgICBjb25zdCBub2NrVjFXYWxsZXQgPSBub2NrQml0R28oYml0Z28pLmdldChgL2FwaS92MS93YWxsZXQvJHtyZWNvdmVyeVdhbGxldElkfWApLnJlcGx5KGVycm9yKTtcbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKFxuICAgICAgICAoKSA9PiBnZXRXYWxsZXQoYml0Z28sIHJlY292ZXJ5Q29pbiwgcmVjb3ZlcnlXYWxsZXRJZCksXG4gICAgICAgIEVycm9yKGBjb3VsZCBub3QgZ2V0IHdhbGxldCAke3JlY292ZXJ5V2FsbGV0SWR9IGZyb20gdjEgb3IgdjI6IEFwaVJlc3BvbnNlRXJyb3I6ICR7ZXJyb3J9YClcbiAgICAgICk7XG4gICAgICBub2NrVjJXYWxsZXQuZG9uZSgpO1xuICAgICAgbm9ja1YxV2FsbGV0LmRvbmUoKTtcbiAgICB9XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgdGhyb3cgYW4gZXJyb3IgaWYgdGhlIHYyIGVuZHBvaW50IHJlc3BvbmRzIHdpdGggYSA1eHggZXJyb3InLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgZXJyb3JSZXNwb25zZXMgPSBbNTAwXTtcbiAgICBmb3IgKGNvbnN0IGVycm9yIG9mIGVycm9yUmVzcG9uc2VzKSB7XG4gICAgICBjb25zdCBub2NrVjJXYWxsZXQgPSBub2NrQml0R28oYml0Z28pXG4gICAgICAgIC5nZXQoYC9hcGkvdjIvJHtyZWNvdmVyeUNvaW4uZ2V0Q2hhaW4oKX0vd2FsbGV0LyR7cmVjb3ZlcnlXYWxsZXRJZH1gKVxuICAgICAgICAucmVwbHkoZXJyb3IpO1xuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoKCkgPT4gZ2V0V2FsbGV0KGJpdGdvLCByZWNvdmVyeUNvaW4sIHJlY292ZXJ5V2FsbGV0SWQpLCB7XG4gICAgICAgIG5hbWU6ICdBcGlSZXNwb25zZUVycm9yJyxcbiAgICAgICAgc3RhdHVzOiA1MDAsXG4gICAgICAgIHJlc3VsdDoge30sXG4gICAgICAgIGludmFsaWRUb2tlbjogZmFsc2UsXG4gICAgICAgIG5lZWRzT1RQOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgICAgbm9ja1YyV2FsbGV0LmRvbmUoKTtcbiAgICB9XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCdjb252ZXJ0THRjQWRkcmVzc1RvTGVnYWN5Rm9ybWF0JywgZnVuY3Rpb24gKCkge1xuICBjb25zdCBzY3JpcHRQdWJLZXkgPSBCdWZmZXIuZnJvbSgnYTkxNDlmMGJmNTFmYWI0ZDMzYWIyMTk3N2UxYjg5Zjc3NmY2NDE2MWVmNDI4NycsICdoZXgnKTtcbiAgaXQoJ3Nob3VsZCBjb252ZXJ0IE0uLi4gUDJTSCBhZGRyZXNzIHRvIDMuLi4gbGVnYWN5IGZvcm1hdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAvLyBUaGVzZSB0d28gYWRkcmVzc2VzIHJlcHJlc2VudCB0aGUgc2FtZSB1bmRlcmx5aW5nIHNjcmlwdCBoYXNoOlxuICAgIC8vIC0gTU5RN3prZ01zYVY2N3JzakEzSnVQNTlSQzV3eFJYcHdnRSBpcyB0aGUgTFRDIGZvcm1hdCAoc2NyaXB0SGFzaCAweDMyKVxuICAgIC8vIC0gM0dCeWdzR1B2VGRmS01icTRBS1paUnUxc1BNV1BFc0JmZCBpcyB0aGUgQlRDIGZvcm1hdCAoc2NyaXB0SGFzaCAweDA1KVxuICAgIC8vIGNvbnN0IGx0Y0FkZHJlc3MgPSAnTU5RN3prZ01zYVY2N3JzakEzSnVQNTlSQzV3eFJYcHdnRSc7XG4gICAgY29uc3QgbHRjQWRkcmVzcyA9IHdhc21BZGRyZXNzLmZyb21PdXRwdXRTY3JpcHRXaXRoQ29pbihzY3JpcHRQdWJLZXksICdsdGMnKTtcbiAgICBjb25zdCB0bHRjQWRkcmVzcyA9IHdhc21BZGRyZXNzLmZyb21PdXRwdXRTY3JpcHRXaXRoQ29pbihzY3JpcHRQdWJLZXksICd0bHRjJyk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKGx0Y0FkZHJlc3MsICdNTlE3emtnTXNhVjY3cnNqQTNKdVA1OVJDNXd4Ulhwd2dFJyk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKHRsdGNBZGRyZXNzLCAnUWI2d3NkNGZaMkM2Zkt6Uk1QeVRHNUtpRTgxVzZRQ3hoVScpO1xuXG4gICAgY29uc3QgbGVnYWN5QWRkcmVzcyA9IGNvbnZlcnRMdGNBZGRyZXNzVG9MZWdhY3lGb3JtYXQobHRjQWRkcmVzcywgJ2x0YycpO1xuICAgIGNvbnN0IGV4cGVjdGVkTHRjTGVnYWN5QWRkcmVzcyA9ICczR0J5Z3NHUHZUZGZLTWJxNEFLWlpSdTFzUE1XUEVzQmZkJztcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwobGVnYWN5QWRkcmVzcywgZXhwZWN0ZWRMdGNMZWdhY3lBZGRyZXNzKTtcblxuICAgIGNvbnN0IGV4cGVjdGVkVGx0Y0xlZ2FjeUFkZHJlc3MgPSAnMk43a0JrY0NSWHY5MVg5RU5qSHdTQk50SDVqWmc4eXllNnInO1xuICAgIGNvbnN0IHRsdGNMZWdhY3lBZGRyZXNzID0gY29udmVydEx0Y0FkZHJlc3NUb0xlZ2FjeUZvcm1hdCh0bHRjQWRkcmVzcywgJ3RsdGMnKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwodGx0Y0xlZ2FjeUFkZHJlc3MsIGV4cGVjdGVkVGx0Y0xlZ2FjeUFkZHJlc3MpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGNvbnZlcnQgTUQ2OFBzZGhlS3hjWXNyVkx5WlJYZ29TRExuQjFNZFZ0RSB0byBsZWdhY3kgZm9ybWF0JywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGFkZHJlc3MgPSAnTUQ2OFBzZGhlS3hjWXNyVkx5WlJYZ29TRExuQjFNZFZ0RSc7XG4gICAgY29uc3QgbGVnYWN5QWRkcmVzcyA9IGNvbnZlcnRMdGNBZGRyZXNzVG9MZWdhY3lGb3JtYXQoYWRkcmVzcywgJ2x0YycpO1xuXG4gICAgLy8gU2hvdWxkIHN0YXJ0IHdpdGggJzMnIChsZWdhY3kgQlRDIFAyU0ggZm9ybWF0KVxuICAgIGFzc2VydC5vayhsZWdhY3lBZGRyZXNzLnN0YXJ0c1dpdGgoJzMnKSwgYEV4cGVjdGVkIGFkZHJlc3MgdG8gc3RhcnQgd2l0aCAnMycsIGdvdDogJHtsZWdhY3lBZGRyZXNzfWApO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIG5vdCBtb2RpZnkgYmVjaDMyIGFkZHJlc3NlcycsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBiZWNoMzJBZGRyZXNzID0gJ2x0YzFxZ3JsOHpwbmRza2xhYTlzd2dkNXZldnl4bXg1eDYzdmNybDdkazQnO1xuICAgIGNvbnN0IHJlc3VsdCA9IGNvbnZlcnRMdGNBZGRyZXNzVG9MZWdhY3lGb3JtYXQoYmVjaDMyQWRkcmVzcywgJ2x0YycpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZXN1bHQsIGJlY2gzMkFkZHJlc3MpO1xuICB9KTtcbn0pO1xuIl19
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatBackupKeyRecoveryResult.d.ts","sourceRoot":"","sources":["../../../../../test/unit/recovery/formatBackupKeyRecoveryResult.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,CAAC"}
|