@bitgo-beta/sdk-coin-sui 3.0.3-beta.182 → 3.0.3-beta.1821
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/index.d.ts +1 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +7 -2
- package/dist/src/lib/compareTransactionBlocks.js +2 -3
- package/dist/src/lib/constants.d.ts +9 -2
- package/dist/src/lib/constants.d.ts.map +1 -1
- package/dist/src/lib/constants.js +18 -2
- package/dist/src/lib/customTransaction.js +3 -3
- package/dist/src/lib/customTransactionBuilder.js +5 -5
- package/dist/src/lib/iface.d.ts +80 -12
- package/dist/src/lib/iface.d.ts.map +1 -1
- package/dist/src/lib/iface.js +34 -5
- package/dist/src/lib/index.d.ts +6 -0
- package/dist/src/lib/index.d.ts.map +1 -1
- package/dist/src/lib/index.js +36 -10
- package/dist/src/lib/keyPair.js +24 -10
- package/dist/src/lib/mystenlab/builder/Inputs.d.ts +64 -11
- package/dist/src/lib/mystenlab/builder/Inputs.d.ts.map +1 -1
- package/dist/src/lib/mystenlab/builder/Inputs.js +63 -19
- package/dist/src/lib/mystenlab/builder/TransactionBlock.d.ts +88 -355
- package/dist/src/lib/mystenlab/builder/TransactionBlock.d.ts.map +1 -1
- package/dist/src/lib/mystenlab/builder/TransactionBlock.js +44 -25
- package/dist/src/lib/mystenlab/builder/TransactionDataBlock.d.ts +152 -77
- package/dist/src/lib/mystenlab/builder/TransactionDataBlock.d.ts.map +1 -1
- package/dist/src/lib/mystenlab/builder/TransactionDataBlock.js +54 -44
- package/dist/src/lib/mystenlab/builder/Transactions.d.ts +133 -188
- package/dist/src/lib/mystenlab/builder/Transactions.d.ts.map +1 -1
- package/dist/src/lib/mystenlab/builder/Transactions.js +52 -53
- package/dist/src/lib/mystenlab/builder/bcs.d.ts +1 -1
- package/dist/src/lib/mystenlab/builder/bcs.d.ts.map +1 -1
- package/dist/src/lib/mystenlab/builder/bcs.js +2 -2
- package/dist/src/lib/mystenlab/builder/index.js +6 -2
- package/dist/src/lib/mystenlab/builder/serializer.js +6 -8
- package/dist/src/lib/mystenlab/builder/utils.d.ts +1 -1
- package/dist/src/lib/mystenlab/builder/utils.d.ts.map +1 -1
- package/dist/src/lib/mystenlab/builder/utils.js +4 -4
- package/dist/src/lib/mystenlab/cryptography/hash.js +3 -4
- package/dist/src/lib/mystenlab/framework/framework.d.ts +6 -6
- package/dist/src/lib/mystenlab/framework/framework.d.ts.map +1 -1
- package/dist/src/lib/mystenlab/framework/framework.js +22 -25
- package/dist/src/lib/mystenlab/framework/index.js +6 -2
- package/dist/src/lib/mystenlab/framework/sui-system-state.js +2 -2
- package/dist/src/lib/mystenlab/txn-data-serializers/type-tag-serializer.js +2 -2
- package/dist/src/lib/mystenlab/types/coin.d.ts +13 -11
- package/dist/src/lib/mystenlab/types/coin.d.ts.map +1 -1
- package/dist/src/lib/mystenlab/types/coin.js +20 -19
- package/dist/src/lib/mystenlab/types/common.d.ts +8 -8
- package/dist/src/lib/mystenlab/types/common.d.ts.map +1 -1
- package/dist/src/lib/mystenlab/types/common.js +22 -22
- package/dist/src/lib/mystenlab/types/events.d.ts +15 -15
- package/dist/src/lib/mystenlab/types/events.d.ts.map +1 -1
- package/dist/src/lib/mystenlab/types/events.js +17 -17
- package/dist/src/lib/mystenlab/types/index.js +6 -2
- package/dist/src/lib/mystenlab/types/normalized.d.ts +21 -21
- package/dist/src/lib/mystenlab/types/normalized.d.ts.map +1 -1
- package/dist/src/lib/mystenlab/types/normalized.js +41 -41
- package/dist/src/lib/mystenlab/types/objects.d.ts +51 -51
- package/dist/src/lib/mystenlab/types/objects.d.ts.map +1 -1
- package/dist/src/lib/mystenlab/types/objects.js +96 -106
- package/dist/src/lib/mystenlab/types/option.d.ts +1 -1
- package/dist/src/lib/mystenlab/types/option.d.ts.map +1 -1
- package/dist/src/lib/mystenlab/types/option.js +2 -3
- package/dist/src/lib/mystenlab/types/sui-bcs.d.ts +55 -29
- package/dist/src/lib/mystenlab/types/sui-bcs.d.ts.map +1 -1
- package/dist/src/lib/mystenlab/types/sui-bcs.js +29 -5
- package/dist/src/lib/mystenlab/types/transactions.d.ts +625 -625
- package/dist/src/lib/mystenlab/types/transactions.d.ts.map +1 -1
- package/dist/src/lib/mystenlab/types/transactions.js +178 -194
- package/dist/src/lib/mystenlab/types/validator.d.ts +13 -13
- package/dist/src/lib/mystenlab/types/validator.d.ts.map +1 -1
- package/dist/src/lib/mystenlab/types/validator.js +124 -124
- package/dist/src/lib/resources/walrusConfig.d.ts +22 -0
- package/dist/src/lib/resources/walrusConfig.d.ts.map +1 -0
- package/dist/src/lib/resources/walrusConfig.js +37 -0
- package/dist/src/lib/rpcClient.d.ts +5 -0
- package/dist/src/lib/rpcClient.d.ts.map +1 -0
- package/dist/src/lib/rpcClient.js +74 -0
- package/dist/src/lib/stakingBuilder.d.ts.map +1 -1
- package/dist/src/lib/stakingBuilder.js +23 -7
- package/dist/src/lib/stakingTransaction.d.ts +0 -1
- package/dist/src/lib/stakingTransaction.d.ts.map +1 -1
- package/dist/src/lib/stakingTransaction.js +26 -15
- package/dist/src/lib/tokenTransferBuilder.d.ts +66 -0
- package/dist/src/lib/tokenTransferBuilder.d.ts.map +1 -0
- package/dist/src/lib/tokenTransferBuilder.js +202 -0
- package/dist/src/lib/tokenTransferTransaction.d.ts +59 -0
- package/dist/src/lib/tokenTransferTransaction.d.ts.map +1 -0
- package/dist/src/lib/tokenTransferTransaction.js +272 -0
- package/dist/src/lib/transaction.d.ts +21 -4
- package/dist/src/lib/transaction.d.ts.map +1 -1
- package/dist/src/lib/transaction.js +129 -17
- package/dist/src/lib/transactionBuilder.d.ts +13 -4
- package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilder.js +34 -4
- package/dist/src/lib/transactionBuilderFactory.d.ts +11 -2
- package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilderFactory.js +32 -1
- package/dist/src/lib/transferBuilder.d.ts +58 -1
- package/dist/src/lib/transferBuilder.d.ts.map +1 -1
- package/dist/src/lib/transferBuilder.js +310 -24
- package/dist/src/lib/transferTransaction.d.ts +6 -1
- package/dist/src/lib/transferTransaction.d.ts.map +1 -1
- package/dist/src/lib/transferTransaction.js +129 -12
- package/dist/src/lib/unstakingBuilder.js +6 -6
- package/dist/src/lib/unstakingTransaction.d.ts +0 -1
- package/dist/src/lib/unstakingTransaction.d.ts.map +1 -1
- package/dist/src/lib/unstakingTransaction.js +31 -17
- package/dist/src/lib/utils.d.ts +24 -3
- package/dist/src/lib/utils.d.ts.map +1 -1
- package/dist/src/lib/utils.js +254 -21
- package/dist/src/lib/walrusStakingBuilder.d.ts +66 -0
- package/dist/src/lib/walrusStakingBuilder.d.ts.map +1 -0
- package/dist/src/lib/walrusStakingBuilder.js +200 -0
- package/dist/src/lib/walrusStakingTransaction.d.ts +52 -0
- package/dist/src/lib/walrusStakingTransaction.d.ts.map +1 -0
- package/dist/src/lib/walrusStakingTransaction.js +269 -0
- package/dist/src/lib/walrusWithdrawStakeBuilder.d.ts +36 -0
- package/dist/src/lib/walrusWithdrawStakeBuilder.d.ts.map +1 -0
- package/dist/src/lib/walrusWithdrawStakeBuilder.js +173 -0
- package/dist/src/lib/walrusWithdrawStakeTransaction.d.ts +21 -0
- package/dist/src/lib/walrusWithdrawStakeTransaction.d.ts.map +1 -0
- package/dist/src/lib/walrusWithdrawStakeTransaction.js +190 -0
- package/dist/src/register.d.ts.map +1 -1
- package/dist/src/register.js +5 -1
- package/dist/src/sui.d.ts +46 -8
- package/dist/src/sui.d.ts.map +1 -1
- package/dist/src/sui.js +525 -37
- package/dist/src/suiToken.d.ts +22 -0
- package/dist/src/suiToken.d.ts.map +1 -0
- package/dist/src/suiToken.js +61 -0
- package/dist/src/tsui.js +1 -1
- package/dist/test/integration/index.d.ts +1 -0
- package/dist/test/integration/index.d.ts.map +1 -0
- package/dist/test/integration/index.js +1 -0
- package/dist/test/local_fullnode/RpcClient.d.ts +60 -0
- package/dist/test/local_fullnode/RpcClient.d.ts.map +1 -0
- package/dist/test/local_fullnode/RpcClient.js +111 -0
- package/dist/test/local_fullnode/faucet.d.ts +6 -0
- package/dist/test/local_fullnode/faucet.d.ts.map +1 -0
- package/dist/test/local_fullnode/faucet.js +17 -0
- package/dist/test/local_fullnode/transactions.d.ts +2 -0
- package/dist/test/local_fullnode/transactions.d.ts.map +1 -0
- package/dist/test/local_fullnode/transactions.js +190 -0
- package/dist/test/resources/sui.d.ts +458 -0
- package/dist/test/resources/sui.d.ts.map +1 -0
- package/dist/test/resources/sui.js +632 -0
- package/dist/test/unit/compareTransactionBlocks.d.ts +2 -0
- package/dist/test/unit/compareTransactionBlocks.d.ts.map +1 -0
- package/dist/test/unit/compareTransactionBlocks.js +64 -0
- package/dist/test/unit/getBuilderFactory.d.ts +3 -0
- package/dist/test/unit/getBuilderFactory.d.ts.map +1 -0
- package/dist/test/unit/getBuilderFactory.js +10 -0
- package/dist/test/unit/keyPair.d.ts +2 -0
- package/dist/test/unit/keyPair.d.ts.map +1 -0
- package/dist/test/unit/keyPair.js +72 -0
- package/dist/test/unit/sui.d.ts +2 -0
- package/dist/test/unit/sui.d.ts.map +1 -0
- package/dist/test/unit/sui.js +2423 -0
- package/dist/test/unit/suiToken.d.ts +2 -0
- package/dist/test/unit/suiToken.d.ts.map +1 -0
- package/dist/test/unit/suiToken.js +39 -0
- package/dist/test/unit/transactionBuilder/customTransactionBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/customTransactionBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/customTransactionBuilder.js +106 -0
- package/dist/test/unit/transactionBuilder/stakingBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/stakingBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/stakingBuilder.js +152 -0
- package/dist/test/unit/transactionBuilder/tokenTransferBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/tokenTransferBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/tokenTransferBuilder.js +255 -0
- package/dist/test/unit/transactionBuilder/transactionBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/transactionBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/transactionBuilder.js +639 -0
- package/dist/test/unit/transactionBuilder/transferBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/transferBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/transferBuilder.js +1055 -0
- package/dist/test/unit/transactionBuilder/unstakingBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/unstakingBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/unstakingBuilder.js +115 -0
- package/dist/test/unit/transactionBuilder/walrusStakingBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/walrusStakingBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/walrusStakingBuilder.js +162 -0
- package/dist/test/unit/transactionBuilder/walrusWithdrawBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/walrusWithdrawBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/walrusWithdrawBuilder.js +181 -0
- package/dist/test/unit/transferTransaction.d.ts +2 -0
- package/dist/test/unit/transferTransaction.d.ts.map +1 -0
- package/dist/test/unit/transferTransaction.js +94 -0
- package/dist/test/unit/utils.d.ts +2 -0
- package/dist/test/unit/utils.d.ts.map +1 -0
- package/dist/test/unit/utils.js +186 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +16 -12
- package/.eslintignore +0 -6
- package/.mocharc.yml +0 -7
- package/CHANGELOG.md +0 -420
|
@@ -0,0 +1,2423 @@
|
|
|
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 should_1 = __importDefault(require("should"));
|
|
40
|
+
const sdk_test_1 = require("@bitgo-beta/sdk-test");
|
|
41
|
+
const sdk_api_1 = require("@bitgo-beta/sdk-api");
|
|
42
|
+
const src_1 = require("../../src");
|
|
43
|
+
const testData = __importStar(require("../resources/sui"));
|
|
44
|
+
const lodash_1 = __importDefault(require("lodash"));
|
|
45
|
+
const sinon_1 = __importDefault(require("sinon"));
|
|
46
|
+
const bignumber_js_1 = __importDefault(require("bignumber.js"));
|
|
47
|
+
const assert_1 = __importDefault(require("assert"));
|
|
48
|
+
const iface_1 = require("../../src/lib/iface");
|
|
49
|
+
const getBuilderFactory_1 = require("./getBuilderFactory");
|
|
50
|
+
const sui_1 = require("../resources/sui");
|
|
51
|
+
const buffer_1 = require("buffer");
|
|
52
|
+
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
53
|
+
const nock_1 = __importDefault(require("nock"));
|
|
54
|
+
describe('SUI:', function () {
|
|
55
|
+
let bitgo;
|
|
56
|
+
let basecoin;
|
|
57
|
+
let newTxPrebuild;
|
|
58
|
+
let newTxParams;
|
|
59
|
+
const txPrebuild = {
|
|
60
|
+
txHex: buffer_1.Buffer.from(testData.TRANSFER, 'base64').toString('hex'),
|
|
61
|
+
txInfo: {},
|
|
62
|
+
};
|
|
63
|
+
const txParams = {
|
|
64
|
+
recipients: testData.recipients,
|
|
65
|
+
};
|
|
66
|
+
before(function () {
|
|
67
|
+
bitgo = sdk_test_1.TestBitGo.decorate(sdk_api_1.BitGoAPI, { env: 'mock' });
|
|
68
|
+
bitgo.safeRegister('sui', src_1.Sui.createInstance);
|
|
69
|
+
bitgo.safeRegister('tsui', src_1.Tsui.createInstance);
|
|
70
|
+
bitgo.initializeTestVars();
|
|
71
|
+
basecoin = bitgo.coin('tsui');
|
|
72
|
+
newTxPrebuild = () => {
|
|
73
|
+
return lodash_1.default.cloneDeep(txPrebuild);
|
|
74
|
+
};
|
|
75
|
+
newTxParams = () => {
|
|
76
|
+
return lodash_1.default.cloneDeep(txParams);
|
|
77
|
+
};
|
|
78
|
+
});
|
|
79
|
+
it('should return the right info', function () {
|
|
80
|
+
const sui = bitgo.coin('sui');
|
|
81
|
+
const tsui = bitgo.coin('tsui');
|
|
82
|
+
sui.getChain().should.equal('sui');
|
|
83
|
+
sui.getFamily().should.equal('sui');
|
|
84
|
+
sui.getFullName().should.equal('Sui');
|
|
85
|
+
sui.getBaseFactor().should.equal(1e9);
|
|
86
|
+
tsui.getChain().should.equal('tsui');
|
|
87
|
+
tsui.getFamily().should.equal('sui');
|
|
88
|
+
tsui.getFullName().should.equal('Testnet Sui');
|
|
89
|
+
tsui.getBaseFactor().should.equal(1e9);
|
|
90
|
+
});
|
|
91
|
+
describe('Verify transaction: ', () => {
|
|
92
|
+
it('should succeed to verify transaction', async function () {
|
|
93
|
+
const txPrebuild = newTxPrebuild();
|
|
94
|
+
const txParams = newTxParams();
|
|
95
|
+
const verification = {};
|
|
96
|
+
const isTransactionVerified = await basecoin.verifyTransaction({ txParams, txPrebuild, verification });
|
|
97
|
+
isTransactionVerified.should.equal(true);
|
|
98
|
+
});
|
|
99
|
+
it('should succeed to verify transaction when recipients amount are numbers', async function () {
|
|
100
|
+
const txPrebuild = newTxPrebuild();
|
|
101
|
+
const txParamsWithNumberAmounts = newTxParams();
|
|
102
|
+
txParamsWithNumberAmounts.recipients = txParamsWithNumberAmounts.recipients.map(({ address, amount }) => {
|
|
103
|
+
return { address, amount: Number(amount) };
|
|
104
|
+
});
|
|
105
|
+
const verification = {};
|
|
106
|
+
const isTransactionVerified = await basecoin.verifyTransaction({
|
|
107
|
+
txParams: txParamsWithNumberAmounts,
|
|
108
|
+
txPrebuild,
|
|
109
|
+
verification,
|
|
110
|
+
});
|
|
111
|
+
isTransactionVerified.should.equal(true);
|
|
112
|
+
});
|
|
113
|
+
it('should fail to verify transaction with invalid param', async function () {
|
|
114
|
+
const txPrebuild = {};
|
|
115
|
+
const txParams = newTxParams();
|
|
116
|
+
txParams.recipients = undefined;
|
|
117
|
+
await basecoin
|
|
118
|
+
.verifyTransaction({
|
|
119
|
+
txParams,
|
|
120
|
+
txPrebuild,
|
|
121
|
+
})
|
|
122
|
+
.should.rejectedWith('missing required tx prebuild property txHex');
|
|
123
|
+
});
|
|
124
|
+
it('should verify a split transaction', async function () {
|
|
125
|
+
const factory = (0, getBuilderFactory_1.getBuilderFactory)('tsui');
|
|
126
|
+
const txBuilder = factory.getTransferBuilder();
|
|
127
|
+
txBuilder.type(iface_1.SuiTransactionType.Transfer);
|
|
128
|
+
txBuilder.sender(testData.sender.address);
|
|
129
|
+
const amount = 1000000000;
|
|
130
|
+
const recipients = new Array(100).fill({ address: testData.sender.address, amount: amount.toString() });
|
|
131
|
+
txBuilder.send(recipients);
|
|
132
|
+
txBuilder.gasData(testData.gasData);
|
|
133
|
+
const tx = await txBuilder.build();
|
|
134
|
+
const txPrebuild = {
|
|
135
|
+
txHex: buffer_1.Buffer.from(tx.toBroadcastFormat(), 'base64').toString('hex'),
|
|
136
|
+
txInfo: {},
|
|
137
|
+
};
|
|
138
|
+
const txParams = {
|
|
139
|
+
recipients,
|
|
140
|
+
};
|
|
141
|
+
const verify = await basecoin.verifyTransaction({
|
|
142
|
+
txParams,
|
|
143
|
+
txPrebuild,
|
|
144
|
+
});
|
|
145
|
+
verify.should.equal(true);
|
|
146
|
+
});
|
|
147
|
+
it('should fail to verify a spoofed consolidation transaction', async function () {
|
|
148
|
+
// Set up wallet data
|
|
149
|
+
const walletData = {
|
|
150
|
+
id: '62e156dbd641c000076bbabe04041a90',
|
|
151
|
+
coin: 'tsui',
|
|
152
|
+
keys: [
|
|
153
|
+
'5b3424f91bf349930e34017500000000',
|
|
154
|
+
'5b3424f91bf349930e34017600000000',
|
|
155
|
+
'5b3424f91bf349930e34017700000000',
|
|
156
|
+
],
|
|
157
|
+
coinSpecific: {
|
|
158
|
+
rootAddress: '0x6f0f4e0eef19176628ee0ebc80eef89194afd9e19e59444e64b997f1254f6cd8',
|
|
159
|
+
},
|
|
160
|
+
multisigType: 'tss',
|
|
161
|
+
};
|
|
162
|
+
const consolidationTx = {
|
|
163
|
+
txRequestId: '13857c1a-9b61-4b85-96f1-10af125f68a0',
|
|
164
|
+
walletId: '644c3d6c5232f00007680040',
|
|
165
|
+
txHex: '0000020008e6e6753b0000000000206f0f4e0eef19176628ee0ebc80eef89194afd9e19e59444e64b997f1254f6cd80202000101000001010200000101001670472c44b59058032840b94a7fd7405b4b87cbf67f4eb60e1b7781ce03ddad01222b818b450dcd2164b25ba5a57b0507e59a4c8eb6d7cadd08ea609db17c611d4e12d014000000002023fc27576626762904339b0abe1ff99c99799c93bea46e8bf452f23c68992db11670472c44b59058032840b94a7fd7405b4b87cbf67f4eb60e1b7781ce03ddade8030000000000001ae324000000000000',
|
|
166
|
+
feeInfo: {
|
|
167
|
+
fee: 2417434,
|
|
168
|
+
feeString: '2417434',
|
|
169
|
+
},
|
|
170
|
+
txInfo: {
|
|
171
|
+
minerFee: '2417434',
|
|
172
|
+
spendAmount: '997582566',
|
|
173
|
+
spendAmounts: [
|
|
174
|
+
{
|
|
175
|
+
coinName: 'tsui',
|
|
176
|
+
amountString: '997582566',
|
|
177
|
+
},
|
|
178
|
+
],
|
|
179
|
+
payGoFee: '0',
|
|
180
|
+
outputs: [
|
|
181
|
+
{
|
|
182
|
+
address: '0x6f0f4e0eef19176628ee0ebc80eef89194afd9e19e59444e64b997f1254f6cd8',
|
|
183
|
+
value: 997582566,
|
|
184
|
+
wallet: '644c3d6c5232f00007680040',
|
|
185
|
+
wallets: ['644c3d6c5232f00007680040'],
|
|
186
|
+
enterprise: '62cc59b727443a0007089033',
|
|
187
|
+
enterprises: ['62cc59b727443a0007089033'],
|
|
188
|
+
valueString: '997582566',
|
|
189
|
+
coinName: 'tsui',
|
|
190
|
+
walletType: 'hot',
|
|
191
|
+
walletTypes: ['hot'],
|
|
192
|
+
},
|
|
193
|
+
],
|
|
194
|
+
inputs: [
|
|
195
|
+
{
|
|
196
|
+
value: 997582566,
|
|
197
|
+
address: '0x1670472c44b59058032840b94a7fd7405b4b87cbf67f4eb60e1b7781ce03ddad',
|
|
198
|
+
valueString: '997582566',
|
|
199
|
+
},
|
|
200
|
+
],
|
|
201
|
+
type: 'Transfer',
|
|
202
|
+
},
|
|
203
|
+
consolidateId: '68b648892ee9355c97e4b96d0945b2ca',
|
|
204
|
+
coin: 'tsui',
|
|
205
|
+
};
|
|
206
|
+
const bgUrl = sdk_core_1.common.Environments['mock'].uri;
|
|
207
|
+
const walletObj = new sdk_core_1.Wallet(bitgo, basecoin, walletData);
|
|
208
|
+
(0, nock_1.default)(bgUrl)
|
|
209
|
+
.post('/api/v2/tsui/wallet/62e156dbd641c000076bbabe04041a90/consolidateAccount/build')
|
|
210
|
+
.reply(200, [
|
|
211
|
+
{
|
|
212
|
+
...consolidationTx,
|
|
213
|
+
txHex: '000002000800e1f5050000000000208771273969acf0356ed0f33c1c52b109bbfe0de3369e9fb9837d52a5a438c6500202000101000001010200000101006f0f4e0eef19176628ee0ebc80eef89194afd9e19e59444e64b997f1254f6cd80122de95b31347a2f0d9715c560dfdfc8fd351782ca5e275d4bc3a98ea78769bce4f12d0140000000020ea639081929603fe2580873f4aa64701746d089f973b0827a222d784e992ee266f0f4e0eef19176628ee0ebc80eef89194afd9e19e59444e64b997f1254f6cd8e803000000000000a48821000000000000',
|
|
214
|
+
},
|
|
215
|
+
]);
|
|
216
|
+
(0, nock_1.default)(bgUrl)
|
|
217
|
+
.get('/api/v2/tsui/key/5b3424f91bf349930e34017500000000')
|
|
218
|
+
.reply(200, [
|
|
219
|
+
{
|
|
220
|
+
encryptedPrv: 'fakePrv',
|
|
221
|
+
},
|
|
222
|
+
]);
|
|
223
|
+
// Call the function to test
|
|
224
|
+
await assert_1.default.rejects(async () => {
|
|
225
|
+
await walletObj.sendAccountConsolidations({
|
|
226
|
+
walletPassphrase: 'password',
|
|
227
|
+
verification: {
|
|
228
|
+
consolidationToBaseAddress: true,
|
|
229
|
+
},
|
|
230
|
+
});
|
|
231
|
+
}, {
|
|
232
|
+
message: 'Consolidation transaction output address does not match wallet base address',
|
|
233
|
+
});
|
|
234
|
+
});
|
|
235
|
+
it('should verify valid a consolidation transaction', async () => {
|
|
236
|
+
// Set up wallet data
|
|
237
|
+
const walletData = {
|
|
238
|
+
id: '62e156dbd641c000076bbabe04041a90',
|
|
239
|
+
coin: 'tsui',
|
|
240
|
+
keys: [
|
|
241
|
+
'5b3424f91bf349930e34017500000000',
|
|
242
|
+
'5b3424f91bf349930e34017600000000',
|
|
243
|
+
'5b3424f91bf349930e34017700000000',
|
|
244
|
+
],
|
|
245
|
+
coinSpecific: {
|
|
246
|
+
rootAddress: '0x6f0f4e0eef19176628ee0ebc80eef89194afd9e19e59444e64b997f1254f6cd8',
|
|
247
|
+
},
|
|
248
|
+
multisigType: 'tss',
|
|
249
|
+
};
|
|
250
|
+
const consolidationTx = {
|
|
251
|
+
txRequestId: '13857c1a-9b61-4b85-96f1-10af125f68a0',
|
|
252
|
+
walletId: '644c3d6c5232f00007680040',
|
|
253
|
+
txHex: '0000020008e6e6753b0000000000206f0f4e0eef19176628ee0ebc80eef89194afd9e19e59444e64b997f1254f6cd80202000101000001010200000101001670472c44b59058032840b94a7fd7405b4b87cbf67f4eb60e1b7781ce03ddad01222b818b450dcd2164b25ba5a57b0507e59a4c8eb6d7cadd08ea609db17c611d4e12d014000000002023fc27576626762904339b0abe1ff99c99799c93bea46e8bf452f23c68992db11670472c44b59058032840b94a7fd7405b4b87cbf67f4eb60e1b7781ce03ddade8030000000000001ae324000000000000',
|
|
254
|
+
feeInfo: {
|
|
255
|
+
fee: 2417434,
|
|
256
|
+
feeString: '2417434',
|
|
257
|
+
},
|
|
258
|
+
txInfo: {
|
|
259
|
+
minerFee: '2417434',
|
|
260
|
+
spendAmount: '997582566',
|
|
261
|
+
spendAmounts: [
|
|
262
|
+
{
|
|
263
|
+
coinName: 'tsui',
|
|
264
|
+
amountString: '997582566',
|
|
265
|
+
},
|
|
266
|
+
],
|
|
267
|
+
payGoFee: '0',
|
|
268
|
+
outputs: [
|
|
269
|
+
{
|
|
270
|
+
address: '0x6f0f4e0eef19176628ee0ebc80eef89194afd9e19e59444e64b997f1254f6cd8',
|
|
271
|
+
value: 997582566,
|
|
272
|
+
wallet: '644c3d6c5232f00007680040',
|
|
273
|
+
wallets: ['644c3d6c5232f00007680040'],
|
|
274
|
+
enterprise: '62cc59b727443a0007089033',
|
|
275
|
+
enterprises: ['62cc59b727443a0007089033'],
|
|
276
|
+
valueString: '997582566',
|
|
277
|
+
coinName: 'tsui',
|
|
278
|
+
walletType: 'hot',
|
|
279
|
+
walletTypes: ['hot'],
|
|
280
|
+
},
|
|
281
|
+
],
|
|
282
|
+
inputs: [
|
|
283
|
+
{
|
|
284
|
+
value: 997582566,
|
|
285
|
+
address: '0x1670472c44b59058032840b94a7fd7405b4b87cbf67f4eb60e1b7781ce03ddad',
|
|
286
|
+
valueString: '997582566',
|
|
287
|
+
},
|
|
288
|
+
],
|
|
289
|
+
type: 'Transfer',
|
|
290
|
+
},
|
|
291
|
+
consolidateId: '68b648892ee9355c97e4b96d0945b2ca',
|
|
292
|
+
coin: 'tsui',
|
|
293
|
+
};
|
|
294
|
+
try {
|
|
295
|
+
if (!(await basecoin.verifyTransaction({
|
|
296
|
+
blockhash: '',
|
|
297
|
+
feePayer: '',
|
|
298
|
+
txParams: {},
|
|
299
|
+
txPrebuild: consolidationTx,
|
|
300
|
+
walletType: 'tss',
|
|
301
|
+
wallet: new sdk_core_1.Wallet(bitgo, basecoin, walletData),
|
|
302
|
+
verification: {
|
|
303
|
+
consolidationToBaseAddress: true,
|
|
304
|
+
},
|
|
305
|
+
}))) {
|
|
306
|
+
assert_1.default.fail('Transaction should pass verification');
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
catch (e) {
|
|
310
|
+
assert_1.default.fail('Transaction should pass verification');
|
|
311
|
+
}
|
|
312
|
+
});
|
|
313
|
+
});
|
|
314
|
+
describe('Explain Transaction: ', () => {
|
|
315
|
+
it('should explain a transfer transaction', async function () {
|
|
316
|
+
const explainedTransaction = await basecoin.explainTransaction({
|
|
317
|
+
txHex: buffer_1.Buffer.from(testData.TRANSFER, 'base64').toString('hex'),
|
|
318
|
+
});
|
|
319
|
+
explainedTransaction.should.deepEqual({
|
|
320
|
+
displayOrder: ['id', 'outputs', 'outputAmount', 'changeOutputs', 'changeAmount', 'fee', 'type'],
|
|
321
|
+
id: 'BxoeGXbBCuw6VFEcgwHHUAKrCoAsGanPB39kdVVKZZcR',
|
|
322
|
+
outputs: [
|
|
323
|
+
{
|
|
324
|
+
address: testData.recipients[0].address,
|
|
325
|
+
amount: testData.recipients[0].amount,
|
|
326
|
+
},
|
|
327
|
+
{
|
|
328
|
+
address: testData.recipients[1].address,
|
|
329
|
+
amount: testData.recipients[1].amount,
|
|
330
|
+
},
|
|
331
|
+
],
|
|
332
|
+
outputAmount: `${testData.AMOUNT * 2}`,
|
|
333
|
+
changeOutputs: [],
|
|
334
|
+
changeAmount: '0',
|
|
335
|
+
fee: { fee: testData.gasData.budget.toString() },
|
|
336
|
+
type: 0,
|
|
337
|
+
});
|
|
338
|
+
});
|
|
339
|
+
it('should explain a split transfer transaction', async function () {
|
|
340
|
+
const explainedTransaction = await basecoin.explainTransaction({
|
|
341
|
+
txHex: '000065000800ca9a3b000000000020574895fe83b409b009e2e0433ad1823ec0d538af7fea52390a198bdfe7676f13000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000c801020001010000010102000001010002000101020001010202000101000200010103000101020400010100020001010400010102060001010002000101050001010208000101000200010106000101020a000101000200010107000101020c000101000200010108000101020e000101000200010109000101021000010100020001010a000101021200010100020001010b000101021400010100020001010c000101021600010100020001010d000101021800010100020001010e000101021a00010100020001010f000101021c000101000200010110000101021e00010100020001011100010102200001010002000101120001010222000101000200010113000101022400010100020001011400010102260001010002000101150001010228000101000200010116000101022a000101000200010117000101022c000101000200010118000101022e000101000200010119000101023000010100020001011a000101023200010100020001011b000101023400010100020001011c000101023600010100020001011d000101023800010100020001011e000101023a00010100020001011f000101023c000101000200010120000101023e00010100020001012100010102400001010002000101220001010242000101000200010123000101024400010100020001012400010102460001010002000101250001010248000101000200010126000101024a000101000200010127000101024c000101000200010128000101024e000101000200010129000101025000010100020001012a000101025200010100020001012b000101025400010100020001012c000101025600010100020001012d000101025800010100020001012e000101025a00010100020001012f000101025c000101000200010130000101025e00010100020001013100010102600001010002000101320001010262000101000200010133000101026400010100020001013400010102660001010002000101350001010268000101000200010136000101026a000101000200010137000101026c000101000200010138000101026e000101000200010139000101027000010100020001013a000101027200010100020001013b000101027400010100020001013c000101027600010100020001013d000101027800010100020001013e000101027a00010100020001013f000101027c000101000200010140000101027e00010100020001014100010102800001010002000101420001010282000101000200010143000101028400010100020001014400010102860001010002000101450001010288000101000200010146000101028a000101000200010147000101028c000101000200010148000101028e000101000200010149000101029000010100020001014a000101029200010100020001014b000101029400010100020001014c000101029600010100020001014d000101029800010100020001014e000101029a00010100020001014f000101029c000101000200010150000101029e00010100020001015100010102a000010100020001015200010102a200010100020001015300010102a400010100020001015400010102a600010100020001015500010102a800010100020001015600010102aa00010100020001015700010102ac00010100020001015800010102ae00010100020001015900010102b000010100020001015a00010102b200010100020001015b00010102b400010100020001015c00010102b600010100020001015d00010102b800010100020001015e00010102ba00010100020001015f00010102bc00010100020001016000010102be00010100020001016100010102c000010100020001016200010102c200010100020001016300010102c400010100020001016400010102c600010100574895fe83b409b009e2e0433ad1823ec0d538af7fea52390a198bdfe7676f1303034f403ff9b73b5794b79a89ebbcd810331fea52878db0b4dc1a1c88f4c0dc5616000000000000002003caf7e677c72b241d61d00e600b6df25639c582987d0aa78ceea0b9953eac52a60b0e51f9ffa398f6ee1d3101d6c9efa13d1800e412d7e0832e2616f1793fd79ce91700000000002050435a49f0635bc2f2c3bbdce05a16b24faf0368edaa25c8fbce16ef62602da5cda44ae47f380f45d3cd4911880f4e9a24b52fe424683c66cf3c7769dd3ca22c1000000000000000200c78fa20236bb86871eacfe2b4f2158eaa68f4f4565d8cf9865ee9f279e4bd40574895fe83b409b009e2e0433ad1823ec0d538af7fea52390a198bdfe7676f13e80300000000000000e1f5050000000000',
|
|
342
|
+
});
|
|
343
|
+
explainedTransaction.outputs.length.should.equal(100);
|
|
344
|
+
});
|
|
345
|
+
it('should explain a staking transaction', async function () {
|
|
346
|
+
const explainedTransaction = await basecoin.explainTransaction({
|
|
347
|
+
txHex: buffer_1.Buffer.from(testData.ADD_STAKE, 'base64').toString('hex'),
|
|
348
|
+
});
|
|
349
|
+
explainedTransaction.should.deepEqual({
|
|
350
|
+
displayOrder: [
|
|
351
|
+
'id',
|
|
352
|
+
'outputs',
|
|
353
|
+
'outputAmount',
|
|
354
|
+
'changeOutputs',
|
|
355
|
+
'changeAmount',
|
|
356
|
+
'fee',
|
|
357
|
+
'type',
|
|
358
|
+
'module',
|
|
359
|
+
'function',
|
|
360
|
+
'validatorAddress',
|
|
361
|
+
],
|
|
362
|
+
id: 'bP78boZ48sDdJsg2V1tJahpGyBwaC9GSTL2rvyADnsh',
|
|
363
|
+
outputs: [
|
|
364
|
+
{
|
|
365
|
+
address: testData.requestAddStake.validatorAddress,
|
|
366
|
+
amount: testData.requestAddStake.amount.toString(),
|
|
367
|
+
},
|
|
368
|
+
],
|
|
369
|
+
outputAmount: testData.STAKING_AMOUNT.toString(),
|
|
370
|
+
changeOutputs: [],
|
|
371
|
+
changeAmount: '0',
|
|
372
|
+
fee: { fee: testData.gasData.budget.toString() },
|
|
373
|
+
type: 25,
|
|
374
|
+
});
|
|
375
|
+
});
|
|
376
|
+
it('should fail to explain transaction with missing params', async function () {
|
|
377
|
+
try {
|
|
378
|
+
await basecoin.explainTransaction({});
|
|
379
|
+
}
|
|
380
|
+
catch (error) {
|
|
381
|
+
should_1.default.equal(error.message, 'Invalid transaction');
|
|
382
|
+
}
|
|
383
|
+
});
|
|
384
|
+
it('should fail to explain transaction with invalid params', async function () {
|
|
385
|
+
try {
|
|
386
|
+
await basecoin.explainTransaction({ txHex: 'randomString' });
|
|
387
|
+
}
|
|
388
|
+
catch (error) {
|
|
389
|
+
should_1.default.equal(error.message, 'Invalid transaction');
|
|
390
|
+
}
|
|
391
|
+
});
|
|
392
|
+
});
|
|
393
|
+
describe('Parse Transactions: ', () => {
|
|
394
|
+
const transferInputsResponse = [
|
|
395
|
+
{
|
|
396
|
+
address: testData.recipients[0].address,
|
|
397
|
+
amount: new bignumber_js_1.default(testData.AMOUNT).plus(testData.AMOUNT).plus(testData.gasData.budget).toFixed(),
|
|
398
|
+
},
|
|
399
|
+
];
|
|
400
|
+
const transferOutputsResponse = [
|
|
401
|
+
{
|
|
402
|
+
address: testData.recipients[0].address,
|
|
403
|
+
amount: testData.recipients[0].amount,
|
|
404
|
+
},
|
|
405
|
+
{
|
|
406
|
+
address: testData.recipients[1].address,
|
|
407
|
+
amount: testData.recipients[1].amount,
|
|
408
|
+
},
|
|
409
|
+
];
|
|
410
|
+
it('should parse a transfer transaction', async function () {
|
|
411
|
+
const parsedTransaction = await basecoin.parseTransaction({
|
|
412
|
+
txHex: buffer_1.Buffer.from(testData.TRANSFER, 'base64').toString('hex'),
|
|
413
|
+
});
|
|
414
|
+
parsedTransaction.should.deepEqual({
|
|
415
|
+
inputs: transferInputsResponse,
|
|
416
|
+
outputs: transferOutputsResponse,
|
|
417
|
+
fee: new bignumber_js_1.default(20000000),
|
|
418
|
+
});
|
|
419
|
+
});
|
|
420
|
+
it('should fail to parse a transfer transaction when explainTransaction response is undefined', async function () {
|
|
421
|
+
const stub = sinon_1.default.stub(src_1.Sui.prototype, 'explainTransaction');
|
|
422
|
+
stub.resolves(undefined);
|
|
423
|
+
await basecoin.parseTransaction({ txHex: testData.TRANSFER }).should.be.rejectedWith('Invalid transaction');
|
|
424
|
+
stub.restore();
|
|
425
|
+
});
|
|
426
|
+
});
|
|
427
|
+
describe('Address Validation', () => {
|
|
428
|
+
let keychains;
|
|
429
|
+
let commonKeychain;
|
|
430
|
+
before(function () {
|
|
431
|
+
commonKeychain =
|
|
432
|
+
'19bdfe2a4b498a05511381235a8892d54267807c4a3f654e310b938b8b424ff4adedbe92f4c146de641c67508a961324c8504cdf8e0c0acbb68d6104ccccd781';
|
|
433
|
+
keychains = [
|
|
434
|
+
{
|
|
435
|
+
id: '6424c353eaf78d000766e95949868468',
|
|
436
|
+
source: 'user',
|
|
437
|
+
type: 'tss',
|
|
438
|
+
commonKeychain: '19bdfe2a4b498a05511381235a8892d54267807c4a3f654e310b938b8b424ff4adedbe92f4c146de641c67508a961324c8504cdf8e0c0acbb68d6104ccccd781',
|
|
439
|
+
encryptedPrv: '{"iv":"cZd5i7L4RxtwrALW2rK7UA==","v":1,"iter":10000,"ks":256,"ts":64,"mode":"ccm","adata":"","cipher":"aes","salt":"5zgoH1Bd3Fw=","ct":"9vVlnXFRtrM9FVEo+d2chbGHlM9lFZemueBuAs3BIkPo33Fo7jzwwNK/kIWkEyg+NmEBd5IaqAS157nvvvwzzsmMWlQdUz9qbmXNv3pg987cXFR08exS+4uhwP1YNOjJTRvRNcO9ZqHb46d4fmyJ/yC9/susCge7r/EsbaN5C3afv1dzybuq912FwaQElZLYYp5BICudFOMZ9k0UDMfKM/PMDkH7WexoGHr9GKq/bgCH2B39TZZyHKU6Uy47lXep2s6h0DrMwHOrnmiL3DZjOj88Ynvphlzxuo4eOlD2UHia2+nvIaISYs29Pr0DAvREutchvcBpExj1kWWPv7hQYrv8F0NAdatsbWl3w+xKyfiMKo1USlrwyJviypGtQtXOJyw0XPN0rv2+L5lW8BbjpzHfYYN13fJTedlGTFhhkzVtbbPAKE02kx7zCJcjYaiexdSTsrDLScYNT9/Jhdt27KpsooehwVohLfSKz4vbFfRu2MPZw3/+c/hfiJNgtz6esWbnxGrcE8U2IwPYCaK+Ghk4DcqWNIni59RI5B5kAsQOToII40qPN510uTgxBSPO7q7MHgkxdd4CqBq+ojr9j0P7oao8E5Y+CBDJrojDoCh1oCCDW9vo2dXlVcD8SIbw7U/9AfvEbA4xyE/5md1M7CIwLnWs2Ynv0YtaKoqhdS9x6FmHlMDhN/DKHinrwmowtrTT82fOkpO5g9saSmgU7Qy3gLt8t+VwdEyeFeQUKRSyci8qgqXQaZIg4+aXgaSOnlCFMtmB8ekYxEhTY5uzRfrNgS4s1QeqFBpNtUF+Ydi297pbVXnJoXAN+SVWd80GCx+yI2dpVC89k3rOWK9WeyqlnzuLJWp2RIOB9cdW8GFv/fN+QAJpYeVxOE4+nZDsKnsj8nKcg9t4Dlx1G6gLM1/Vq9YxNLbuzuRC0asUYvdMnoMvszmpm++TxndYisgNYscpZSoz7wvcazJNEPfhPVjEkd6tUUuN4GM35H0DmKCUQNT+a6B6hmHlTZvjxiyGAg5bY59hdjvJ+22QduazlEEC6LI3HrA7uK0TpplWzS1tCIFvTMUhj65DEZmNJ2+ZY9bQ4vsMf+DRR3OOG4t+DMlNfjOd3zNv3QoY95BjfWpryFwPzDq7bCP67JDsoj7j2TY5FRSrRkD77H0Ewlux2cWfjRTwcMHcdQxxuV0OP0aNjGDjybFN"}',
|
|
440
|
+
},
|
|
441
|
+
{
|
|
442
|
+
id: '6424c353eaf78d000766e96137d4404b',
|
|
443
|
+
source: 'backup',
|
|
444
|
+
type: 'tss',
|
|
445
|
+
commonKeychain: '19bdfe2a4b498a05511381235a8892d54267807c4a3f654e310b938b8b424ff4adedbe92f4c146de641c67508a961324c8504cdf8e0c0acbb68d6104ccccd781',
|
|
446
|
+
encryptedPrv: '{"iv":"vi0dPef/Rx7kG/pRySQi6Q==","v":1,"iter":10000,"ks":256,"ts":64,"mode":"ccm","adata":"","cipher":"aes","salt":"9efhQsiEvVs=","ct":"Gw6atvf6gxKzsjtl3xseipO3rAxp1mAz7Yu1ihFsi5/lf2vMZegApgZx+pyILFS9KKLHbNF3U6WgSYdrr2t4vzdLsXkH1WIxfHS+cd2C5N59yADZDnPJBT6pv/IRvaYelP0Ck3nIYQ2hSMm8op+VOWC/SzHeh7slYDqwEHTGan0Wigfvk1yRd7CCJTaEAomnc/4eFi2NY3X3gt/3opy9IAgknnwUFohn96EWpEQ0F6pbzH/Z8VF6gF+DUcrrByAxExUPnHQZiFk3YHU/vVV4FxBU/mVAE8xBsBn5ul5e5SUMPfc7TBuJWv4BByTNg9xDShF/91Yx2nbfUm5d9QmM8lpKgzzQvcK8POAPk87gRCuKnsGh5vNS0UppkHc+ocfzRQlGA6jze7QyyQO0rMj5Ly8kWjwk2vISvKYHYS1NR7VU549UIXo7NXjatunKSc3+IreoRUHIshiaLg6hl+pxCCuc0qQ43V0mdIfCjTN8gkGWLNk8R7tAGPz9jyapQPcPEGHgEz0ATIi6yMNWCsibS2eLiE1uVEJONoM4lk6FPl3Q2CHbW2MeEbqjY8hbaw18mNb2xSBH/Fwpiial+Tvi2imqgnCO4ZpO9bllKftZPcQy0stN+eGBlb5ufyflKkDSiChHYroGjEpmiFicdde48cJszF52uKNnf1q67fA9/S2FAHQab3EXojxH2Gbk+kkV2h/TYKFFZSWC3vi4e8mO+vjMUcR0AdsgPFyEIz0SCGuba3CnTLNdEuZwsauAeHkx2vUTnRgJPVgNeeuXmsVG76Sy2ggJHuals0Hj8U2Xda0qO1RuFfoCWfss9wn6HGRwPPkhSB/8oNguAqmRVGKkd8Zwt3IvrTd9fk0/rFFDJKGz7WyNHkYgUmNiGcItD12v0jx7FZ52EJzl3Av1RyJUQK18+8EYPh3SGiU9dt7VX0aF0uo6JouKhOeldUvMP+AugQz8fUclwTQsbboVg27Yxo0DyATVwThW5a56R6Qf5ZiQJluFuzs5y98rq0S5q046lE6o3vVmJpEdwjeSCJoET5CL4nTgkXyWvhm4eB8u/e66l3o0qbaSx8q9YYmT9EpRcl5TP4ThLBKETYdzVvg4exjQfektMatk5EyUpEIhZPXh5vXpJZesdfO9LJ8zTaHBsBjDPU7cdNgQMbebpataRi8A0el2/IJXl+E+olgAz5zC4i2O1Q=="}',
|
|
447
|
+
},
|
|
448
|
+
{
|
|
449
|
+
id: '6424c353eaf78d000766e9510b125fba',
|
|
450
|
+
source: 'bitgo',
|
|
451
|
+
type: 'tss',
|
|
452
|
+
commonKeychain: '19bdfe2a4b498a05511381235a8892d54267807c4a3f654e310b938b8b424ff4adedbe92f4c146de641c67508a961324c8504cdf8e0c0acbb68d6104ccccd781',
|
|
453
|
+
verifiedVssProof: true,
|
|
454
|
+
isBitGo: true,
|
|
455
|
+
},
|
|
456
|
+
];
|
|
457
|
+
});
|
|
458
|
+
it('should return true when validating a well formatted address', async function () {
|
|
459
|
+
const address = 'f941ae3cbe5645dccc15da8346b533f7f91f202089a5521653c062b2ff10b304';
|
|
460
|
+
basecoin.isValidAddress(address).should.equal(true);
|
|
461
|
+
});
|
|
462
|
+
it('should return true when validating a well formatted address prefixed with 0x', async function () {
|
|
463
|
+
const address = '0xf941ae3cbe5645dccc15da8346b533f7f91f202089a5521653c062b2ff10b304';
|
|
464
|
+
basecoin.isValidAddress(address).should.equal(true);
|
|
465
|
+
});
|
|
466
|
+
it('should return false when validating an old address', async function () {
|
|
467
|
+
const address = '0x2959bfc3fdb7dc23fed8deba2fafb70f3e606a59';
|
|
468
|
+
basecoin.isValidAddress(address).should.equal(false);
|
|
469
|
+
});
|
|
470
|
+
it('should return false when validating an incorrectly formatted', async function () {
|
|
471
|
+
const address = 'wrongaddress';
|
|
472
|
+
basecoin.isValidAddress(address).should.equal(false);
|
|
473
|
+
});
|
|
474
|
+
it('should return true for isWalletAddress with valid address for index 4', async function () {
|
|
475
|
+
const newAddress = '0x8b3c7807730d75792dd6c49732cf9f014d6984a9c77d386bdb1072a9e537d8d8';
|
|
476
|
+
const index = 4;
|
|
477
|
+
const params = { commonKeychain, address: newAddress, index, keychains };
|
|
478
|
+
(await basecoin.isWalletAddress(params)).should.equal(true);
|
|
479
|
+
});
|
|
480
|
+
it('should throw error for isWalletAddress when keychains is missing', async function () {
|
|
481
|
+
const address = '0x2959bfc3fdb7dc23fed8deba2fafb70f3e606a59';
|
|
482
|
+
const index = 0;
|
|
483
|
+
const params = { commonKeychain, address, index };
|
|
484
|
+
await assert_1.default.rejects(async () => basecoin.isWalletAddress(params));
|
|
485
|
+
});
|
|
486
|
+
it('should throw error for isWalletAddress when new address is invalid', async function () {
|
|
487
|
+
const wrongAddress = 'badAddress';
|
|
488
|
+
const index = 0;
|
|
489
|
+
const params = { commonKeychain, address: wrongAddress, index };
|
|
490
|
+
await assert_1.default.rejects(async () => basecoin.isWalletAddress(params), {
|
|
491
|
+
message: `invalid address: ${wrongAddress}`,
|
|
492
|
+
});
|
|
493
|
+
});
|
|
494
|
+
});
|
|
495
|
+
describe('Recover Transactions:', () => {
|
|
496
|
+
const sandBox = sinon_1.default.createSandbox();
|
|
497
|
+
const senderAddress0 = '0x91f25e237b83a00a62724fdc4a81e43f494dc6b41a1241492826d36e4d131da3';
|
|
498
|
+
const recoveryDestination = '0x00e4eaa6a291fe02918452e645b5653cd260a5fc0fb35f6193d580916aa9e389';
|
|
499
|
+
const walletPassphrase = 'p$Sw<RjvAgf{nYAYI2xM';
|
|
500
|
+
let getBalanceStub;
|
|
501
|
+
let getInputCoinsStub;
|
|
502
|
+
let getFeeEstimateStub;
|
|
503
|
+
beforeEach(() => {
|
|
504
|
+
getBalanceStub = sandBox.stub(src_1.Sui.prototype, 'getBalance');
|
|
505
|
+
getBalanceStub
|
|
506
|
+
.withArgs(senderAddress0)
|
|
507
|
+
.resolves({ totalBalance: '1900000000', coinObjectBalance: '1900000000', fundsInAddressBalance: '0' });
|
|
508
|
+
getInputCoinsStub = sandBox.stub(src_1.Sui.prototype, 'getInputCoins');
|
|
509
|
+
getInputCoinsStub.withArgs(senderAddress0).resolves([
|
|
510
|
+
{
|
|
511
|
+
coinType: '0x2::sui::SUI',
|
|
512
|
+
objectId: '0xc05c765e26e6ae84c78fa245f38a23fb20406a5cf3f61b57bd323a0df9d98003',
|
|
513
|
+
version: '195',
|
|
514
|
+
digest: '7BJLb32LKN7wt5uv4xgXW4AbFKoMNcPE76o41TQEvUZb',
|
|
515
|
+
balance: new bignumber_js_1.default('1900000000'),
|
|
516
|
+
},
|
|
517
|
+
]);
|
|
518
|
+
getFeeEstimateStub = sandBox.stub(src_1.Sui.prototype, 'getFeeEstimate');
|
|
519
|
+
getFeeEstimateStub
|
|
520
|
+
.withArgs('AAACAAgA0klrAAAAAAAgAOTqpqKR/gKRhFLmRbVlPNJgpfwPs19hk9WAkWqp44kCAgABAQAAAQECAAABAQCR8l4je4OgCmJyT9xKgeQ/SU3GtBoSQUkoJtNuTRMdowHAXHZeJuauhMePokXziiP7IEBqXPP2G1e9MjoN+dmAA8MAAAAAAAAAIFvJiJBdEAhi14cxcSr/HUIhBZMbLMd4rczUTCMIb3UmkfJeI3uDoApick/cSoHkP0lNxrQaEkFJKCbTbk0THaPoAwAAAAAAAADh9QUAAAAAAA==')
|
|
521
|
+
.resolves(new bignumber_js_1.default(1997880));
|
|
522
|
+
});
|
|
523
|
+
afterEach(() => {
|
|
524
|
+
sandBox.restore();
|
|
525
|
+
});
|
|
526
|
+
it('should recover a txn for non-bitgo recovery', async function () {
|
|
527
|
+
const res = await basecoin.recover({
|
|
528
|
+
userKey: sui_1.keys.userKey,
|
|
529
|
+
backupKey: sui_1.keys.backupKey,
|
|
530
|
+
bitgoKey: sui_1.keys.bitgoKey,
|
|
531
|
+
recoveryDestination,
|
|
532
|
+
walletPassphrase,
|
|
533
|
+
});
|
|
534
|
+
res.should.not.be.empty();
|
|
535
|
+
res.should.hasOwnProperty('transactions');
|
|
536
|
+
const tx = res.transactions[0];
|
|
537
|
+
tx.scanIndex.should.equal(0);
|
|
538
|
+
tx.recoveryAmount.should.equal('1897802332');
|
|
539
|
+
tx.serializedTx.should.equal('AAACAAhcKh5xAAAAAAAgAOTqpqKR/gKRhFLmRbVlPNJgpfwPs19hk9WAkWqp44kCAgABAQAAAQECAAABAQCR8l4je4OgCmJyT9xKgeQ/SU3GtBoSQUkoJtNuTRMdowHAXHZeJuauhMePokXziiP7IEBqXPP2G1e9MjoN+dmAA8MAAAAAAAAAIFvJiJBdEAhi14cxcSr/HUIhBZMbLMd4rczUTCMIb3UmkfJeI3uDoApick/cSoHkP0lNxrQaEkFJKCbTbk0THaPoAwAAAAAAAKSIIQAAAAAAAA==');
|
|
540
|
+
const NonBitGoTxnDeserialize = new src_1.TransferTransaction(basecoin);
|
|
541
|
+
NonBitGoTxnDeserialize.fromRawTransaction(tx.serializedTx);
|
|
542
|
+
const NonBitGoTxnJson = NonBitGoTxnDeserialize.toJson();
|
|
543
|
+
should_1.default.equal(NonBitGoTxnJson.id, 'FDCBUNqLUAW4qBTnFjTCPZazL8VnRBP2gS3GmEnwtEcg');
|
|
544
|
+
should_1.default.equal(NonBitGoTxnJson.sender, senderAddress0);
|
|
545
|
+
sandBox.assert.callCount(basecoin.getBalance, 1);
|
|
546
|
+
sandBox.assert.callCount(basecoin.getInputCoins, 1);
|
|
547
|
+
sandBox.assert.callCount(basecoin.getFeeEstimate, 1);
|
|
548
|
+
});
|
|
549
|
+
it('should recover a txn for unsigned sweep recovery', async function () {
|
|
550
|
+
const res = await basecoin.recover({
|
|
551
|
+
bitgoKey: sui_1.keys.bitgoKey,
|
|
552
|
+
recoveryDestination,
|
|
553
|
+
});
|
|
554
|
+
res.should.deepEqual({
|
|
555
|
+
txRequests: [
|
|
556
|
+
{
|
|
557
|
+
transactions: [
|
|
558
|
+
{
|
|
559
|
+
unsignedTx: {
|
|
560
|
+
serializedTx: '00000200085c2a1e7100000000002000e4eaa6a291fe02918452e645b5653cd260a5fc0fb35f6193d580916aa9e38902020001010000010102000001010091f25e237b83a00a62724fdc4a81e43f494dc6b41a1241492826d36e4d131da301c05c765e26e6ae84c78fa245f38a23fb20406a5cf3f61b57bd323a0df9d98003c300000000000000205bc988905d100862d78731712aff1d422105931b2cc778adccd44c23086f752691f25e237b83a00a62724fdc4a81e43f494dc6b41a1241492826d36e4d131da3e803000000000000a48821000000000000',
|
|
561
|
+
scanIndex: 0,
|
|
562
|
+
coin: 'tsui',
|
|
563
|
+
signableHex: '873748a31e766f5f8f0077d8d0003548fae4f4c1344067a7c3799cfa73808fb7',
|
|
564
|
+
derivationPath: 'm/0',
|
|
565
|
+
parsedTx: {
|
|
566
|
+
inputs: [
|
|
567
|
+
{
|
|
568
|
+
address: '0x91f25e237b83a00a62724fdc4a81e43f494dc6b41a1241492826d36e4d131da3',
|
|
569
|
+
valueString: '1897802332',
|
|
570
|
+
value: new bignumber_js_1.default(1897802332),
|
|
571
|
+
},
|
|
572
|
+
],
|
|
573
|
+
outputs: [
|
|
574
|
+
{
|
|
575
|
+
address: '0x00e4eaa6a291fe02918452e645b5653cd260a5fc0fb35f6193d580916aa9e389',
|
|
576
|
+
valueString: '1897802332',
|
|
577
|
+
coinName: 'tsui',
|
|
578
|
+
},
|
|
579
|
+
],
|
|
580
|
+
spendAmount: '1897802332',
|
|
581
|
+
type: 'Transfer',
|
|
582
|
+
},
|
|
583
|
+
feeInfo: { fee: 2197668, feeString: '2197668' },
|
|
584
|
+
coinSpecific: {
|
|
585
|
+
commonKeychain: '3b89eec9d2d2f3b049ecda2e7b5f47827f7927fe6618d6e8b13f64e7c95f4b00b9577ab01395ecf8eeb804b590cedae14ff5fd3947bf3b7a95b9327c49e27c54',
|
|
586
|
+
},
|
|
587
|
+
},
|
|
588
|
+
signatureShares: [],
|
|
589
|
+
},
|
|
590
|
+
],
|
|
591
|
+
walletCoin: 'tsui',
|
|
592
|
+
},
|
|
593
|
+
],
|
|
594
|
+
});
|
|
595
|
+
const unsignedSweepTxnDeserialize = new src_1.TransferTransaction(basecoin);
|
|
596
|
+
const serializedTxHex = res.txRequests[0].transactions[0].unsignedTx.serializedTx;
|
|
597
|
+
const serializedTxBase64 = buffer_1.Buffer.from(serializedTxHex, 'hex').toString('base64');
|
|
598
|
+
unsignedSweepTxnDeserialize.fromRawTransaction(serializedTxBase64);
|
|
599
|
+
const unsignedSweepTxnJson = unsignedSweepTxnDeserialize.toJson();
|
|
600
|
+
should_1.default.equal(unsignedSweepTxnJson.id, 'FDCBUNqLUAW4qBTnFjTCPZazL8VnRBP2gS3GmEnwtEcg');
|
|
601
|
+
should_1.default.equal(unsignedSweepTxnJson.sender, senderAddress0);
|
|
602
|
+
sandBox.assert.callCount(basecoin.getBalance, 1);
|
|
603
|
+
sandBox.assert.callCount(basecoin.getInputCoins, 1);
|
|
604
|
+
sandBox.assert.callCount(basecoin.getFeeEstimate, 1);
|
|
605
|
+
});
|
|
606
|
+
it('should recover a txn for unsigned sweep recovery with multiple input coins', async function () {
|
|
607
|
+
const senderAddress = '0x00e4eaa6a291fe02918452e645b5653cd260a5fc0fb35f6193d580916aa9e389';
|
|
608
|
+
getBalanceStub
|
|
609
|
+
.withArgs(senderAddress)
|
|
610
|
+
.resolves({ totalBalance: '1798002120', coinObjectBalance: '1798002120', fundsInAddressBalance: '0' });
|
|
611
|
+
getInputCoinsStub.withArgs(senderAddress).resolves([
|
|
612
|
+
{
|
|
613
|
+
coinType: '0x2::sui::SUI',
|
|
614
|
+
objectId: '0x60aefaffa35daa32a1e561f2ba9c18753057d2feb502f32804e573ea2875a39c',
|
|
615
|
+
version: '195',
|
|
616
|
+
digest: 'jKjduy8gHDE244ZJWcP3JXfXPKjqY67avMqhzHw98CL',
|
|
617
|
+
balance: new bignumber_js_1.default('98002120'),
|
|
618
|
+
},
|
|
619
|
+
{
|
|
620
|
+
coinType: '0x2::sui::SUI',
|
|
621
|
+
objectId: '0x9a363c91d29b50832ab98094b6c1933941280fc298a2ec232739f14ce31e2582',
|
|
622
|
+
version: '197',
|
|
623
|
+
digest: 'ELnbgmW7crPYr3B9pWVqfg9uLeJt43KPofkfdR6LWftu',
|
|
624
|
+
balance: new bignumber_js_1.default('1700000000'),
|
|
625
|
+
},
|
|
626
|
+
]);
|
|
627
|
+
getFeeEstimateStub
|
|
628
|
+
.withArgs('AAACAAjIdDVlAAAAAAAgMtjlfubZHlVY2gZ3FUwvCFeVNI4xf5Wsye+t4bQRL8wCAgABAQAAAQECAAABAQAA5OqmopH+ApGEUuZFtWU80mCl/A+zX2GT1YCRaqnjiQKaNjyR0ptQgyq5gJS2wZM5QSgPwpii7CMnOfFM4x4lgsUAAAAAAAAAIMY5hfUFzuMVaY3+LwmZTvypRSAJRLNXocRYR9yKalXyYK76/6NdqjKh5WHyupwYdTBX0v61AvMoBOVz6ih1o5zDAAAAAAAAACAK15PtO6gwSNx0bHksVJOcN96AYyc+3YVpJzaYMMhHbQDk6qaikf4CkYRS5kW1ZTzSYKX8D7NfYZPVgJFqqeOJ6AMAAAAAAAAA4fUFAAAAAAA=')
|
|
629
|
+
.resolves(new bignumber_js_1.default(1997880));
|
|
630
|
+
const res = await basecoin.recover({
|
|
631
|
+
bitgoKey: '7d91f69c285c0b3b0a0d6371020f194d45956ee556289e7854f6d114e07805720eec673c6a2\n72b7da4137db7b1289f38af4f4b824ef0de65c5f53e3e66617617',
|
|
632
|
+
recoveryDestination: '0x32d8e57ee6d91e5558da0677154c2f085795348e317f95acc9efade1b4112fcc',
|
|
633
|
+
});
|
|
634
|
+
res.should.deepEqual({
|
|
635
|
+
txRequests: [
|
|
636
|
+
{
|
|
637
|
+
transactions: [
|
|
638
|
+
{
|
|
639
|
+
unsignedTx: {
|
|
640
|
+
serializedTx: '000002000824cd096b00000000002032d8e57ee6d91e5558da0677154c2f085795348e317f95acc9efade1b4112fcc02020001010000010102000001010000e4eaa6a291fe02918452e645b5653cd260a5fc0fb35f6193d580916aa9e389029a363c91d29b50832ab98094b6c1933941280fc298a2ec232739f14ce31e2582c50000000000000020c63985f505cee315698dfe2f09994efca945200944b357a1c45847dc8a6a55f260aefaffa35daa32a1e561f2ba9c18753057d2feb502f32804e573ea2875a39cc300000000000000200ad793ed3ba83048dc746c792c54939c37de8063273edd856927369830c8476d00e4eaa6a291fe02918452e645b5653cd260a5fc0fb35f6193d580916aa9e389e803000000000000a48821000000000000',
|
|
641
|
+
scanIndex: 0,
|
|
642
|
+
coin: 'tsui',
|
|
643
|
+
signableHex: '3eec395ccaee7d6a0b9fa5488dd00bfeb89dc4bd37e3139ebebb62c2e60bc00d',
|
|
644
|
+
derivationPath: 'm/0',
|
|
645
|
+
parsedTx: {
|
|
646
|
+
inputs: [
|
|
647
|
+
{
|
|
648
|
+
address: '0x00e4eaa6a291fe02918452e645b5653cd260a5fc0fb35f6193d580916aa9e389',
|
|
649
|
+
valueString: '1795804452',
|
|
650
|
+
value: new bignumber_js_1.default(1795804452),
|
|
651
|
+
},
|
|
652
|
+
],
|
|
653
|
+
outputs: [
|
|
654
|
+
{
|
|
655
|
+
address: '0x32d8e57ee6d91e5558da0677154c2f085795348e317f95acc9efade1b4112fcc',
|
|
656
|
+
valueString: '1795804452',
|
|
657
|
+
coinName: 'tsui',
|
|
658
|
+
},
|
|
659
|
+
],
|
|
660
|
+
spendAmount: '1795804452',
|
|
661
|
+
type: 'Transfer',
|
|
662
|
+
},
|
|
663
|
+
feeInfo: { fee: 2197668, feeString: '2197668' },
|
|
664
|
+
coinSpecific: {
|
|
665
|
+
commonKeychain: '7d91f69c285c0b3b0a0d6371020f194d45956ee556289e7854f6d114e07805720eec673c6a272b7da4137db7b1289f38af4f4b824ef0de65c5f53e3e66617617',
|
|
666
|
+
},
|
|
667
|
+
},
|
|
668
|
+
signatureShares: [],
|
|
669
|
+
},
|
|
670
|
+
],
|
|
671
|
+
walletCoin: 'tsui',
|
|
672
|
+
},
|
|
673
|
+
],
|
|
674
|
+
});
|
|
675
|
+
const unsignedSweepTxnDeserialize = new src_1.TransferTransaction(basecoin);
|
|
676
|
+
const serializedTxHex = res.txRequests[0].transactions[0].unsignedTx.serializedTx;
|
|
677
|
+
const serializedTxBase64 = buffer_1.Buffer.from(serializedTxHex, 'hex').toString('base64');
|
|
678
|
+
unsignedSweepTxnDeserialize.fromRawTransaction(serializedTxBase64);
|
|
679
|
+
const unsignedSweepTxnJson = unsignedSweepTxnDeserialize.toJson();
|
|
680
|
+
should_1.default.equal(unsignedSweepTxnJson.id, '7Jyx3KUVXxs1Q2i1RqXtj4hFgUgBon6PUQAovL84Y3eP');
|
|
681
|
+
should_1.default.equal(unsignedSweepTxnJson.sender, senderAddress);
|
|
682
|
+
sandBox.assert.callCount(basecoin.getBalance, 1);
|
|
683
|
+
sandBox.assert.callCount(basecoin.getInputCoins, 1);
|
|
684
|
+
sandBox.assert.callCount(basecoin.getFeeEstimate, 1);
|
|
685
|
+
});
|
|
686
|
+
});
|
|
687
|
+
describe('Recover Token Transactions:', () => {
|
|
688
|
+
const sandBox = sinon_1.default.createSandbox();
|
|
689
|
+
const coinType = '0x36dbef866a1d62bf7328989a10fb2f07d769f4ee587c0de4a0a256e57e0a58a8::deep::DEEP';
|
|
690
|
+
const senderAddress0 = '0x91f25e237b83a00a62724fdc4a81e43f494dc6b41a1241492826d36e4d131da3';
|
|
691
|
+
const senderAddressColdWallet = '0x016495ddda748c116a218242835d364709d6c5ee5c8a1ed684c4ef433d314421';
|
|
692
|
+
const recoveryDestination = '0x00e4eaa6a291fe02918452e645b5653cd260a5fc0fb35f6193d580916aa9e389';
|
|
693
|
+
const walletPassphrase = 'p$Sw<RjvAgf{nYAYI2xM';
|
|
694
|
+
const tokenContractAddress = '0x36dbef866a1d62bf7328989a10fb2f07d769f4ee587c0de4a0a256e57e0a58a8';
|
|
695
|
+
let getBalanceStub;
|
|
696
|
+
let getInputCoinsStub;
|
|
697
|
+
let getFeeEstimateStub;
|
|
698
|
+
beforeEach(() => {
|
|
699
|
+
getBalanceStub = sandBox.stub(src_1.Sui.prototype, 'getBalance');
|
|
700
|
+
getInputCoinsStub = sandBox.stub(src_1.Sui.prototype, 'getInputCoins');
|
|
701
|
+
getFeeEstimateStub = sandBox.stub(src_1.Sui.prototype, 'getFeeEstimate');
|
|
702
|
+
});
|
|
703
|
+
afterEach(() => {
|
|
704
|
+
sandBox.restore();
|
|
705
|
+
});
|
|
706
|
+
it('should recover a token txn for non-bitgo recovery', async function () {
|
|
707
|
+
getBalanceStub
|
|
708
|
+
.withArgs(senderAddress0)
|
|
709
|
+
.resolves({ totalBalance: '1900000000', coinObjectBalance: '1900000000', fundsInAddressBalance: '0' })
|
|
710
|
+
.withArgs(senderAddress0, coinType)
|
|
711
|
+
.resolves({ totalBalance: '1000', coinObjectBalance: '1000', fundsInAddressBalance: '0' });
|
|
712
|
+
getInputCoinsStub.withArgs(senderAddress0, coinType).resolves([
|
|
713
|
+
{
|
|
714
|
+
coinType: '0x36dbef866a1d62bf7328989a10fb2f07d769f4ee587c0de4a0a256e57e0a58a8::deep::DEEP',
|
|
715
|
+
objectId: '0x924ab69ebba304f2975a588372b41e4e1f5db7fa824868f84199eeb1e0a15a2d',
|
|
716
|
+
version: '34696807',
|
|
717
|
+
digest: '7XRbWQTiwAUCjLLsZVpJMrABCheJBkzKVfCr7aTZZVkd',
|
|
718
|
+
balance: new bignumber_js_1.default(1000),
|
|
719
|
+
},
|
|
720
|
+
]);
|
|
721
|
+
getInputCoinsStub.withArgs(senderAddress0).resolves([
|
|
722
|
+
{
|
|
723
|
+
coinType: '0x2::sui::SUI',
|
|
724
|
+
objectId: '0x9146928f557cb8ab1915a5886c1362435a05b4709b586bb01d4c70e85bb53161',
|
|
725
|
+
version: '239',
|
|
726
|
+
digest: 'GLSzR6HJ319nPKAFm5x3TWHcaHZzCFSBCqhvZ1qwT5wr',
|
|
727
|
+
balance: new bignumber_js_1.default('1230261076'),
|
|
728
|
+
},
|
|
729
|
+
{
|
|
730
|
+
coinType: '0x2::sui::SUI',
|
|
731
|
+
objectId: '0x93f700dc82e229f699f47b167859c5108288b78f54068800cc290900d0de8429',
|
|
732
|
+
version: '149',
|
|
733
|
+
digest: '2wXDxt2ZxekBxN6oW3BqVDXZcX49C87n1AN26Nyu7kPR',
|
|
734
|
+
balance: new bignumber_js_1.default('169611024'),
|
|
735
|
+
},
|
|
736
|
+
{
|
|
737
|
+
coinType: '0x2::sui::SUI',
|
|
738
|
+
objectId: '0xb869b45744ca2c4a663c6e8679db5a632bead0364273842d3990d7ff65d57b1e',
|
|
739
|
+
version: '237',
|
|
740
|
+
digest: 'F1xWKPVHV5WL72ErjgQxrjn3RNH2GHjyN9jTgwW7Qphk',
|
|
741
|
+
balance: new bignumber_js_1.default('101976'),
|
|
742
|
+
},
|
|
743
|
+
]);
|
|
744
|
+
getFeeEstimateStub
|
|
745
|
+
.withArgs('AAADAQCSSraeu6ME8pdaWINytB5OH123+oJIaPhBme6x4KFaLWduEQIAAAAAIGDxWv07uqv0hEZiOG0FC/xG830WBmRDZLOLmMp61gdSAAjoAwAAAAAAAAAgAOTqpqKR/gKRhFLmRbVlPNJgpfwPs19hk9WAkWqp44kCAgEAAAEBAQABAQIAAAECAJHyXiN7g6AKYnJP3EqB5D9JTca0GhJBSSgm025NEx2jAZFGko9VfLirGRWliGwTYkNaBbRwm1hrsB1McOhbtTFh7wAAAAAAAAAg49q55eJGGM5xtoJzY233UnL2dj1Kb5N90YxZ70QopW2R8l4je4OgCmJyT9xKgeQ/SU3GtBoSQUkoJtNuTRMdo+gDAAAAAAAAAOH1BQAAAAAA')
|
|
746
|
+
.resolves(new bignumber_js_1.default(2345504));
|
|
747
|
+
const res = await basecoin.recover({
|
|
748
|
+
userKey: sui_1.keys.userKey,
|
|
749
|
+
backupKey: sui_1.keys.backupKey,
|
|
750
|
+
bitgoKey: sui_1.keys.bitgoKey,
|
|
751
|
+
recoveryDestination,
|
|
752
|
+
walletPassphrase,
|
|
753
|
+
tokenContractAddress,
|
|
754
|
+
});
|
|
755
|
+
res.should.not.be.empty();
|
|
756
|
+
res.should.hasOwnProperty('transactions');
|
|
757
|
+
const tx = res.transactions[0];
|
|
758
|
+
tx.scanIndex.should.equal(0);
|
|
759
|
+
tx.recoveryAmount.should.equal('1000');
|
|
760
|
+
tx.serializedTx.should.equal('AAADAQCSSraeu6ME8pdaWINytB5OH123+oJIaPhBme6x4KFaLWduEQIAAAAAIGDxWv07uqv0hEZiOG0FC/xG830WBmRDZLOLmMp61gdSAAjoAwAAAAAAAAAgAOTqpqKR/gKRhFLmRbVlPNJgpfwPs19hk9WAkWqp44kCAgEAAAEBAQABAQIAAAECAJHyXiN7g6AKYnJP3EqB5D9JTca0GhJBSSgm025NEx2jAZFGko9VfLirGRWliGwTYkNaBbRwm1hrsB1McOhbtTFh7wAAAAAAAAAg49q55eJGGM5xtoJzY233UnL2dj1Kb5N90YxZ70QopW2R8l4je4OgCmJyT9xKgeQ/SU3GtBoSQUkoJtNuTRMdo+gDAAAAAAAAVl4nAAAAAAAA');
|
|
761
|
+
const NonBitGoTxnDeserialize = new src_1.TokenTransferTransaction(basecoin);
|
|
762
|
+
NonBitGoTxnDeserialize.fromRawTransaction(tx.serializedTx);
|
|
763
|
+
const NonBitGoTxnJson = NonBitGoTxnDeserialize.toJson();
|
|
764
|
+
should_1.default.equal(NonBitGoTxnJson.id, 'DYW9mA8AZGQntk7HGQUEoEdy8BaH8Hh9Ts294EnqGTEr');
|
|
765
|
+
should_1.default.equal(NonBitGoTxnJson.sender, senderAddress0);
|
|
766
|
+
sandBox.assert.callCount(basecoin.getBalance, 3);
|
|
767
|
+
sandBox.assert.callCount(basecoin.getInputCoins, 2);
|
|
768
|
+
sandBox.assert.callCount(basecoin.getFeeEstimate, 1);
|
|
769
|
+
});
|
|
770
|
+
it('should recover a token txn for unsigned sweep recovery', async function () {
|
|
771
|
+
getBalanceStub
|
|
772
|
+
.withArgs(senderAddressColdWallet)
|
|
773
|
+
.resolves({ totalBalance: '298980240', coinObjectBalance: '298980240', fundsInAddressBalance: '0' });
|
|
774
|
+
getBalanceStub
|
|
775
|
+
.withArgs(senderAddressColdWallet, coinType)
|
|
776
|
+
.resolves({ totalBalance: '1000', coinObjectBalance: '1000', fundsInAddressBalance: '0' });
|
|
777
|
+
getInputCoinsStub.withArgs(senderAddressColdWallet, coinType).resolves([
|
|
778
|
+
{
|
|
779
|
+
coinType: '0x36dbef866a1d62bf7328989a10fb2f07d769f4ee587c0de4a0a256e57e0a58a8::deep::DEEP',
|
|
780
|
+
objectId: '0x4c1cccc6d03510bd74a95f81b2b7da08119cb18e2c565435e7ad715e6aadc5a7',
|
|
781
|
+
version: '34696809',
|
|
782
|
+
digest: 'Afy4LW46tuczj341TbCLeeynxrupj9Lw2qBQUpndHc1c',
|
|
783
|
+
balance: new bignumber_js_1.default(1000),
|
|
784
|
+
},
|
|
785
|
+
]);
|
|
786
|
+
getInputCoinsStub.withArgs(senderAddressColdWallet).resolves([
|
|
787
|
+
{
|
|
788
|
+
coinType: '0x2::sui::SUI',
|
|
789
|
+
objectId: '0x98114f2ddefe3f16d9d2e016194b52c4c3af430c1601bdb3539cbd237cbca068',
|
|
790
|
+
version: '34696809',
|
|
791
|
+
digest: 'DBtoqvWtrcYHE1HjQUo4igTkHYxY7D83iHSoKXi9A85W',
|
|
792
|
+
balance: new bignumber_js_1.default(200000000),
|
|
793
|
+
},
|
|
794
|
+
{
|
|
795
|
+
coinType: '0x2::sui::SUI',
|
|
796
|
+
objectId: '0x9ec13440647b0bee74f45409589ad2ff5a18c9615f99d5d914f988b834da493e',
|
|
797
|
+
version: '239',
|
|
798
|
+
digest: '9d3uVsQ4p37TGnzTpnXXw2pFoggbVfVp9CdC4jpZq664',
|
|
799
|
+
balance: new bignumber_js_1.default(98980240),
|
|
800
|
+
},
|
|
801
|
+
]);
|
|
802
|
+
getFeeEstimateStub
|
|
803
|
+
.withArgs('AAADAQBMHMzG0DUQvXSpX4Gyt9oIEZyxjixWVDXnrXFeaq3Fp2luEQIAAAAAII+0ozS4Kazey/oqMoZCr6JNb5U3QPdoMIDuDks9OpYvAAjoAwAAAAAAAAAgAOTqpqKR/gKRhFLmRbVlPNJgpfwPs19hk9WAkWqp44kCAgEAAAEBAQABAQIAAAECAAFkld3adIwRaiGCQoNdNkcJ1sXuXIoe1oTE70M9MUQhAZgRTy3e/j8W2dLgFhlLUsTDr0MMFgG9s1OcvSN8vKBoaW4RAgAAAAAgtRahW1A0vNQkJUQMVkzzb0OVQviGce95nd4GYeeJoAkBZJXd2nSMEWohgkKDXTZHCdbF7lyKHtaExO9DPTFEIegDAAAAAAAAAOH1BQAAAAAA')
|
|
804
|
+
.resolves(new bignumber_js_1.default(2345504));
|
|
805
|
+
const res = await basecoin.recover({
|
|
806
|
+
bitgoKey: sui_1.keys.bitgoKeyColdWallet,
|
|
807
|
+
recoveryDestination,
|
|
808
|
+
tokenContractAddress,
|
|
809
|
+
});
|
|
810
|
+
res.should.deepEqual({
|
|
811
|
+
txRequests: [
|
|
812
|
+
{
|
|
813
|
+
transactions: [
|
|
814
|
+
{
|
|
815
|
+
unsignedTx: {
|
|
816
|
+
serializedTx: '00000301004c1cccc6d03510bd74a95f81b2b7da08119cb18e2c565435e7ad715e6aadc5a7696e110200000000208fb4a334b829acdecbfa2a328642afa24d6f953740f7683080ee0e4b3d3a962f0008e803000000000000002000e4eaa6a291fe02918452e645b5653cd260a5fc0fb35f6193d580916aa9e3890202010000010101000101020000010200016495ddda748c116a218242835d364709d6c5ee5c8a1ed684c4ef433d3144210198114f2ddefe3f16d9d2e016194b52c4c3af430c1601bdb3539cbd237cbca068696e11020000000020b516a15b5034bcd42425440c564cf36f439542f88671ef799dde0661e789a009016495ddda748c116a218242835d364709d6c5ee5c8a1ed684c4ef433d314421e803000000000000565e27000000000000',
|
|
817
|
+
scanIndex: 0,
|
|
818
|
+
coin: 'tsui:deep',
|
|
819
|
+
signableHex: 'e3547a58b9c48840a2774aeb71b8652a70b67ee59c3fa5b1f743738d8b295199',
|
|
820
|
+
derivationPath: 'm/0',
|
|
821
|
+
parsedTx: {
|
|
822
|
+
inputs: [
|
|
823
|
+
{
|
|
824
|
+
address: '0x016495ddda748c116a218242835d364709d6c5ee5c8a1ed684c4ef433d314421',
|
|
825
|
+
valueString: '1000',
|
|
826
|
+
value: new bignumber_js_1.default(1000),
|
|
827
|
+
},
|
|
828
|
+
],
|
|
829
|
+
outputs: [
|
|
830
|
+
{
|
|
831
|
+
address: '0x00e4eaa6a291fe02918452e645b5653cd260a5fc0fb35f6193d580916aa9e389',
|
|
832
|
+
valueString: '1000',
|
|
833
|
+
coinName: 'tsui:deep',
|
|
834
|
+
},
|
|
835
|
+
],
|
|
836
|
+
spendAmount: '1000',
|
|
837
|
+
type: 'TokenTransfer',
|
|
838
|
+
},
|
|
839
|
+
feeInfo: {
|
|
840
|
+
fee: 2580054,
|
|
841
|
+
feeString: '2580054',
|
|
842
|
+
},
|
|
843
|
+
coinSpecific: {
|
|
844
|
+
commonKeychain: '79d4b9b594df028fee3725a6af51ae3ab6a3519e9d2c322f2c8fd815b96496323c5aba7ea874c102f966f1a61d3c9a42b5f3177c6a85712cf313715afddf83d8',
|
|
845
|
+
},
|
|
846
|
+
},
|
|
847
|
+
signatureShares: [],
|
|
848
|
+
},
|
|
849
|
+
],
|
|
850
|
+
walletCoin: 'tsui:deep',
|
|
851
|
+
},
|
|
852
|
+
],
|
|
853
|
+
});
|
|
854
|
+
const unsignedSweepTxnDeserialize = new src_1.TransferTransaction(basecoin);
|
|
855
|
+
const serializedTxHex = res.txRequests[0].transactions[0].unsignedTx.serializedTx;
|
|
856
|
+
const serializedTxBase64 = buffer_1.Buffer.from(serializedTxHex, 'hex').toString('base64');
|
|
857
|
+
unsignedSweepTxnDeserialize.fromRawTransaction(serializedTxBase64);
|
|
858
|
+
const unsignedSweepTxnJson = unsignedSweepTxnDeserialize.toJson();
|
|
859
|
+
should_1.default.equal(unsignedSweepTxnJson.id, 'F8wrUjZYf6xvDW2LzW9DohAKyJFcWgGEvjMoKLxCajmV');
|
|
860
|
+
should_1.default.equal(unsignedSweepTxnJson.sender, senderAddressColdWallet);
|
|
861
|
+
sandBox.assert.callCount(basecoin.getBalance, 3);
|
|
862
|
+
sandBox.assert.callCount(basecoin.getInputCoins, 2);
|
|
863
|
+
sandBox.assert.callCount(basecoin.getFeeEstimate, 1);
|
|
864
|
+
});
|
|
865
|
+
it('should recover a token txn for unsigned sweep recovery with multiple input coins', async function () {
|
|
866
|
+
getBalanceStub
|
|
867
|
+
.withArgs(senderAddressColdWallet)
|
|
868
|
+
.resolves({ totalBalance: '298980240', coinObjectBalance: '298980240', fundsInAddressBalance: '0' });
|
|
869
|
+
getBalanceStub
|
|
870
|
+
.withArgs(senderAddressColdWallet, coinType)
|
|
871
|
+
.resolves({ totalBalance: '11000', coinObjectBalance: '11000', fundsInAddressBalance: '0' });
|
|
872
|
+
getInputCoinsStub.withArgs(senderAddressColdWallet, coinType).resolves([
|
|
873
|
+
{
|
|
874
|
+
coinType: '0x36dbef866a1d62bf7328989a10fb2f07d769f4ee587c0de4a0a256e57e0a58a8::deep::DEEP',
|
|
875
|
+
objectId: '0x4c1cccc6d03510bd74a95f81b2b7da08119cb18e2c565435e7ad715e6aadc5a7',
|
|
876
|
+
version: '34696809',
|
|
877
|
+
digest: 'Afy4LW46tuczj341TbCLeeynxrupj9Lw2qBQUpndHc1c',
|
|
878
|
+
balance: new bignumber_js_1.default('1000'),
|
|
879
|
+
},
|
|
880
|
+
{
|
|
881
|
+
coinType: '0x36dbef866a1d62bf7328989a10fb2f07d769f4ee587c0de4a0a256e57e0a58a8::deep::DEEP',
|
|
882
|
+
objectId: '0x72ad99130abd3790db7bac8908d50d3412a800a8fcd10c1cfbd64b8215537558',
|
|
883
|
+
version: '34696865',
|
|
884
|
+
digest: 'X8uaNDkSfYKa6PBzJJUe9StP4nRWR9RZoa2nJHqv5mn',
|
|
885
|
+
balance: new bignumber_js_1.default('10000'),
|
|
886
|
+
},
|
|
887
|
+
]);
|
|
888
|
+
getInputCoinsStub.withArgs(senderAddressColdWallet).resolves([
|
|
889
|
+
{
|
|
890
|
+
coinType: '0x2::sui::SUI',
|
|
891
|
+
objectId: '0x98114f2ddefe3f16d9d2e016194b52c4c3af430c1601bdb3539cbd237cbca068',
|
|
892
|
+
version: '34696809',
|
|
893
|
+
digest: 'DBtoqvWtrcYHE1HjQUo4igTkHYxY7D83iHSoKXi9A85W',
|
|
894
|
+
balance: new bignumber_js_1.default('200000000'),
|
|
895
|
+
},
|
|
896
|
+
{
|
|
897
|
+
coinType: '0x2::sui::SUI',
|
|
898
|
+
objectId: '0x9ec13440647b0bee74f45409589ad2ff5a18c9615f99d5d914f988b834da493e',
|
|
899
|
+
version: '239',
|
|
900
|
+
digest: '9d3uVsQ4p37TGnzTpnXXw2pFoggbVfVp9CdC4jpZq664',
|
|
901
|
+
balance: new bignumber_js_1.default('98980240'),
|
|
902
|
+
},
|
|
903
|
+
]);
|
|
904
|
+
getFeeEstimateStub
|
|
905
|
+
.withArgs('AAAEAQByrZkTCr03kNt7rIkI1Q00EqgAqPzRDBz71kuCFVN1WKFuEQIAAAAAIAe4XTi24bSF8UVZMNJylhCAgcqs12ZMSNfV9IVy7iu9AQBMHMzG0DUQvXSpX4Gyt9oIEZyxjixWVDXnrXFeaq3Fp2luEQIAAAAAII+0ozS4Kazey/oqMoZCr6JNb5U3QPdoMIDuDks9OpYvAAj4KgAAAAAAAAAgAOTqpqKR/gKRhFLmRbVlPNJgpfwPs19hk9WAkWqp44kDAwEAAAEBAQACAQAAAQECAAEBAgEAAQMAAWSV3dp0jBFqIYJCg102RwnWxe5cih7WhMTvQz0xRCEBmBFPLd7+PxbZ0uAWGUtSxMOvQwwWAb2zU5y9I3y8oGhpbhECAAAAACC1FqFbUDS81CQlRAxWTPNvQ5VC+IZx73md3gZh54mgCQFkld3adIwRaiGCQoNdNkcJ1sXuXIoe1oTE70M9MUQh6AMAAAAAAAAA4fUFAAAAAAA=')
|
|
906
|
+
.resolves(new bignumber_js_1.default(1036328));
|
|
907
|
+
const res = await basecoin.recover({
|
|
908
|
+
bitgoKey: sui_1.keys.bitgoKeyColdWallet,
|
|
909
|
+
recoveryDestination,
|
|
910
|
+
tokenContractAddress,
|
|
911
|
+
});
|
|
912
|
+
res.should.deepEqual({
|
|
913
|
+
txRequests: [
|
|
914
|
+
{
|
|
915
|
+
transactions: [
|
|
916
|
+
{
|
|
917
|
+
unsignedTx: {
|
|
918
|
+
serializedTx: '000004010072ad99130abd3790db7bac8908d50d3412a800a8fcd10c1cfbd64b8215537558a16e1102000000002007b85d38b6e1b485f1455930d27296108081caacd7664c48d7d5f48572ee2bbd01004c1cccc6d03510bd74a95f81b2b7da08119cb18e2c565435e7ad715e6aadc5a7696e110200000000208fb4a334b829acdecbfa2a328642afa24d6f953740f7683080ee0e4b3d3a962f0008f82a000000000000002000e4eaa6a291fe02918452e645b5653cd260a5fc0fb35f6193d580916aa9e38903030100000101010002010000010102000101020100010300016495ddda748c116a218242835d364709d6c5ee5c8a1ed684c4ef433d3144210198114f2ddefe3f16d9d2e016194b52c4c3af430c1601bdb3539cbd237cbca068696e11020000000020b516a15b5034bcd42425440c564cf36f439542f88671ef799dde0661e789a009016495ddda748c116a218242835d364709d6c5ee5c8a1ed684c4ef433d314421e803000000000000f86411000000000000',
|
|
919
|
+
scanIndex: 0,
|
|
920
|
+
coin: 'tsui:deep',
|
|
921
|
+
signableHex: 'cd028c401f815dab7f6c5e8a33976879c5c799ae7c9fde01cafd0aee0075a174',
|
|
922
|
+
derivationPath: 'm/0',
|
|
923
|
+
parsedTx: {
|
|
924
|
+
inputs: [
|
|
925
|
+
{
|
|
926
|
+
address: '0x016495ddda748c116a218242835d364709d6c5ee5c8a1ed684c4ef433d314421',
|
|
927
|
+
valueString: '11000',
|
|
928
|
+
value: new bignumber_js_1.default('11000'),
|
|
929
|
+
},
|
|
930
|
+
],
|
|
931
|
+
outputs: [
|
|
932
|
+
{
|
|
933
|
+
address: '0x00e4eaa6a291fe02918452e645b5653cd260a5fc0fb35f6193d580916aa9e389',
|
|
934
|
+
valueString: '11000',
|
|
935
|
+
coinName: 'tsui:deep',
|
|
936
|
+
},
|
|
937
|
+
],
|
|
938
|
+
spendAmount: '11000',
|
|
939
|
+
type: 'TokenTransfer',
|
|
940
|
+
},
|
|
941
|
+
feeInfo: {
|
|
942
|
+
fee: 1139960,
|
|
943
|
+
feeString: '1139960',
|
|
944
|
+
},
|
|
945
|
+
coinSpecific: {
|
|
946
|
+
commonKeychain: '79d4b9b594df028fee3725a6af51ae3ab6a3519e9d2c322f2c8fd815b96496323c5aba7ea874c102f966f1a61d3c9a42b5f3177c6a85712cf313715afddf83d8',
|
|
947
|
+
},
|
|
948
|
+
},
|
|
949
|
+
signatureShares: [],
|
|
950
|
+
},
|
|
951
|
+
],
|
|
952
|
+
walletCoin: 'tsui:deep',
|
|
953
|
+
},
|
|
954
|
+
],
|
|
955
|
+
});
|
|
956
|
+
const unsignedSweepTxnDeserialize = new src_1.TransferTransaction(basecoin);
|
|
957
|
+
const serializedTxHex = res.txRequests[0].transactions[0].unsignedTx.serializedTx;
|
|
958
|
+
const serializedTxBase64 = buffer_1.Buffer.from(serializedTxHex, 'hex').toString('base64');
|
|
959
|
+
unsignedSweepTxnDeserialize.fromRawTransaction(serializedTxBase64);
|
|
960
|
+
const unsignedSweepTxnJson = unsignedSweepTxnDeserialize.toJson();
|
|
961
|
+
should_1.default.equal(unsignedSweepTxnJson.id, '4qeXJP7pTa6pmyAKuJZG9AkGsKM53SDqHVcPjRMFHjc5');
|
|
962
|
+
should_1.default.equal(unsignedSweepTxnJson.sender, senderAddressColdWallet);
|
|
963
|
+
sandBox.assert.callCount(basecoin.getBalance, 3);
|
|
964
|
+
sandBox.assert.callCount(basecoin.getInputCoins, 2);
|
|
965
|
+
sandBox.assert.callCount(basecoin.getFeeEstimate, 1);
|
|
966
|
+
});
|
|
967
|
+
});
|
|
968
|
+
describe('Recover Transactions for wallet with multiple addresses:', () => {
|
|
969
|
+
const sandBox = sinon_1.default.createSandbox();
|
|
970
|
+
const senderAddress0 = '0x91f25e237b83a00a62724fdc4a81e43f494dc6b41a1241492826d36e4d131da3';
|
|
971
|
+
const senderAddress1 = '0x32d8e57ee6d91e5558da0677154c2f085795348e317f95acc9efade1b4112fcc';
|
|
972
|
+
const recoveryDestination = '0x00e4eaa6a291fe02918452e645b5653cd260a5fc0fb35f6193d580916aa9e389';
|
|
973
|
+
const walletPassphrase = 'p$Sw<RjvAgf{nYAYI2xM';
|
|
974
|
+
beforeEach(function () {
|
|
975
|
+
let callBack = sandBox.stub(src_1.Sui.prototype, 'getBalance');
|
|
976
|
+
callBack
|
|
977
|
+
.withArgs(senderAddress0)
|
|
978
|
+
.resolves({ totalBalance: '0', coinObjectBalance: '0', fundsInAddressBalance: '0' })
|
|
979
|
+
.withArgs(senderAddress1)
|
|
980
|
+
.resolves({ totalBalance: '1800000000', coinObjectBalance: '1800000000', fundsInAddressBalance: '0' });
|
|
981
|
+
callBack = sandBox.stub(src_1.Sui.prototype, 'getInputCoins');
|
|
982
|
+
callBack.withArgs(senderAddress1).resolves([
|
|
983
|
+
{
|
|
984
|
+
coinType: '0x2::sui::SUI',
|
|
985
|
+
objectId: '0xff93adc2f516fcaa0c6040e01f50027a23f9b1767f5040eb2282790a6900ce7f',
|
|
986
|
+
version: '196',
|
|
987
|
+
digest: 'XrjRM9ZM98xdNWigHYQjCpGoWt6aZLpqXdSEixnhb4p',
|
|
988
|
+
balance: new bignumber_js_1.default('1800000000'),
|
|
989
|
+
},
|
|
990
|
+
]);
|
|
991
|
+
callBack = sandBox.stub(src_1.Sui.prototype, 'getFeeEstimate');
|
|
992
|
+
callBack
|
|
993
|
+
.withArgs('AAACAAgA8VNlAAAAAAAgAOTqpqKR/gKRhFLmRbVlPNJgpfwPs19hk9WAkWqp44kCAgABAQAAAQECAAABAQAy2OV+5tkeVVjaBncVTC8IV5U0jjF/lazJ763htBEvzAH/k63C9Rb8qgxgQOAfUAJ6I/mxdn9QQOsignkKaQDOf8QAAAAAAAAAIAfnp90gMsdBGGz1tW/sFQlArhkRmYjdiXTXx+CvxHjVMtjlfubZHlVY2gZ3FUwvCFeVNI4xf5Wsye+t4bQRL8zoAwAAAAAAAADh9QUAAAAAAA==')
|
|
994
|
+
.resolves(new bignumber_js_1.default(1997880));
|
|
995
|
+
});
|
|
996
|
+
afterEach(function () {
|
|
997
|
+
sandBox.restore();
|
|
998
|
+
});
|
|
999
|
+
it('should recover a txn for non-bitgo recoveries at address 1 but search from address 0', async function () {
|
|
1000
|
+
const res = await basecoin.recover({
|
|
1001
|
+
userKey: sui_1.keys.userKey,
|
|
1002
|
+
backupKey: sui_1.keys.backupKey,
|
|
1003
|
+
bitgoKey: sui_1.keys.bitgoKey,
|
|
1004
|
+
recoveryDestination,
|
|
1005
|
+
walletPassphrase,
|
|
1006
|
+
});
|
|
1007
|
+
res.should.not.be.empty();
|
|
1008
|
+
res.should.hasOwnProperty('transactions');
|
|
1009
|
+
const tx = res.transactions[0];
|
|
1010
|
+
tx.scanIndex.should.equal(1);
|
|
1011
|
+
tx.recoveryAmount.should.equal('1797802332');
|
|
1012
|
+
tx.serializedTx.should.equal('AAACAAhcSShrAAAAAAAgAOTqpqKR/gKRhFLmRbVlPNJgpfwPs19hk9WAkWqp44kCAgABAQAAAQECAAABAQAy2OV+5tkeVVjaBncVTC8IV5U0jjF/lazJ763htBEvzAH/k63C9Rb8qgxgQOAfUAJ6I/mxdn9QQOsignkKaQDOf8QAAAAAAAAAIAfnp90gMsdBGGz1tW/sFQlArhkRmYjdiXTXx+CvxHjVMtjlfubZHlVY2gZ3FUwvCFeVNI4xf5Wsye+t4bQRL8zoAwAAAAAAAKSIIQAAAAAAAA==');
|
|
1013
|
+
const UnsignedSweepTxnDeserialize = new src_1.TransferTransaction(basecoin);
|
|
1014
|
+
UnsignedSweepTxnDeserialize.fromRawTransaction(tx.serializedTx);
|
|
1015
|
+
const UnsignedSweepTxnJson = UnsignedSweepTxnDeserialize.toJson();
|
|
1016
|
+
should_1.default.equal(UnsignedSweepTxnJson.id, 'BqHcCR51mqUyi5GJYEED3cw9AgpJ3SraTrt5aE9nLkLj');
|
|
1017
|
+
should_1.default.equal(UnsignedSweepTxnJson.sender, senderAddress1);
|
|
1018
|
+
sandBox.assert.callCount(basecoin.getBalance, 2);
|
|
1019
|
+
sandBox.assert.callCount(basecoin.getInputCoins, 1);
|
|
1020
|
+
sandBox.assert.callCount(basecoin.getFeeEstimate, 1);
|
|
1021
|
+
});
|
|
1022
|
+
it('should recover a txn for non-bitgo recoveries at address 1 but search from address 1', async function () {
|
|
1023
|
+
const res = await basecoin.recover({
|
|
1024
|
+
userKey: sui_1.keys.userKey,
|
|
1025
|
+
backupKey: sui_1.keys.backupKey,
|
|
1026
|
+
bitgoKey: sui_1.keys.bitgoKey,
|
|
1027
|
+
recoveryDestination,
|
|
1028
|
+
walletPassphrase,
|
|
1029
|
+
startingScanIndex: 1,
|
|
1030
|
+
});
|
|
1031
|
+
res.should.not.be.empty();
|
|
1032
|
+
res.should.hasOwnProperty('transactions');
|
|
1033
|
+
const tx = res.transactions[0];
|
|
1034
|
+
tx.scanIndex.should.equal(1);
|
|
1035
|
+
tx.recoveryAmount.should.equal('1797802332');
|
|
1036
|
+
tx.serializedTx.should.equal('AAACAAhcSShrAAAAAAAgAOTqpqKR/gKRhFLmRbVlPNJgpfwPs19hk9WAkWqp44kCAgABAQAAAQECAAABAQAy2OV+5tkeVVjaBncVTC8IV5U0jjF/lazJ763htBEvzAH/k63C9Rb8qgxgQOAfUAJ6I/mxdn9QQOsignkKaQDOf8QAAAAAAAAAIAfnp90gMsdBGGz1tW/sFQlArhkRmYjdiXTXx+CvxHjVMtjlfubZHlVY2gZ3FUwvCFeVNI4xf5Wsye+t4bQRL8zoAwAAAAAAAKSIIQAAAAAAAA==');
|
|
1037
|
+
const UnsignedSweepTxnDeserialize = new src_1.TransferTransaction(basecoin);
|
|
1038
|
+
UnsignedSweepTxnDeserialize.fromRawTransaction(tx.serializedTx);
|
|
1039
|
+
const UnsignedSweepTxnJson = UnsignedSweepTxnDeserialize.toJson();
|
|
1040
|
+
should_1.default.equal(UnsignedSweepTxnJson.id, 'BqHcCR51mqUyi5GJYEED3cw9AgpJ3SraTrt5aE9nLkLj');
|
|
1041
|
+
should_1.default.equal(UnsignedSweepTxnJson.sender, senderAddress1);
|
|
1042
|
+
sandBox.assert.callCount(basecoin.getBalance, 1);
|
|
1043
|
+
sandBox.assert.callCount(basecoin.getInputCoins, 1);
|
|
1044
|
+
sandBox.assert.callCount(basecoin.getFeeEstimate, 1);
|
|
1045
|
+
});
|
|
1046
|
+
});
|
|
1047
|
+
describe('Recover Token Transactions for wallet with multiple addresses:', () => {
|
|
1048
|
+
const sandBox = sinon_1.default.createSandbox();
|
|
1049
|
+
const senderAddress0 = '0x91f25e237b83a00a62724fdc4a81e43f494dc6b41a1241492826d36e4d131da3';
|
|
1050
|
+
const senderAddress1 = '0x32d8e57ee6d91e5558da0677154c2f085795348e317f95acc9efade1b4112fcc';
|
|
1051
|
+
const recoveryDestination = '0x00e4eaa6a291fe02918452e645b5653cd260a5fc0fb35f6193d580916aa9e389';
|
|
1052
|
+
const walletPassphrase = 'p$Sw<RjvAgf{nYAYI2xM';
|
|
1053
|
+
const packageId = '0x36dbef866a1d62bf7328989a10fb2f07d769f4ee587c0de4a0a256e57e0a58a8';
|
|
1054
|
+
const coinType = `${packageId}::deep::DEEP`;
|
|
1055
|
+
let getBalanceStub;
|
|
1056
|
+
let getInputCoinsStub;
|
|
1057
|
+
let getFeeEstimateStub;
|
|
1058
|
+
beforeEach(function () {
|
|
1059
|
+
getBalanceStub = sandBox.stub(src_1.Sui.prototype, 'getBalance');
|
|
1060
|
+
getBalanceStub
|
|
1061
|
+
.withArgs(senderAddress0)
|
|
1062
|
+
.resolves({ totalBalance: '706875692', coinObjectBalance: '706875692', fundsInAddressBalance: '0' })
|
|
1063
|
+
.withArgs(senderAddress0, coinType)
|
|
1064
|
+
.resolves({ totalBalance: '0', coinObjectBalance: '0', fundsInAddressBalance: '0' })
|
|
1065
|
+
.withArgs(senderAddress1)
|
|
1066
|
+
.resolves({ totalBalance: '120101976', coinObjectBalance: '120101976', fundsInAddressBalance: '0' })
|
|
1067
|
+
.withArgs(senderAddress1, coinType)
|
|
1068
|
+
.resolves({ totalBalance: '1000', coinObjectBalance: '1000', fundsInAddressBalance: '0' });
|
|
1069
|
+
getInputCoinsStub = sandBox.stub(src_1.Sui.prototype, 'getInputCoins');
|
|
1070
|
+
getInputCoinsStub.withArgs(senderAddress1, coinType).resolves([
|
|
1071
|
+
{
|
|
1072
|
+
coinType: '0x36dbef866a1d62bf7328989a10fb2f07d769f4ee587c0de4a0a256e57e0a58a8::deep::DEEP',
|
|
1073
|
+
objectId: '0xcdba76bdc3f460ed0d6af834fc17b082eb9eabd0b886f9af17cd4291f2f862fa',
|
|
1074
|
+
version: '34696866',
|
|
1075
|
+
digest: '7vbSgaGytATtnQ2fLRQo3VtCwYr9KjxsuxLLMj2dfCsU',
|
|
1076
|
+
balance: new bignumber_js_1.default('1000'),
|
|
1077
|
+
},
|
|
1078
|
+
]);
|
|
1079
|
+
getInputCoinsStub.withArgs(senderAddress1).resolves([
|
|
1080
|
+
{
|
|
1081
|
+
coinType: '0x2::sui::SUI',
|
|
1082
|
+
objectId: '0x0eca78901e342b2515fbf99be243b3f00ade0a7a50675b37307f44cc195c9046',
|
|
1083
|
+
version: '34696875',
|
|
1084
|
+
digest: 'APE3nj4zYm4hY2Xn9C2n3ynyPiYqxgTRejYT7ParhpU7',
|
|
1085
|
+
balance: new bignumber_js_1.default('120000000'),
|
|
1086
|
+
},
|
|
1087
|
+
{
|
|
1088
|
+
coinType: '0x2::sui::SUI',
|
|
1089
|
+
objectId: '0x761222340db80dd9da144d55098870bc81a788205e0bbdd34c2f8df12cf45aeb',
|
|
1090
|
+
version: '227',
|
|
1091
|
+
digest: '9bwyjaSH3X8anrjGUpD1NqMrLFUtGSCK9LFuLbhjX69E',
|
|
1092
|
+
balance: new bignumber_js_1.default('101976'),
|
|
1093
|
+
},
|
|
1094
|
+
]);
|
|
1095
|
+
getFeeEstimateStub = sandBox.stub(src_1.Sui.prototype, 'getFeeEstimate');
|
|
1096
|
+
getFeeEstimateStub
|
|
1097
|
+
.withArgs('AAADAQDNuna9w/Rg7Q1q+DT8F7CC656r0LiG+a8XzUKR8vhi+qJuEQIAAAAAIGbg2VphuEezzTVLyBTrQGC+GJWMRSV5YJWka7fwmD9LAAjoAwAAAAAAAAAgAOTqpqKR/gKRhFLmRbVlPNJgpfwPs19hk9WAkWqp44kCAgEAAAEBAQABAQIAAAECADLY5X7m2R5VWNoGdxVMLwhXlTSOMX+VrMnvreG0ES/MAQ7KeJAeNCslFfv5m+JDs/AK3gp6UGdbNzB/RMwZXJBGq24RAgAAAAAgi2q2sUgd0frgxWZVkgajJAb1V5f1VzaTrXEYIxkLqDAy2OV+5tkeVVjaBncVTC8IV5U0jjF/lazJ763htBEvzOgDAAAAAAAAAOH1BQAAAAAA')
|
|
1098
|
+
.resolves(new bignumber_js_1.default(2345504));
|
|
1099
|
+
});
|
|
1100
|
+
afterEach(function () {
|
|
1101
|
+
sandBox.restore();
|
|
1102
|
+
});
|
|
1103
|
+
it('should recover a token txn for non-bitgo recoveries at address 1 but search from address 0', async function () {
|
|
1104
|
+
const res = await basecoin.recover({
|
|
1105
|
+
userKey: sui_1.keys.userKey,
|
|
1106
|
+
backupKey: sui_1.keys.backupKey,
|
|
1107
|
+
bitgoKey: sui_1.keys.bitgoKey,
|
|
1108
|
+
recoveryDestination,
|
|
1109
|
+
walletPassphrase,
|
|
1110
|
+
tokenContractAddress: packageId,
|
|
1111
|
+
});
|
|
1112
|
+
res.should.not.be.empty();
|
|
1113
|
+
res.should.hasOwnProperty('transactions');
|
|
1114
|
+
const tx = res.transactions[0];
|
|
1115
|
+
tx.scanIndex.should.equal(1);
|
|
1116
|
+
tx.recoveryAmount.should.equal('1000');
|
|
1117
|
+
tx.serializedTx.should.equal('AAADAQDNuna9w/Rg7Q1q+DT8F7CC656r0LiG+a8XzUKR8vhi+qJuEQIAAAAAIGbg2VphuEezzTVLyBTrQGC+GJWMRSV5YJWka7fwmD9LAAjoAwAAAAAAAAAgAOTqpqKR/gKRhFLmRbVlPNJgpfwPs19hk9WAkWqp44kCAgEAAAEBAQABAQIAAAECADLY5X7m2R5VWNoGdxVMLwhXlTSOMX+VrMnvreG0ES/MAQ7KeJAeNCslFfv5m+JDs/AK3gp6UGdbNzB/RMwZXJBGq24RAgAAAAAgi2q2sUgd0frgxWZVkgajJAb1V5f1VzaTrXEYIxkLqDAy2OV+5tkeVVjaBncVTC8IV5U0jjF/lazJ763htBEvzOgDAAAAAAAAVl4nAAAAAAAA');
|
|
1118
|
+
const UnsignedSweepTxnDeserialize = new src_1.TransferTransaction(basecoin);
|
|
1119
|
+
UnsignedSweepTxnDeserialize.fromRawTransaction(tx.serializedTx);
|
|
1120
|
+
const UnsignedSweepTxnJson = UnsignedSweepTxnDeserialize.toJson();
|
|
1121
|
+
should_1.default.equal(UnsignedSweepTxnJson.id, 'GFuk1VKy3wzTFeAUtrmUe6sxRhtezzrGDfKdpQTxv9so');
|
|
1122
|
+
should_1.default.equal(UnsignedSweepTxnJson.sender, senderAddress1);
|
|
1123
|
+
sandBox.assert.callCount(basecoin.getBalance, 5);
|
|
1124
|
+
sandBox.assert.callCount(basecoin.getInputCoins, 2);
|
|
1125
|
+
sandBox.assert.callCount(basecoin.getFeeEstimate, 1);
|
|
1126
|
+
});
|
|
1127
|
+
it('should recover a token txn for non-bitgo recoveries at address 1 but search from address 1', async function () {
|
|
1128
|
+
const res = await basecoin.recover({
|
|
1129
|
+
userKey: sui_1.keys.userKey,
|
|
1130
|
+
backupKey: sui_1.keys.backupKey,
|
|
1131
|
+
bitgoKey: sui_1.keys.bitgoKey,
|
|
1132
|
+
recoveryDestination,
|
|
1133
|
+
walletPassphrase,
|
|
1134
|
+
tokenContractAddress: packageId,
|
|
1135
|
+
startingScanIndex: 1,
|
|
1136
|
+
});
|
|
1137
|
+
res.should.not.be.empty();
|
|
1138
|
+
res.should.hasOwnProperty('transactions');
|
|
1139
|
+
const tx = res.transactions[0];
|
|
1140
|
+
tx.scanIndex.should.equal(1);
|
|
1141
|
+
tx.recoveryAmount.should.equal('1000');
|
|
1142
|
+
tx.serializedTx.should.equal('AAADAQDNuna9w/Rg7Q1q+DT8F7CC656r0LiG+a8XzUKR8vhi+qJuEQIAAAAAIGbg2VphuEezzTVLyBTrQGC+GJWMRSV5YJWka7fwmD9LAAjoAwAAAAAAAAAgAOTqpqKR/gKRhFLmRbVlPNJgpfwPs19hk9WAkWqp44kCAgEAAAEBAQABAQIAAAECADLY5X7m2R5VWNoGdxVMLwhXlTSOMX+VrMnvreG0ES/MAQ7KeJAeNCslFfv5m+JDs/AK3gp6UGdbNzB/RMwZXJBGq24RAgAAAAAgi2q2sUgd0frgxWZVkgajJAb1V5f1VzaTrXEYIxkLqDAy2OV+5tkeVVjaBncVTC8IV5U0jjF/lazJ763htBEvzOgDAAAAAAAAVl4nAAAAAAAA');
|
|
1143
|
+
const UnsignedSweepTxnDeserialize = new src_1.TransferTransaction(basecoin);
|
|
1144
|
+
UnsignedSweepTxnDeserialize.fromRawTransaction(tx.serializedTx);
|
|
1145
|
+
const UnsignedSweepTxnJson = UnsignedSweepTxnDeserialize.toJson();
|
|
1146
|
+
should_1.default.equal(UnsignedSweepTxnJson.id, 'GFuk1VKy3wzTFeAUtrmUe6sxRhtezzrGDfKdpQTxv9so');
|
|
1147
|
+
should_1.default.equal(UnsignedSweepTxnJson.sender, senderAddress1);
|
|
1148
|
+
sandBox.assert.callCount(basecoin.getBalance, 3);
|
|
1149
|
+
sandBox.assert.callCount(basecoin.getInputCoins, 2);
|
|
1150
|
+
sandBox.assert.callCount(basecoin.getFeeEstimate, 1);
|
|
1151
|
+
});
|
|
1152
|
+
});
|
|
1153
|
+
describe('Recover Consolidation Transactions', () => {
|
|
1154
|
+
const sandBox = sinon_1.default.createSandbox();
|
|
1155
|
+
const receiveAddress1 = '0x32d8e57ee6d91e5558da0677154c2f085795348e317f95acc9efade1b4112fcc';
|
|
1156
|
+
const receiveAddress2 = '0xdf407e3e25e9400f9779ac7571537c2361684194f1aa5db126a8f574b5ed851c';
|
|
1157
|
+
const walletPassphrase = 'p$Sw<RjvAgf{nYAYI2xM';
|
|
1158
|
+
const seedReceiveAddress1 = '0xd201566e6a0bc020fd2e6f72e9bde2223f550d64daa61398cd917c2f7501324a';
|
|
1159
|
+
const seedReceiveAddress2 = '0x2fa5d8394bd6bec5525b9550bf43be075b83422d0107c05c700944e3eaec26f9';
|
|
1160
|
+
beforeEach(function () {
|
|
1161
|
+
let callBack = sandBox.stub(src_1.Sui.prototype, 'getBalance');
|
|
1162
|
+
callBack
|
|
1163
|
+
.withArgs(receiveAddress1)
|
|
1164
|
+
.resolves({ totalBalance: '200101976', coinObjectBalance: '200101976', fundsInAddressBalance: '0' })
|
|
1165
|
+
.withArgs(receiveAddress2)
|
|
1166
|
+
.resolves({ totalBalance: '200000000', coinObjectBalance: '200000000', fundsInAddressBalance: '0' })
|
|
1167
|
+
.withArgs(seedReceiveAddress1)
|
|
1168
|
+
.resolves({ totalBalance: '500000000', coinObjectBalance: '500000000', fundsInAddressBalance: '0' })
|
|
1169
|
+
.withArgs(seedReceiveAddress2)
|
|
1170
|
+
.resolves({ totalBalance: '200000000', coinObjectBalance: '200000000', fundsInAddressBalance: '0' });
|
|
1171
|
+
callBack = sandBox.stub(src_1.Sui.prototype, 'getInputCoins');
|
|
1172
|
+
callBack
|
|
1173
|
+
.withArgs(receiveAddress1)
|
|
1174
|
+
.resolves([
|
|
1175
|
+
{
|
|
1176
|
+
coinType: '0x2::sui::SUI',
|
|
1177
|
+
objectId: '0x996aab365d4551b6d1274f520bbfa7b0a566d548b2d590b5565c623812e7e76d',
|
|
1178
|
+
version: '201',
|
|
1179
|
+
digest: 'HXpNTfx9TBdxFcXHi4RziZsQuDAHavRasK6Ri15rVwuA',
|
|
1180
|
+
balance: new bignumber_js_1.default('200000000'),
|
|
1181
|
+
},
|
|
1182
|
+
{
|
|
1183
|
+
coinType: '0x2::sui::SUI',
|
|
1184
|
+
objectId: '0xb39c5f380208cce7fe1ba1258c8d19befb02a80f14952617ed37098dbd4d2df0',
|
|
1185
|
+
version: '199',
|
|
1186
|
+
digest: 'mqk37hXLkiUYgkYxk2MyqNykCkCXwe97uMus7bDPhe2',
|
|
1187
|
+
balance: new bignumber_js_1.default('101976'),
|
|
1188
|
+
},
|
|
1189
|
+
])
|
|
1190
|
+
.withArgs(receiveAddress2)
|
|
1191
|
+
.resolves([
|
|
1192
|
+
{
|
|
1193
|
+
coinType: '0x2::sui::SUI',
|
|
1194
|
+
objectId: '0xfa04105eedebdabf729dccecf01d0cf5f1b770892fac2ed8f1e69d71a32a2d24',
|
|
1195
|
+
version: '202',
|
|
1196
|
+
digest: 'DeApRVSrTa9ttXvNyLexT4PJcAkyyxSpi3JQeUg4ua8Q',
|
|
1197
|
+
balance: new bignumber_js_1.default('200000000'),
|
|
1198
|
+
},
|
|
1199
|
+
])
|
|
1200
|
+
.withArgs(seedReceiveAddress1)
|
|
1201
|
+
.resolves([
|
|
1202
|
+
{
|
|
1203
|
+
coinType: '0x2::sui::SUI',
|
|
1204
|
+
objectId: '0x86e728fd7242b3be60e9c1941add2c47fb655779108c3500a216310218748e2d',
|
|
1205
|
+
version: '147',
|
|
1206
|
+
digest: '6PJeyEX4L8RkjsNaF5GSMCwRjmFGYrQB7fbmJPFMMPHL',
|
|
1207
|
+
balance: '500000000',
|
|
1208
|
+
},
|
|
1209
|
+
])
|
|
1210
|
+
.withArgs(seedReceiveAddress2)
|
|
1211
|
+
.resolves([
|
|
1212
|
+
{
|
|
1213
|
+
coinType: '0x2::sui::SUI',
|
|
1214
|
+
objectId: '0xfd66dbfe7a1497f210747b0532f62e6926cb144c75e519f2dfff17a4f6e515fc',
|
|
1215
|
+
version: '148',
|
|
1216
|
+
digest: 'PJ3jfS1ERShSMtFWZgma4h6duWX8nm5Bei1z3BszyBk',
|
|
1217
|
+
balance: '200000000',
|
|
1218
|
+
},
|
|
1219
|
+
]);
|
|
1220
|
+
callBack = sandBox.stub(src_1.Sui.prototype, 'getFeeEstimate');
|
|
1221
|
+
callBack
|
|
1222
|
+
.withArgs('AAACAAhYb/cFAAAAAAAgkfJeI3uDoApick/cSoHkP0lNxrQaEkFJKCbTbk0THaMCAgABAQAAAQECAAABAQAy2OV+5tkeVVjaBncVTC8IV5U0jjF/lazJ763htBEvzAKZaqs2XUVRttEnT1ILv6ewpWbVSLLVkLVWXGI4EufnbckAAAAAAAAAIPWf+f1EklW1ggi3rwo5Jw3Lftu9W/UsyrZrI0FYsBTZs5xfOAIIzOf+G6EljI0ZvvsCqA8UlSYX7TcJjb1NLfDHAAAAAAAAACALfKsZ4T9Y2y1rrlBxQQ2BouS9VFjBgVfvbbFf9U+f8zLY5X7m2R5VWNoGdxVMLwhXlTSOMX+VrMnvreG0ES/M6AMAAAAAAAAA4fUFAAAAAAA=')
|
|
1223
|
+
.resolves(new bignumber_js_1.default('1019760'))
|
|
1224
|
+
.withArgs('AAACAAgA4fUFAAAAAAAgkfJeI3uDoApick/cSoHkP0lNxrQaEkFJKCbTbk0THaMCAgABAQAAAQECAAABAQDfQH4+JelAD5d5rHVxU3wjYWhBlPGqXbEmqPV0te2FHAH6BBBe7evav3KdzOzwHQz18bdwiS+sLtjx5p1xoyotJMoAAAAAAAAAILvR1XjlKKylRGh9pX4UpBFBsCv5At6RBn+XXDAbnfRB30B+PiXpQA+Xeax1cVN8I2FoQZTxql2xJqj1dLXthRzoAwAAAAAAAADh9QUAAAAAAA==')
|
|
1225
|
+
.resolves(new bignumber_js_1.default('1997880'))
|
|
1226
|
+
.withArgs('AAACAAgAhNcXAAAAAAAgiMmeDbicuh25fLrdfzeypLKitAIllKDASyvMg35LJAQCAgABAQAAAQECAAABAQDSAVZuagvAIP0ub3LpveIiP1UNZNqmE5jNkXwvdQEySgGG5yj9ckKzvmDpwZQa3SxH+2VXeRCMNQCiFjECGHSOLZMAAAAAAAAAIFABLLLjMJc51R0P8DHy0PbXwsYUD0b5gvVmiZsupafr0gFWbmoLwCD9Lm9y6b3iIj9VDWTaphOYzZF8L3UBMkroAwAAAAAAAADh9QUAAAAAAA==')
|
|
1227
|
+
.resolves(new bignumber_js_1.default('1997880'))
|
|
1228
|
+
.withArgs('AAACAAgA4fUFAAAAAAAgiMmeDbicuh25fLrdfzeypLKitAIllKDASyvMg35LJAQCAgABAQAAAQECAAABAQAvpdg5S9a+xVJblVC/Q74HW4NCLQEHwFxwCUTj6uwm+QH9Ztv+ehSX8hB0ewUy9i5pJssUTHXlGfLf/xek9uUV/JQAAAAAAAAAIAW2DZdVWJ9ENnvL4Z2POOHfK2Z74DgSgDQci60MdQuXL6XYOUvWvsVSW5VQv0O+B1uDQi0BB8BccAlE4+rsJvnoAwAAAAAAAADh9QUAAAAAAA==')
|
|
1229
|
+
.resolves(new bignumber_js_1.default('1997880'));
|
|
1230
|
+
});
|
|
1231
|
+
afterEach(function () {
|
|
1232
|
+
sandBox.restore();
|
|
1233
|
+
});
|
|
1234
|
+
it('should build signed consolidation transactions for hot wallet', async function () {
|
|
1235
|
+
const res = await basecoin.recoverConsolidations({
|
|
1236
|
+
userKey: sui_1.keys.userKey,
|
|
1237
|
+
backupKey: sui_1.keys.backupKey,
|
|
1238
|
+
bitgoKey: sui_1.keys.bitgoKey,
|
|
1239
|
+
walletPassphrase,
|
|
1240
|
+
startingScanIndex: 1,
|
|
1241
|
+
endingScanIndex: 3,
|
|
1242
|
+
});
|
|
1243
|
+
const transactions = res.transactions;
|
|
1244
|
+
transactions.length.should.equal(2);
|
|
1245
|
+
const txn1 = transactions[0];
|
|
1246
|
+
txn1.scanIndex.should.equal(1);
|
|
1247
|
+
txn1.recoveryAmount.should.equal('198980240');
|
|
1248
|
+
txn1.serializedTx.should.equal('AAACAAiQMtwLAAAAAAAgkfJeI3uDoApick/cSoHkP0lNxrQaEkFJKCbTbk0THaMCAgABAQAAAQECAAABAQAy2OV+5tkeVVjaBncVTC8IV5U0jjF/lazJ763htBEvzAKZaqs2XUVRttEnT1ILv6ewpWbVSLLVkLVWXGI4EufnbckAAAAAAAAAIPWf+f1EklW1ggi3rwo5Jw3Lftu9W/UsyrZrI0FYsBTZs5xfOAIIzOf+G6EljI0ZvvsCqA8UlSYX7TcJjb1NLfDHAAAAAAAAACALfKsZ4T9Y2y1rrlBxQQ2BouS9VFjBgVfvbbFf9U+f8zLY5X7m2R5VWNoGdxVMLwhXlTSOMX+VrMnvreG0ES/M6AMAAAAAAADIHREAAAAAAAA=');
|
|
1249
|
+
const txn2 = transactions[1];
|
|
1250
|
+
txn2.scanIndex.should.equal(2);
|
|
1251
|
+
txn2.recoveryAmount.should.equal('197802332');
|
|
1252
|
+
txn2.serializedTx.should.equal('AAACAAhcOcoLAAAAAAAgkfJeI3uDoApick/cSoHkP0lNxrQaEkFJKCbTbk0THaMCAgABAQAAAQECAAABAQDfQH4+JelAD5d5rHVxU3wjYWhBlPGqXbEmqPV0te2FHAH6BBBe7evav3KdzOzwHQz18bdwiS+sLtjx5p1xoyotJMoAAAAAAAAAILvR1XjlKKylRGh9pX4UpBFBsCv5At6RBn+XXDAbnfRB30B+PiXpQA+Xeax1cVN8I2FoQZTxql2xJqj1dLXthRzoAwAAAAAAAKSIIQAAAAAAAA==');
|
|
1253
|
+
res.lastScanIndex.should.equal(2);
|
|
1254
|
+
sandBox.assert.callCount(basecoin.getBalance, 2);
|
|
1255
|
+
sandBox.assert.callCount(basecoin.getInputCoins, 2);
|
|
1256
|
+
sandBox.assert.callCount(basecoin.getFeeEstimate, 2);
|
|
1257
|
+
});
|
|
1258
|
+
it('should build unsigned consolidation transactions for cold wallet', async function () {
|
|
1259
|
+
const res = await basecoin.recoverConsolidations({
|
|
1260
|
+
bitgoKey: sui_1.keys.bitgoKey,
|
|
1261
|
+
startingScanIndex: 1,
|
|
1262
|
+
endingScanIndex: 3,
|
|
1263
|
+
});
|
|
1264
|
+
res.should.deepEqual({
|
|
1265
|
+
txRequests: [
|
|
1266
|
+
{
|
|
1267
|
+
transactions: [
|
|
1268
|
+
{
|
|
1269
|
+
unsignedTx: {
|
|
1270
|
+
serializedTx: '00000200089032dc0b00000000002091f25e237b83a00a62724fdc4a81e43f494dc6b41a1241492826d36e4d131da302020001010000010102000001010032d8e57ee6d91e5558da0677154c2f085795348e317f95acc9efade1b4112fcc02996aab365d4551b6d1274f520bbfa7b0a566d548b2d590b5565c623812e7e76dc90000000000000020f59ff9fd449255b58208b7af0a39270dcb7edbbd5bf52ccab66b234158b014d9b39c5f380208cce7fe1ba1258c8d19befb02a80f14952617ed37098dbd4d2df0c700000000000000200b7cab19e13f58db2d6bae5071410d81a2e4bd5458c18157ef6db15ff54f9ff332d8e57ee6d91e5558da0677154c2f085795348e317f95acc9efade1b4112fcce803000000000000c81d11000000000000',
|
|
1271
|
+
scanIndex: 1,
|
|
1272
|
+
coin: 'tsui',
|
|
1273
|
+
signableHex: 'ab84c9d09c678c038439f63fcd40d26535cc1485151257f4f175b6e8a0e94316',
|
|
1274
|
+
derivationPath: 'm/1',
|
|
1275
|
+
parsedTx: {
|
|
1276
|
+
inputs: [
|
|
1277
|
+
{
|
|
1278
|
+
address: '0x32d8e57ee6d91e5558da0677154c2f085795348e317f95acc9efade1b4112fcc',
|
|
1279
|
+
valueString: '198980240',
|
|
1280
|
+
value: new bignumber_js_1.default('198980240'),
|
|
1281
|
+
},
|
|
1282
|
+
],
|
|
1283
|
+
outputs: [
|
|
1284
|
+
{
|
|
1285
|
+
address: '0x91f25e237b83a00a62724fdc4a81e43f494dc6b41a1241492826d36e4d131da3',
|
|
1286
|
+
valueString: '198980240',
|
|
1287
|
+
coinName: 'tsui',
|
|
1288
|
+
},
|
|
1289
|
+
],
|
|
1290
|
+
spendAmount: '198980240',
|
|
1291
|
+
type: 'Transfer',
|
|
1292
|
+
},
|
|
1293
|
+
feeInfo: {
|
|
1294
|
+
fee: 1121736,
|
|
1295
|
+
feeString: '1121736',
|
|
1296
|
+
},
|
|
1297
|
+
coinSpecific: {
|
|
1298
|
+
commonKeychain: '3b89eec9d2d2f3b049ecda2e7b5f47827f7927fe6618d6e8b13f64e7c95f4b00b9577ab01395ecf8eeb804b590cedae14ff5fd3947bf3b7a95b9327c49e27c54',
|
|
1299
|
+
},
|
|
1300
|
+
},
|
|
1301
|
+
signatureShares: [],
|
|
1302
|
+
},
|
|
1303
|
+
],
|
|
1304
|
+
walletCoin: 'tsui',
|
|
1305
|
+
},
|
|
1306
|
+
{
|
|
1307
|
+
transactions: [
|
|
1308
|
+
{
|
|
1309
|
+
unsignedTx: {
|
|
1310
|
+
serializedTx: '00000200085c39ca0b00000000002091f25e237b83a00a62724fdc4a81e43f494dc6b41a1241492826d36e4d131da3020200010100000101020000010100df407e3e25e9400f9779ac7571537c2361684194f1aa5db126a8f574b5ed851c01fa04105eedebdabf729dccecf01d0cf5f1b770892fac2ed8f1e69d71a32a2d24ca0000000000000020bbd1d578e528aca544687da57e14a41141b02bf902de91067f975c301b9df441df407e3e25e9400f9779ac7571537c2361684194f1aa5db126a8f574b5ed851ce803000000000000a48821000000000000',
|
|
1311
|
+
scanIndex: 2,
|
|
1312
|
+
coin: 'tsui',
|
|
1313
|
+
signableHex: '66d650b4c4dedf5ab33c9381ee46140b30bb896cf2c66b7b241cae70d1414f16',
|
|
1314
|
+
derivationPath: 'm/2',
|
|
1315
|
+
parsedTx: {
|
|
1316
|
+
inputs: [
|
|
1317
|
+
{
|
|
1318
|
+
address: '0xdf407e3e25e9400f9779ac7571537c2361684194f1aa5db126a8f574b5ed851c',
|
|
1319
|
+
valueString: '197802332',
|
|
1320
|
+
value: new bignumber_js_1.default('197802332'),
|
|
1321
|
+
},
|
|
1322
|
+
],
|
|
1323
|
+
outputs: [
|
|
1324
|
+
{
|
|
1325
|
+
address: '0x91f25e237b83a00a62724fdc4a81e43f494dc6b41a1241492826d36e4d131da3',
|
|
1326
|
+
valueString: '197802332',
|
|
1327
|
+
coinName: 'tsui',
|
|
1328
|
+
},
|
|
1329
|
+
],
|
|
1330
|
+
spendAmount: '197802332',
|
|
1331
|
+
type: 'Transfer',
|
|
1332
|
+
},
|
|
1333
|
+
feeInfo: {
|
|
1334
|
+
fee: 2197668,
|
|
1335
|
+
feeString: '2197668',
|
|
1336
|
+
},
|
|
1337
|
+
coinSpecific: {
|
|
1338
|
+
commonKeychain: '3b89eec9d2d2f3b049ecda2e7b5f47827f7927fe6618d6e8b13f64e7c95f4b00b9577ab01395ecf8eeb804b590cedae14ff5fd3947bf3b7a95b9327c49e27c54',
|
|
1339
|
+
lastScanIndex: 2,
|
|
1340
|
+
},
|
|
1341
|
+
},
|
|
1342
|
+
signatureShares: [],
|
|
1343
|
+
},
|
|
1344
|
+
],
|
|
1345
|
+
walletCoin: 'tsui',
|
|
1346
|
+
},
|
|
1347
|
+
],
|
|
1348
|
+
});
|
|
1349
|
+
sandBox.assert.callCount(basecoin.getBalance, 2);
|
|
1350
|
+
sandBox.assert.callCount(basecoin.getInputCoins, 2);
|
|
1351
|
+
sandBox.assert.callCount(basecoin.getFeeEstimate, 2);
|
|
1352
|
+
});
|
|
1353
|
+
it('should build unsigned consolidation transactions for cold wallet with seed', async function () {
|
|
1354
|
+
const res = await basecoin.recoverConsolidations({
|
|
1355
|
+
bitgoKey: sui_1.keys.bitgoKeyWithSeed,
|
|
1356
|
+
startingScanIndex: 1,
|
|
1357
|
+
endingScanIndex: 3,
|
|
1358
|
+
seed: '123',
|
|
1359
|
+
});
|
|
1360
|
+
res.should.deepEqual({
|
|
1361
|
+
txRequests: [
|
|
1362
|
+
{
|
|
1363
|
+
transactions: [
|
|
1364
|
+
{
|
|
1365
|
+
unsignedTx: {
|
|
1366
|
+
serializedTx: '00000200085cdcab1d00000000002088c99e0db89cba1db97cbadd7f37b2a4b2a2b4022594a0c04b2bcc837e4b2404020200010100000101020000010100d201566e6a0bc020fd2e6f72e9bde2223f550d64daa61398cd917c2f7501324a0186e728fd7242b3be60e9c1941add2c47fb655779108c3500a216310218748e2d93000000000000002050012cb2e3309739d51d0ff031f2d0f6d7c2c6140f46f982f566899b2ea5a7ebd201566e6a0bc020fd2e6f72e9bde2223f550d64daa61398cd917c2f7501324ae803000000000000a48821000000000000',
|
|
1367
|
+
scanIndex: 1,
|
|
1368
|
+
coin: 'tsui',
|
|
1369
|
+
signableHex: '6d7a4c4882745707c2cd40b0c57566601a2a4d269f5cb0a692828551212cf452',
|
|
1370
|
+
derivationPath: 'm/999999/94862622/157363509/1',
|
|
1371
|
+
parsedTx: {
|
|
1372
|
+
inputs: [
|
|
1373
|
+
{
|
|
1374
|
+
address: '0xd201566e6a0bc020fd2e6f72e9bde2223f550d64daa61398cd917c2f7501324a',
|
|
1375
|
+
valueString: '497802332',
|
|
1376
|
+
value: new bignumber_js_1.default(497802332),
|
|
1377
|
+
},
|
|
1378
|
+
],
|
|
1379
|
+
outputs: [
|
|
1380
|
+
{
|
|
1381
|
+
address: '0x88c99e0db89cba1db97cbadd7f37b2a4b2a2b4022594a0c04b2bcc837e4b2404',
|
|
1382
|
+
valueString: '497802332',
|
|
1383
|
+
coinName: 'tsui',
|
|
1384
|
+
},
|
|
1385
|
+
],
|
|
1386
|
+
spendAmount: '497802332',
|
|
1387
|
+
type: 'Transfer',
|
|
1388
|
+
},
|
|
1389
|
+
feeInfo: {
|
|
1390
|
+
fee: 2197668,
|
|
1391
|
+
feeString: '2197668',
|
|
1392
|
+
},
|
|
1393
|
+
coinSpecific: {
|
|
1394
|
+
commonKeychain: 'ca0a014ba6f11106a155ef8e2cab2f76d277e4f01cffa591a9b40848343823b3d910752a49c96bf5813985206e23c9f9cd3a78f1cccf5cf88def52b573cedc93',
|
|
1395
|
+
},
|
|
1396
|
+
},
|
|
1397
|
+
signatureShares: [],
|
|
1398
|
+
},
|
|
1399
|
+
],
|
|
1400
|
+
walletCoin: 'tsui',
|
|
1401
|
+
},
|
|
1402
|
+
{
|
|
1403
|
+
transactions: [
|
|
1404
|
+
{
|
|
1405
|
+
unsignedTx: {
|
|
1406
|
+
serializedTx: '00000200085c39ca0b00000000002088c99e0db89cba1db97cbadd7f37b2a4b2a2b4022594a0c04b2bcc837e4b24040202000101000001010200000101002fa5d8394bd6bec5525b9550bf43be075b83422d0107c05c700944e3eaec26f901fd66dbfe7a1497f210747b0532f62e6926cb144c75e519f2dfff17a4f6e515fc94000000000000002005b60d9755589f44367bcbe19d8f38e1df2b667be0381280341c8bad0c750b972fa5d8394bd6bec5525b9550bf43be075b83422d0107c05c700944e3eaec26f9e803000000000000a48821000000000000',
|
|
1407
|
+
scanIndex: 2,
|
|
1408
|
+
coin: 'tsui',
|
|
1409
|
+
signableHex: '32a00a6d892630467c7d0666390d3b27caaf4aefee3dda9e0c97c3f8bc06bcea',
|
|
1410
|
+
derivationPath: 'm/999999/94862622/157363509/2',
|
|
1411
|
+
parsedTx: {
|
|
1412
|
+
inputs: [
|
|
1413
|
+
{
|
|
1414
|
+
address: '0x2fa5d8394bd6bec5525b9550bf43be075b83422d0107c05c700944e3eaec26f9',
|
|
1415
|
+
valueString: '197802332',
|
|
1416
|
+
value: new bignumber_js_1.default(197802332),
|
|
1417
|
+
},
|
|
1418
|
+
],
|
|
1419
|
+
outputs: [
|
|
1420
|
+
{
|
|
1421
|
+
address: '0x88c99e0db89cba1db97cbadd7f37b2a4b2a2b4022594a0c04b2bcc837e4b2404',
|
|
1422
|
+
valueString: '197802332',
|
|
1423
|
+
coinName: 'tsui',
|
|
1424
|
+
},
|
|
1425
|
+
],
|
|
1426
|
+
spendAmount: '197802332',
|
|
1427
|
+
type: 'Transfer',
|
|
1428
|
+
},
|
|
1429
|
+
feeInfo: {
|
|
1430
|
+
fee: 2197668,
|
|
1431
|
+
feeString: '2197668',
|
|
1432
|
+
},
|
|
1433
|
+
coinSpecific: {
|
|
1434
|
+
commonKeychain: 'ca0a014ba6f11106a155ef8e2cab2f76d277e4f01cffa591a9b40848343823b3d910752a49c96bf5813985206e23c9f9cd3a78f1cccf5cf88def52b573cedc93',
|
|
1435
|
+
lastScanIndex: 2,
|
|
1436
|
+
},
|
|
1437
|
+
},
|
|
1438
|
+
signatureShares: [],
|
|
1439
|
+
},
|
|
1440
|
+
],
|
|
1441
|
+
walletCoin: 'tsui',
|
|
1442
|
+
},
|
|
1443
|
+
],
|
|
1444
|
+
});
|
|
1445
|
+
sandBox.assert.callCount(basecoin.getBalance, 2);
|
|
1446
|
+
sandBox.assert.callCount(basecoin.getInputCoins, 2);
|
|
1447
|
+
sandBox.assert.callCount(basecoin.getFeeEstimate, 2);
|
|
1448
|
+
});
|
|
1449
|
+
});
|
|
1450
|
+
describe('Recover Token Consolidation Transactions', () => {
|
|
1451
|
+
const sandBox = sinon_1.default.createSandbox();
|
|
1452
|
+
const walletPassphrase = 'p$Sw<RjvAgf{nYAYI2xM';
|
|
1453
|
+
const seedReceiveAddress1 = '0xd201566e6a0bc020fd2e6f72e9bde2223f550d64daa61398cd917c2f7501324a';
|
|
1454
|
+
const seedReceiveAddress2 = '0x2fa5d8394bd6bec5525b9550bf43be075b83422d0107c05c700944e3eaec26f9';
|
|
1455
|
+
const packageId = '0x36dbef866a1d62bf7328989a10fb2f07d769f4ee587c0de4a0a256e57e0a58a8';
|
|
1456
|
+
const coinType = `${packageId}::deep::DEEP`;
|
|
1457
|
+
const hotWalletReceiveAddress1 = '0x32d8e57ee6d91e5558da0677154c2f085795348e317f95acc9efade1b4112fcc';
|
|
1458
|
+
const hotWalletReceiveAddress2 = '0xdf407e3e25e9400f9779ac7571537c2361684194f1aa5db126a8f574b5ed851c';
|
|
1459
|
+
const coldWalletReceiveAddress1 = '0xa992709591deb7471fb30dda0f339db7ab548d3391a89d3f1fa0c72d2092675f';
|
|
1460
|
+
const coldWalletReceiveAddress2 = '0xc3ac2a86e35b62bfada83f6388ff27c7dda7092cf0b829d2d1f4c2813e28ae39';
|
|
1461
|
+
let getBalanceStub;
|
|
1462
|
+
let getInputCoinsStub;
|
|
1463
|
+
let getFeeEstimateStub;
|
|
1464
|
+
beforeEach(function () {
|
|
1465
|
+
getBalanceStub = sandBox.stub(src_1.Sui.prototype, 'getBalance');
|
|
1466
|
+
getInputCoinsStub = sandBox.stub(src_1.Sui.prototype, 'getInputCoins');
|
|
1467
|
+
getFeeEstimateStub = sandBox.stub(src_1.Sui.prototype, 'getFeeEstimate');
|
|
1468
|
+
});
|
|
1469
|
+
afterEach(function () {
|
|
1470
|
+
sandBox.restore();
|
|
1471
|
+
});
|
|
1472
|
+
it('should build signed token consolidation transactions for hot wallet', async function () {
|
|
1473
|
+
getBalanceStub
|
|
1474
|
+
.withArgs(hotWalletReceiveAddress1)
|
|
1475
|
+
.resolves({ totalBalance: '116720144', coinObjectBalance: '116720144', fundsInAddressBalance: '0' })
|
|
1476
|
+
.withArgs(hotWalletReceiveAddress1, coinType)
|
|
1477
|
+
.resolves({ totalBalance: '1500', coinObjectBalance: '1500', fundsInAddressBalance: '0' })
|
|
1478
|
+
.withArgs(hotWalletReceiveAddress2)
|
|
1479
|
+
.resolves({ totalBalance: '120101976', coinObjectBalance: '120101976', fundsInAddressBalance: '0' })
|
|
1480
|
+
.withArgs(hotWalletReceiveAddress2, coinType)
|
|
1481
|
+
.resolves({ totalBalance: '2000', coinObjectBalance: '2000', fundsInAddressBalance: '0' });
|
|
1482
|
+
getInputCoinsStub
|
|
1483
|
+
.withArgs(hotWalletReceiveAddress1, coinType)
|
|
1484
|
+
.resolves([
|
|
1485
|
+
{
|
|
1486
|
+
coinType: '0x36dbef866a1d62bf7328989a10fb2f07d769f4ee587c0de4a0a256e57e0a58a8::deep::DEEP',
|
|
1487
|
+
objectId: '0x8d2da577227e9b7166dbb9b3cce480968cf549b448c662771d1124d6420bf792',
|
|
1488
|
+
version: '34696878',
|
|
1489
|
+
digest: 'BniWiG3v71ozzRirb3hNKEP16pTu3CpNt3voy1uzgMi9',
|
|
1490
|
+
balance: new bignumber_js_1.default('1500'),
|
|
1491
|
+
},
|
|
1492
|
+
])
|
|
1493
|
+
.withArgs(hotWalletReceiveAddress1)
|
|
1494
|
+
.resolves([
|
|
1495
|
+
{
|
|
1496
|
+
coinType: '0x2::sui::SUI',
|
|
1497
|
+
objectId: '0x0eca78901e342b2515fbf99be243b3f00ade0a7a50675b37307f44cc195c9046',
|
|
1498
|
+
version: '34696877',
|
|
1499
|
+
digest: 'D8XqJXrkVGoer952GvHBdBDXpof8H4F4pRJJ1wSnESNW',
|
|
1500
|
+
balance: new bignumber_js_1.default('116618168'),
|
|
1501
|
+
},
|
|
1502
|
+
{
|
|
1503
|
+
coinType: '0x2::sui::SUI',
|
|
1504
|
+
objectId: '0x761222340db80dd9da144d55098870bc81a788205e0bbdd34c2f8df12cf45aeb',
|
|
1505
|
+
version: '227',
|
|
1506
|
+
digest: '9bwyjaSH3X8anrjGUpD1NqMrLFUtGSCK9LFuLbhjX69E',
|
|
1507
|
+
balance: new bignumber_js_1.default('101976'),
|
|
1508
|
+
},
|
|
1509
|
+
])
|
|
1510
|
+
.withArgs(hotWalletReceiveAddress2, coinType)
|
|
1511
|
+
.resolves([
|
|
1512
|
+
{
|
|
1513
|
+
coinType: '0x36dbef866a1d62bf7328989a10fb2f07d769f4ee587c0de4a0a256e57e0a58a8::deep::DEEP',
|
|
1514
|
+
objectId: '0x8e18bd14c34e33f81c494f4d6c18d07c686c7f3619682d2066b3f55ecfe707a2',
|
|
1515
|
+
version: '34696868',
|
|
1516
|
+
digest: '6jZFu8PRWLJYPewW7K3o4GLVPYnRyNo3kP6454eLuHZm',
|
|
1517
|
+
balance: new bignumber_js_1.default('2000'),
|
|
1518
|
+
},
|
|
1519
|
+
])
|
|
1520
|
+
.withArgs(hotWalletReceiveAddress2)
|
|
1521
|
+
.resolves([
|
|
1522
|
+
{
|
|
1523
|
+
coinType: '0x2::sui::SUI',
|
|
1524
|
+
objectId: '0x811a75066134945e3b033f4ac54ec885ec0384f42a80994d88a48d7d18c4260a',
|
|
1525
|
+
version: '236',
|
|
1526
|
+
digest: '32N9ZyferGDEV7PY3ykijVVKhLjEFSL6itqcfRPCy4oW',
|
|
1527
|
+
balance: new bignumber_js_1.default('101976'),
|
|
1528
|
+
},
|
|
1529
|
+
{
|
|
1530
|
+
coinType: '0x2::sui::SUI',
|
|
1531
|
+
objectId: '0xf85a738a30566d558800228f2d5c193a5ca3ddbbddca2a65a48a9332306715cc',
|
|
1532
|
+
version: '34696876',
|
|
1533
|
+
digest: '7gJgCMDEPdQaMeuXZ5CFNonFKMPQyw6k5sT1RpaHEXpe',
|
|
1534
|
+
balance: new bignumber_js_1.default('120000000'),
|
|
1535
|
+
},
|
|
1536
|
+
]);
|
|
1537
|
+
getFeeEstimateStub
|
|
1538
|
+
.withArgs('AAADAQCNLaV3In6bcWbbubPM5ICWjPVJtEjGYncdESTWQgv3kq5uEQIAAAAAIKBK8Zjq4yz/PTFZLg6jf6gDTsogig63pduXeiKgzMVKAAjcBQAAAAAAAAAgkfJeI3uDoApick/cSoHkP0lNxrQaEkFJKCbTbk0THaMCAgEAAAEBAQABAQIAAAECADLY5X7m2R5VWNoGdxVMLwhXlTSOMX+VrMnvreG0ES/MAQ7KeJAeNCslFfv5m+JDs/AK3gp6UGdbNzB/RMwZXJBGrW4RAgAAAAAgtDor6b9EJHOSWdJZCQdLkKpS2cPoBc5b28KpX1rg7lsy2OV+5tkeVVjaBncVTC8IV5U0jjF/lazJ763htBEvzOgDAAAAAAAAAOH1BQAAAAAA')
|
|
1539
|
+
.resolves(new bignumber_js_1.default('2345504'))
|
|
1540
|
+
.withArgs('AAADAQCOGL0Uw04z+BxJT01sGNB8aGx/NhloLSBms/Vez+cHoqRuEQIAAAAAIFUxTTQyTKM6bVjeFHHT8KVrV2fgTOCX7Uoevk2r5JPcAAjQBwAAAAAAAAAgkfJeI3uDoApick/cSoHkP0lNxrQaEkFJKCbTbk0THaMCAgEAAAEBAQABAQIAAAECAN9Afj4l6UAPl3msdXFTfCNhaEGU8apdsSao9XS17YUcAfhac4owVm1ViAAijy1cGTpco9273coqZaSKkzIwZxXMrG4RAgAAAAAgYzfCWiypCmme8IJZhqn5nT8+zoP3S7sfQKfezW99YWvfQH4+JelAD5d5rHVxU3wjYWhBlPGqXbEmqPV0te2FHOgDAAAAAAAAAOH1BQAAAAAA')
|
|
1541
|
+
.resolves(new bignumber_js_1.default('2345504'));
|
|
1542
|
+
const res = await basecoin.recoverConsolidations({
|
|
1543
|
+
userKey: sui_1.keys.userKey,
|
|
1544
|
+
backupKey: sui_1.keys.backupKey,
|
|
1545
|
+
bitgoKey: sui_1.keys.bitgoKey,
|
|
1546
|
+
walletPassphrase,
|
|
1547
|
+
tokenContractAddress: packageId,
|
|
1548
|
+
startingScanIndex: 1,
|
|
1549
|
+
endingScanIndex: 3,
|
|
1550
|
+
});
|
|
1551
|
+
const transactions = res.transactions;
|
|
1552
|
+
transactions.length.should.equal(2);
|
|
1553
|
+
const txn1 = transactions[0];
|
|
1554
|
+
txn1.scanIndex.should.equal(1);
|
|
1555
|
+
txn1.recoveryAmount.should.equal('1500');
|
|
1556
|
+
txn1.serializedTx.should.equal('AAADAQCNLaV3In6bcWbbubPM5ICWjPVJtEjGYncdESTWQgv3kq5uEQIAAAAAIKBK8Zjq4yz/PTFZLg6jf6gDTsogig63pduXeiKgzMVKAAjcBQAAAAAAAAAgkfJeI3uDoApick/cSoHkP0lNxrQaEkFJKCbTbk0THaMCAgEAAAEBAQABAQIAAAECADLY5X7m2R5VWNoGdxVMLwhXlTSOMX+VrMnvreG0ES/MAQ7KeJAeNCslFfv5m+JDs/AK3gp6UGdbNzB/RMwZXJBGrW4RAgAAAAAgtDor6b9EJHOSWdJZCQdLkKpS2cPoBc5b28KpX1rg7lsy2OV+5tkeVVjaBncVTC8IV5U0jjF/lazJ763htBEvzOgDAAAAAAAAVl4nAAAAAAAA');
|
|
1557
|
+
const txn2 = transactions[1];
|
|
1558
|
+
txn2.scanIndex.should.equal(2);
|
|
1559
|
+
txn2.recoveryAmount.should.equal('2000');
|
|
1560
|
+
txn2.serializedTx.should.equal('AAADAQCOGL0Uw04z+BxJT01sGNB8aGx/NhloLSBms/Vez+cHoqRuEQIAAAAAIFUxTTQyTKM6bVjeFHHT8KVrV2fgTOCX7Uoevk2r5JPcAAjQBwAAAAAAAAAgkfJeI3uDoApick/cSoHkP0lNxrQaEkFJKCbTbk0THaMCAgEAAAEBAQABAQIAAAECAN9Afj4l6UAPl3msdXFTfCNhaEGU8apdsSao9XS17YUcAfhac4owVm1ViAAijy1cGTpco9273coqZaSKkzIwZxXMrG4RAgAAAAAgYzfCWiypCmme8IJZhqn5nT8+zoP3S7sfQKfezW99YWvfQH4+JelAD5d5rHVxU3wjYWhBlPGqXbEmqPV0te2FHOgDAAAAAAAAVl4nAAAAAAAA');
|
|
1561
|
+
res.lastScanIndex.should.equal(2);
|
|
1562
|
+
sandBox.assert.callCount(basecoin.getBalance, 6);
|
|
1563
|
+
sandBox.assert.callCount(basecoin.getInputCoins, 4);
|
|
1564
|
+
sandBox.assert.callCount(basecoin.getFeeEstimate, 2);
|
|
1565
|
+
});
|
|
1566
|
+
it('should build unsigned token consolidation transactions for cold wallet', async function () {
|
|
1567
|
+
getBalanceStub
|
|
1568
|
+
.withArgs(coldWalletReceiveAddress1)
|
|
1569
|
+
.resolves({ totalBalance: '116720144', coinObjectBalance: '116720144', fundsInAddressBalance: '0' })
|
|
1570
|
+
.withArgs(coldWalletReceiveAddress1, coinType)
|
|
1571
|
+
.resolves({ totalBalance: '4000', coinObjectBalance: '4000', fundsInAddressBalance: '0' })
|
|
1572
|
+
.withArgs(coldWalletReceiveAddress2)
|
|
1573
|
+
.resolves({ totalBalance: '120101976', coinObjectBalance: '120101976', fundsInAddressBalance: '0' })
|
|
1574
|
+
.withArgs(coldWalletReceiveAddress2, coinType)
|
|
1575
|
+
.resolves({ totalBalance: '6000', coinObjectBalance: '6000', fundsInAddressBalance: '0' });
|
|
1576
|
+
getInputCoinsStub
|
|
1577
|
+
.withArgs(coldWalletReceiveAddress1, coinType)
|
|
1578
|
+
.resolves([
|
|
1579
|
+
{
|
|
1580
|
+
coinType: '0x36dbef866a1d62bf7328989a10fb2f07d769f4ee587c0de4a0a256e57e0a58a8::deep::DEEP',
|
|
1581
|
+
objectId: '0x9e2618685fff38b999355e93a4693c4bd18f68dd6b654ff6555f1f4ad229dcdb',
|
|
1582
|
+
version: '34696876',
|
|
1583
|
+
digest: 'F5iGjs95CnScCtXHFuTJhdZkfLyagWR1Qm1zDH6SngMG',
|
|
1584
|
+
balance: new bignumber_js_1.default('4000'),
|
|
1585
|
+
},
|
|
1586
|
+
])
|
|
1587
|
+
.withArgs(coldWalletReceiveAddress1)
|
|
1588
|
+
.resolves([
|
|
1589
|
+
{
|
|
1590
|
+
coinType: '0x2::sui::SUI',
|
|
1591
|
+
objectId: '0x8f3f7c8961997327166b1571117ff67232ccd1267ec52a7e973677ba0431ffad',
|
|
1592
|
+
version: '226',
|
|
1593
|
+
digest: 'AWh7tPmS9xmH4a2zYLCG73YDiskCf8uizbLjpCStHhNV',
|
|
1594
|
+
balance: new bignumber_js_1.default('98980240'),
|
|
1595
|
+
},
|
|
1596
|
+
{
|
|
1597
|
+
coinType: '0x2::sui::SUI',
|
|
1598
|
+
objectId: '0x916e35a0ac6b525b7d38a44b667394aaee7cde41dffc876980cfbc8845590cdd',
|
|
1599
|
+
version: '34696878',
|
|
1600
|
+
digest: '14PfNwUvfcR3mNAS1bcNXToaooVLnXQHDdGxPFRJQtY',
|
|
1601
|
+
balance: new bignumber_js_1.default('120000000'),
|
|
1602
|
+
},
|
|
1603
|
+
])
|
|
1604
|
+
.withArgs(coldWalletReceiveAddress2, coinType)
|
|
1605
|
+
.resolves([
|
|
1606
|
+
{
|
|
1607
|
+
coinType: '0x36dbef866a1d62bf7328989a10fb2f07d769f4ee587c0de4a0a256e57e0a58a8::deep::DEEP',
|
|
1608
|
+
objectId: '0xc548c220454d20e0712bd2858b07260c829a1c847f3818b47805961b574813ab',
|
|
1609
|
+
version: '34696877',
|
|
1610
|
+
digest: '8mANdoskG8eLLy7zVU5rmHRAXVHUyJPABfS1mYHSmAYt',
|
|
1611
|
+
balance: new bignumber_js_1.default('6000'),
|
|
1612
|
+
},
|
|
1613
|
+
])
|
|
1614
|
+
.withArgs(coldWalletReceiveAddress2)
|
|
1615
|
+
.resolves([
|
|
1616
|
+
{
|
|
1617
|
+
coinType: '0x2::sui::SUI',
|
|
1618
|
+
objectId: '0x396ab09ee58fb2c9fbcca887c00ef01a33d5bfe55a5d50514e32a59f948e9a05',
|
|
1619
|
+
version: '234',
|
|
1620
|
+
digest: 'HWKW56dt8BNxSTvXiW7dtDVmM2gxEexFyNVzGj8HPVp4',
|
|
1621
|
+
balance: new bignumber_js_1.default('101976'),
|
|
1622
|
+
},
|
|
1623
|
+
{
|
|
1624
|
+
coinType: '0x2::sui::SUI',
|
|
1625
|
+
objectId: '0xd4bfefa532827d7619a58279a87db81632e267cc48e6b94ab81a4367f02cbefa',
|
|
1626
|
+
version: '34696879',
|
|
1627
|
+
digest: 'GJnp1oXNjVXLcYY6hqRV8Rm7G7obmk3s8Nhj1bFsfkUo',
|
|
1628
|
+
balance: new bignumber_js_1.default('120000000'),
|
|
1629
|
+
},
|
|
1630
|
+
]);
|
|
1631
|
+
getFeeEstimateStub
|
|
1632
|
+
.withArgs('AAADAQCeJhhoX/84uZk1XpOkaTxL0Y9o3WtlT/ZVXx9K0inc26xuEQIAAAAAINE4mxs1hGMmovTU5dfnFoouWOPdVn0nRDPbuXymALPLAAigDwAAAAAAAAAgAWSV3dp0jBFqIYJCg102RwnWxe5cih7WhMTvQz0xRCECAgEAAAEBAQABAQIAAAECAKmScJWR3rdHH7MN2g8znberVI0zkaidPx+gxy0gkmdfAZFuNaCsa1JbfTikS2ZzlKrufN5B3/yHaYDPvIhFWQzdrm4RAgAAAAAgAAPVeleb8pMu7o/cp9MwtGsUMwKA28CviO+5N79foNGpknCVkd63Rx+zDdoPM523q1SNM5GonT8foMctIJJnX+gDAAAAAAAAAOH1BQAAAAAA')
|
|
1633
|
+
.resolves(new bignumber_js_1.default('2345504'))
|
|
1634
|
+
.withArgs('AAADAQDFSMIgRU0g4HEr0oWLByYMgpochH84GLR4BZYbV0gTq61uEQIAAAAAIHNR9lF7b7NdhWgutklx5vwLmihijROI6T24ctzx9g6tAAhwFwAAAAAAAAAgAWSV3dp0jBFqIYJCg102RwnWxe5cih7WhMTvQz0xRCECAgEAAAEBAQABAQIAAAECAMOsKobjW2K/rag/Y4j/J8fdpwks8Lgp0tH0woE+KK45AdS/76Uygn12GaWCeah9uBYy4mfMSOa5SrgaQ2fwLL76r24RAgAAAAAg42350Lqqaanub5TpjJnYlKiupjF2Xc+qgDIoiPOkU6jDrCqG41tiv62oP2OI/yfH3acJLPC4KdLR9MKBPiiuOegDAAAAAAAAAOH1BQAAAAAA')
|
|
1635
|
+
.resolves(new bignumber_js_1.default('2345504'));
|
|
1636
|
+
const res = await basecoin.recoverConsolidations({
|
|
1637
|
+
bitgoKey: sui_1.keys.bitgoKeyColdWallet,
|
|
1638
|
+
tokenContractAddress: packageId,
|
|
1639
|
+
startingScanIndex: 1,
|
|
1640
|
+
endingScanIndex: 3,
|
|
1641
|
+
});
|
|
1642
|
+
res.should.deepEqual({
|
|
1643
|
+
txRequests: [
|
|
1644
|
+
{
|
|
1645
|
+
transactions: [
|
|
1646
|
+
{
|
|
1647
|
+
unsignedTx: {
|
|
1648
|
+
serializedTx: '00000301009e2618685fff38b999355e93a4693c4bd18f68dd6b654ff6555f1f4ad229dcdbac6e11020000000020d1389b1b35846326a2f4d4e5d7e7168a2e58e3dd567d274433dbb97ca600b3cb0008a00f0000000000000020016495ddda748c116a218242835d364709d6c5ee5c8a1ed684c4ef433d3144210202010000010101000101020000010200a992709591deb7471fb30dda0f339db7ab548d3391a89d3f1fa0c72d2092675f01916e35a0ac6b525b7d38a44b667394aaee7cde41dffc876980cfbc8845590cddae6e110200000000200003d57a579bf2932eee8fdca7d330b46b14330280dbc0af88efb937bf5fa0d1a992709591deb7471fb30dda0f339db7ab548d3391a89d3f1fa0c72d2092675fe803000000000000565e27000000000000',
|
|
1649
|
+
scanIndex: 1,
|
|
1650
|
+
coin: 'tsui:deep',
|
|
1651
|
+
signableHex: 'cedade6c1c99e3531c90536fa228f0fb148f35605d1a4edfbe8eb739bdc99a48',
|
|
1652
|
+
derivationPath: 'm/1',
|
|
1653
|
+
parsedTx: {
|
|
1654
|
+
inputs: [
|
|
1655
|
+
{
|
|
1656
|
+
address: '0xa992709591deb7471fb30dda0f339db7ab548d3391a89d3f1fa0c72d2092675f',
|
|
1657
|
+
valueString: '4000',
|
|
1658
|
+
value: new bignumber_js_1.default('4000'),
|
|
1659
|
+
},
|
|
1660
|
+
],
|
|
1661
|
+
outputs: [
|
|
1662
|
+
{
|
|
1663
|
+
address: '0x016495ddda748c116a218242835d364709d6c5ee5c8a1ed684c4ef433d314421',
|
|
1664
|
+
valueString: '4000',
|
|
1665
|
+
coinName: 'tsui:deep',
|
|
1666
|
+
},
|
|
1667
|
+
],
|
|
1668
|
+
spendAmount: '4000',
|
|
1669
|
+
type: 'TokenTransfer',
|
|
1670
|
+
},
|
|
1671
|
+
feeInfo: {
|
|
1672
|
+
fee: 2580054,
|
|
1673
|
+
feeString: '2580054',
|
|
1674
|
+
},
|
|
1675
|
+
coinSpecific: {
|
|
1676
|
+
commonKeychain: '79d4b9b594df028fee3725a6af51ae3ab6a3519e9d2c322f2c8fd815b96496323c5aba7ea874c102f966f1a61d3c9a42b5f3177c6a85712cf313715afddf83d8',
|
|
1677
|
+
},
|
|
1678
|
+
},
|
|
1679
|
+
signatureShares: [],
|
|
1680
|
+
},
|
|
1681
|
+
],
|
|
1682
|
+
walletCoin: 'tsui:deep',
|
|
1683
|
+
},
|
|
1684
|
+
{
|
|
1685
|
+
transactions: [
|
|
1686
|
+
{
|
|
1687
|
+
unsignedTx: {
|
|
1688
|
+
serializedTx: '0000030100c548c220454d20e0712bd2858b07260c829a1c847f3818b47805961b574813abad6e110200000000207351f6517b6fb35d85682eb64971e6fc0b9a28628d1388e93db872dcf1f60ead000870170000000000000020016495ddda748c116a218242835d364709d6c5ee5c8a1ed684c4ef433d3144210202010000010101000101020000010200c3ac2a86e35b62bfada83f6388ff27c7dda7092cf0b829d2d1f4c2813e28ae3901d4bfefa532827d7619a58279a87db81632e267cc48e6b94ab81a4367f02cbefaaf6e11020000000020e36df9d0baaa69a9ee6f94e98c99d894a8aea631765dcfaa80322888f3a453a8c3ac2a86e35b62bfada83f6388ff27c7dda7092cf0b829d2d1f4c2813e28ae39e803000000000000565e27000000000000',
|
|
1689
|
+
scanIndex: 2,
|
|
1690
|
+
coin: 'tsui:deep',
|
|
1691
|
+
signableHex: 'd0551409d248accdd894713a4c03a6d8f240349a5e85b90aef019b5f426062c8',
|
|
1692
|
+
derivationPath: 'm/2',
|
|
1693
|
+
parsedTx: {
|
|
1694
|
+
inputs: [
|
|
1695
|
+
{
|
|
1696
|
+
address: '0xc3ac2a86e35b62bfada83f6388ff27c7dda7092cf0b829d2d1f4c2813e28ae39',
|
|
1697
|
+
valueString: '6000',
|
|
1698
|
+
value: new bignumber_js_1.default('6000'),
|
|
1699
|
+
},
|
|
1700
|
+
],
|
|
1701
|
+
outputs: [
|
|
1702
|
+
{
|
|
1703
|
+
address: '0x016495ddda748c116a218242835d364709d6c5ee5c8a1ed684c4ef433d314421',
|
|
1704
|
+
valueString: '6000',
|
|
1705
|
+
coinName: 'tsui:deep',
|
|
1706
|
+
},
|
|
1707
|
+
],
|
|
1708
|
+
spendAmount: '6000',
|
|
1709
|
+
type: 'TokenTransfer',
|
|
1710
|
+
},
|
|
1711
|
+
feeInfo: {
|
|
1712
|
+
fee: 2580054,
|
|
1713
|
+
feeString: '2580054',
|
|
1714
|
+
},
|
|
1715
|
+
coinSpecific: {
|
|
1716
|
+
commonKeychain: '79d4b9b594df028fee3725a6af51ae3ab6a3519e9d2c322f2c8fd815b96496323c5aba7ea874c102f966f1a61d3c9a42b5f3177c6a85712cf313715afddf83d8',
|
|
1717
|
+
lastScanIndex: 2,
|
|
1718
|
+
},
|
|
1719
|
+
},
|
|
1720
|
+
signatureShares: [],
|
|
1721
|
+
},
|
|
1722
|
+
],
|
|
1723
|
+
walletCoin: 'tsui:deep',
|
|
1724
|
+
},
|
|
1725
|
+
],
|
|
1726
|
+
});
|
|
1727
|
+
sandBox.assert.callCount(basecoin.getBalance, 6);
|
|
1728
|
+
sandBox.assert.callCount(basecoin.getInputCoins, 4);
|
|
1729
|
+
sandBox.assert.callCount(basecoin.getFeeEstimate, 2);
|
|
1730
|
+
});
|
|
1731
|
+
it('should build unsigned token consolidation transactions for cold wallet with seed', async function () {
|
|
1732
|
+
getBalanceStub
|
|
1733
|
+
.withArgs(seedReceiveAddress1)
|
|
1734
|
+
.resolves({ totalBalance: '120199788', coinObjectBalance: '120199788', fundsInAddressBalance: '0' })
|
|
1735
|
+
.withArgs(seedReceiveAddress1, coinType)
|
|
1736
|
+
.resolves({ totalBalance: '1500', coinObjectBalance: '1500', fundsInAddressBalance: '0' })
|
|
1737
|
+
.withArgs(seedReceiveAddress2)
|
|
1738
|
+
.resolves({ totalBalance: '120199788', coinObjectBalance: '120199788', fundsInAddressBalance: '0' })
|
|
1739
|
+
.withArgs(seedReceiveAddress2, coinType)
|
|
1740
|
+
.resolves({ totalBalance: '2000', coinObjectBalance: '2000', fundsInAddressBalance: '0' });
|
|
1741
|
+
getInputCoinsStub
|
|
1742
|
+
.withArgs(seedReceiveAddress1, coinType)
|
|
1743
|
+
.resolves([
|
|
1744
|
+
{
|
|
1745
|
+
coinType: '0x36dbef866a1d62bf7328989a10fb2f07d769f4ee587c0de4a0a256e57e0a58a8::deep::DEEP',
|
|
1746
|
+
objectId: '0xa7a8c91028035ab49977e72b084e145eb1c1ddcfe2e06925f0f833cef2d1f69f',
|
|
1747
|
+
version: '34696878',
|
|
1748
|
+
digest: 'CKiuXkFMaVkn12iKinZCr9aDHfGpCQiPdyZUQzNDJ9Qx',
|
|
1749
|
+
balance: new bignumber_js_1.default('1500'),
|
|
1750
|
+
},
|
|
1751
|
+
])
|
|
1752
|
+
.withArgs(seedReceiveAddress1)
|
|
1753
|
+
.resolves([
|
|
1754
|
+
{
|
|
1755
|
+
coinType: '0x2::sui::SUI',
|
|
1756
|
+
objectId: '0x5eea0353f078016b71a84cb494e6f791e97cb8de5344def3baedffc89c27a4b5',
|
|
1757
|
+
version: '34696879',
|
|
1758
|
+
digest: '6KqrwjKHhJCe4DXfdH2yMLG8bXGcSQoTeJy4shghDbTZ',
|
|
1759
|
+
balance: new bignumber_js_1.default('120000000'),
|
|
1760
|
+
},
|
|
1761
|
+
{
|
|
1762
|
+
coinType: '0x2::sui::SUI',
|
|
1763
|
+
objectId: '0x86e728fd7242b3be60e9c1941add2c47fb655779108c3500a216310218748e2d',
|
|
1764
|
+
version: '148',
|
|
1765
|
+
digest: 'B9zJfEYkiXnAuLE6q3XFJeLbPc3K7qmjgDrHVvJnT5wa',
|
|
1766
|
+
balance: new bignumber_js_1.default('199788'),
|
|
1767
|
+
},
|
|
1768
|
+
])
|
|
1769
|
+
.withArgs(seedReceiveAddress2, coinType)
|
|
1770
|
+
.resolves([
|
|
1771
|
+
{
|
|
1772
|
+
coinType: '0x36dbef866a1d62bf7328989a10fb2f07d769f4ee587c0de4a0a256e57e0a58a8::deep::DEEP',
|
|
1773
|
+
objectId: '0xe191f166e71b1ef20ffda0c91b24da95ecc93b657c464d8a06f561d4692722f0',
|
|
1774
|
+
version: '34696880',
|
|
1775
|
+
digest: '4KyhzfPQcTUrnp4UBvR3GsPE3DLccVDEPgBjDxaWVRcr',
|
|
1776
|
+
balance: new bignumber_js_1.default('2000'),
|
|
1777
|
+
},
|
|
1778
|
+
])
|
|
1779
|
+
.withArgs(seedReceiveAddress2)
|
|
1780
|
+
.resolves([
|
|
1781
|
+
{
|
|
1782
|
+
coinType: '0x2::sui::SUI',
|
|
1783
|
+
objectId: '0xd32f94889d0bfc05c24ed6c023d5d3d3654294a837d850d3738b0e352e1f4867',
|
|
1784
|
+
version: '34696880',
|
|
1785
|
+
digest: '5Po12YiuL3NkNTAvyWvRwtR55JviyPVbcDfTvCwQrTkr',
|
|
1786
|
+
balance: new bignumber_js_1.default('120000000'),
|
|
1787
|
+
},
|
|
1788
|
+
{
|
|
1789
|
+
coinType: '0x2::sui::SUI',
|
|
1790
|
+
objectId: '0xfd66dbfe7a1497f210747b0532f62e6926cb144c75e519f2dfff17a4f6e515fc',
|
|
1791
|
+
version: '149',
|
|
1792
|
+
digest: '5eVcbbm3NTF6jqadTb4GjZMzn75KDZBqcspRz3sVrpbR',
|
|
1793
|
+
balance: new bignumber_js_1.default('199788'),
|
|
1794
|
+
},
|
|
1795
|
+
]);
|
|
1796
|
+
getFeeEstimateStub
|
|
1797
|
+
.withArgs('AAADAQCnqMkQKANatJl35ysIThRescHdz+LgaSXw+DPO8tH2n65uEQIAAAAAIKg8ZMeF2XLLbBdPQyPmfu8bYqCB2z/uaR5sG7Fobl7VAAjcBQAAAAAAAAAgiMmeDbicuh25fLrdfzeypLKitAIllKDASyvMg35LJAQCAgEAAAEBAQABAQIAAAECANIBVm5qC8Ag/S5vcum94iI/VQ1k2qYTmM2RfC91ATJKAV7qA1PweAFrcahMtJTm95HpfLjeU0Te87rt/8icJ6S1r24RAgAAAAAgTx4i+RgcLdA5q+vymM+WETpvCnqEqR4oY7RqQdNj2ozSAVZuagvAIP0ub3LpveIiP1UNZNqmE5jNkXwvdQEySugDAAAAAAAAAOH1BQAAAAAA')
|
|
1798
|
+
.resolves(new bignumber_js_1.default('2345504'))
|
|
1799
|
+
.withArgs('AAADAQDhkfFm5xse8g/9oMkbJNqV7Mk7ZXxGTYoG9WHUaSci8LBuEQIAAAAAIDFvokinBxoWyeL64lPM9mJVOpB0UOjZjDu+J1skPcQPAAjQBwAAAAAAAAAgiMmeDbicuh25fLrdfzeypLKitAIllKDASyvMg35LJAQCAgEAAAEBAQABAQIAAAECAC+l2DlL1r7FUluVUL9Dvgdbg0ItAQfAXHAJROPq7Cb5AdMvlIidC/wFwk7WwCPV09NlQpSoN9hQ03OLDjUuH0hnsG4RAgAAAAAgQUWJ0/tPZt++q7KnLYmAPWRRonn/W/XGYxzxY689zK8vpdg5S9a+xVJblVC/Q74HW4NCLQEHwFxwCUTj6uwm+egDAAAAAAAAAOH1BQAAAAAA')
|
|
1800
|
+
.resolves(new bignumber_js_1.default('2345504'));
|
|
1801
|
+
const res = await basecoin.recoverConsolidations({
|
|
1802
|
+
bitgoKey: sui_1.keys.bitgoKeyWithSeed,
|
|
1803
|
+
tokenContractAddress: packageId,
|
|
1804
|
+
startingScanIndex: 1,
|
|
1805
|
+
endingScanIndex: 3,
|
|
1806
|
+
seed: '123',
|
|
1807
|
+
});
|
|
1808
|
+
res.should.deepEqual({
|
|
1809
|
+
txRequests: [
|
|
1810
|
+
{
|
|
1811
|
+
transactions: [
|
|
1812
|
+
{
|
|
1813
|
+
unsignedTx: {
|
|
1814
|
+
serializedTx: '0000030100a7a8c91028035ab49977e72b084e145eb1c1ddcfe2e06925f0f833cef2d1f69fae6e11020000000020a83c64c785d972cb6c174f4323e67eef1b62a081db3fee691e6c1bb1686e5ed50008dc05000000000000002088c99e0db89cba1db97cbadd7f37b2a4b2a2b4022594a0c04b2bcc837e4b24040202010000010101000101020000010200d201566e6a0bc020fd2e6f72e9bde2223f550d64daa61398cd917c2f7501324a015eea0353f078016b71a84cb494e6f791e97cb8de5344def3baedffc89c27a4b5af6e110200000000204f1e22f9181c2dd039abebf298cf96113a6f0a7a84a91e2863b46a41d363da8cd201566e6a0bc020fd2e6f72e9bde2223f550d64daa61398cd917c2f7501324ae803000000000000565e27000000000000',
|
|
1815
|
+
scanIndex: 1,
|
|
1816
|
+
coin: 'tsui:deep',
|
|
1817
|
+
signableHex: '22defa9101ea3a3839c3c0026b27a9837165c07fcecff8e94353bcf3d5a01328',
|
|
1818
|
+
derivationPath: 'm/999999/94862622/157363509/1',
|
|
1819
|
+
parsedTx: {
|
|
1820
|
+
inputs: [
|
|
1821
|
+
{
|
|
1822
|
+
address: '0xd201566e6a0bc020fd2e6f72e9bde2223f550d64daa61398cd917c2f7501324a',
|
|
1823
|
+
valueString: '1500',
|
|
1824
|
+
value: new bignumber_js_1.default('1500'),
|
|
1825
|
+
},
|
|
1826
|
+
],
|
|
1827
|
+
outputs: [
|
|
1828
|
+
{
|
|
1829
|
+
address: '0x88c99e0db89cba1db97cbadd7f37b2a4b2a2b4022594a0c04b2bcc837e4b2404',
|
|
1830
|
+
valueString: '1500',
|
|
1831
|
+
coinName: 'tsui:deep',
|
|
1832
|
+
},
|
|
1833
|
+
],
|
|
1834
|
+
spendAmount: '1500',
|
|
1835
|
+
type: 'TokenTransfer',
|
|
1836
|
+
},
|
|
1837
|
+
feeInfo: {
|
|
1838
|
+
fee: 2580054,
|
|
1839
|
+
feeString: '2580054',
|
|
1840
|
+
},
|
|
1841
|
+
coinSpecific: {
|
|
1842
|
+
commonKeychain: 'ca0a014ba6f11106a155ef8e2cab2f76d277e4f01cffa591a9b40848343823b3d910752a49c96bf5813985206e23c9f9cd3a78f1cccf5cf88def52b573cedc93',
|
|
1843
|
+
},
|
|
1844
|
+
},
|
|
1845
|
+
signatureShares: [],
|
|
1846
|
+
},
|
|
1847
|
+
],
|
|
1848
|
+
walletCoin: 'tsui:deep',
|
|
1849
|
+
},
|
|
1850
|
+
{
|
|
1851
|
+
transactions: [
|
|
1852
|
+
{
|
|
1853
|
+
unsignedTx: {
|
|
1854
|
+
serializedTx: '0000030100e191f166e71b1ef20ffda0c91b24da95ecc93b657c464d8a06f561d4692722f0b06e11020000000020316fa248a7071a16c9e2fae253ccf662553a907450e8d98c3bbe275b243dc40f0008d007000000000000002088c99e0db89cba1db97cbadd7f37b2a4b2a2b4022594a0c04b2bcc837e4b240402020100000101010001010200000102002fa5d8394bd6bec5525b9550bf43be075b83422d0107c05c700944e3eaec26f901d32f94889d0bfc05c24ed6c023d5d3d3654294a837d850d3738b0e352e1f4867b06e11020000000020414589d3fb4f66dfbeabb2a72d89803d6451a279ff5bf5c6631cf163af3dccaf2fa5d8394bd6bec5525b9550bf43be075b83422d0107c05c700944e3eaec26f9e803000000000000565e27000000000000',
|
|
1855
|
+
scanIndex: 2,
|
|
1856
|
+
coin: 'tsui:deep',
|
|
1857
|
+
signableHex: '2e6bb17166ee197102729bda47b06b7c0b5962bf431bbb0562b91e267b75129d',
|
|
1858
|
+
derivationPath: 'm/999999/94862622/157363509/2',
|
|
1859
|
+
parsedTx: {
|
|
1860
|
+
inputs: [
|
|
1861
|
+
{
|
|
1862
|
+
address: '0x2fa5d8394bd6bec5525b9550bf43be075b83422d0107c05c700944e3eaec26f9',
|
|
1863
|
+
valueString: '2000',
|
|
1864
|
+
value: new bignumber_js_1.default('2000'),
|
|
1865
|
+
},
|
|
1866
|
+
],
|
|
1867
|
+
outputs: [
|
|
1868
|
+
{
|
|
1869
|
+
address: '0x88c99e0db89cba1db97cbadd7f37b2a4b2a2b4022594a0c04b2bcc837e4b2404',
|
|
1870
|
+
valueString: '2000',
|
|
1871
|
+
coinName: 'tsui:deep',
|
|
1872
|
+
},
|
|
1873
|
+
],
|
|
1874
|
+
spendAmount: '2000',
|
|
1875
|
+
type: 'TokenTransfer',
|
|
1876
|
+
},
|
|
1877
|
+
feeInfo: {
|
|
1878
|
+
fee: 2580054,
|
|
1879
|
+
feeString: '2580054',
|
|
1880
|
+
},
|
|
1881
|
+
coinSpecific: {
|
|
1882
|
+
commonKeychain: 'ca0a014ba6f11106a155ef8e2cab2f76d277e4f01cffa591a9b40848343823b3d910752a49c96bf5813985206e23c9f9cd3a78f1cccf5cf88def52b573cedc93',
|
|
1883
|
+
lastScanIndex: 2,
|
|
1884
|
+
},
|
|
1885
|
+
},
|
|
1886
|
+
signatureShares: [],
|
|
1887
|
+
},
|
|
1888
|
+
],
|
|
1889
|
+
walletCoin: 'tsui:deep',
|
|
1890
|
+
},
|
|
1891
|
+
],
|
|
1892
|
+
});
|
|
1893
|
+
sandBox.assert.callCount(basecoin.getBalance, 6);
|
|
1894
|
+
sandBox.assert.callCount(basecoin.getInputCoins, 4);
|
|
1895
|
+
sandBox.assert.callCount(basecoin.getFeeEstimate, 2);
|
|
1896
|
+
});
|
|
1897
|
+
});
|
|
1898
|
+
describe('Create Broadcastable MPC Transaction', () => {
|
|
1899
|
+
it('create broadcastable MPC transaction for OVC signed sweep transaction', async function () {
|
|
1900
|
+
const signatureShares = {
|
|
1901
|
+
signatureShares: [
|
|
1902
|
+
{
|
|
1903
|
+
txRequest: {
|
|
1904
|
+
transactions: [
|
|
1905
|
+
{
|
|
1906
|
+
unsignedTx: {
|
|
1907
|
+
serializedTx: '0000020008c88b902f000000000020df407e3e25e9400f9779ac7571537c2361684194f1aa5db126a8f574b5ed851c020200010100000101020000010100016495ddda748c116a218242835d364709d6c5ee5c8a1ed684c4ef433d314421014553b0f6f79ed95942141835de3ab086bf38d1f1d96272981e1390b84fb86b36c900000000000000200b1de8fdfbbb8a6fa2c65ec79a55703c9a9f0c2685a768f2b81a0426bc932ec3016495ddda748c116a218242835d364709d6c5ee5c8a1ed684c4ef433d314421e803000000000000a48821000000000000',
|
|
1908
|
+
scanIndex: 0,
|
|
1909
|
+
coin: 'tsui',
|
|
1910
|
+
signableHex: 'a4ce8eb11362cd45c09936e745044dc78b2689e5d8147b9ea9a7de43ee43923a',
|
|
1911
|
+
derivationPath: 'm/0',
|
|
1912
|
+
parsedTx: {
|
|
1913
|
+
inputs: [
|
|
1914
|
+
{
|
|
1915
|
+
address: '0x016495ddda748c116a218242835d364709d6c5ee5c8a1ed684c4ef433d314421',
|
|
1916
|
+
valueString: '798002120',
|
|
1917
|
+
value: {
|
|
1918
|
+
s: 1,
|
|
1919
|
+
e: 8,
|
|
1920
|
+
c: [798002120],
|
|
1921
|
+
},
|
|
1922
|
+
},
|
|
1923
|
+
],
|
|
1924
|
+
outputs: [
|
|
1925
|
+
{
|
|
1926
|
+
address: '0xdf407e3e25e9400f9779ac7571537c2361684194f1aa5db126a8f574b5ed851c',
|
|
1927
|
+
valueString: '798002120',
|
|
1928
|
+
coinName: 'tsui',
|
|
1929
|
+
},
|
|
1930
|
+
],
|
|
1931
|
+
spendAmount: '798002120',
|
|
1932
|
+
type: 'Transfer',
|
|
1933
|
+
},
|
|
1934
|
+
feeInfo: {
|
|
1935
|
+
fee: 2197668,
|
|
1936
|
+
feeString: '2197668',
|
|
1937
|
+
},
|
|
1938
|
+
coinSpecific: {
|
|
1939
|
+
commonKeychain: '79d4b9b594df028fee3725a6af51ae3ab6a3519e9d2c322f2c8fd815b96496323c5aba7ea874c102f966f1a61d3c9a42b5f3177c6a85712cf313715afddf83d8',
|
|
1940
|
+
},
|
|
1941
|
+
},
|
|
1942
|
+
signatureShares: [],
|
|
1943
|
+
signatureShare: {
|
|
1944
|
+
from: 'backup',
|
|
1945
|
+
to: 'user',
|
|
1946
|
+
share: '6f470906df88c33b27c8d113ed944ed0a4fc499ba6cc76f00b8924942812d7835792ee455cbc8941faba7bcc93b15a9cd198a20dc3f0b629f5fdceab34e66100',
|
|
1947
|
+
publicShare: '284496ca04cc603823f7993aef13f72f331d97085b2184d7a6a463a90aa927d0',
|
|
1948
|
+
},
|
|
1949
|
+
},
|
|
1950
|
+
],
|
|
1951
|
+
walletCoin: 'tsui',
|
|
1952
|
+
},
|
|
1953
|
+
tssVersion: '0.0.1',
|
|
1954
|
+
ovc: [
|
|
1955
|
+
{
|
|
1956
|
+
eddsaSignature: {
|
|
1957
|
+
y: '284496ca04cc603823f7993aef13f72f331d97085b2184d7a6a463a90aa927d0',
|
|
1958
|
+
R: '6f470906df88c33b27c8d113ed944ed0a4fc499ba6cc76f00b8924942812d783',
|
|
1959
|
+
sigma: '5c23a8c72ce192731e702da460aea79ed66334b4a783dcf6dd2758347d6c9f0d',
|
|
1960
|
+
},
|
|
1961
|
+
},
|
|
1962
|
+
],
|
|
1963
|
+
},
|
|
1964
|
+
],
|
|
1965
|
+
};
|
|
1966
|
+
const res = await basecoin.createBroadcastableSweepTransaction(signatureShares);
|
|
1967
|
+
res.should.deepEqual({
|
|
1968
|
+
transactions: [
|
|
1969
|
+
{
|
|
1970
|
+
serializedTx: 'AAACAAjIi5AvAAAAAAAg30B+PiXpQA+Xeax1cVN8I2FoQZTxql2xJqj1dLXthRwCAgABAQAAAQECAAABAQABZJXd2nSMEWohgkKDXTZHCdbF7lyKHtaExO9DPTFEIQFFU7D2957ZWUIUGDXeOrCGvzjR8dlicpgeE5C4T7hrNskAAAAAAAAAIAsd6P37u4pvosZex5pVcDyanwwmhado8rgaBCa8ky7DAWSV3dp0jBFqIYJCg102RwnWxe5cih7WhMTvQz0xRCHoAwAAAAAAAKSIIQAAAAAAAA==',
|
|
1971
|
+
scanIndex: 0,
|
|
1972
|
+
signature: 'AG9HCQbfiMM7J8jRE+2UTtCk/Embpsx28AuJJJQoEteDXCOoxyzhknMecC2kYK6nntZjNLSng9z23SdYNH1snw0oRJbKBMxgOCP3mTrvE/cvMx2XCFshhNempGOpCqkn0A==',
|
|
1973
|
+
recoveryAmount: '798002120',
|
|
1974
|
+
},
|
|
1975
|
+
],
|
|
1976
|
+
lastScanIndex: 0,
|
|
1977
|
+
});
|
|
1978
|
+
});
|
|
1979
|
+
it('create broadcastable MPC token transaction for OVC signed sweep transaction', async function () {
|
|
1980
|
+
const signatureShares = {
|
|
1981
|
+
signatureShares: [
|
|
1982
|
+
{
|
|
1983
|
+
txRequest: {
|
|
1984
|
+
transactions: [
|
|
1985
|
+
{
|
|
1986
|
+
unsignedTx: {
|
|
1987
|
+
serializedTx: '000004010072ad99130abd3790db7bac8908d50d3412a800a8fcd10c1cfbd64b8215537558a16e1102000000002007b85d38b6e1b485f1455930d27296108081caacd7664c48d7d5f48572ee2bbd01004c1cccc6d03510bd74a95f81b2b7da08119cb18e2c565435e7ad715e6aadc5a7696e110200000000208fb4a334b829acdecbfa2a328642afa24d6f953740f7683080ee0e4b3d3a962f0008f82a000000000000002091f25e237b83a00a62724fdc4a81e43f494dc6b41a1241492826d36e4d131da303030100000101010002010000010102000101020100010300016495ddda748c116a218242835d364709d6c5ee5c8a1ed684c4ef433d3144210198114f2ddefe3f16d9d2e016194b52c4c3af430c1601bdb3539cbd237cbca068696e11020000000020b516a15b5034bcd42425440c564cf36f439542f88671ef799dde0661e789a009016495ddda748c116a218242835d364709d6c5ee5c8a1ed684c4ef433d314421e803000000000000f86411000000000000',
|
|
1988
|
+
scanIndex: 0,
|
|
1989
|
+
coin: 'tsui:deep',
|
|
1990
|
+
signableHex: '449ade19590685b1eb0cefcb2ec41f4c68e37d8eaf75687c45965e288e71caa4',
|
|
1991
|
+
derivationPath: 'm/0',
|
|
1992
|
+
parsedTx: {
|
|
1993
|
+
inputs: [
|
|
1994
|
+
{
|
|
1995
|
+
address: '0x016495ddda748c116a218242835d364709d6c5ee5c8a1ed684c4ef433d314421',
|
|
1996
|
+
valueString: '11000',
|
|
1997
|
+
value: {
|
|
1998
|
+
s: 1,
|
|
1999
|
+
e: 4,
|
|
2000
|
+
c: [11000],
|
|
2001
|
+
},
|
|
2002
|
+
},
|
|
2003
|
+
],
|
|
2004
|
+
outputs: [
|
|
2005
|
+
{
|
|
2006
|
+
address: '0x91f25e237b83a00a62724fdc4a81e43f494dc6b41a1241492826d36e4d131da3',
|
|
2007
|
+
valueString: '11000',
|
|
2008
|
+
coinName: 'tsui:deep',
|
|
2009
|
+
},
|
|
2010
|
+
],
|
|
2011
|
+
spendAmount: '11000',
|
|
2012
|
+
type: 'TokenTransfer',
|
|
2013
|
+
},
|
|
2014
|
+
feeInfo: {
|
|
2015
|
+
fee: 1139960,
|
|
2016
|
+
feeString: '1139960',
|
|
2017
|
+
},
|
|
2018
|
+
coinSpecific: {
|
|
2019
|
+
commonKeychain: '79d4b9b594df028fee3725a6af51ae3ab6a3519e9d2c322f2c8fd815b96496323c5aba7ea874c102f966f1a61d3c9a42b5f3177c6a85712cf313715afddf83d8',
|
|
2020
|
+
},
|
|
2021
|
+
},
|
|
2022
|
+
signatureShares: [],
|
|
2023
|
+
signatureShare: {
|
|
2024
|
+
from: 'backup',
|
|
2025
|
+
to: 'user',
|
|
2026
|
+
share: '23c53e54f271386578d99a6932ff708960900188ab3e5bce1aec1f019e53a85d3197f8b64a9feadbedbbd37aa42e4444609f000743adc0a94ffcc721c7057d04',
|
|
2027
|
+
publicShare: '284496ca04cc603823f7993aef13f72f331d97085b2184d7a6a463a90aa927d0',
|
|
2028
|
+
},
|
|
2029
|
+
},
|
|
2030
|
+
],
|
|
2031
|
+
walletCoin: 'tsui:deep',
|
|
2032
|
+
},
|
|
2033
|
+
tssVersion: '0.0.1',
|
|
2034
|
+
ovc: [
|
|
2035
|
+
{
|
|
2036
|
+
eddsaSignature: {
|
|
2037
|
+
y: '284496ca04cc603823f7993aef13f72f331d97085b2184d7a6a463a90aa927d0',
|
|
2038
|
+
R: '23c53e54f271386578d99a6932ff708960900188ab3e5bce1aec1f019e53a85d',
|
|
2039
|
+
sigma: '9b52b45c4d539fad906805f9fcbab6fb5e4152243caee252855c36c34048cc09',
|
|
2040
|
+
},
|
|
2041
|
+
},
|
|
2042
|
+
],
|
|
2043
|
+
},
|
|
2044
|
+
],
|
|
2045
|
+
};
|
|
2046
|
+
const res = await basecoin.createBroadcastableSweepTransaction(signatureShares);
|
|
2047
|
+
res.should.deepEqual({
|
|
2048
|
+
transactions: [
|
|
2049
|
+
{
|
|
2050
|
+
serializedTx: 'AAAEAQByrZkTCr03kNt7rIkI1Q00EqgAqPzRDBz71kuCFVN1WKFuEQIAAAAAIAe4XTi24bSF8UVZMNJylhCAgcqs12ZMSNfV9IVy7iu9AQBMHMzG0DUQvXSpX4Gyt9oIEZyxjixWVDXnrXFeaq3Fp2luEQIAAAAAII+0ozS4Kazey/oqMoZCr6JNb5U3QPdoMIDuDks9OpYvAAj4KgAAAAAAAAAgkfJeI3uDoApick/cSoHkP0lNxrQaEkFJKCbTbk0THaMDAwEAAAEBAQACAQAAAQECAAEBAgEAAQMAAWSV3dp0jBFqIYJCg102RwnWxe5cih7WhMTvQz0xRCEBmBFPLd7+PxbZ0uAWGUtSxMOvQwwWAb2zU5y9I3y8oGhpbhECAAAAACC1FqFbUDS81CQlRAxWTPNvQ5VC+IZx73md3gZh54mgCQFkld3adIwRaiGCQoNdNkcJ1sXuXIoe1oTE70M9MUQh6AMAAAAAAAD4ZBEAAAAAAAA=',
|
|
2051
|
+
scanIndex: 0,
|
|
2052
|
+
signature: 'ACPFPlTycThleNmaaTL/cIlgkAGIqz5bzhrsHwGeU6hdm1K0XE1Tn62QaAX5/Lq2+15BUiQ8ruJShVw2w0BIzAkoRJbKBMxgOCP3mTrvE/cvMx2XCFshhNempGOpCqkn0A==',
|
|
2053
|
+
recoveryAmount: '11000',
|
|
2054
|
+
},
|
|
2055
|
+
],
|
|
2056
|
+
lastScanIndex: 0,
|
|
2057
|
+
});
|
|
2058
|
+
});
|
|
2059
|
+
it('create broadcastable MPC transaction for OVC signed consolidation transactions', async function () {
|
|
2060
|
+
const signatureShares = {
|
|
2061
|
+
signatureShares: [
|
|
2062
|
+
{
|
|
2063
|
+
txRequest: {
|
|
2064
|
+
transactions: [
|
|
2065
|
+
{
|
|
2066
|
+
unsignedTx: {
|
|
2067
|
+
serializedTx: '000002000820c2d605000000000020016495ddda748c116a218242835d364709d6c5ee5c8a1ed684c4ef433d314421020200010100000101020000010100a992709591deb7471fb30dda0f339db7ab548d3391a89d3f1fa0c72d2092675f01568beffe7651033a081a7375a3bb43d4d2a8e290a396e826236e73d0973b49b5d000000000000000208bc0764a454de7538b5ecea6fd0bd221c9c85207af297612944a967d43e8dd3ba992709591deb7471fb30dda0f339db7ab548d3391a89d3f1fa0c72d2092675fe803000000000000a48821000000000000',
|
|
2068
|
+
scanIndex: 1,
|
|
2069
|
+
coin: 'tsui',
|
|
2070
|
+
signableHex: '857a2f26687c011a61a060a41d4c80c10b2fd31e98fe6704d6bcda26f57b03bb',
|
|
2071
|
+
derivationPath: 'm/1',
|
|
2072
|
+
parsedTx: {
|
|
2073
|
+
inputs: [
|
|
2074
|
+
{
|
|
2075
|
+
address: '0xa992709591deb7471fb30dda0f339db7ab548d3391a89d3f1fa0c72d2092675f',
|
|
2076
|
+
valueString: '97960480',
|
|
2077
|
+
value: {
|
|
2078
|
+
s: 1,
|
|
2079
|
+
e: 7,
|
|
2080
|
+
c: [97960480],
|
|
2081
|
+
},
|
|
2082
|
+
},
|
|
2083
|
+
],
|
|
2084
|
+
outputs: [
|
|
2085
|
+
{
|
|
2086
|
+
address: '0x016495ddda748c116a218242835d364709d6c5ee5c8a1ed684c4ef433d314421',
|
|
2087
|
+
valueString: '97960480',
|
|
2088
|
+
coinName: 'tsui',
|
|
2089
|
+
},
|
|
2090
|
+
],
|
|
2091
|
+
spendAmount: '97960480',
|
|
2092
|
+
type: 'Transfer',
|
|
2093
|
+
},
|
|
2094
|
+
feeInfo: {
|
|
2095
|
+
fee: 2197668,
|
|
2096
|
+
feeString: '2197668',
|
|
2097
|
+
},
|
|
2098
|
+
coinSpecific: {
|
|
2099
|
+
commonKeychain: '79d4b9b594df028fee3725a6af51ae3ab6a3519e9d2c322f2c8fd815b96496323c5aba7ea874c102f966f1a61d3c9a42b5f3177c6a85712cf313715afddf83d8',
|
|
2100
|
+
},
|
|
2101
|
+
},
|
|
2102
|
+
signatureShares: [],
|
|
2103
|
+
signatureShare: {
|
|
2104
|
+
from: 'backup',
|
|
2105
|
+
to: 'user',
|
|
2106
|
+
share: 'cdfe15d7c0f80f8aad89d878706673ce242947b126852c00ee309ef05f7a8301b2e902b90d37ea7dfe86ce79c7a99b2b27a175c3f714c310fd9e10ea877cc60f',
|
|
2107
|
+
publicShare: 'e445bd092a467df577001cfbd6081b1445ca0f75147233561ed2f53f6a30e45a',
|
|
2108
|
+
},
|
|
2109
|
+
},
|
|
2110
|
+
],
|
|
2111
|
+
walletCoin: 'tsui',
|
|
2112
|
+
},
|
|
2113
|
+
tssVersion: '0.0.1',
|
|
2114
|
+
ovc: [
|
|
2115
|
+
{
|
|
2116
|
+
eddsaSignature: {
|
|
2117
|
+
y: 'e445bd092a467df577001cfbd6081b1445ca0f75147233561ed2f53f6a30e45a',
|
|
2118
|
+
R: 'cdfe15d7c0f80f8aad89d878706673ce242947b126852c00ee309ef05f7a8301',
|
|
2119
|
+
sigma: '2a31329b2e5ef8c3f222eb91cd9d70e716f229ee19d3ca9417c8acc16b1da100',
|
|
2120
|
+
},
|
|
2121
|
+
},
|
|
2122
|
+
],
|
|
2123
|
+
},
|
|
2124
|
+
{
|
|
2125
|
+
txRequest: {
|
|
2126
|
+
transactions: [
|
|
2127
|
+
{
|
|
2128
|
+
unsignedTx: {
|
|
2129
|
+
serializedTx: '000002000800c2eb0b000000000020016495ddda748c116a218242835d364709d6c5ee5c8a1ed684c4ef433d314421020200010100000101020000010100c3ac2a86e35b62bfada83f6388ff27c7dda7092cf0b829d2d1f4c2813e28ae3901d68feb4780886ccfa81a37036958ec9c8bfabfe75a0bb7c4d1a4587992343f5bcf00000000000000205ad4f631a378f8b09542d4df66942b6dabb2f65cb20cf8f628c91c64f9352e4ec3ac2a86e35b62bfada83f6388ff27c7dda7092cf0b829d2d1f4c2813e28ae39e803000000000000a48821000000000000',
|
|
2130
|
+
scanIndex: 2,
|
|
2131
|
+
coin: 'tsui',
|
|
2132
|
+
signableHex: 'f2b56a74e787b2a98decf189e71b1e0c5d4ccee88697b3991a48de2910676020',
|
|
2133
|
+
derivationPath: 'm/2',
|
|
2134
|
+
parsedTx: {
|
|
2135
|
+
inputs: [
|
|
2136
|
+
{
|
|
2137
|
+
address: '0xc3ac2a86e35b62bfada83f6388ff27c7dda7092cf0b829d2d1f4c2813e28ae39',
|
|
2138
|
+
valueString: '200000000',
|
|
2139
|
+
value: {
|
|
2140
|
+
s: 1,
|
|
2141
|
+
e: 8,
|
|
2142
|
+
c: [200000000],
|
|
2143
|
+
},
|
|
2144
|
+
},
|
|
2145
|
+
],
|
|
2146
|
+
outputs: [
|
|
2147
|
+
{
|
|
2148
|
+
address: '0x016495ddda748c116a218242835d364709d6c5ee5c8a1ed684c4ef433d314421',
|
|
2149
|
+
valueString: '200000000',
|
|
2150
|
+
coinName: 'tsui',
|
|
2151
|
+
},
|
|
2152
|
+
],
|
|
2153
|
+
spendAmount: '200000000',
|
|
2154
|
+
type: 'Transfer',
|
|
2155
|
+
},
|
|
2156
|
+
feeInfo: {
|
|
2157
|
+
fee: 2197668,
|
|
2158
|
+
feeString: '2197668',
|
|
2159
|
+
},
|
|
2160
|
+
coinSpecific: {
|
|
2161
|
+
commonKeychain: '79d4b9b594df028fee3725a6af51ae3ab6a3519e9d2c322f2c8fd815b96496323c5aba7ea874c102f966f1a61d3c9a42b5f3177c6a85712cf313715afddf83d8',
|
|
2162
|
+
lastScanIndex: 20,
|
|
2163
|
+
},
|
|
2164
|
+
},
|
|
2165
|
+
signatureShares: [],
|
|
2166
|
+
signatureShare: {
|
|
2167
|
+
from: 'backup',
|
|
2168
|
+
to: 'user',
|
|
2169
|
+
share: '3518613ea5cefa36cd22e1b092742d8d052744188518040397f1a65a754f9e95324889312d70146811dbdc2a96245c518e16fc61bd1a5a2b53b53ebcec5d4a03',
|
|
2170
|
+
publicShare: '4b143a12835bdda04831a9ed851f9eadd7ba5b46e9c07fd087b751f46a3f364d',
|
|
2171
|
+
},
|
|
2172
|
+
},
|
|
2173
|
+
],
|
|
2174
|
+
walletCoin: 'tsui',
|
|
2175
|
+
},
|
|
2176
|
+
tssVersion: '0.0.1',
|
|
2177
|
+
ovc: [
|
|
2178
|
+
{
|
|
2179
|
+
eddsaSignature: {
|
|
2180
|
+
y: '4b143a12835bdda04831a9ed851f9eadd7ba5b46e9c07fd087b751f46a3f364d',
|
|
2181
|
+
R: '3518613ea5cefa36cd22e1b092742d8d052744188518040397f1a65a754f9e95',
|
|
2182
|
+
sigma: '2df48ed60ff62b0e8689c5ebe57318f3dad76288647524b420acf7b1a84cc000',
|
|
2183
|
+
},
|
|
2184
|
+
},
|
|
2185
|
+
],
|
|
2186
|
+
},
|
|
2187
|
+
],
|
|
2188
|
+
};
|
|
2189
|
+
const res = await basecoin.createBroadcastableSweepTransaction(signatureShares);
|
|
2190
|
+
res.should.deepEqual({
|
|
2191
|
+
transactions: [
|
|
2192
|
+
{
|
|
2193
|
+
serializedTx: 'AAACAAggwtYFAAAAAAAgAWSV3dp0jBFqIYJCg102RwnWxe5cih7WhMTvQz0xRCECAgABAQAAAQECAAABAQCpknCVkd63Rx+zDdoPM523q1SNM5GonT8foMctIJJnXwFWi+/+dlEDOggac3Wju0PU0qjikKOW6CYjbnPQlztJtdAAAAAAAAAAIIvAdkpFTedTi17Opv0L0iHJyFIHryl2EpRKln1D6N07qZJwlZHet0cfsw3aDzOdt6tUjTORqJ0/H6DHLSCSZ1/oAwAAAAAAAKSIIQAAAAAAAA==',
|
|
2194
|
+
scanIndex: 1,
|
|
2195
|
+
signature: 'AM3+FdfA+A+KrYnYeHBmc84kKUexJoUsAO4wnvBfeoMBKjEymy5e+MPyIuuRzZ1w5xbyKe4Z08qUF8iswWsdoQDkRb0JKkZ99XcAHPvWCBsURcoPdRRyM1Ye0vU/ajDkWg==',
|
|
2196
|
+
recoveryAmount: '97960480',
|
|
2197
|
+
},
|
|
2198
|
+
{
|
|
2199
|
+
serializedTx: 'AAACAAgAwusLAAAAAAAgAWSV3dp0jBFqIYJCg102RwnWxe5cih7WhMTvQz0xRCECAgABAQAAAQECAAABAQDDrCqG41tiv62oP2OI/yfH3acJLPC4KdLR9MKBPiiuOQHWj+tHgIhsz6gaNwNpWOyci/q/51oLt8TRpFh5kjQ/W88AAAAAAAAAIFrU9jGjePiwlULU32aUK22rsvZcsgz49ijJHGT5NS5Ow6wqhuNbYr+tqD9jiP8nx92nCSzwuCnS0fTCgT4orjnoAwAAAAAAAKSIIQAAAAAAAA==',
|
|
2200
|
+
scanIndex: 2,
|
|
2201
|
+
signature: 'ADUYYT6lzvo2zSLhsJJ0LY0FJ0QYhRgEA5fxplp1T56VLfSO1g/2Kw6GicXr5XMY89rXYohkdSS0IKz3sahMwABLFDoSg1vdoEgxqe2FH56t17pbRunAf9CHt1H0aj82TQ==',
|
|
2202
|
+
recoveryAmount: '200000000',
|
|
2203
|
+
},
|
|
2204
|
+
],
|
|
2205
|
+
lastScanIndex: 20,
|
|
2206
|
+
});
|
|
2207
|
+
});
|
|
2208
|
+
it('create broadcastable MPC transaction for OVC signed token consolidation transactions', async function () {
|
|
2209
|
+
const signatureShares = {
|
|
2210
|
+
signatureShares: [
|
|
2211
|
+
{
|
|
2212
|
+
txRequest: {
|
|
2213
|
+
transactions: [
|
|
2214
|
+
{
|
|
2215
|
+
unsignedTx: {
|
|
2216
|
+
serializedTx: '0000030100a7a8c91028035ab49977e72b084e145eb1c1ddcfe2e06925f0f833cef2d1f69fae6e11020000000020a83c64c785d972cb6c174f4323e67eef1b62a081db3fee691e6c1bb1686e5ed50008dc05000000000000002088c99e0db89cba1db97cbadd7f37b2a4b2a2b4022594a0c04b2bcc837e4b24040202010000010101000101020000010200d201566e6a0bc020fd2e6f72e9bde2223f550d64daa61398cd917c2f7501324a015eea0353f078016b71a84cb494e6f791e97cb8de5344def3baedffc89c27a4b5af6e110200000000204f1e22f9181c2dd039abebf298cf96113a6f0a7a84a91e2863b46a41d363da8cd201566e6a0bc020fd2e6f72e9bde2223f550d64daa61398cd917c2f7501324ae803000000000000565e27000000000000',
|
|
2217
|
+
scanIndex: 1,
|
|
2218
|
+
coin: 'tsui:deep',
|
|
2219
|
+
signableHex: '22defa9101ea3a3839c3c0026b27a9837165c07fcecff8e94353bcf3d5a01328',
|
|
2220
|
+
derivationPath: 'm/999999/94862622/157363509/1',
|
|
2221
|
+
parsedTx: {
|
|
2222
|
+
inputs: [
|
|
2223
|
+
{
|
|
2224
|
+
address: '0xd201566e6a0bc020fd2e6f72e9bde2223f550d64daa61398cd917c2f7501324a',
|
|
2225
|
+
valueString: '1500',
|
|
2226
|
+
value: {
|
|
2227
|
+
s: 1,
|
|
2228
|
+
e: 3,
|
|
2229
|
+
c: [1500],
|
|
2230
|
+
},
|
|
2231
|
+
},
|
|
2232
|
+
],
|
|
2233
|
+
outputs: [
|
|
2234
|
+
{
|
|
2235
|
+
address: '0x88c99e0db89cba1db97cbadd7f37b2a4b2a2b4022594a0c04b2bcc837e4b2404',
|
|
2236
|
+
valueString: '1500',
|
|
2237
|
+
coinName: 'tsui:deep',
|
|
2238
|
+
},
|
|
2239
|
+
],
|
|
2240
|
+
spendAmount: '1500',
|
|
2241
|
+
type: 'TokenTransfer',
|
|
2242
|
+
},
|
|
2243
|
+
feeInfo: {
|
|
2244
|
+
fee: 2580054,
|
|
2245
|
+
feeString: '2580054',
|
|
2246
|
+
},
|
|
2247
|
+
coinSpecific: {
|
|
2248
|
+
commonKeychain: 'ca0a014ba6f11106a155ef8e2cab2f76d277e4f01cffa591a9b40848343823b3d910752a49c96bf5813985206e23c9f9cd3a78f1cccf5cf88def52b573cedc93',
|
|
2249
|
+
},
|
|
2250
|
+
},
|
|
2251
|
+
signatureShares: [],
|
|
2252
|
+
signatureShare: {
|
|
2253
|
+
from: 'backup',
|
|
2254
|
+
to: 'user',
|
|
2255
|
+
share: '1989420ce800e35e1c590907f2017b5529945484b3ff884f8e88390da88936e6a5844e4860df0f489e2a0975519c1d6f5f0255dd091edbf859c74063a7f1e20e',
|
|
2256
|
+
publicShare: '408c7a11967152efee953f3eb16191004946685fdc4dd8087b91e3afcb77c916',
|
|
2257
|
+
},
|
|
2258
|
+
},
|
|
2259
|
+
],
|
|
2260
|
+
walletCoin: 'tsui:deep',
|
|
2261
|
+
},
|
|
2262
|
+
tssVersion: '0.0.1',
|
|
2263
|
+
ovc: [
|
|
2264
|
+
{
|
|
2265
|
+
eddsaSignature: {
|
|
2266
|
+
y: '408c7a11967152efee953f3eb16191004946685fdc4dd8087b91e3afcb77c916',
|
|
2267
|
+
R: '1989420ce800e35e1c590907f2017b5529945484b3ff884f8e88390da88936e6',
|
|
2268
|
+
sigma: 'c2ce528f1f323fe9af256abb57428973b2e97e4fa54fa6f50c3943036815860e',
|
|
2269
|
+
},
|
|
2270
|
+
},
|
|
2271
|
+
],
|
|
2272
|
+
},
|
|
2273
|
+
{
|
|
2274
|
+
txRequest: {
|
|
2275
|
+
transactions: [
|
|
2276
|
+
{
|
|
2277
|
+
unsignedTx: {
|
|
2278
|
+
serializedTx: '0000030100e191f166e71b1ef20ffda0c91b24da95ecc93b657c464d8a06f561d4692722f0b06e11020000000020316fa248a7071a16c9e2fae253ccf662553a907450e8d98c3bbe275b243dc40f0008d007000000000000002088c99e0db89cba1db97cbadd7f37b2a4b2a2b4022594a0c04b2bcc837e4b240402020100000101010001010200000102002fa5d8394bd6bec5525b9550bf43be075b83422d0107c05c700944e3eaec26f901d32f94889d0bfc05c24ed6c023d5d3d3654294a837d850d3738b0e352e1f4867b06e11020000000020414589d3fb4f66dfbeabb2a72d89803d6451a279ff5bf5c6631cf163af3dccaf2fa5d8394bd6bec5525b9550bf43be075b83422d0107c05c700944e3eaec26f9e803000000000000565e27000000000000',
|
|
2279
|
+
scanIndex: 2,
|
|
2280
|
+
coin: 'tsui:deep',
|
|
2281
|
+
signableHex: '2e6bb17166ee197102729bda47b06b7c0b5962bf431bbb0562b91e267b75129d',
|
|
2282
|
+
derivationPath: 'm/999999/94862622/157363509/2',
|
|
2283
|
+
parsedTx: {
|
|
2284
|
+
inputs: [
|
|
2285
|
+
{
|
|
2286
|
+
address: '0x2fa5d8394bd6bec5525b9550bf43be075b83422d0107c05c700944e3eaec26f9',
|
|
2287
|
+
valueString: '2000',
|
|
2288
|
+
value: {
|
|
2289
|
+
s: 1,
|
|
2290
|
+
e: 3,
|
|
2291
|
+
c: [2000],
|
|
2292
|
+
},
|
|
2293
|
+
},
|
|
2294
|
+
],
|
|
2295
|
+
outputs: [
|
|
2296
|
+
{
|
|
2297
|
+
address: '0x88c99e0db89cba1db97cbadd7f37b2a4b2a2b4022594a0c04b2bcc837e4b2404',
|
|
2298
|
+
valueString: '2000',
|
|
2299
|
+
coinName: 'tsui:deep',
|
|
2300
|
+
},
|
|
2301
|
+
],
|
|
2302
|
+
spendAmount: '2000',
|
|
2303
|
+
type: 'TokenTransfer',
|
|
2304
|
+
},
|
|
2305
|
+
feeInfo: {
|
|
2306
|
+
fee: 2580054,
|
|
2307
|
+
feeString: '2580054',
|
|
2308
|
+
},
|
|
2309
|
+
coinSpecific: {
|
|
2310
|
+
commonKeychain: 'ca0a014ba6f11106a155ef8e2cab2f76d277e4f01cffa591a9b40848343823b3d910752a49c96bf5813985206e23c9f9cd3a78f1cccf5cf88def52b573cedc93',
|
|
2311
|
+
lastScanIndex: 20,
|
|
2312
|
+
},
|
|
2313
|
+
},
|
|
2314
|
+
signatureShares: [],
|
|
2315
|
+
signatureShare: {
|
|
2316
|
+
from: 'backup',
|
|
2317
|
+
to: 'user',
|
|
2318
|
+
share: '9e1d0fd6640780cf4dc209fa6ed8957d6958e0d0272d8a2fd48438c011f67a2200de1a78e23bc2a7d261d0d02a422145301aa9ce97d3d306b3501b1f44d95606',
|
|
2319
|
+
publicShare: '362d716a5a230d683b60d29ece941197e09627c234c71449facab514c3a7abaf',
|
|
2320
|
+
},
|
|
2321
|
+
},
|
|
2322
|
+
],
|
|
2323
|
+
walletCoin: 'tsui:deep',
|
|
2324
|
+
},
|
|
2325
|
+
tssVersion: '0.0.1',
|
|
2326
|
+
ovc: [
|
|
2327
|
+
{
|
|
2328
|
+
eddsaSignature: {
|
|
2329
|
+
y: '362d716a5a230d683b60d29ece941197e09627c234c71449facab514c3a7abaf',
|
|
2330
|
+
R: '9e1d0fd6640780cf4dc209fa6ed8957d6958e0d0272d8a2fd48438c011f67a22',
|
|
2331
|
+
sigma: '15a82f7c4aedb9ebd4ab481b4281d6fcadb2a8422635f16e4e31967097001806',
|
|
2332
|
+
},
|
|
2333
|
+
},
|
|
2334
|
+
],
|
|
2335
|
+
},
|
|
2336
|
+
],
|
|
2337
|
+
};
|
|
2338
|
+
const res = await basecoin.createBroadcastableSweepTransaction(signatureShares);
|
|
2339
|
+
res.should.deepEqual({
|
|
2340
|
+
transactions: [
|
|
2341
|
+
{
|
|
2342
|
+
serializedTx: 'AAADAQCnqMkQKANatJl35ysIThRescHdz+LgaSXw+DPO8tH2n65uEQIAAAAAIKg8ZMeF2XLLbBdPQyPmfu8bYqCB2z/uaR5sG7Fobl7VAAjcBQAAAAAAAAAgiMmeDbicuh25fLrdfzeypLKitAIllKDASyvMg35LJAQCAgEAAAEBAQABAQIAAAECANIBVm5qC8Ag/S5vcum94iI/VQ1k2qYTmM2RfC91ATJKAV7qA1PweAFrcahMtJTm95HpfLjeU0Te87rt/8icJ6S1r24RAgAAAAAgTx4i+RgcLdA5q+vymM+WETpvCnqEqR4oY7RqQdNj2ozSAVZuagvAIP0ub3LpveIiP1UNZNqmE5jNkXwvdQEySugDAAAAAAAAVl4nAAAAAAAA',
|
|
2343
|
+
scanIndex: 1,
|
|
2344
|
+
signature: 'ABmJQgzoAONeHFkJB/IBe1UplFSEs/+IT46IOQ2oiTbmws5Sjx8yP+mvJWq7V0KJc7Lpfk+lT6b1DDlDA2gVhg5AjHoRlnFS7+6VPz6xYZEASUZoX9xN2Ah7keOvy3fJFg==',
|
|
2345
|
+
recoveryAmount: '1500',
|
|
2346
|
+
},
|
|
2347
|
+
{
|
|
2348
|
+
serializedTx: 'AAADAQDhkfFm5xse8g/9oMkbJNqV7Mk7ZXxGTYoG9WHUaSci8LBuEQIAAAAAIDFvokinBxoWyeL64lPM9mJVOpB0UOjZjDu+J1skPcQPAAjQBwAAAAAAAAAgiMmeDbicuh25fLrdfzeypLKitAIllKDASyvMg35LJAQCAgEAAAEBAQABAQIAAAECAC+l2DlL1r7FUluVUL9Dvgdbg0ItAQfAXHAJROPq7Cb5AdMvlIidC/wFwk7WwCPV09NlQpSoN9hQ03OLDjUuH0hnsG4RAgAAAAAgQUWJ0/tPZt++q7KnLYmAPWRRonn/W/XGYxzxY689zK8vpdg5S9a+xVJblVC/Q74HW4NCLQEHwFxwCUTj6uwm+egDAAAAAAAAVl4nAAAAAAAA',
|
|
2349
|
+
scanIndex: 2,
|
|
2350
|
+
signature: 'AJ4dD9ZkB4DPTcIJ+m7YlX1pWODQJy2KL9SEOMAR9noiFagvfErtuevUq0gbQoHW/K2yqEImNfFuTjGWcJcAGAY2LXFqWiMNaDtg0p7OlBGX4JYnwjTHFEn6yrUUw6errw==',
|
|
2351
|
+
recoveryAmount: '2000',
|
|
2352
|
+
},
|
|
2353
|
+
],
|
|
2354
|
+
lastScanIndex: 20,
|
|
2355
|
+
});
|
|
2356
|
+
});
|
|
2357
|
+
});
|
|
2358
|
+
describe('Recover Transaction Failures:', () => {
|
|
2359
|
+
const sandBox = sinon_1.default.createSandbox();
|
|
2360
|
+
const senderAddress0 = '0x91f25e237b83a00a62724fdc4a81e43f494dc6b41a1241492826d36e4d131da3';
|
|
2361
|
+
const recoveryDestination = '0x00e4eaa6a291fe02918452e645b5653cd260a5fc0fb35f6193d580916aa9e389';
|
|
2362
|
+
const walletPassphrase = 'p$Sw<RjvAgf{nYAYI2xM';
|
|
2363
|
+
afterEach(function () {
|
|
2364
|
+
sandBox.restore();
|
|
2365
|
+
});
|
|
2366
|
+
it('should fail to recover due to non-zero fund but insufficient funds address', async function () {
|
|
2367
|
+
const callBack = sandBox.stub(src_1.Sui.prototype, 'getBalance');
|
|
2368
|
+
callBack
|
|
2369
|
+
.withArgs(senderAddress0)
|
|
2370
|
+
.resolves({ totalBalance: '9800212', coinObjectBalance: '9800212', fundsInAddressBalance: '0' });
|
|
2371
|
+
await basecoin
|
|
2372
|
+
.recover({
|
|
2373
|
+
userKey: sui_1.keys.userKey,
|
|
2374
|
+
backupKey: sui_1.keys.backupKey,
|
|
2375
|
+
bitgoKey: sui_1.keys.bitgoKey,
|
|
2376
|
+
recoveryDestination,
|
|
2377
|
+
walletPassphrase,
|
|
2378
|
+
startingScanIndex: '0',
|
|
2379
|
+
scan: 1,
|
|
2380
|
+
})
|
|
2381
|
+
.should.rejectedWith('Did not find an address with sufficient funds to recover. Please start the next scan at address index 1. If it is token transaction, please keep sufficient Sui balance in the address for the transaction fee.');
|
|
2382
|
+
sandBox.assert.callCount(basecoin.getBalance, 1);
|
|
2383
|
+
});
|
|
2384
|
+
it('should fail to recover due to not finding an address with funds', async function () {
|
|
2385
|
+
const callBack = sandBox.stub(src_1.Sui.prototype, 'getBalance');
|
|
2386
|
+
callBack.resolves({ totalBalance: '0', coinObjectBalance: '0', fundsInAddressBalance: '0' });
|
|
2387
|
+
await basecoin
|
|
2388
|
+
.recover({
|
|
2389
|
+
userKey: sui_1.keys.userKey,
|
|
2390
|
+
backupKey: sui_1.keys.backupKey,
|
|
2391
|
+
bitgoKey: sui_1.keys.bitgoKey,
|
|
2392
|
+
recoveryDestination,
|
|
2393
|
+
walletPassphrase,
|
|
2394
|
+
scan: '10',
|
|
2395
|
+
})
|
|
2396
|
+
.should.rejectedWith('Did not find an address with sufficient funds to recover. Please start the next scan at address index 10. If it is token transaction, please keep sufficient Sui balance in the address for the transaction fee.');
|
|
2397
|
+
sandBox.assert.callCount(basecoin.getBalance, 10);
|
|
2398
|
+
});
|
|
2399
|
+
});
|
|
2400
|
+
describe('Consolidation Transaction Failures:', () => {
|
|
2401
|
+
it('should fail due to insufficient funds in receive address', async function () {
|
|
2402
|
+
const sandBox = sinon_1.default.createSandbox();
|
|
2403
|
+
const receiveAddress1 = '0x32d8e57ee6d91e5558da0677154c2f085795348e317f95acc9efade1b4112fcc';
|
|
2404
|
+
const walletPassphrase = 'p$Sw<RjvAgf{nYAYI2xM';
|
|
2405
|
+
const callBack = sandBox.stub(src_1.Sui.prototype, 'getBalance');
|
|
2406
|
+
callBack
|
|
2407
|
+
.withArgs(receiveAddress1)
|
|
2408
|
+
.resolves({ totalBalance: '1', coinObjectBalance: '1', fundsInAddressBalance: '0' });
|
|
2409
|
+
await basecoin
|
|
2410
|
+
.recoverConsolidations({
|
|
2411
|
+
userKey: sui_1.keys.userKey,
|
|
2412
|
+
backupKey: sui_1.keys.backupKey,
|
|
2413
|
+
bitgoKey: sui_1.keys.bitgoKey,
|
|
2414
|
+
walletPassphrase,
|
|
2415
|
+
startingScanIndex: '1',
|
|
2416
|
+
endingScanIndex: '2',
|
|
2417
|
+
})
|
|
2418
|
+
.should.rejectedWith('Did not find an address with sufficient funds to recover. Please start the next scan at address index 2.');
|
|
2419
|
+
sandBox.assert.callCount(basecoin.getBalance, 1);
|
|
2420
|
+
});
|
|
2421
|
+
});
|
|
2422
|
+
});
|
|
2423
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdGVzdC91bml0L3N1aS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG9EQUE0QjtBQUU1QixtREFBK0Q7QUFDL0QsaURBQStDO0FBQy9DLG1DQUFxRjtBQUNyRiwyREFBNkM7QUFDN0Msb0RBQXVCO0FBQ3ZCLGtEQUEwQjtBQUMxQixnRUFBcUM7QUFDckMsb0RBQTRCO0FBQzVCLCtDQUF5RDtBQUN6RCwyREFBd0Q7QUFDeEQsMENBQXdDO0FBQ3hDLG1DQUFnQztBQUNoQyxtREFBMkU7QUFDM0UsZ0RBQXdCO0FBRXhCLFFBQVEsQ0FBQyxNQUFNLEVBQUU7SUFDZixJQUFJLEtBQW1CLENBQUM7SUFDeEIsSUFBSSxRQUFRLENBQUM7SUFDYixJQUFJLGFBQWEsQ0FBQztJQUNsQixJQUFJLFdBQVcsQ0FBQztJQUVoQixNQUFNLFVBQVUsR0FBRztRQUNqQixLQUFLLEVBQUUsZUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7UUFDL0QsTUFBTSxFQUFFLEVBQUU7S0FDWCxDQUFDO0lBRUYsTUFBTSxRQUFRLEdBQUc7UUFDZixVQUFVLEVBQUUsUUFBUSxDQUFDLFVBQVU7S0FDaEMsQ0FBQztJQUVGLE1BQU0sQ0FBQztRQUNMLEtBQUssR0FBRyxvQkFBUyxDQUFDLFFBQVEsQ0FBQyxrQkFBUSxFQUFFLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDdEQsS0FBSyxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsU0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQzlDLEtBQUssQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLFVBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUNoRCxLQUFLLENBQUMsa0JBQWtCLEVBQUUs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QUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgc2hvdWxkIGZyb20gJ3Nob3VsZCc7XG5cbmltcG9ydCB7IFRlc3RCaXRHbywgVGVzdEJpdEdvQVBJIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLXRlc3QnO1xuaW1wb3J0IHsgQml0R29BUEkgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstYXBpJztcbmltcG9ydCB7IFN1aSwgVG9rZW5UcmFuc2ZlclRyYW5zYWN0aW9uLCBUcmFuc2ZlclRyYW5zYWN0aW9uLCBUc3VpIH0gZnJvbSAnLi4vLi4vc3JjJztcbmltcG9ydCAqIGFzIHRlc3REYXRhIGZyb20gJy4uL3Jlc291cmNlcy9zdWknO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBzaW5vbiBmcm9tICdzaW5vbic7XG5pbXBvcnQgQmlnTnVtYmVyIGZyb20gJ2JpZ251bWJlci5qcyc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgeyBTdWlUcmFuc2FjdGlvblR5cGUgfSBmcm9tICcuLi8uLi9zcmMvbGliL2lmYWNlJztcbmltcG9ydCB7IGdldEJ1aWxkZXJGYWN0b3J5IH0gZnJvbSAnLi9nZXRCdWlsZGVyRmFjdG9yeSc7XG5pbXBvcnQgeyBrZXlzIH0gZnJvbSAnLi4vcmVzb3VyY2VzL3N1aSc7XG5pbXBvcnQgeyBCdWZmZXIgfSBmcm9tICdidWZmZXInO1xuaW1wb3J0IHsgY29tbW9uLCBUcmFuc2FjdGlvblByZWJ1aWxkLCBXYWxsZXQgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgbm9jayBmcm9tICdub2NrJztcblxuZGVzY3JpYmUoJ1NVSTonLCBmdW5jdGlvbiAoKSB7XG4gIGxldCBiaXRnbzogVGVzdEJpdEdvQVBJO1xuICBsZXQgYmFzZWNvaW47XG4gIGxldCBuZXdUeFByZWJ1aWxkO1xuICBsZXQgbmV3VHhQYXJhbXM7XG5cbiAgY29uc3QgdHhQcmVidWlsZCA9IHtcbiAgICB0eEhleDogQnVmZmVyLmZyb20odGVzdERhdGEuVFJBTlNGRVIsICdiYXNlNjQnKS50b1N0cmluZygnaGV4JyksXG4gICAgdHhJbmZvOiB7fSxcbiAgfTtcblxuICBjb25zdCB0eFBhcmFtcyA9IHtcbiAgICByZWNpcGllbnRzOiB0ZXN0RGF0YS5yZWNpcGllbnRzLFxuICB9O1xuXG4gIGJlZm9yZShmdW5jdGlvbiAoKSB7XG4gICAgYml0Z28gPSBUZXN0Qml0R28uZGVjb3JhdGUoQml0R29BUEksIHsgZW52OiAnbW9jaycgfSk7XG4gICAgYml0Z28uc2FmZVJlZ2lzdGVyKCdzdWknLCBTdWkuY3JlYXRlSW5zdGFuY2UpO1xuICAgIGJpdGdvLnNhZmVSZWdpc3RlcigndHN1aScsIFRzdWkuY3JlYXRlSW5zdGFuY2UpO1xuICAgIGJpdGdvLmluaXRpYWxpemVUZXN0VmFycygpO1xuICAgIGJhc2Vjb2luID0gYml0Z28uY29pbigndHN1aScpO1xuICAgIG5ld1R4UHJlYnVpbGQgPSAoKSA9PiB7XG4gICAgICByZXR1cm4gXy5jbG9uZURlZXAodHhQcmVidWlsZCk7XG4gICAgfTtcbiAgICBuZXdUeFBhcmFtcyA9ICgpID0+IHtcbiAgICAgIHJldHVybiBfLmNsb25lRGVlcCh0eFBhcmFtcyk7XG4gICAgfTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCByZXR1cm4gdGhlIHJpZ2h0IGluZm8nLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3Qgc3VpID0gYml0Z28uY29pbignc3VpJyk7XG4gICAgY29uc3QgdHN1aSA9IGJpdGdvLmNvaW4oJ3RzdWknKTtcblxuICAgIHN1aS5nZXRDaGFpbigpLnNob3VsZC5lcXVhbCgnc3VpJyk7XG4gICAgc3VpLmdldEZhbWlseSgpLnNob3VsZC5lcXVhbCgnc3VpJyk7XG4gICAgc3VpLmdldEZ1bGxOYW1lKCkuc2hvdWxkLmVxdWFsKCdTdWknKTtcbiAgICBzdWkuZ2V0QmFzZUZhY3RvcigpLnNob3VsZC5lcXVhbCgxZTkpO1xuXG4gICAgdHN1aS5nZXRDaGFpbigpLnNob3VsZC5lcXVhbCgndHN1aScpO1xuICAgIHRzdWkuZ2V0RmFtaWx5KCkuc2hvdWxkLmVxdWFsKCdzdWknKTtcbiAgICB0c3VpLmdldEZ1bGxOYW1lKCkuc2hvdWxkLmVxdWFsKCdUZXN0bmV0IFN1aScpO1xuICAgIHRzdWkuZ2V0QmFzZUZhY3RvcigpLnNob3VsZC5lcXVhbCgxZTkpO1xuICB9KTtcblxuICBkZXNjcmliZSgnVmVyaWZ5IHRyYW5zYWN0aW9uOiAnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBzdWNjZWVkIHRvIHZlcmlmeSB0cmFuc2FjdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4UHJlYnVpbGQgPSBuZXdUeFByZWJ1aWxkKCk7XG4gICAgICBjb25zdCB0eFBhcmFtcyA9IG5ld1R4UGFyYW1zKCk7XG4gICAgICBjb25zdCB2ZXJpZmljYXRpb24gPSB7fTtcbiAgICAgIGNvbnN0IGlzVHJhbnNhY3Rpb25WZXJpZmllZCA9IGF3YWl0IGJhc2Vjb2luLnZlcmlmeVRyYW5zYWN0aW9uKHsgdHhQYXJhbXMsIHR4UHJlYnVpbGQsIHZlcmlmaWNhdGlvbiB9KTtcbiAgICAgIGlzVHJhbnNhY3Rpb25WZXJpZmllZC5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHN1Y2NlZWQgdG8gdmVyaWZ5IHRyYW5zYWN0aW9uIHdoZW4gcmVjaXBpZW50cyBhbW91bnQgYXJlIG51bWJlcnMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eFByZWJ1aWxkID0gbmV3VHhQcmVidWlsZCgpO1xuICAgICAgY29uc3QgdHhQYXJhbXNXaXRoTnVtYmVyQW1vdW50cyA9IG5ld1R4UGFyYW1zKCk7XG4gICAgICB0eFBhcmFtc1dpdGhOdW1iZXJBbW91bnRzLnJlY2lwaWVudHMgPSB0eFBhcmFtc1dpdGhOdW1iZXJBbW91bnRzLnJlY2lwaWVudHMubWFwKCh7IGFkZHJlc3MsIGFtb3VudCB9KSA9PiB7XG4gICAgICAgIHJldHVybiB7IGFkZHJlc3MsIGFtb3VudDogTnVtYmVyKGFtb3VudCkgfTtcbiAgICAgIH0pO1xuICAgICAgY29uc3QgdmVyaWZpY2F0aW9uID0ge307XG4gICAgICBjb25zdCBpc1RyYW5zYWN0aW9uVmVyaWZpZWQgPSBhd2FpdCBiYXNlY29pbi52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICAgIHR4UGFyYW1zOiB0eFBhcmFtc1dpdGhOdW1iZXJBbW91bnRzLFxuICAgICAgICB0eFByZWJ1aWxkLFxuICAgICAgICB2ZXJpZmljYXRpb24sXG4gICAgICB9KTtcbiAgICAgIGlzVHJhbnNhY3Rpb25WZXJpZmllZC5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgdG8gdmVyaWZ5IHRyYW5zYWN0aW9uIHdpdGggaW52YWxpZCBwYXJhbScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4UHJlYnVpbGQgPSB7fTtcbiAgICAgIGNvbnN0IHR4UGFyYW1zID0gbmV3VHhQYXJhbXMoKTtcbiAgICAgIHR4UGFyYW1zLnJlY2lwaWVudHMgPSB1bmRlZmluZWQ7XG4gICAgICBhd2FpdCBiYXNlY29pblxuICAgICAgICAudmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgICAgIHR4UGFyYW1zLFxuICAgICAgICAgIHR4UHJlYnVpbGQsXG4gICAgICAgIH0pXG4gICAgICAgIC5zaG91bGQucmVqZWN0ZWRXaXRoKCdtaXNzaW5nIHJlcXVpcmVkIHR4IHByZWJ1aWxkIHByb3BlcnR5IHR4SGV4Jyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHZlcmlmeSBhIHNwbGl0IHRyYW5zYWN0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZmFjdG9yeSA9IGdldEJ1aWxkZXJGYWN0b3J5KCd0c3VpJyk7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLnR5cGUoU3VpVHJhbnNhY3Rpb25UeXBlLlRyYW5zZmVyKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgY29uc3QgYW1vdW50ID0gMTAwMDAwMDAwMDtcbiAgICAgIGNvbnN0IHJlY2lwaWVudHMgPSBuZXcgQXJyYXkoMTAwKS5maWxsKHsgYWRkcmVzczogdGVzdERhdGEuc2VuZGVyLmFkZHJlc3MsIGFtb3VudDogYW1vdW50LnRvU3RyaW5nKCkgfSk7XG4gICAgICB0eEJ1aWxkZXIuc2VuZChyZWNpcGllbnRzKTtcbiAgICAgIHR4QnVpbGRlci5nYXNEYXRhKHRlc3REYXRhLmdhc0RhdGEpO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcblxuICAgICAgY29uc3QgdHhQcmVidWlsZCA9IHtcbiAgICAgICAgdHhIZXg6IEJ1ZmZlci5mcm9tKHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCksICdiYXNlNjQnKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgIHR4SW5mbzoge30sXG4gICAgICB9O1xuICAgICAgY29uc3QgdHhQYXJhbXMgPSB7XG4gICAgICAgIHJlY2lwaWVudHMsXG4gICAgICB9O1xuICAgICAgY29uc3QgdmVyaWZ5ID0gYXdhaXQgYmFzZWNvaW4udmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgICB0eFBhcmFtcyxcbiAgICAgICAgdHhQcmVidWlsZCxcbiAgICAgIH0pO1xuICAgICAgdmVyaWZ5LnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCB0byB2ZXJpZnkgYSBzcG9vZmVkIGNvbnNvbGlkYXRpb24gdHJhbnNhY3Rpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBTZXQgdXAgd2FsbGV0IGRhdGFcbiAgICAgIGNvbnN0IHdhbGxldERhdGEgPSB7XG4gICAgICAgIGlkOiAnNjJlMTU2ZGJkNjQxYzAwMDA3NmJiYWJlMDQwNDFhOTAnLFxuICAgICAgICBjb2luOiAndHN1aScsXG4gICAgICAgIGtleXM6IFtcbiAgICAgICAgICAnNWIzNDI0ZjkxYmYzNDk5MzBlMzQwMTc1MDAwMDAwMDAnLFxuICAgICAgICAgICc1YjM0MjRmOTFiZjM0OTkzMGUzNDAxNzYwMDAwMDAwMCcsXG4gICAgICAgICAgJzViMzQyNGY5MWJmMzQ5OTMwZTM0MDE3NzAwMDAwMDAwJyxcbiAgICAgICAgXSxcbiAgICAgICAgY29pblNwZWNpZmljOiB7XG4gICAgICAgICAgcm9vdEFkZHJlc3M6ICcweDZmMGY0ZTBlZWYxOTE3NjYyOGVlMGViYzgwZWVmODkxOTRhZmQ5ZTE5ZTU5NDQ0ZTY0Yjk5N2YxMjU0ZjZjZDgnLFxuICAgICAgICB9LFxuICAgICAgICBtdWx0aXNpZ1R5cGU6ICd0c3MnLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgY29uc29saWRhdGlvblR4ID0ge1xuICAgICAgICB0eFJlcXVlc3RJZDogJzEzODU3YzFhLTliNjEtNGI4NS05NmYxLTEwYWYxMjVmNjhhMCcsXG4gICAgICAgIHdhbGxldElkOiAnNjQ0YzNkNmM1MjMyZjAwMDA3NjgwMDQwJyxcbiAgICAgICAgdHhIZXg6XG4gICAgICAgICAgJzAwMDAwMjAwMDhlNmU2NzUzYjAwMDAwMDAwMDAyMDZmMGY0ZTBlZWYxOTE3NjYyOGVlMGViYzgwZWVmODkxOTRhZmQ5ZTE5ZTU5NDQ0ZTY0Yjk5N2YxMjU0ZjZjZDgwMjAyMDAwMTAxMDAwMDAxMDEwMjAwMDAwMTAxMDAxNjcwNDcyYzQ0YjU5MDU4MDMyODQwYjk0YTdmZDc0MDViNGI4N2NiZjY3ZjRlYjYwZTFiNzc4MWNlMDNkZGFkMDEyMjJiODE4YjQ1MGRjZDIxNjRiMjViYTVhNTdiMDUwN2U1OWE0YzhlYjZkN2NhZGQwOGVhNjA5ZGIxN2M2MTFkNGUxMmQwMTQwMDAwMDAwMDIwMjNmYzI3NTc2NjI2NzYyOTA0MzM5YjBhYmUxZmY5OWM5OTc5OWM5M2JlYTQ2ZThiZjQ1MmYyM2M2ODk5MmRiMTE2NzA0NzJjNDRiNTkwNTgwMzI4NDBiOTRhN2ZkNzQwNWI0Yjg3Y2JmNjdmNGViNjBlMWI3NzgxY2UwM2RkYWRlODAzMDAwMDAwMDAwMDAwMWFlMzI0MDAwMDAwMDAwMDAwJyxcbiAgICAgICAgZmVlSW5mbzoge1xuICAgICAgICAgIGZlZTogMjQxNzQzNCxcbiAgICAgICAgICBmZWVTdHJpbmc6ICcyNDE3NDM0JyxcbiAgICAgICAgfSxcbiAgICAgICAgdHhJbmZvOiB7XG4gICAgICAgICAgbWluZXJGZWU6ICcyNDE3NDM0JyxcbiAgICAgICAgICBzcGVuZEFtb3VudDogJzk5NzU4MjU2NicsXG4gICAgICAgICAgc3BlbmRBbW91bnRzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGNvaW5OYW1lOiAndHN1aScsXG4gICAgICAgICAgICAgIGFtb3VudFN0cmluZzogJzk5NzU4MjU2NicsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgICAgcGF5R29GZWU6ICcwJyxcbiAgICAgICAgICBvdXRwdXRzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGFkZHJlc3M6ICcweDZmMGY0ZTBlZWYxOTE3NjYyOGVlMGViYzgwZWVmODkxOTRhZmQ5ZTE5ZTU5NDQ0ZTY0Yjk5N2YxMjU0ZjZjZDgnLFxuICAgICAgICAgICAgICB2YWx1ZTogOTk3NTgyNTY2LFxuICAgICAgICAgICAgICB3YWxsZXQ6ICc2NDRjM2Q2YzUyMzJmMDAwMDc2ODAwNDAnLFxuICAgICAgICAgICAgICB3YWxsZXRzOiBbJzY0NGMzZDZjNTIzMmYwMDAwNzY4MDA0MCddLFxuICAgICAgICAgICAgICBlbnRlcnByaXNlOiAnNjJjYzU5YjcyNzQ0M2EwMDA3MDg5MDMzJyxcbiAgICAgICAgICAgICAgZW50ZXJwcmlzZXM6IFsnNjJjYzU5YjcyNzQ0M2EwMDA3MDg5MDMzJ10sXG4gICAgICAgICAgICAgIHZhbHVlU3RyaW5nOiAnOTk3NTgyNTY2JyxcbiAgICAgICAgICAgICAgY29pbk5hbWU6ICd0c3VpJyxcbiAgICAgICAgICAgICAgd2FsbGV0VHlwZTogJ2hvdCcsXG4gICAgICAgICAgICAgIHdhbGxldFR5cGVzOiBbJ2hvdCddLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIGlucHV0czogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB2YWx1ZTogOTk3NTgyNTY2LFxuICAgICAgICAgICAgICBhZGRyZXNzOiAnMHgxNjcwNDcyYzQ0YjU5MDU4MDMyODQwYjk0YTdmZDc0MDViNGI4N2NiZjY3ZjRlYjYwZTFiNzc4MWNlMDNkZGFkJyxcbiAgICAgICAgICAgICAgdmFsdWVTdHJpbmc6ICc5OTc1ODI1NjYnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIHR5cGU6ICdUcmFuc2ZlcicsXG4gICAgICAgIH0sXG4gICAgICAgIGNvbnNvbGlkYXRlSWQ6ICc2OGI2NDg4OTJlZTkzNTVjOTdlNGI5NmQwOTQ1YjJjYScsXG4gICAgICAgIGNvaW46ICd0c3VpJyxcbiAgICAgIH07XG4gICAgICBjb25zdCBiZ1VybCA9IGNvbW1vbi5FbnZpcm9ubWVudHNbJ21vY2snXS51cmk7XG4gICAgICBjb25zdCB3YWxsZXRPYmogPSBuZXcgV2FsbGV0KGJpdGdvLCBiYXNlY29pbiwgd2FsbGV0RGF0YSk7XG5cbiAgICAgIG5vY2soYmdVcmwpXG4gICAgICAgIC5wb3N0KCcvYXBpL3YyL3RzdWkvd2FsbGV0LzYyZTE1NmRiZDY0MWMwMDAwNzZiYmFiZTA0MDQxYTkwL2NvbnNvbGlkYXRlQWNjb3VudC9idWlsZCcpXG4gICAgICAgIC5yZXBseSgyMDAsIFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICAuLi5jb25zb2xpZGF0aW9uVHgsXG4gICAgICAgICAgICB0eEhleDpcbiAgICAgICAgICAgICAgJzAwMDAwMjAwMDgwMGUxZjUwNTAwMDAwMDAwMDAyMDg3NzEyNzM5NjlhY2YwMzU2ZWQwZjMzYzFjNTJiMTA5YmJmZTBkZTMzNjllOWZiOTgzN2Q1MmE1YTQzOGM2NTAwMjAyMDAwMTAxMDAwMDAxMDEwMjAwMDAwMTAxMDA2ZjBmNGUwZWVmMTkxNzY2MjhlZTBlYmM4MGVlZjg5MTk0YWZkOWUxOWU1OTQ0NGU2NGI5OTdmMTI1NGY2Y2Q4MDEyMmRlOTViMzEzNDdhMmYwZDk3MTVjNTYwZGZkZmM4ZmQzNTE3ODJjYTVlMjc1ZDRiYzNhOThlYTc4NzY5YmNlNGYxMmQwMTQwMDAwMDAwMDIwZWE2MzkwODE5Mjk2MDNmZTI1ODA4NzNmNGFhNjQ3MDE3NDZkMDg5Zjk3M2IwODI3YTIyMmQ3ODRlOTkyZWUyNjZmMGY0ZTBlZWYxOTE3NjYyOGVlMGViYzgwZWVmODkxOTRhZmQ5ZTE5ZTU5NDQ0ZTY0Yjk5N2YxMjU0ZjZjZDhlODAzMDAwMDAwMDAwMDAwYTQ4ODIxMDAwMDAwMDAwMDAwJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcblxuICAgICAgbm9jayhiZ1VybClcbiAgICAgICAgLmdldCgnL2FwaS92Mi90c3VpL2tleS81YjM0MjRmOTFiZjM0OTkzMGUzNDAxNzUwMDAwMDAwMCcpXG4gICAgICAgIC5yZXBseSgyMDAsIFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBlbmNyeXB0ZWRQcnY6ICdmYWtlUHJ2JyxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcblxuICAgICAgLy8gQ2FsbCB0aGUgZnVuY3Rpb24gdG8gdGVzdFxuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoXG4gICAgICAgIGFzeW5jICgpID0+IHtcbiAgICAgICAgICBhd2FpdCB3YWxsZXRPYmouc2VuZEFjY291bnRDb25zb2xpZGF0aW9ucyh7XG4gICAgICAgICAgICB3YWxsZXRQYXNzcGhyYXNlOiAncGFzc3dvcmQnLFxuICAgICAgICAgICAgdmVyaWZpY2F0aW9uOiB7XG4gICAgICAgICAgICAgIGNvbnNvbGlkYXRpb25Ub0Jhc2VBZGRyZXNzOiB0cnVlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG1lc3NhZ2U6ICdDb25zb2xpZGF0aW9uIHRyYW5zYWN0aW9uIG91dHB1dCBhZGRyZXNzIGRvZXMgbm90IG1hdGNoIHdhbGxldCBiYXNlIGFkZHJlc3MnLFxuICAgICAgICB9XG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB2ZXJpZnkgdmFsaWQgYSBjb25zb2xpZGF0aW9uIHRyYW5zYWN0aW9uJywgYXN5bmMgKCkgPT4ge1xuICAgICAgLy8gU2V0IHVwIHdhbGxldCBkYXRhXG4gICAgICBjb25zdCB3YWxsZXREYXRhID0ge1xuICAgICAgICBpZDogJzYyZTE1NmRiZDY0MWMwMDAwNzZiYmFiZTA0MDQxYTkwJyxcbiAgICAgICAgY29pbjogJ3RzdWknLFxuICAgICAgICBrZXlzOiBbXG4gICAgICAgICAgJzViMzQyNGY5MWJmMzQ5OTMwZTM0MDE3NTAwMDAwMDAwJyxcbiAgICAgICAgICAnNWIzNDI0ZjkxYmYzNDk5MzBlMzQwMTc2MDAwMDAwMDAnLFxuICAgICAgICAgICc1YjM0MjRmOTFiZjM0OTkzMGUzNDAxNzcwMDAwMDAwMCcsXG4gICAgICAgIF0sXG4gICAgICAgIGNvaW5TcGVjaWZpYzoge1xuICAgICAgICAgIHJvb3RBZGRyZXNzOiAnMHg2ZjBmNGUwZWVmMTkxNzY2MjhlZTBlYmM4MGVlZjg5MTk0YWZkOWUxOWU1OTQ0NGU2NGI5OTdmMTI1NGY2Y2Q4JyxcbiAgICAgICAgfSxcbiAgICAgICAgbXVsdGlzaWdUeXBlOiAndHNzJyxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGNvbnNvbGlkYXRpb25UeCA9IHtcbiAgICAgICAgdHhSZXF1ZXN0SWQ6ICcxMzg1N2MxYS05YjYxLTRiODUtOTZmMS0xMGFmMTI1ZjY4YTAnLFxuICAgICAgICB3YWxsZXRJZDogJzY0NGMzZDZjNTIzMmYwMDAwNzY4MDA0MCcsXG4gICAgICAgIHR4SGV4OlxuICAgICAgICAgICcwMDAwMDIwMDA4ZTZlNjc1M2IwMDAwMDAwMDAwMjA2ZjBmNGUwZWVmMTkxNzY2MjhlZTBlYmM4MGVlZjg5MTk0YWZkOWUxOWU1OTQ0NGU2NGI5OTdmMTI1NGY2Y2Q4MDIwMjAwMDEwMTAwMDAwMTAxMDIwMDAwMDEwMTAwMTY3MDQ3MmM0NGI1OTA1ODAzMjg0MGI5NGE3ZmQ3NDA1YjRiODdjYmY2N2Y0ZWI2MGUxYjc3ODFjZTAzZGRhZDAxMjIyYjgxOGI0NTBkY2QyMTY0YjI1YmE1YTU3YjA1MDdlNTlhNGM4ZWI2ZDdjYWRkMDhlYTYwOWRiMTdjNjExZDRlMTJkMDE0MDAwMDAwMDAyMDIzZmMyNzU3NjYyNjc2MjkwNDMzOWIwYWJlMWZmOTljOTk3OTljOTNiZWE0NmU4YmY0NTJmMjNjNjg5OTJkYjExNjcwNDcyYzQ0YjU5MDU4MDMyODQwYjk0YTdmZDc0MDViNGI4N2NiZjY3ZjRlYjYwZTFiNzc4MWNlMDNkZGFkZTgwMzAwMDAwMDAwMDAwMDFhZTMyNDAwMDAwMDAwMDAwMCcsXG4gICAgICAgIGZlZUluZm86IHtcbiAgICAgICAgICBmZWU6IDI0MTc0MzQsXG4gICAgICAgICAgZmVlU3RyaW5nOiAnMjQxNzQzNCcsXG4gICAgICAgIH0sXG4gICAgICAgIHR4SW5mbzoge1xuICAgICAgICAgIG1pbmVyRmVlOiAnMjQxNzQzNCcsXG4gICAgICAgICAgc3BlbmRBbW91bnQ6ICc5OTc1ODI1NjYnLFxuICAgICAgICAgIHNwZW5kQW1vdW50czogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBjb2luTmFtZTogJ3RzdWknLFxuICAgICAgICAgICAgICBhbW91bnRTdHJpbmc6ICc5OTc1ODI1NjYnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIHBheUdvRmVlOiAnMCcsXG4gICAgICAgICAgb3V0cHV0czogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBhZGRyZXNzOiAnMHg2ZjBmNGUwZWVmMTkxNzY2MjhlZTBlYmM4MGVlZjg5MTk0YWZkOWUxOWU1OTQ0NGU2NGI5OTdmMTI1NGY2Y2Q4JyxcbiAgICAgICAgICAgICAgdmFsdWU6IDk5NzU4MjU2NixcbiAgICAgICAgICAgICAgd2FsbGV0OiAnNjQ0YzNkNmM1MjMyZjAwMDA3NjgwMDQwJyxcbiAgICAgICAgICAgICAgd2FsbGV0czogWyc2NDRjM2Q2YzUyMzJmMDAwMDc2ODAwNDAnXSxcbiAgICAgICAgICAgICAgZW50ZXJwcmlzZTogJzYyY2M1OWI3Mjc0NDNhMDAwNzA4OTAzMycsXG4gICAgICAgICAgICAgIGVudGVycHJpc2VzOiBbJzYyY2M1OWI3Mjc0NDNhMDAwNzA4OTAzMyddLFxuICAgICAgICAgICAgICB2YWx1ZVN0cmluZzogJzk5NzU4MjU2NicsXG4gICAgICAgICAgICAgIGNvaW5OYW1lOiAndHN1aScsXG4gICAgICAgICAgICAgIHdhbGxldFR5cGU6ICdob3QnLFxuICAgICAgICAgICAgICB3YWxsZXRUeXBlczogWydob3QnXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICBpbnB1dHM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdmFsdWU6IDk5NzU4MjU2NixcbiAgICAgICAgICAgICAgYWRkcmVzczogJzB4MTY3MDQ3MmM0NGI1OTA1ODAzMjg0MGI5NGE3ZmQ3NDA1YjRiODdjYmY2N2Y0ZWI2MGUxYjc3ODFjZTAzZGRhZCcsXG4gICAgICAgICAgICAgIHZhbHVlU3RyaW5nOiAnOTk3NTgyNTY2JyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICB0eXBlOiAnVHJhbnNmZXInLFxuICAgICAgICB9LFxuICAgICAgICBjb25zb2xpZGF0ZUlkOiAnNjhiNjQ4ODkyZWU5MzU1Yzk3ZTRiOTZkMDk0NWIyY2EnLFxuICAgICAgICBjb2luOiAndHN1aScsXG4gICAgICB9O1xuXG4gICAgICB0cnkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgIShhd2FpdCBiYXNlY29pbi52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICAgICAgICBibG9ja2hhc2g6ICcnLFxuICAgICAgICAgICAgZmVlUGF5ZXI6ICcnLFxuICAgICAgICAgICAgdHhQYXJhbXM6IHt9LFxuICAgICAgICAgICAgdHhQcmVidWlsZDogY29uc29saWRhdGlvblR4IGFzIHVua25vd24gYXMgVHJhbnNhY3Rpb25QcmVidWlsZCxcbiAgICAgICAgICAgIHdhbGxldFR5cGU6ICd0c3MnLFxuICAgICAgICAgICAgd2FsbGV0OiBuZXcgV2FsbGV0KGJpdGdvLCBiYXNlY29pbiwgd2FsbGV0RGF0YSksXG4gICAgICAgICAgICB2ZXJpZmljYXRpb246IHtcbiAgICAgICAgICAgICAgY29uc29saWRhdGlvblRvQmFzZUFkZHJlc3M6IHRydWUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pKVxuICAgICAgICApIHtcbiAgICAgICAgICBhc3NlcnQuZmFpbCgnVHJhbnNhY3Rpb24gc2hvdWxkIHBhc3MgdmVyaWZpY2F0aW9uJyk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgYXNzZXJ0LmZhaWwoJ1RyYW5zYWN0aW9uIHNob3VsZCBwYXNzIHZlcmlmaWNhdGlvbicpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnRXhwbGFpbiBUcmFuc2FjdGlvbjogJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgZXhwbGFpbiBhIHRyYW5zZmVyIHRyYW5zYWN0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZXhwbGFpbmVkVHJhbnNhY3Rpb24gPSBhd2FpdCBiYXNlY29pbi5leHBsYWluVHJhbnNhY3Rpb24oe1xuICAgICAgICB0eEhleDogQnVmZmVyLmZyb20odGVzdERhdGEuVFJBTlNGRVIsICdiYXNlNjQnKS50b1N0cmluZygnaGV4JyksXG4gICAgICB9KTtcbiAgICAgIGV4cGxhaW5lZFRyYW5zYWN0aW9uLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBkaXNwbGF5T3JkZXI6IFsnaWQnLCAnb3V0cHV0cycsICdvdXRwdXRBbW91bnQnLCAnY2hhbmdlT3V0cHV0cycsICdjaGFuZ2VBbW91bnQnLCAnZmVlJywgJ3R5cGUnXSxcbiAgICAgICAgaWQ6ICdCeG9lR1hiQkN1dzZWRkVjZ3dISFVBS3JDb0FzR2FuUEIzOWtkVlZLWlpjUicsXG4gICAgICAgIG91dHB1dHM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhZGRyZXNzOiB0ZXN0RGF0YS5yZWNpcGllbnRzWzBdLmFkZHJlc3MsXG4gICAgICAgICAgICBhbW91bnQ6IHRlc3REYXRhLnJlY2lwaWVudHNbMF0uYW1vdW50LFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWRkcmVzczogdGVzdERhdGEucmVjaXBpZW50c1sxXS5hZGRyZXNzLFxuICAgICAgICAgICAgYW1vdW50OiB0ZXN0RGF0YS5yZWNpcGllbnRzWzFdLmFtb3VudCxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBvdXRwdXRBbW91bnQ6IGAke3Rlc3REYXRhLkFNT1VOVCAqIDJ9YCxcbiAgICAgICAgY2hhbmdlT3V0cHV0czogW10sXG4gICAgICAgIGNoYW5nZUFtb3VudDogJzAnLFxuICAgICAgICBmZWU6IHsgZmVlOiB0ZXN0RGF0YS5nYXNEYXRhLmJ1ZGdldC50b1N0cmluZygpIH0sXG4gICAgICAgIHR5cGU6IDAsXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZXhwbGFpbiBhIHNwbGl0IHRyYW5zZmVyIHRyYW5zYWN0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZXhwbGFpbmVkVHJhbnNhY3Rpb24gPSBhd2FpdCBiYXNlY29pbi5leHBsYWluVHJhbnNhY3Rpb24oe1xuICAgICAgICB0eEhleDpcbiAgICAgICAgICAnMDAwMDY1MDAwODAwY2E5YTNiMDAwMDAwMDAwMDIwNTc0ODk1ZmU4M2I0MDliMDA5ZTJlMDQzM2FkMTgyM2VjMGQ1MzhhZjdmZWE1MjM5MGExOThiZGZlNzY3NmYxMzAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMGM4MDEwMjAwMDEwMTAwMDAwMTAxMDIwMDAwMDEwMTAwMDIwMDAxMDEwMjAwMDEwMTAyMDIwMDAxMDEwMDAyMDAwMTAxMDMwMDAxMDEwMjA0MDAwMTAxMDAwMjAwMDEwMTA0MDAwMTAxMDIwNjAwMDEwMTAwMDIwMDAxMDEwNTAwMDEwMTAyMDgwMDAxMDEwMDAyMDAwMTAxMDYwMDAxMDEwMjBhMDAwMTAxMDAwMjAwMDEwMTA3MDAwMTAxMDIwYzAwMDEwMTAwMDIwMDAxMDEwODAwMDEwMTAyMGUwMDAxMDEwMDAyMDAwMTAxMDkwMDAxMDEwMjEwMDAwMTAxMDAwMjAwMDEwMTBhMDAwMTAxMDIxMjAwMDEwMTAwMDIwMDAxMDEwYjAwMDEwMTAyMTQwMDAxMDEwMDAyMDAwMTAxMGMwMDAxMDEwMjE2MDAwMTAxMDAwMjAwMDEwMTBkMDAwMTAxMDIxODAwMDEwMTAwMDIwMDAxMDEwZTAwMDEwMTAyMWEwMDAxMDEwMDAyMDAwMTAxMGYwMDAxMDEwMjFjMDAwMTAxMDAwMjAwMDEwMTEwMDAwMTAxMDIxZTAwMDEwMTAwMDIwMDAxMDExMTAwMDEwMTAyMjAwMDAxMDEwMDAyMDAwMTAxMTIwMDAxMDEwMjIyMDAwMTAxMDAwMjAwMDEwMTEzMDAwMTAxMDIyNDAwMDEwMTAwMDIwMDAxMDExNDAwMDEwMTAyMjYwMDAxMDEwMDAyMDAwMTAxMTUwMDAxMDEwMjI4MDAwMTAxMDAwMjAwMDEwMTE2MDAwMTAxMDIyYTAwMDEwMTAwMDIwMDAxMDExNzAwMDEwMTAyMmMwMDAxMDEwMDAyMDAwMTAxMTgwMDAxMDEwMjJlMDAwMTAxMDAwMjAwMDEwMTE5MDAwMTAxMDIzMDAwMDEwMTAwMDIwMDAxMDExYTAwMDEwMTAyMzIwMDAxMDEwMDAyMDAwMTAxMWIwMDAxMDEwMjM0MDAwMTAxMDAwMjAwMDEwMTFjMDAwMTAxMDIzNjAwMDEwMTAwMDIwMDAxMDExZDAwMDEwMTAyMzgwMDAxMDEwMDAyMDAwMTAxMWUwMDAxMDEwMjNhMDAwMTAxMDAwMjAwMDEwMTFmMDAwMTAxMDIzYzAwMDEwMTAwMDIwMDAxMDEyMDAwMDEwMTAyM2UwMDAxMDEwMDAyMDAwMTAxMjEwMDAxMDEwMjQwMDAwMTAxMDAwMjAwMDEwMTIyMDAwMTAxMDI0MjAwMDEwMTAwMDIwMDAxMDEyMzAwMDEwMTAyNDQwMDAxMDEwMDAyMDAwMTAxMjQwMDAxMDEwMjQ2MDAwMTAxMDAwMjAwMDEwMTI1MDAwMTAxMDI0ODAwMDEwMTAwMDIwMDAxMDEyNjAwMDEwMTAyNGEwMDAxMDEwMDAyMDAwMTAxMjcwMDAxMDEwMjRjMDAwMTAxMDAwMjAwMDEwMTI4MDAwMTAxMDI0ZTAwMDEwMTAwMDIwMDAxMDEyOTAwMDEwMTAyNTAwMDAxMDEwMDAyMDAwMTAxMmEwMDAxMDEwMjUyMDAwMTAxMDAwMjAwMDEwMTJiMDAwMTAxMDI1NDAwMDEwMTAwMDIwMDAxMDEyYzAwMDEwMTAyNTYwMDAxMDEwMDAyMDAwMTAxMmQwMDAxMDEwMjU4MDAwMTAxMDAwMjAwMDEwMTJlMDAwMTAxMDI1YTAwMDEwMTAwMDIwMDAxMDEyZjAwMDEwMTAyNWMwMDAxMDEwMDAyMDAwMTAxMzAwMDAxMDEwMjVlMDAwMTAxMDAwMjAwMDEwMTMxMDAwMTAxMDI2MDAwMDEwMTAwMDIwMDAxMDEzMjAwMDEwMTAyNjIwMDAxMDEwMDAyMDAwMTAxMzMwMDAxMDEwMjY0MDAwMTAxMDAwMjAwMDEwMTM0MDAwMTAxMDI2NjAwMDEwMTAwMDIwMDAxMDEzNTAwMDEwMTAyNjgwMDAxMDEwMDAyMDAwMTAxMzYwMDAxMDEwMjZhMDAwMTAxMDAwMjAwMDEwMTM3MDAwMTAxMDI2YzAwMDEwMTAwMDIwMDAxMDEzODAwMDEwMTAyNmUwMDAxMDEwMDAyMDAwMTAxMzkwMDAxMDEwMjcwMDAwMTAxMDAwMjAwMDEwMTNhMDAwMTAxMDI3MjAwMDEwMTAwMDIwMDAxMDEzYjAwMDEwMTAyNzQwMDAxMDEwMDAyMDAwMTAxM2MwMDAxMDEwMjc2MDAwMTAxMDAwMjAwMDEwMTNkMDAwMTAxMDI3ODAwMDEwMTAwMDIwMDAxMDEzZTAwMDEwMTAyN2EwMDAxMDEwMDAyMDAwMTAxM2YwMDAxMDEwMjdjMDAwMTAxMDAwMjAwMDEwMTQwMDAwMTAxMDI3ZTAwMDEwMTAwMDIwMDAxMDE0MTAwMDEwMTAyODAwMDAxMDEwMDAyMDAwMTAxNDIwMDAxMDEwMjgyMDAwMTAxMDAwMjAwMDEwMTQzMDAwMTAxMDI4NDAwMDEwMTAwMDIwMDAxMDE0NDAwMDEwMTAyODYwMDAxMDEwMDAyMDAwMTAxNDUwMDAxMDEwMjg4MDAwMTAxMDAwMjAwMDEwMTQ2MDAwMTAxMDI4YTAwMDEwMTAwMDIwMDAxMDE0NzAwMDEwMTAyOGMwMDAxMDEwMDAyMDAwMTAxNDgwMDAxMDEwMjhlMDAwMTAxMDAwMjAwMDEwMTQ5MDAwMTAxMDI5MDAwMDEwMTAwMDIwMDAxMDE0YTAwMDEwMTAyOTIwMDAxMDEwMDAyMDAwMTAxNGIwMDAxMDEwMjk0MDAwMTAxMDAwMjAwMDEwMTRjMDAwMTAxMDI5NjAwMDEwMTAwMDIwMDAxMDE0ZDAwMDEwMTAyOTgwMDAxMDEwMDAyMDAwMTAxNGUwMDAxMDEwMjlhMDAwMTAxMDAwMjAwMDEwMTRmMDAwMTAxMDI5YzAwMDEwMTAwMDIwMDAxMDE1MDAwMDEwMTAyOWUwMDAxMDEwMDAyMDAwMTAxNTEwMDAxMDEwMmEwMDAwMTAxMDAwMjAwMDEwMTUyMDAwMTAxMDJhMjAwMDEwMTAwMDIwMDAxMDE1MzAwMDEwMTAyYTQwMDAxMDEwMDAyMDAwMTAxNTQwMDAxMDEwMmE2MDAwMTAxMDAwMjAwMDEwMTU1MDAwMTAxMDJhODAwMDEwMTAwMDIwMDAxMDE1NjAwMDEwMTAyYWEwMDAxMDEwMDAyMDAwMTAxNTcwMDAxMDEwMmFjMDAwMTAxMDAwMjAwMDEwMTU4MDAwMTAxMDJhZTAwMDEwMTAwMDIwMDAxMDE1OTAwMDEwMTAyYjAwMDAxMDEwMDAyMDAwMTAxNWEwMDAxMDEwMmIyMDAwMTAxMDAwMjAwMDEwMTViMDAwMTAxMDJiNDAwMDEwMTAwMDIwMDAxMDE1YzAwMDEwMTAyYjYwMDAxMDEwMDAyMDAwMTAxNWQwMDAxMDEwMmI4MDAwMTAxMDAwMjAwMDEwMTVlMDAwMTAxMDJiYTAwMDEwMTAwMDIwMDAxMDE1ZjAwMDEwMTAyYmMwMDAxMDEwMDAyMDAwMTAxNjAwMDAxMDEwMmJlMDAwMTAxMDAwMjAwMDEwMTYxMDAwMTAxMDJjMDAwMDEwMTAwMDIwMDAxMDE2MjAwMDEwMTAyYzIwMDAxMDEwMDAyMDAwMTAxNjMwMDAxMDEwMmM0MDAwMTAxMDAwMjAwMDEwMTY0MDAwMTAxMDJjNjAwMDEwMTAwNTc0ODk1ZmU4M2I0MDliMDA5ZTJlMDQzM2FkMTgyM2VjMGQ1MzhhZjdmZWE1MjM5MGExOThiZGZlNzY3NmYxMzAzMDM0ZjQwM2ZmOWI3M2I1Nzk0Yjc5YTg5ZWJiY2Q4MTAzMzFmZWE1Mjg3OGRiMGI0ZGMxYTFjODhmNGMwZGM1NjE2MDAwMDAwMDAwMDAwMDAyMDAzY2FmN2U2NzdjNzJiMjQxZDYxZDAwZTYwMGI2ZGYyNTYzOWM1ODI5ODdkMGFhNzhjZWVhMGI5OTUzZWFjNTJhNjBiMGU1MWY5ZmZhMzk4ZjZlZTFkMzEwMWQ2YzllZmExM2QxODAwZTQxMmQ3ZTA4MzJlMjYxNmYxNzkzZmQ3OWNlOTE3MDAwMDAwMDAwMDIwNTA0MzVhNDlmMDYzNWJjMmYyYzNiYmRjZTA1YTE2YjI0ZmFmMDM2OGVkYWEyNWM4ZmJjZTE2ZWY2MjYwMmRhNWNkYTQ0YWU0N2YzODBmNDVkM2NkNDkxMTg4MGY0ZTlhMjRiNTJmZTQyNDY4M2M2NmNmM2M3NzY5ZGQzY2EyMmMxMDAwMDAwMDAwMDAwMDAwMjAwYzc4ZmEyMDIzNmJiODY4NzFlYWNmZTJiNGYyMTU4ZWFhNjhmNGY0NTY1ZDhjZjk4NjVlZTlmMjc5ZTRiZDQwNTc0ODk1ZmU4M2I0MDliMDA5ZTJlMDQzM2FkMTgyM2VjMGQ1MzhhZjdmZWE1MjM5MGExOThiZGZlNzY3NmYxM2U4MDMwMDAwMDAwMDAwMDAwMGUxZjUwNTAwMDAwMDAwMDAnLFxuICAgICAgfSk7XG4gICAgICBleHBsYWluZWRUcmFuc2FjdGlvbi5vdXRwdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMTAwKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZXhwbGFpbiBhIHN0YWtpbmcgdHJhbnNhY3Rpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBleHBsYWluZWRUcmFuc2FjdGlvbiA9IGF3YWl0IGJhc2Vjb2luLmV4cGxhaW5UcmFuc2FjdGlvbih7XG4gICAgICAgIHR4SGV4OiBCdWZmZXIuZnJvbSh0ZXN0RGF0YS5BRERfU1RBS0UsICdiYXNlNjQnKS50b1N0cmluZygnaGV4JyksXG4gICAgICB9KTtcbiAgICAgIGV4cGxhaW5lZFRyYW5zYWN0aW9uLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBkaXNwbGF5T3JkZXI6IFtcbiAgICAgICAgICAnaWQnLFxuICAgICAgICAgICdvdXRwdXRzJyxcbiAgICAgICAgICAnb3V0cHV0QW1vdW50JyxcbiAgICAgICAgICAnY2hhbmdlT3V0cHV0cycsXG4gICAgICAgICAgJ2NoYW5nZUFtb3VudCcsXG4gICAgICAgICAgJ2ZlZScsXG4gICAgICAgICAgJ3R5cGUnLFxuICAgICAgICAgICdtb2R1bGUnLFxuICAgICAgICAgICdmdW5jdGlvbicsXG4gICAgICAgICAgJ3ZhbGlkYXRvckFkZHJlc3MnLFxuICAgICAgICBdLFxuICAgICAgICBpZDogJ2JQNzhib1o0OHNEZEpzZzJWMXRKYWhwR3lCd2FDOUdTVEwycnZ5QURuc2gnLFxuICAgICAgICBvdXRwdXRzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWRkcmVzczogdGVzdERhdGEucmVxdWVzdEFkZFN0YWtlLnZhbGlkYXRvckFkZHJlc3MsXG4gICAgICAgICAgICBhbW91bnQ6IHRlc3REYXRhLnJlcXVlc3RBZGRTdGFrZS5hbW91bnQudG9TdHJpbmcoKSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBvdXRwdXRBbW91bnQ6IHRlc3REYXRhLlNUQUtJTkdfQU1PVU5ULnRvU3RyaW5nKCksXG4gICAgICAgIGNoYW5nZU91dHB1dHM6IFtdLFxuICAgICAgICBjaGFuZ2VBbW91bnQ6ICcwJyxcbiAgICAgICAgZmVlOiB7IGZlZTogdGVzdERhdGEuZ2FzRGF0YS5idWRnZXQudG9TdHJpbmcoKSB9LFxuICAgICAgICB0eXBlOiAyNSxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHRvIGV4cGxhaW4gdHJhbnNhY3Rpb24gd2l0aCBtaXNzaW5nIHBhcmFtcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGJhc2Vjb2luLmV4cGxhaW5UcmFuc2FjdGlvbih7fSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBzaG91bGQuZXF1YWwoZXJyb3IubWVzc2FnZSwgJ0ludmFsaWQgdHJhbnNhY3Rpb24nKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCB0byBleHBsYWluIHRyYW5zYWN0aW9uIHdpdGggaW52YWxpZCBwYXJhbXMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBiYXNlY29pbi5leHBsYWluVHJhbnNhY3Rpb24oeyB0eEhleDogJ3JhbmRvbVN0cmluZycgfSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBzaG91bGQuZXF1YWwoZXJyb3IubWVzc2FnZSwgJ0ludmFsaWQgdHJhbnNhY3Rpb24nKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1BhcnNlIFRyYW5zYWN0aW9uczogJywgKCkgPT4ge1xuICAgIGNvbnN0IHRyYW5zZmVySW5wdXRzUmVzcG9uc2UgPSBbXG4gICAgICB7XG4gICAgICAgIGFkZHJlc3M6IHRlc3REYXRhLnJlY2lwaWVudHNbMF0uYWRkcmVzcyxcbiAgICAgICAgYW1vdW50OiBuZXcgQmlnTnVtYmVyKHRlc3REYXRhLkFNT1VOVCkucGx1cyh0ZXN0RGF0YS5BTU9VTlQpLnBsdXModGVzdERhdGEuZ2FzRGF0YS5idWRnZXQpLnRvRml4ZWQoKSxcbiAgICAgIH0sXG4gICAgXTtcblxuICAgIGNvbnN0IHRyYW5zZmVyT3V0cHV0c1Jlc3BvbnNlID0gW1xuICAgICAge1xuICAgICAgICBhZGRyZXNzOiB0ZXN0RGF0YS5yZWNpcGllbnRzWzBdLmFkZHJlc3MsXG4gICAgICAgIGFtb3VudDogdGVzdERhdGEucmVjaXBpZW50c1swXS5hbW91bnQsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBhZGRyZXNzOiB0ZXN0RGF0YS5yZWNpcGllbnRzWzFdLmFkZHJlc3MsXG4gICAgICAgIGFtb3VudDogdGVzdERhdGEucmVjaXBpZW50c1sxXS5hbW91bnQsXG4gICAgICB9LFxuICAgIF07XG5cbiAgICBpdCgnc2hvdWxkIHBhcnNlIGEgdHJhbnNmZXIgdHJhbnNhY3Rpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBwYXJzZWRUcmFuc2FjdGlvbiA9IGF3YWl0IGJhc2Vjb2luLnBhcnNlVHJhbnNhY3Rpb24oe1xuICAgICAgICB0eEhleDogQnVmZmVyLmZyb20odGVzdERhdGEuVFJBTlNGRVIsICdiYXNlNjQnKS50b1N0cmluZygnaGV4JyksXG4gICAgICB9KTtcblxuICAgICAgcGFyc2VkVHJhbnNhY3Rpb24uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGlucHV0czogdHJhbnNmZXJJbnB1dHNSZXNwb25zZSxcbiAgICAgICAgb3V0cHV0czogdHJhbnNmZXJPdXRwdXRzUmVzcG9uc2UsXG4gICAgICAgIGZlZTogbmV3IEJpZ051bWJlcigyMDAwMDAwMCksXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCB0byBwYXJzZSBhIHRyYW5zZmVyIHRyYW5zYWN0aW9uIHdoZW4gZXhwbGFpblRyYW5zYWN0aW9uIHJlc3BvbnNlIGlzIHVuZGVmaW5lZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHN0dWIgPSBzaW5vbi5zdHViKFN1aS5wcm90b3R5cGUsICdleHBsYWluVHJhbnNhY3Rpb24nKTtcbiAgICAgIHN0dWIucmVzb2x2ZXModW5kZWZpbmVkKTtcbiAgICAgIGF3YWl0IGJhc2Vjb2luLnBhcnNlVHJhbnNhY3Rpb24oeyB0eEhleDogdGVzdERhdGEuVFJBTlNGRVIgfSkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgnSW52YWxpZCB0cmFuc2FjdGlvbicpO1xuICAgICAgc3R1Yi5yZXN0b3JlKCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdBZGRyZXNzIFZhbGlkYXRpb24nLCAoKSA9PiB7XG4gICAgbGV0IGtleWNoYWlucztcbiAgICBsZXQgY29tbW9uS2V5Y2hhaW47XG5cbiAgICBiZWZvcmUoZnVuY3Rpb24gKCkge1xuICAgICAgY29tbW9uS2V5Y2hhaW4gPVxuICAgICAgICAnMTliZGZlMmE0YjQ5OGEwNTUxMTM4MTIzNWE4ODkyZDU0MjY3ODA3YzRhM2Y2NTRlMzEwYjkzOGI4YjQyNGZmNGFkZWRiZTkyZjRjMTQ2ZGU2NDFjNjc1MDhhOTYxMzI0Yzg1MDRjZGY4ZTBjMGFjYmI2OGQ2MTA0Y2NjY2Q3ODEnO1xuICAgICAga2V5Y2hhaW5zID0gW1xuICAgICAgICB7XG4gICAgICAgICAgaWQ6ICc2NDI0YzM1M2VhZjc4ZDAwMDc2NmU5NTk0OTg2ODQ2OCcsXG4gICAgICAgICAgc291cmNlOiAndXNlcicsXG4gICAgICAgICAgdHlwZTogJ3RzcycsXG4gICAgICAgICAgY29tbW9uS2V5Y2hhaW46XG4gICAgICAgICAgICAnMTliZGZlMmE0YjQ5OGEwNTUxMTM4MTIzNWE4ODkyZDU0MjY3ODA3YzRhM2Y2NTRlMzEwYjkzOGI4YjQyNGZmNGFkZWRiZTkyZjRjMTQ2ZGU2NDFjNjc1MDhhOTYxMzI0Yzg1MDRjZGY4ZTBjMGFjYmI2OGQ2MTA0Y2NjY2Q3ODEnLFxuICAgICAgICAgIGVuY3J5cHRlZFBydjpcbiAgICAgICAgICAgICd7XCJpdlwiOlwiY1pkNWk3TDRSeHR3ckFMVzJySzdVQT09XCIsXCJ2XCI6MSxcIml0ZXJcIjoxMDAwMCxcImtzXCI6MjU2LFwidHNcIjo2NCxcIm1vZGVcIjpcImNjbVwiLFwiYWRhdGFcIjpcIlwiLFwiY2lwaGVyXCI6XCJhZXNcIixcInNhbHRcIjpcIjV6Z29IMUJkM0Z3PVwiLFwiY3RcIjpcIjl2VmxuWEZSdHJNOUZWRW8rZDJjaGJHSGxNOWxGWmVtdWVCdUFzM0JJa1BvMzNGbzdqend3Tksva0lXa0V5ZytObUVCZDVJYXFBUzE1N252dnZ3enpzbU1XbFFkVXo5cWJtWE52M3BnOTg3Y1hGUjA4ZXhTKzR1aHdQMVlOT2pKVFJ2Uk5jTzlacUhiNDZkNGZteUoveUM5L3N1c0NnZTdyL0VzYmFONUMzYWZ2MWR6eWJ1cTkxMkZ3YVFFbFpMWVlwNUJJQ3VkRk9NWjlrMFVETWZLTS9QTURrSDdXZXhvR0hyOUdLcS9iZ0NIMkIzOVRaWnlIS1U2VXk0N2xYZXAyczZoMERyTXdIT3JubWlMM0Raak9qODhZbnZwaGx6eHVvNGVPbEQyVUhpYTIrbnZJYUlTWXMyOVByMERBdlJFdXRjaHZjQnBFeGoxa1dXUHY3aFFZcnY4RjBOQWRhdHNiV2wzdyt4S3lmaU1LbzFVU2xyd3lKdml5cEd0UXRYT0p5dzBYUE4wcnYyK0w1bFc4QmJqcHpIZllZTjEzZkpUZWRsR1RGaGhrelZ0YmJQQUtFMDJreDd6Q0pjallhaWV4ZFNUc3JETFNjWU5UOS9KaGR0MjdLcHNvb2Vod1ZvaExmU0t6NHZiRmZSdTJNUFp3My8rYy9oZmlKTmd0ejZlc1dibnhHcmNFOFUySXdQWUNhSytHaGs0RGNxV05Jbmk1OVJJNUI1a0FzUU9Ub0lJNDBxUE41MTB1VGd4QlNQTzdxN01IZ2t4ZGQ0Q3FCcStvanI5ajBQN29hbzhFNVkrQ0JESnJvakRvQ2gxb0NDRFc5dm8yZFhsVmNEOFNJYnc3VS85QWZ2RWJBNHh5RS81bWQxTTdDSXdMbldzMlludjBZdGFLb3FoZFM5eDZGbUhsTURoTi9ES0hpbnJ3bW93dHJUVDgyZk9rcE81ZzlzYVNtZ1U3UXkzZ0x0OHQrVndkRXllRmVRVUtSU3ljaThxZ3FYUWFaSWc0K2FYZ2FTT25sQ0ZNdG1COGVrWXhFaFRZNXV6UmZyTmdTNHMxUWVxRkJwTnRVRitZZGkyOTdwYlZYbkpvWEFOK1NWV2Q4MEdDeCt5STJkcFZDODlrM3JPV0s5V2V5cWxuenVMSldwMlJJT0I5Y2RXOEdGdi9mTitRQUpwWWVWeE9FNCtuWkRzS25zajhuS2NnOXQ0RGx4MUc2Z0xNMS9WcTlZeE5MYnV6dVJDMGFzVVl2ZE1ub012c3ptcG0rK1R4bmRZaXNnTllzY3BaU296N3d2Y2F6Sk5FUGZoUFZqRWtkNnRVVXVONEdNMzVIMERtS0NVUU5UK2E2QjZobUhsVFp2anhpeUdBZzViWTU5aGRqdkorMjJRZHVhemxFRUM2TEkzSHJBN3VLMFRwcGxXelMxdENJRnZUTVVoajY1REVabU5KMitaWTliUTR2c01mK0RSUjNPT0c0dCtETWxOZmpPZDN6TnYzUW9ZOTVCamZXcHJ5RndQekRxN2JDUDY3SkRzb2o3ajJUWTVGUlNyUmtENzdIMEV3bHV4MmNXZmpSVHdjTUhjZFF4eHVWME9QMGFOakdEanliRk5cIn0nLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgaWQ6ICc2NDI0YzM1M2VhZjc4ZDAwMDc2NmU5NjEzN2Q0NDA0YicsXG4gICAgICAgICAgc291cmNlOiAnYmFja3VwJyxcbiAgICAgICAgICB0eXBlOiAndHNzJyxcbiAgICAgICAgICBjb21tb25LZXljaGFpbjpcbiAgICAgICAgICAgICcxOWJkZmUyYTRiNDk4YTA1NTExMzgxMjM1YTg4OTJkNTQyNjc4MDdjNGEzZjY1NGUzMTBiOTM4YjhiNDI0ZmY0YWRlZGJlOTJmNGMxNDZkZTY0MWM2NzUwOGE5NjEzMjRjODUwNGNkZjhlMGMwYWNiYjY4ZDYxMDRjY2NjZDc4MScsXG4gICAgICAgICAgZW5jcnlwdGVkUHJ2OlxuICAgICAgICAgICAgJ3tcIml2XCI6XCJ2aTBkUGVmL1J4N2tHL3BSeVNRaTZRPT1cIixcInZcIjoxLFwiaXRlclwiOjEwMDAwLFwia3NcIjoyNTYsXCJ0c1wiOjY0LFwibW9kZVwiOlwiY2NtXCIsXCJhZGF0YVwiOlwiXCIsXCJjaXBoZXJcIjpcImFlc1wiLFwic2FsdFwiOlwiOWVmaFFzaUV2VnM9XCIsXCJjdFwiOlwiR3c2YXR2ZjZneEt6c2p0bDN4c2VpcE8zckF4cDFtQXo3WXUxaWhGc2k1L2xmMnZNWmVnQXBnWngrcHlJTEZTOUtLTEhiTkYzVTZXZ1NZZHJyMnQ0dnpkTHNYa0gxV0l4ZkhTK2NkMkM1TjU5eUFEWkRuUEpCVDZwdi9JUnZhWWVsUDBDazNuSVlRMmhTTW04b3ArVk9XQy9TekhlaDdzbFlEcXdFSFRHYW4wV2lnZnZrMXlSZDdDQ0pUYUVBb21uYy80ZUZpMk5ZM1gzZ3QvM29weTlJQWdrbm53VUZvaG45NkVXcEVRMEY2cGJ6SC9aOFZGNmdGK0RVY3JyQnlBeEV4VVBuSFFaaUZrM1lIVS92VlY0RnhCVS9tVkFFOHhCc0JuNXVsNWU1U1VNUGZjN1RCdUpXdjRCQnlUTmc5eERTaEYvOTFZeDJuYmZVbTVkOVFtTThscEtnenpRdmNLOFBPQVBrODdnUkN1S25zR2g1dk5TMFVwcGtIYytvY2Z6UlFsR0E2anplN1F5eVFPMHJNajVMeThrV2p3azJ2SVN2S1lIWVMxTlI3VlU1NDlVSVhvN05YamF0dW5LU2MzK0lyZW9SVUhJc2hpYUxnNmhsK3B4Q0N1YzBxUTQzVjBtZElmQ2pUTjhna0dXTE5rOFI3dEFHUHo5anlhcFFQY1BFR0hnRXowQVRJaTZ5TU5XQ3NpYlMyZUxpRTF1VkVKT05vTTRsazZGUGwzUTJDSGJXMk1lRWJxalk4aGJhdzE4bU5iMnhTQkgvRndwaWlhbCtUdmkyaW1xZ25DTzRacE85YmxsS2Z0WlBjUXkwc3ROK2VHQmxiNXVmeWZsS2tEU2lDaEhZcm9HakVwbWlGaWNkZGU0OGNKc3pGNTJ1S05uZjFxNjdmQTkvUzJGQUhRYWIzRVhvanhIMkdiaytra1YyaC9UWUtGRlpTV0Mzdmk0ZThtTyt2ak1VY1IwQWRzZ1BGeUVJejBTQ0d1YmEzQ25UTE5kRXVad3NhdUFlSGt4MnZVVG5SZ0pQVmdOZWV1WG1zVkc3NlN5MmdnSkh1YWxzMEhqOFUyWGRhMHFPMVJ1RmZvQ1dmc3M5d242SEdSd1BQa2hTQi84b05ndUFxbVJWR0trZDhad3QzSXZyVGQ5ZmswL3JGRkRKS0d6N1d5TkhrWWdVbU5pR2NJdEQxMnYwang3Rlo1MkVKemwzQXYxUnlKVVFLMTgrOEVZUGgzU0dpVTlkdDdWWDBhRjB1bzZKb3VLaE9lbGRVdk1QK0F1Z1F6OGZVY2x3VFFzYmJvVmcyN1l4bzBEeUFUVndUaFc1YTU2UjZRZjVaaVFKbHVGdXpzNXk5OHJxMFM1cTA0NmxFNm8zdlZtSnBFZHdqZVNDSm9FVDVDTDRuVGdrWHlXdmhtNGVCOHUvZTY2bDNvMHFiYVN4OHE5WVltVDlFcFJjbDVUUDRUaExCS0VUWWR6VnZnNGV4alFmZWt0TWF0azVFeVVwRUloWlBYaDV2WHBKWmVzZGZPOUxKOHpUYUhCc0JqRFBVN2NkTmdRTWJlYnBhdGFSaThBMGVsMi9JSlhsK0Urb2xnQXo1ekM0aTJPMVE9PVwifScsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogJzY0MjRjMzUzZWFmNzhkMDAwNzY2ZTk1MTBiMTI1ZmJhJyxcbiAgICAgICAgICBzb3VyY2U6ICdiaXRnbycsXG4gICAgICAgICAgdHlwZTogJ3RzcycsXG4gICAgICAgICAgY29tbW9uS2V5Y2hhaW46XG4gICAgICAgICAgICAnMTliZGZlMmE0YjQ5OGEwNTUxMTM4MTIzNWE4ODkyZDU0MjY3ODA3YzRhM2Y2NTRlMzEwYjkzOGI4YjQyNGZmNGFkZWRiZTkyZjRjMTQ2ZGU2NDFjNjc1MDhhOTYxMzI0Yzg1MDRjZGY4ZTBjMGFjYmI2OGQ2MTA0Y2NjY2Q3ODEnLFxuICAgICAgICAgIHZlcmlmaWVkVnNzUHJvb2Y6IHRydWUsXG4gICAgICAgICAgaXNCaXRHbzogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgIF07XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiB0cnVlIHdoZW4gdmFsaWRhdGluZyBhIHdlbGwgZm9ybWF0dGVkIGFkZHJlc3MnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBhZGRyZXNzID0gJ2Y5NDFhZTNjYmU1NjQ1ZGNjYzE1ZGE4MzQ2YjUzM2Y3ZjkxZjIwMjA4OWE1NTIxNjUzYzA2MmIyZmYxMGIzMDQnO1xuICAgICAgYmFzZWNvaW4uaXNWYWxpZEFkZHJlc3MoYWRkcmVzcykuc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdHJ1ZSB3aGVuIHZhbGlkYXRpbmcgYSB3ZWxsIGZvcm1hdHRlZCBhZGRyZXNzIHByZWZpeGVkIHdpdGggMHgnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBhZGRyZXNzID0gJzB4Zjk0MWFlM2NiZTU2NDVkY2NjMTVkYTgzNDZiNTMzZjdmOTFmMjAyMDg5YTU1MjE2NTNjMDYyYjJmZjEwYjMwNCc7XG4gICAgICBiYXNlY29pbi5pc1ZhbGlkQWRkcmVzcyhhZGRyZXNzKS5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBmYWxzZSB3aGVuIHZhbGlkYXRpbmcgYW4gb2xkIGFkZHJlc3MnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBhZGRyZXNzID0gJzB4Mjk1OWJmYzNmZGI3ZGMyM2ZlZDhkZWJhMmZhZmI3MGYzZTYwNmE1OSc7XG4gICAgICBiYXNlY29pbi5pc1ZhbGlkQWRkcmVzcyhhZGRyZXNzKS5zaG91bGQuZXF1YWwoZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZmFsc2Ugd2hlbiB2YWxpZGF0aW5nIGFuIGluY29ycmVjdGx5IGZvcm1hdHRlZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGFkZHJlc3MgPSAnd3JvbmdhZGRyZXNzJztcbiAgICAgIGJhc2Vjb2luLmlzVmFsaWRBZGRyZXNzKGFkZHJlc3MpLnNob3VsZC5lcXVhbChmYWxzZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiB0cnVlIGZvciBpc1dhbGxldEFkZHJlc3Mgd2l0aCB2YWxpZCBhZGRyZXNzIGZvciBpbmRleCA0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgbmV3QWRkcmVzcyA9ICcweDhiM2M3ODA3NzMwZDc1NzkyZGQ2YzQ5NzMyY2Y5ZjAxNGQ2OTg0YTljNzdkMzg2YmRiMTA3MmE5ZTUzN2Q4ZDgnO1xuICAgICAgY29uc3QgaW5kZXggPSA0O1xuXG4gICAgICBjb25zdCBwYXJhbXMgPSB7IGNvbW1vbktleWNoYWluLCBhZGRyZXNzOiBuZXdBZGRyZXNzLCBpbmRleCwga2V5Y2hhaW5zIH07XG4gICAgICAoYXdhaXQgYmFzZWNvaW4uaXNXYWxsZXRBZGRyZXNzKHBhcmFtcykpLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgZXJyb3IgZm9yIGlzV2FsbGV0QWRkcmVzcyB3aGVuIGtleWNoYWlucyBpcyBtaXNzaW5nJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYWRkcmVzcyA9ICcweDI5NTliZmMzZmRiN2RjMjNmZWQ4ZGViYTJmYWZiNzBmM2U2MDZhNTknO1xuICAgICAgY29uc3QgaW5kZXggPSAwO1xuXG4gICAgICBjb25zdCBwYXJhbXMgPSB7IGNvbW1vbktleWNoYWluLCBhZGRyZXNzLCBpbmRleCB9O1xuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoYXN5bmMgKCkgPT4gYmFzZWNvaW4uaXNXYWxsZXRBZGRyZXNzKHBhcmFtcykpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciBmb3IgaXNXYWxsZXRBZGRyZXNzIHdoZW4gbmV3IGFkZHJlc3MgaXMgaW52YWxpZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHdyb25nQWRkcmVzcyA9ICdiYWRBZGRyZXNzJztcbiAgICAgIGNvbnN0IGluZGV4ID0gMDtcblxuICAgICAgY29uc3QgcGFyYW1zID0geyBjb21tb25LZXljaGFpbiwgYWRkcmVzczogd3JvbmdBZGRyZXNzLCBpbmRleCB9O1xuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoYXN5bmMgKCkgPT4gYmFzZWNvaW4uaXNXYWxsZXRBZGRyZXNzKHBhcmFtcyksIHtcbiAgICAgICAgbWVzc2FnZTogYGludmFsaWQgYWRkcmVzczogJHt3cm9uZ0FkZHJlc3N9YCxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnUmVjb3ZlciBUcmFuc2FjdGlvbnM6JywgKCkgPT4ge1xuICAgIGNvbnN0IHNhbmRCb3ggPSBzaW5vbi5jcmVhdGVTYW5kYm94KCk7XG4gICAgY29uc3Qgc2VuZGVyQWRkcmVzczAgPSAnMHg5MWYyNWUyMzdiODNhMDBhNjI3MjRmZGM0YTgxZTQzZjQ5NGRjNmI0MWExMjQxNDkyODI2ZDM2ZTRkMTMxZGEzJztcbiAgICBjb25zdCByZWNvdmVyeURlc3RpbmF0aW9uID0gJzB4MDBlNGVhYTZhMjkxZmUwMjkxODQ1MmU2NDViNTY1M2NkMjYwYTVmYzBmYjM1ZjYxOTNkNTgwOTE2YWE5ZTM4OSc7XG4gICAgY29uc3Qgd2FsbGV0UGFzc3BocmFzZSA9ICdwJFN3PFJqdkFnZntuWUFZSTJ4TSc7XG4gICAgbGV0IGdldEJhbGFuY2VTdHViOiBzaW5vbi5TaW5vblN0dWI7XG4gICAgbGV0IGdldElucHV0Q29pbnNTdHViOiBzaW5vbi5TaW5vblN0dWI7XG4gICAgbGV0IGdldEZlZUVzdGltYXRlU3R1Yjogc2lub24uU2lub25TdHViO1xuXG4gICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICBnZXRCYWxhbmNlU3R1YiA9IHNhbmRCb3guc3R1YihTdWkucHJvdG90eXBlLCAnZ2V0QmFsYW5jZScgYXMga2V5b2YgU3VpKTtcbiAgICAgIGdldEJhbGFuY2VTdHViXG4gICAgICAgIC53aXRoQXJncyhzZW5kZXJBZGRyZXNzMClcbiAgICAgICAgLnJlc29sdmVzKHsgdG90YWxCYWxhbmNlOiAnMTkwMDAwMDAwMCcsIGNvaW5PYmplY3RCYWxhbmNlOiAnMTkwMDAwMDAwMCcsIGZ1bmRzSW5BZGRyZXNzQmFsYW5jZTogJzAnIH0pO1xuXG4gICAgICBnZXRJbnB1dENvaW5zU3R1YiA9IHNhbmRCb3guc3R1YihTdWkucHJvdG90eXBlLCAnZ2V0SW5wdXRDb2lucycgYXMga2V5b2YgU3VpKTtcbiAgICAgIGdldElucHV0Q29pbnNTdHViLndpdGhBcmdzKHNlbmRlckFkZHJlc3MwKS5yZXNvbHZlcyhbXG4gICAgICAgIHtcbiAgICAgICAgICBjb2luVHlwZTogJzB4Mjo6c3VpOjpTVUknLFxuICAgICAgICAgIG9iamVjdElkOiAnMHhjMDVjNzY1ZTI2ZTZhZTg0Yzc4ZmEyNDVmMzhhMjNmYjIwNDA2YTVjZjNmNjFiNTdiZDMyM2EwZGY5ZDk4MDAzJyxcbiAgICAgICAgICB2ZXJzaW9uOiAnMTk1JyxcbiAgICAgICAgICBkaWdlc3Q6ICc3QkpMYjMyTEtON3d0NXV2NHhnWFc0QWJGS29NTmNQRTc2bzQxVFFFdlVaYicsXG4gICAgICAgICAgYmFsYW5jZTogbmV3IEJpZ051bWJlcignMTkwMDAwMDAwMCcpLFxuICAgICAgICB9LFxuICAgICAgXSk7XG5cbiAgICAgIGdldEZlZUVzdGltYXRlU3R1YiA9IHNhbmRCb3guc3R1YihTdWkucHJvdG90eXBlLCAnZ2V0RmVlRXN0aW1hdGUnIGFzIGtleW9mIFN1aSk7XG4gICAgICBnZXRGZWVFc3RpbWF0ZVN0dWJcbiAgICAgICAgLndpdGhBcmdzKFxuICAgICAgICAgICdBQUFDQUFnQTBrbHJBQUFBQUFBZ0FPVHFwcUtSL2dLUmhGTG1SYlZsUE5KZ3Bmd1BzMTloazlXQWtXcXA0NGtDQWdBQkFRQUFBUUVDQUFBQkFRQ1I4bDRqZTRPZ0NtSnlUOXhLZ2VRL1NVM0d0Qm9TUVVrb0p0TnVUUk1kb3dIQVhIWmVKdWF1aE1lUG9rWHppaVA3SUVCcVhQUDJHMWU5TWpvTitkbUFBOE1BQUFBQUFBQUFJRnZKaUpCZEVBaGkxNGN4Y1NyL0hVSWhCWk1iTE1kNHJjelVUQ01JYjNVbWtmSmVJM3VEb0FwaWNrL2NTb0hrUDBsTnhyUWFFa0ZKS0NiVGJrMFRIYVBvQXdBQUFBQUFBQURoOVFVQUFBQUFBQT09J1xuICAgICAgICApXG4gICAgICAgIC5yZXNvbHZlcyhuZXcgQmlnTnVtYmVyKDE5OTc4ODApKTtcbiAgICB9KTtcblxuICAgIGFmdGVyRWFjaCgoKSA9PiB7XG4gICAgICBzYW5kQm94LnJlc3RvcmUoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVjb3ZlciBhIHR4biBmb3Igbm9uLWJpdGdvIHJlY292ZXJ5JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgYmFzZWNvaW4ucmVjb3Zlcih7XG4gICAgICAgIHVzZXJLZXk6IGtleXMudXNlcktleSxcbiAgICAgICAgYmFja3VwS2V5OiBrZXlzLmJhY2t1cEtleSxcbiAgICAgICAgYml0Z29LZXk6IGtleXMuYml0Z29LZXksXG4gICAgICAgIHJlY292ZXJ5RGVzdGluYXRpb24sXG4gICAgICAgIHdhbGxldFBhc3NwaHJhc2UsXG4gICAgICB9KTtcbiAgICAgIHJlcy5zaG91bGQubm90LmJlLmVtcHR5KCk7XG4gICAgICByZXMuc2hvdWxkLmhhc093blByb3BlcnR5KCd0cmFuc2FjdGlvbnMnKTtcbiAgICAgIGNvbnN0IHR4ID0gcmVzLnRyYW5zYWN0aW9uc1swXTtcbiAgICAgIHR4LnNjYW5JbmRleC5zaG91bGQuZXF1YWwoMCk7XG4gICAgICB0eC5yZWNvdmVyeUFtb3VudC5zaG91bGQuZXF1YWwoJzE4OTc4MDIzMzInKTtcbiAgICAgIHR4LnNlcmlhbGl6ZWRUeC5zaG91bGQuZXF1YWwoXG4gICAgICAgICdBQUFDQUFoY0toNXhBQUFBQUFBZ0FPVHFwcUtSL2dLUmhGTG1SYlZsUE5KZ3Bmd1BzMTloazlXQWtXcXA0NGtDQWdBQkFRQUFBUUVDQUFBQkFRQ1I4bDRqZTRPZ0NtSnlUOXhLZ2VRL1NVM0d0Qm9TUVVrb0p0TnVUUk1kb3dIQVhIWmVKdWF1aE1lUG9rWHppaVA3SUVCcVhQUDJHMWU5TWpvTitkbUFBOE1BQUFBQUFBQUFJRnZKaUpCZEVBaGkxNGN4Y1NyL0hVSWhCWk1iTE1kNHJjelVUQ01JYjNVbWtmSmVJM3VEb0FwaWNrL2NTb0hrUDBsTnhyUWFFa0ZKS0NiVGJrMFRIYVBvQXdBQUFBQUFBS1NJSVFBQUFBQUFBQT09J1xuICAgICAgKTtcblxuICAgICAgY29uc3QgTm9uQml0R29UeG5EZXNlcmlhbGl6ZSA9IG5ldyBUcmFuc2ZlclRyYW5zYWN0aW9uKGJhc2Vjb2luKTtcbiAgICAgIE5vbkJpdEdvVHhuRGVzZXJpYWxpemUuZnJvbVJhd1RyYW5zYWN0aW9uKHR4LnNlcmlhbGl6ZWRUeCk7XG4gICAgICBjb25zdCBOb25CaXRHb1R4bkpzb24gPSBOb25CaXRHb1R4bkRlc2VyaWFsaXplLnRvSnNvbigpO1xuXG4gICAgICBzaG91bGQuZXF1YWwoTm9uQml0R29UeG5Kc29uLmlkLCAnRkRDQlVOcUxVQVc0cUJUbkZqVENQWmF6TDhWblJCUDJnUzNHbUVud3RFY2cnKTtcbiAgICAgIHNob3VsZC5lcXVhbChOb25CaXRHb1R4bkpzb24uc2VuZGVyLCBzZW5kZXJBZGRyZXNzMCk7XG4gICAgICBzYW5kQm94LmFzc2VydC5jYWxsQ291bnQoYmFzZWNvaW4uZ2V0QmFsYW5jZSwgMSk7XG4gICAgICBzYW5kQm94LmFzc2VydC5jYWxsQ291bnQoYmFzZWNvaW4uZ2V0SW5wdXRDb2lucywgMSk7XG4gICAgICBzYW5kQm94LmFzc2VydC5jYWxsQ291bnQoYmFzZWNvaW4uZ2V0RmVlRXN0aW1hdGUsIDEpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWNvdmVyIGEgdHhuIGZvciB1bnNpZ25lZCBzd2VlcCByZWNvdmVyeScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGJhc2Vjb2luLnJlY292ZXIoe1xuICAgICAgICBiaXRnb0tleToga2V5cy5iaXRnb0tleSxcbiAgICAgICAgcmVjb3ZlcnlEZXN0aW5hdGlvbixcbiAgICAgIH0pO1xuXG4gICAgICByZXMuc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIHR4UmVxdWVzdHM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0cmFuc2FjdGlvbnM6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHVuc2lnbmVkVHg6IHtcbiAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWRUeDpcbiAgICAgICAgICAgICAgICAgICAgJzAwMDAwMjAwMDg1YzJhMWU3MTAwMDAwMDAwMDAyMDAwZTRlYWE2YTI5MWZlMDI5MTg0NTJlNjQ1YjU2NTNjZDI2MGE1ZmMwZmIzNWY2MTkzZDU4MDkxNmFhOWUzODkwMjAyMDAwMTAxMDAwMDAxMDEwMjAwMDAwMTAxMDA5MWYyNWUyMzdiODNhMDBhNjI3MjRmZGM0YTgxZTQzZjQ5NGRjNmI0MWExMjQxNDkyODI2ZDM2ZTRkMTMxZGEzMDFjMDVjNzY1ZTI2ZTZhZTg0Yzc4ZmEyNDVmMzhhMjNmYjIwNDA2YTVjZjNmNjFiNTdiZDMyM2EwZGY5ZDk4MDAzYzMwMDAwMDAwMDAwMDAwMDIwNWJjOTg4OTA1ZDEwMDg2MmQ3ODczMTcxMmFmZjFkNDIyMTA1OTMxYjJjYzc3OGFkY2NkNDRjMjMwODZmNzUyNjkxZjI1ZTIzN2I4M2EwMGE2MjcyNGZkYzRhODFlNDNmNDk0ZGM2YjQxYTEyNDE0OTI4MjZkMzZlNGQxMzFkYTNlODAzMDAwMDAwMDAwMDAwYTQ4ODIxMDAwMDAwMDAwMDAwJyxcbiAgICAgICAgICAgICAgICAgIHNjYW5JbmRleDogMCxcbiAgICAgICAgICAgICAgICAgIGNvaW46ICd0c3VpJyxcbiAgICAgICAgICAgICAgICAgIHNpZ25hYmxlSGV4OiAnODczNzQ4YTMxZTc2NmY1ZjhmMDA3N2Q4ZDAwMDM1NDhmYWU0ZjRjMTM0NDA2N2E3YzM3OTljZmE3MzgwOGZiNycsXG4gICAgICAgICAgICAgICAgICBkZXJpdmF0aW9uUGF0aDogJ20vMCcsXG4gICAgICAgICAgICAgICAgICBwYXJzZWRUeDoge1xuICAgICAgICAgICAgICAgICAgICBpbnB1dHM6IFtcbiAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzOiAnMHg5MWYyNWUyMzdiODNhMDBhNjI3MjRmZGM0YTgxZTQzZjQ5NGRjNmI0MWExMjQxNDkyODI2ZDM2ZTRkMTMxZGEzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlU3RyaW5nOiAnMTg5NzgwMjMzMicsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbmV3IEJpZ051bWJlcigxODk3ODAyMzMyKSxcbiAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBvdXRwdXRzOiBbXG4gICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzczogJzB4MDBlNGVhYTZhMjkxZmUwMjkxODQ1MmU2NDViNTY1M2NkMjYwYTVmYzBmYjM1ZjYxOTNkNTgwOTE2YWE5ZTM4OScsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVN0cmluZzogJzE4OTc4MDIzMzInLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29pbk5hbWU6ICd0c3VpJyxcbiAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBzcGVuZEFtb3VudDogJzE4OTc4MDIzMzInLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnVHJhbnNmZXInLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIGZlZUluZm86IHsgZmVlOiAyMTk3NjY4LCBmZWVTdHJpbmc6ICcyMTk3NjY4JyB9LFxuICAgICAgICAgICAgICAgICAgY29pblNwZWNpZmljOiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbW1vbktleWNoYWluOlxuICAgICAgICAgICAgICAgICAgICAgICczYjg5ZWVjOWQyZDJmM2IwNDllY2RhMmU3YjVmNDc4MjdmNzkyN2ZlNjYxOGQ2ZThiMTNmNjRlN2M5NWY0YjAwYjk1NzdhYjAxMzk1ZWNmOGVlYjgwNGI1OTBjZWRhZTE0ZmY1ZmQzOTQ3YmYzYjdhOTViOTMyN2M0OWUyN2M1NCcsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc2lnbmF0dXJlU2hhcmVzOiBbXSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB3YWxsZXRDb2luOiAndHN1aScsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB1bnNpZ25lZFN3ZWVwVHhuRGVzZXJpYWxpemUgPSBuZXcgVHJhbnNmZXJUcmFuc2FjdGlvbihiYXNlY29pbik7XG4gICAgICBjb25zdCBzZXJpYWxpemVkVHhIZXggPSByZXMudHhSZXF1ZXN0c1swXS50cmFuc2FjdGlvbnNbMF0udW5zaWduZWRUeC5zZXJpYWxpemVkVHg7XG4gICAgICBjb25zdCBzZXJpYWxpemVkVHhCYXNlNjQgPSBCdWZmZXIuZnJvbShzZXJpYWxpemVkVHhIZXgsICdoZXgnKS50b1N0cmluZygnYmFzZTY0Jyk7XG4gICAgICB1bnNpZ25lZFN3ZWVwVHhuRGVzZXJpYWxpemUuZnJvbVJhd1RyYW5zYWN0aW9uKHNlcmlhbGl6ZWRUeEJhc2U2NCk7XG4gICAgICBjb25zdCB1bnNpZ25lZFN3ZWVwVHhuSnNvbiA9IHVuc2lnbmVkU3dlZXBUeG5EZXNlcmlhbGl6ZS50b0pzb24oKTtcbiAgICAgIHNob3VsZC5lcXVhbCh1bnNpZ25lZFN3ZWVwVHhuSnNvbi5pZCwgJ0ZEQ0JVTnFMVUFXNHFCVG5GalRDUFphekw4Vm5SQlAyZ1MzR21Fbnd0RWNnJyk7XG4gICAgICBzaG91bGQuZXF1YWwodW5zaWduZWRTd2VlcFR4bkpzb24uc2VuZGVyLCBzZW5kZXJBZGRyZXNzMCk7XG5cbiAgICAgIHNhbmRCb3guYXNzZXJ0LmNhbGxDb3VudChiYXNlY29pbi5nZXRCYWxhbmNlLCAxKTtcbiAgICAgIHNhbmRCb3guYXNzZXJ0LmNhbGxDb3VudChiYXNlY29pbi5nZXRJbnB1dENvaW5zLCAxKTtcbiAgICAgIHNhbmRCb3guYXNzZXJ0LmNhbGxDb3VudChiYXNlY29pbi5nZXRGZWVFc3RpbWF0ZSwgMSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlY292ZXIgYSB0eG4gZm9yIHVuc2lnbmVkIHN3ZWVwIHJlY292ZXJ5IHdpdGggbXVsdGlwbGUgaW5wdXQgY29pbnMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBzZW5kZXJBZGRyZXNzID0gJzB4MDBlNGVhYTZhMjkxZmUwMjkxODQ1MmU2NDViNTY1M2NkMjYwYTVmYzBmYjM1ZjYxOTNkNTgwOTE2YWE5ZTM4OSc7XG4gICAgICBnZXRCYWxhbmNlU3R1YlxuICAgICAgICAud2l0aEFyZ3Moc2VuZGVyQWRkcmVzcylcbiAgICAgICAgLnJlc29sdmVzKHsgdG90YWxCYWxhbmNlOiAnMTc5ODAwMjEyMCcsIGNvaW5PYmplY3RCYWxhbmNlOiAnMTc5ODAwMjEyMCcsIGZ1bmRzSW5BZGRyZXNzQmFsYW5jZTogJzAnIH0pO1xuICAgICAgZ2V0SW5wdXRDb2luc1N0dWIud2l0aEFyZ3Moc2VuZGVyQWRkcmVzcykucmVzb2x2ZXMoW1xuICAgICAgICB7XG4gICAgICAgICAgY29pblR5cGU6ICcweDI6OnN1aTo6U1VJJyxcbiAgICAgICAgICBvYmplY3RJZDogJzB4NjBhZWZhZmZhMzVkYWEzMmExZTU2MWYyYmE5YzE4NzUzMDU3ZDJmZWI1MDJmMzI4MDRlNTczZWEyODc1YTM5YycsXG4gICAgICAgICAgdmVyc2lvbjogJzE5NScsXG4gICAgICAgICAgZGlnZXN0OiAnaktqZHV5OGdIREUyNDRaSldjUDNKWGZYUEtqcVk2N2F2TXFoekh3OThDTCcsXG4gICAgICAgICAgYmFsYW5jZTogbmV3IEJpZ051bWJlcignOTgwMDIxMjAnKSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGNvaW5UeXBlOiAnMHgyOjpzdWk6OlNVSScsXG4gICAgICAgICAgb2JqZWN0SWQ6ICcweDlhMzYzYzkxZDI5YjUwODMyYWI5ODA5NGI2YzE5MzM5NDEyODBmYzI5OGEyZWMyMzI3MzlmMTRjZTMxZTI1ODInLFxuICAgICAgICAgIHZlcnNpb246ICcxOTcnLFxuICAgICAgICAgIGRpZ2VzdDogJ0VMbmJnbVc3Y3JQWXIzQjlwV1ZxZmc5dUxlSnQ0M0tQb2ZrZmRSNkxXZnR1JyxcbiAgICAgICAgICBiYWxhbmNlOiBuZXcgQmlnTnVtYmVyKCcxNzAwMDAwMDAwJyksXG4gICAgICAgIH0sXG4gICAgICBdKTtcbiAgICAgIGdldEZlZUVzdGltYXRlU3R1YlxuICAgICAgICAud2l0aEFyZ3MoXG4gICAgICAgICAgJ0FBQUNBQWpJZERWbEFBQUFBQUFnTXRqbGZ1YlpIbFZZMmdaM0ZVd3ZDRmVWTkk0eGY1V3N5ZSt0NGJRUkw4d0NBZ0FCQVFBQUFRRUNBQUFCQVFBQTVPcW1vcEgrQXBHRVV1WkZ0V1U4MG1DbC9BK3pYMkdUMVlDUmFxbmppUUthTmp5UjBwdFFneXE1Z0pTMndaTTVRU2dQd3BpaTdDTW5PZkZNNHg0bGdzVUFBQUFBQUFBQUlNWTVoZlVGenVNVmFZMytMd21aVHZ5cFJTQUpSTE5Yb2NSWVI5eUthbFh5WUs3Ni82TmRxaktoNVdIeXVwd1lkVEJYMHY2MUF2TW9CT1Z6NmloMW81ekRBQUFBQUFBQUFDQUsxNVB0TzZnd1NOeDBiSGtzVkpPY045NkFZeWMrM1lWcEp6YVlNTWhIYlFEazZxYWlrZjRDa1lSUzVrVzFaVHpTWUtYOEQ3TmZZWlBWZ0pGcXFlT0o2QU1BQUFBQUFBQUE0ZlVGQUFBQUFBQT0nXG4gICAgICAgIClcbiAgICAgICAgLnJlc29sdmVzKG5ldyBCaWdOdW1iZXIoMTk5Nzg4MCkpO1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgYmFzZWNvaW4ucmVjb3Zlcih7XG4gICAgICAgIGJpdGdvS2V5OlxuICAgICAgICAgICc3ZDkxZjY5YzI4NWMwYjNiMGEwZDYzNzEwMjBmMTk0ZDQ1OTU2ZWU1NTYyODllNzg1NGY2ZDExNGUwNzgwNTcyMGVlYzY3M2M2YTJcXG43MmI3ZGE0MTM3ZGI3YjEyODlmMzhhZjRmNGI4MjRlZjBkZTY1YzVmNTNlM2U2NjYxNzYxNycsXG4gICAgICAgIHJlY292ZXJ5RGVzdGluYXRpb246ICcweDMyZDhlNTdlZTZkOTFlNTU1OGRhMDY3NzE1NGMyZjA4NTc5NTM0OGUzMTdmOTVhY2M5ZWZhZGUxYjQxMTJmY2MnLFxuICAgICAgfSk7XG5cbiAgICAgIHJlcy5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgdHhSZXF1ZXN0czogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRyYW5zYWN0aW9uczogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdW5zaWduZWRUeDoge1xuICAgICAgICAgICAgICAgICAgc2VyaWFsaXplZFR4OlxuICAgICAgICAgICAgICAgICAgICAnMDAwMDAyMDAwODI0Y2QwOTZiMDAwMDAwMDAwMDIwMzJkOGU1N2VlNmQ5MWU1NTU4ZGEwNjc3MTU0YzJmMDg1Nzk1MzQ4ZTMxN2Y5NWFjYzllZmFkZTFiNDExMmZjYzAyMDIwMDAxMDEwMDAwMDEwMTAyMDAwMDAxMDEwMDAwZTRlYWE2YTI5MWZlMDI5MTg0NTJlNjQ1YjU2NTNjZDI2MGE1ZmMwZmIzNWY2MTkzZDU4MDkxNmFhOWUzODkwMjlhMzYzYzkxZDI5YjUwODMyYWI5ODA5NGI2YzE5MzM5NDEyODBmYzI5OGEyZWMyMzI3MzlmMTRjZTMxZTI1ODJjNTAwMDAwMDAwMDAwMDAwMjBjNjM5ODVmNTA1Y2VlMzE1Njk4ZGZlMmYwOTk5NGVmY2E5NDUyMDA5NDRiMzU3YTFjNDU4NDdkYzhhNmE1NWYyNjBhZWZhZmZhMzVkYWEzMmExZTU2MWYyYmE5YzE4NzUzMDU3ZDJmZWI1MDJmMzI4MDRlNTczZWEyODc1YTM5Y2MzMDAwMDAwMDAwMDAwMDAyMDBhZDc5M2VkM2JhODMwNDhkYzc0NmM3OTJjNTQ5MzljMzdkZTgwNjMyNzNlZGQ4NTY5MjczNjk4MzBjODQ3NmQwMGU0ZWFhNmEyOTFmZTAyOTE4NDUyZTY0NWI1NjUzY2QyNjBhNWZjMGZiMzVmNjE5M2Q1ODA5MTZhYTllMzg5ZTgwMzAwMDAwMDAwMDAwMGE0ODgyMTAwMDAwMDAwMDAwMCcsXG4gICAgICAgICAgICAgICAgICBzY2FuSW5kZXg6IDAsXG4gICAgICAgICAgICAgICAgICBjb2luOiAndHN1aScsXG4gICAgICAgICAgICAgICAgICBzaWduYWJsZUhleDogJzNlZWMzOTVjY2FlZTdkNmEwYjlmYTU0ODhkZDAwYmZlYjg5ZGM0YmQzN2UzMTM5ZWJlYmI2MmMyZTYwYmMwMGQnLFxuICAgICAgICAgICAgICAgICAgZGVyaXZhdGlvblBhdGg6ICdtLzAnLFxuICAgICAgICAgICAgICAgICAgcGFyc2VkVHg6IHtcbiAgICAgICAgICAgICAgICAgICAgaW5wdXRzOiBbXG4gICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzczogJzB4MDBlNGVhYTZhMjkxZmUwMjkxODQ1MmU2NDViNTY1M2NkMjYwYTVmYzBmYjM1ZjYxOTNkNTgwOTE2YWE5ZTM4OScsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVN0cmluZzogJzE3OTU4MDQ0NTInLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG5ldyBCaWdOdW1iZXIoMTc5NTgwNDQ1MiksXG4gICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0czogW1xuICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3M6ICcweDMyZDhlNTdlZTZkOTFlNTU1OGRhMDY3NzE1NGMyZjA4NTc5NTM0OGUzMTdmOTVhY2M5ZWZhZGUxYjQxMTJmY2MnLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVTdHJpbmc6ICcxNzk1ODA0NDUyJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvaW5OYW1lOiAndHN1aScsXG4gICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgc3BlbmRBbW91bnQ6ICcxNzk1ODA0NDUyJyxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ1RyYW5zZmVyJyxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBmZWVJbmZvOiB7IGZlZTogMjE5NzY2OCwgZmVlU3RyaW5nOiAnMjE5NzY2OCcgfSxcbiAgICAgICAgICAgICAgICAgIGNvaW5TcGVjaWZpYzoge1xuICAgICAgICAgICAgICAgICAgICBjb21tb25LZXljaGFpbjpcbiAgICAgICAgICAgICAgICAgICAgICAnN2Q5MWY2OWMyODVjMGIzYjBhMGQ2MzcxMDIwZjE5NGQ0NTk1NmVlNTU2Mjg5ZTc4NTRmNmQxMTRlMDc4MDU3MjBlZWM2NzNjNmEyNzJiN2RhNDEzN2RiN2IxMjg5ZjM4YWY0ZjRiODI0ZWYwZGU2NWM1ZjUzZTNlNjY2MTc2MTcnLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHNpZ25hdHVyZVNoYXJlczogW10sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgd2FsbGV0Q29pbjogJ3RzdWknLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgdW5zaWduZWRTd2VlcFR4bkRlc2VyaWFsaXplID0gbmV3IFRyYW5zZmVyVHJhbnNhY3Rpb24oYmFzZWNvaW4pO1xuICAgICAgY29uc3Qgc2VyaWFsaXplZFR4SGV4ID0gcmVzLnR4UmVxdWVzdHNbMF0udHJhbnNhY3Rpb25zWzBdLnVuc2lnbmVkVHguc2VyaWFsaXplZFR4O1xuICAgICAgY29uc3Qgc2VyaWFsaXplZFR4QmFzZTY0ID0gQnVmZmVyLmZyb20oc2VyaWFsaXplZFR4SGV4LCAnaGV4JykudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuICAgICAgdW5zaWduZWRTd2VlcFR4bkRlc2VyaWFsaXplLmZyb21SYXdUcmFuc2FjdGlvbihzZXJpYWxpemVkVHhCYXNlNjQpO1xuICAgICAgY29uc3QgdW5zaWduZWRTd2VlcFR4bkpzb24gPSB1bnNpZ25lZFN3ZWVwVHhuRGVzZXJpYWxpemUudG9Kc29uKCk7XG4gICAgICBzaG91bGQuZXF1YWwodW5zaWduZWRTd2VlcFR4bkpzb24uaWQsICc3Snl4M0tVVlh4czFRMmkxUnFYdGo0aEZnVWdCb242UFVRQW92TDg0WTNlUCcpO1xuICAgICAgc2hvdWxkLmVxdWFsKHVuc2lnbmVkU3dlZXBUeG5Kc29uLnNlbmRlciwgc2VuZGVyQWRkcmVzcyk7XG5cbiAgICAgIHNhbmRCb3guYXNzZXJ0LmNhbGxDb3VudChiYXNlY29pbi5nZXRCYWxhbmNlLCAxKTtcbiAgICAgIHNhbmRCb3guYXNzZXJ0LmNhbGxDb3VudChiYXNlY29pbi5nZXRJbnB1dENvaW5zLCAxKTtcbiAgICAgIHNhbmRCb3guYXNzZXJ0LmNhbGxDb3VudChiYXNlY29pbi5nZXRGZWVFc3RpbWF0ZSwgMSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdSZWNvdmVyIFRva2VuIFRyYW5zYWN0aW9uczonLCAoKSA9PiB7XG4gICAgY29uc3Qgc2FuZEJveCA9IHNpbm9uLmNyZWF0ZVNhbmRib3goKTtcbiAgICBjb25zdCBjb2luVHlwZSA9ICcweDM2ZGJlZjg2NmExZDYyYmY3MzI4OTg5YTEwZmIyZjA3ZDc2OWY0ZWU1ODdjMGRlNGEwYTI1NmU1N2UwYTU4YTg6OmRlZXA6OkRFRVAnO1xuICAgIGNvbnN0IHNlbmRlckFkZHJlc3MwID0gJzB4OTFmMjVlMjM3YjgzYTAwYTYyNzI0ZmRjNGE4MWU0M2Y0OTRkYzZiNDFhMTI0MTQ5MjgyNmQzNmU0ZDEzMWRhMyc7XG4gICAgY29uc3Qgc2VuZGVyQWRkcmVzc0NvbGRXYWxsZXQgPSAnMHgwMTY0OTVkZGRhNzQ4YzExNmEyMTgyNDI4MzVkMzY0NzA5ZDZjNWVlNWM4YTFlZDY4NGM0ZWY0MzNkMzE0NDIxJztcbiAgICBjb25zdCByZWNvdmVyeURlc3RpbmF0aW9uID0gJzB4MDBlNGVhYTZhMjkxZmUwMjkxODQ1MmU2NDViNTY1M2NkMjYwYTVmYzBmYjM1ZjYxOTNkNTgwOTE2YWE5ZTM4OSc7XG4gICAgY29uc3Qgd2FsbGV0UGFzc3BocmFzZSA9ICdwJFN3PFJqdkFnZntuWUFZSTJ4TSc7XG4gICAgY29uc3QgdG9rZW5Db250cmFjdEFkZHJlc3MgPSAnMHgzNmRiZWY4NjZhMWQ2MmJmNzMyODk4OWExMGZiMmYwN2Q3NjlmNGVlNTg3YzBkZTRhMGEyNTZlNTdlMGE1OGE4JztcbiAgICBsZXQgZ2V0QmFsYW5jZVN0dWI6IHNpbm9uLlNpbm9uU3R1YjtcbiAgICBsZXQgZ2V0SW5wdXRDb2luc1N0dWI6IHNpbm9uLlNpbm9uU3R1YjtcbiAgICBsZXQgZ2V0RmVlRXN0aW1hdGVTdHViOiBzaW5vbi5TaW5vblN0dWI7XG5cbiAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgIGdldEJhbGFuY2VTdHViID0gc2FuZEJveC5zdHViKFN1aS5wcm90b3R5cGUsICdnZXRCYWxhbmNlJyBhcyBrZXlvZiBTdWkpO1xuICAgICAgZ2V0SW5wdXRDb2luc1N0dWIgPSBzYW5kQm94LnN0dWIoU3VpLnByb3RvdHlwZSwgJ2dldElucHV0Q29pbnMnIGFzIGtleW9mIFN1aSk7XG4gICAgICBnZXRGZWVFc3RpbWF0ZVN0dWIgPSBzYW5kQm94LnN0dWIoU3VpLnByb3RvdHlwZSwgJ2dldEZlZUVzdGltYXRlJyBhcyBrZXlvZiBTdWkpO1xuICAgIH0pO1xuXG4gICAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICAgIHNhbmRCb3gucmVzdG9yZSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWNvdmVyIGEgdG9rZW4gdHhuIGZvciBub24tYml0Z28gcmVjb3ZlcnknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBnZXRCYWxhbmNlU3R1YlxuICAgICAgICAud2l0aEFyZ3Moc2VuZGVyQWRkcmVzczApXG4gICAgICAgIC5yZXNvbHZlcyh7IHRvdGFsQmFsYW5jZTogJzE5MDAwMDAwMDAnLCBjb2luT2JqZWN0QmFsYW5jZTogJzE5MDAwMDAwMDAnLCBmdW5kc0luQWRkcmVzc0JhbGFuY2U6ICcwJyB9KVxuICAgICAgICAud2l0aEFyZ3Moc2VuZGVyQWRkcmVzczAsIGNvaW5UeXBlKVxuICAgICAgICAucmVzb2x2ZXMoeyB0b3RhbEJhbGFuY2U6ICcxMDAwJywgY29pbk9iamVjdEJhbGFuY2U6ICcxMDAwJywgZnVuZHNJbkFkZHJlc3NCYWxhbmNlOiAnMCcgfSk7XG4gICAgICBnZXRJbnB1dENvaW5zU3R1Yi53aXRoQXJncyhzZW5kZXJBZGRyZXNzMCwgY29pblR5cGUpLnJlc29sdmVzKFtcbiAgICAgICAge1xuICAgICAgICAgIGNvaW5UeXBlOiAnMHgzNmRiZWY4NjZhMWQ2MmJmNzMyODk4OWExMGZiMmYwN2Q3NjlmNGVlNTg3YzBkZTRhMGEyNTZlNTdlMGE1OGE4OjpkZWVwOjpERUVQJyxcbiAgICAgICAgICBvYmplY3RJZDogJzB4OTI0YWI2OWViYmEzMDRmMjk3NWE1ODgzNzJiNDFlNGUxZjVkYjdmYTgyNDg2OGY4NDE5OWVlYjFlMGExNWEyZCcsXG4gICAgICAgICAgdmVyc2lvbjogJzM0Njk2ODA3JyxcbiAgICAgICAgICBkaWdlc3Q6ICc3WFJiV1FUaXdBVUNqTExzWlZwSk1yQUJDaGVKQmt6S1ZmQ3I3YVRaWlZrZCcsXG4gICAgICAgICAgYmFsYW5jZTogbmV3IEJpZ051bWJlcigxMDAwKSxcbiAgICAgICAgfSxcbiAgICAgIF0pO1xuICAgICAgZ2V0SW5wdXRDb2luc1N0dWIud2l0aEFyZ3Moc2VuZGVyQWRkcmVzczApLnJlc29sdmVzKFtcbiAgICAgICAge1xuICAgICAgICAgIGNvaW5UeXBlOiAnMHgyOjpzdWk6OlNVSScsXG4gICAgICAgICAgb2JqZWN0SWQ6ICcweDkxNDY5MjhmNTU3Y2I4YWIxOTE1YTU4ODZjMTM2MjQzNWEwNWI0NzA5YjU4NmJiMDFkNGM3MGU4NWJiNTMxNjEnLFxuICAgICAgICAgIHZlcnNpb246ICcyMzknLFxuICAgICAgICAgIGRpZ2VzdDogJ0dMU3pSNkhKMzE5blBLQUZtNXgzVFdIY2FIWnpDRlNCQ3FodloxcXdUNXdyJyxcbiAgICAgICAgICBiYWxhbmNlOiBuZXcgQmlnTnVtYmVyKCcxMjMwMjYxMDc2JyksXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBjb2luVHlwZTogJzB4Mjo6c3VpOjpTVUknLFxuICAgICAgICAgIG9iamVjdElkOiAnMHg5M2Y3MDBkYzgyZTIyOWY2OTlmNDdiMTY3ODU5YzUxMDgyODhiNzhmNTQwNjg4MDBjYzI5MDkwMGQwZGU4NDI5JyxcbiAgICAgICAgICB2ZXJzaW9uOiAnMTQ5JyxcbiAgICAgICAgICBkaWdlc3Q6ICcyd1hEeHQyWnhla0J4TjZvVzNCcVZEWFpjWDQ5Qzg3bjFBTjI2Tnl1N2tQUicsXG4gICAgICAgICAgYmFsYW5jZTogbmV3IEJpZ051bWJlcignMTY5NjExMDI0JyksXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBjb2luVHlwZTogJzB4Mjo6c3VpOjpTVUknLFxuICAgICAgICAgIG9iamVjdElkOiAnMHhiODY5YjQ1NzQ0Y2EyYzRhNjYzYzZlODY3OWRiNWE2MzJiZWFkMDM2NDI3Mzg0MmQzOTkwZDdmZjY1ZDU3YjFlJyxcbiAgICAgICAgICB2ZXJzaW9uOiAnMjM3JyxcbiAgICAgICAgICBkaWdlc3Q6ICdGMXhXS1BWSFY1V0w3MkVyamdReHJqbjNSTkgyR0hqeU45alRnd1c3UXBoaycsXG4gICAgICAgICAgYmFsYW5jZTogbmV3IEJpZ051bWJlcignMTAxOTc2JyksXG4gICAgICAgIH0sXG4gICAgICBdKTtcbiAgICAgIGdldEZlZUVzdGltYXRlU3R1YlxuICAgICAgICAud2l0aEFyZ3MoXG4gICAgICAgICAgJ0FBQURBUUNTU3JhZXU2TUU4cGRhV0lOeXRCNU9IMTIzK29KSWFQaEJtZTZ4NEtGYUxXZHVFUUlBQUFBQUlHRHhXdjA3dXF2MGhFWmlPRzBGQy94RzgzMFdCbVJEWkxPTG1NcDYxZ2RTQUFqb0F3QUFBQUFBQUFBZ0FPVHFwcUtSL2dLUmhGTG1SYlZsUE5KZ3Bmd1BzMTloazlXQWtXcXA0NGtDQWdFQUFBRUJBUUFCQVFJQUFBRUNBSkh5WGlON2c2QUtZbkpQM0VxQjVEOUpUY2EwR2hKQlNTZ20wMjVORXgyakFaRkdrbzlWZkxpckdSV2xpR3dUWWtOYUJiUndtMWhyc0IxTWNPaGJ0VEZoN3dBQUFBQUFBQUFnNDlxNTVlSkdHTTV4dG9KelkyMzNVbkwyZGoxS2I1TjkwWXhaNzBRb3BXMlI4bDRqZTRPZ0NtSnlUOXhLZ2VRL1NVM0d0Qm9TUVVrb0p0TnVUUk1kbytnREFBQUFBQUFBQU9IMUJRQUFBQUFBJ1xuICAgICAgICApXG4gICAgICAgIC5yZXNvbHZlcyhuZXcgQmlnTnVtYmVyKDIzNDU1MDQpKTtcblxuICAgICAgY29uc3QgcmVzID0gYXdhaXQgYmFzZWNvaW4ucmVjb3Zlcih7XG4gICAgICAgIHVzZXJLZXk6IGtleXMudXNlcktleSxcbiAgICAgICAgYmFja3VwS2V5OiBrZXlzLmJhY2t1cEtleSxcbiAgICAgICAgYml0Z29LZXk6IGtleXMuYml0Z29LZXksXG4gICAgICAgIHJlY292ZXJ5RGVzdGluYXRpb24sXG4gICAgICAgIHdhbGxldFBhc3NwaHJhc2UsXG4gICAgICAgIHRva2VuQ29udHJhY3RBZGRyZXNzLFxuICAgICAgfSk7XG4gICAgICByZXMuc2hvdWxkLm5vdC5iZS5lbXB0eSgpO1xuICAgICAgcmVzLnNob3VsZC5oYXNPd25Qcm9wZXJ0eSgndHJhbnNhY3Rpb25zJyk7XG4gICAgICBjb25zdCB0eCA9IHJlcy50cmFuc2FjdGlvbnNbMF07XG4gICAgICB0eC5zY2FuSW5kZXguc2hvdWxkLmVxdWFsKDApO1xuICAgICAgdHgucmVjb3ZlcnlBbW91bnQuc2hvdWxkLmVxdWFsKCcxMDAwJyk7XG4gICAgICB0eC5zZXJpYWxpemVkVHguc2hvdWxkLmVxdWFsKFxuICAgICAgICAnQUFBREFRQ1NTcmFldTZNRThwZGFXSU55dEI1T0gxMjMrb0pJYVBoQm1lNng0S0ZhTFdkdUVRSUFBQUFBSUdEeFd2MDd1cXYwaEVaaU9HMEZDL3hHODMwV0JtUkRaTE9MbU1wNjFnZFNBQWpvQXdBQUFBQUFBQUFnQU9UcXBxS1IvZ0tSaEZMbVJiVmxQTkpncGZ3UHMxOWhrOVdBa1dxcDQ0a0NBZ0VBQUFFQkFRQUJBUUlBQUFFQ0FKSHlYaU43ZzZBS1luSlAzRXFCNUQ5SlRjYTBHaEpCU1NnbTAyNU5FeDJqQVpGR2tvOVZmTGlyR1JXbGlHd1RZa05hQmJSd20xaHJzQjFNY09oYnRURmg3d0FBQUFBQUFBQWc0OXE1NWVKR0dNNXh0b0p6WTIzM1VuTDJkajFLYjVOOTBZeFo3MFFvcFcyUjhsNGplNE9nQ21KeVQ5eEtnZVEvU1UzR3RCb1NRVWtvSnROdVRSTWRvK2dEQUFBQUFBQUFWbDRuQUFBQUFBQUEnXG4gICAgICApO1xuXG4gICAgICBjb25zdCBOb25CaXRHb1R4bkRlc2VyaWFsaXplID0gbmV3IFRva2VuVHJhbnNmZXJUcmFuc2FjdGlvbihiYXNlY29pbik7XG4gICAgICBOb25CaXRHb1R4bkRlc2VyaWFsaXplLmZyb21SYXdUcmFuc2FjdGlvbih0eC5zZXJpYWxpemVkVHgpO1xuICAgICAgY29uc3QgTm9uQml0R29UeG5Kc29uID0gTm9uQml0R29UeG5EZXNlcmlhbGl6ZS50b0pzb24oKTtcblxuICAgICAgc2hvdWxkLmVxdWFsKE5vbkJpdEdvVHhuSnNvbi5pZCwgJ0RZVzltQThBWkdRbnRrN0hHUVVFb0VkeThCYUg4SGg5VHMyOTRFbnFHVEVyJyk7XG4gICAgICBzaG91bGQuZXF1YWwoTm9uQml0R29UeG5Kc29uLnNlbmRlciwgc2VuZGVyQWRkcmVzczApO1xuICAgICAgc2FuZEJveC5hc3NlcnQuY2FsbENvdW50KGJhc2Vjb2luLmdldEJhbGFuY2UsIDMpO1xuICAgICAgc2FuZEJveC5hc3NlcnQuY2FsbENvdW50KGJhc2Vjb2luLmdldElucHV0Q29pbnMsIDIpO1xuICAgICAgc2FuZEJveC5hc3NlcnQuY2FsbENvdW50KGJhc2Vjb2luLmdldEZlZUVzdGltYXRlLCAxKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVjb3ZlciBhIHRva2VuIHR4biBmb3IgdW5zaWduZWQgc3dlZXAgcmVjb3ZlcnknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBnZXRCYWxhbmNlU3R1YlxuICAgICAgICAud2l0aEFyZ3Moc2VuZGVyQWRkcmVzc0NvbGRXYWxsZXQpXG4gICAgICAgIC5yZXNvbHZlcyh7IHRvdGFsQmFsYW5jZTogJzI5ODk4MDI0MCcsIGNvaW5PYmplY3RCYWxhbmNlOiAnMjk4OTgwMjQwJywgZnVuZHNJbkFkZHJlc3NCYWxhbmNlOiAnMCcgfSk7XG4gICAgICBnZXRCYWxhbmNlU3R1YlxuICAgICAgICAud2l0aEFyZ3Moc2VuZGVyQWRkcmVzc0NvbGRXYWxsZXQsIGNvaW5UeXBlKVxuICAgICAgICAucmVzb2x2ZXMoeyB0b3RhbEJhbGFuY2U6ICcxMDAwJywgY29pbk9iamVjdEJhbGFuY2U6ICcxMDAwJywgZnVuZHNJbkFkZHJlc3NCYWxhbmNlOiAnMCcgfSk7XG5cbiAgICAgIGdldElucHV0Q29pbnNTdHViLndpdGhBcmdzKHNlbmRlckFkZHJlc3NDb2xkV2FsbGV0LCBjb2luVHlwZSkucmVzb2x2ZXMoW1xuICAgICAgICB7XG4gICAgICAgICAgY29pblR5cGU6ICcweDM2ZGJlZjg2NmExZDYyYmY3MzI4OTg5YTEwZmIyZjA3ZDc2OWY0ZWU1ODdjMGRlNGEwYTI1NmU1N2UwYTU4YTg6OmRlZXA6OkRFRVAnLFxuICAgICAgICAgIG9iamVjdElkOiAnMHg0YzFjY2NjNmQwMzUxMGJkNzRhOTVmODFiMmI3ZGEwODExOWNiMThlMmM1NjU0MzVlN2FkNzE1ZTZhYWRjNWE3JyxcbiAgICAgICAgICB2ZXJzaW9uOiAnMzQ2OTY4MDknLFxuICAgICAgICAgIGRpZ2VzdDogJ0FmeTRMVzQ2dHVjemozNDFUYkNMZWV5bnhydXBqOUx3MnFCUVVwbmRIYzFjJyxcbiAgICAgICAgICBiYWxhbmNlOiBuZXcgQmlnTnVtYmVyKDEwMDApLFxuICAgICAgICB9LFxuICAgICAgXSk7XG4gICAgICBnZXRJbnB1dENvaW5zU3R1Yi53aXRoQXJncyhzZW5kZXJBZGRyZXNzQ29sZFdhbGxldCkucmVzb2x2ZXMoW1xuICAgICAgICB7XG4gICAgICAgICAgY29pblR5cGU6ICcweDI6OnN1aTo6U1VJJyxcbiAgICAgICAgICBvYmplY3RJZDogJzB4OTgxMTRmMmRkZWZlM2YxNmQ5ZDJlMDE2MTk0YjUyYzRjM2FmNDMwYzE2MDFiZGIzNTM5Y2JkMjM3Y2JjYTA2OCcsXG4gICAgICAgICAgdmVyc2lvbjogJzM0Njk2ODA5JyxcbiAgICAgICAgICBkaWdlc3Q6ICdEQnRvcXZXdHJjWUhFMUhqUVVvNGlnVGtIWXhZN0Q4M2lIU29LWGk5QTg1VycsXG4gICAgICAgICAgYmFsYW5jZTogbmV3IEJpZ051bWJlcigyMDAwMDAwMDApLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgY29pblR5cGU6ICcweDI6OnN1aTo6U1VJJyxcbiAgICAgICAgICBvYmplY3RJZDogJzB4OWVjMTM0NDA2NDdiMGJlZTc0ZjQ1NDA5NTg5YWQyZmY1YTE4Yzk2MTVmOTlkNWQ5MTRmOTg4YjgzNGRhNDkzZScsXG4gICAgICAgICAgdmVyc2lvbjogJzIzOScsXG4gICAgICAgICAgZGlnZXN0OiAnOWQzdVZzUTRwMzdUR256VHBuWFh3MnBGb2dnYlZmVnA5Q2RDNGpwWnE2NjQnLFxuICAgICAgICAgIGJhbGFuY2U6IG5ldyBCaWdOdW1iZXIoOTg5ODAyNDApLFxuICAgICAgICB9LFxuICAgICAgXSk7XG4gICAgICBnZXRGZWVFc3RpbWF0ZVN0dWJcbiAgICAgICAgLndpdGhBcmdzKFxuICAgICAgICAgICdBQUFEQVFCTUhNekcwRFVRdlhTcFg0R3l0OW9JRVp5eGppeFdWRFhuclhGZWFxM0ZwMmx1RVFJQUFBQUFJSSswb3pTNEthemV5L29xTW9aQ3I2Sk5iNVUzUVBkb01JRHVEa3M5T3BZdkFBam9Bd0FBQUFBQUFBQWdBT1RxcHFLUi9nS1JoRkxtUmJWbFBOSmdwZndQczE5aGs5V0FrV3FwNDRrQ0FnRUFBQUVCQVFBQkFRSUFBQUVDQUFGa2xkM2FkSXdSYWlHQ1FvTmROa2NKMXNYdVhJb2Uxb1RFNzBNOU1VUWhBWmdSVHkzZS9qOFcyZExnRmhsTFVzVERyME1NRmdHOXMxT2N2U044dktCb2FXNFJBZ0FBQUFBZ3RSYWhXMUEwdk5Ra0pVUU1Wa3p6YjBPVlF2aUdjZTk1bmQ0R1llZUpvQWtCWkpYZDJuU01FV29oZ2tLRFhUWkhDZGJGN2x5S0h0YUV4TzlEUFRGRUllZ0RBQUFBQUFBQUFPSDFCUUFBQUFBQSdcbiAgICAgICAgKVxuICAgICAgICAucmVzb2x2ZXMobmV3IEJpZ051bWJlcigyMzQ1NTA0KSk7XG5cbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGJhc2Vjb2luLnJlY292ZXIoe1xuICAgICAgICBiaXRnb0tleToga2V5cy5iaXRnb0tleUNvbGRXYWxsZXQsXG4gICAgICAgIHJlY292ZXJ5RGVzdGluYXRpb24sXG4gICAgICAgIHRva2VuQ29udHJhY3RBZGRyZXNzLFxuICAgICAgfSk7XG5cbiAgICAgIHJlcy5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgdHhSZXF1ZXN0czogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRyYW5zYWN0aW9uczogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdW5zaWduZWRUeDoge1xuICAgICAgICAgICAgICAgICAgc2VyaWFsaXplZFR4OlxuICAgICAgICAgICAgICAgICAgICAnMDAwMDAzMDEwMDRjMWNjY2M2ZDAzNTEwYmQ3NGE5NWY4MWIyYjdkYTA4MTE5Y2IxOGUyYzU2NTQzNWU3YWQ3MTVlNmFhZGM1YTc2OTZlMTEwMjAwMDAwMDAwMjA4ZmI0YTMzNGI4MjlhY2RlY2JmYTJhMzI4NjQyYWZhMjRkNmY5NTM3NDBmNzY4MzA4MGVlMGU0YjNkM2E5NjJmMDAwOGU4MDMwMDAwMDAwMDAwMDAwMDIwMDBlNGVhYTZhMjkxZmUwMjkxODQ1MmU2NDViNTY1M2NkMjYwYTVmYzBmYjM1ZjYxOTNkNTgwOTE2YWE5ZTM4OTAyMDIwMTAwMDAwMTAxMDEwMDAxMDEwMjAwMDAwMTAyMDAwMTY0OTVkZGRhNzQ4YzExNmEyMTgyNDI4MzVkMzY0NzA5ZDZjNWVlNWM4YTFlZDY4NGM0ZWY0MzNkMzE0NDIxMDE5ODExNGYyZGRlZmUzZjE2ZDlkMmUwMTYxOTRiNTJjNGMzYWY0MzBjMTYwMWJkYjM1MzljYmQyMzdjYmNhMDY4Njk2ZTExMDIwMDAwMDAwMDIwYjUxNmExNWI1MDM0YmNkNDI0MjU0NDBjNTY0Y2YzNmY0Mzk1NDJmODg2NzFlZjc5OWRkZTA2NjFlNzg5YTAwOTAxNjQ5NWRkZGE3NDhjMTE2YTIxODI0MjgzNWQzNjQ3MDlkNmM1ZWU1YzhhMWVkNjg0YzRlZjQzM2QzMTQ0MjFlODAzMDAwMDAwMDAwMDAwNTY1ZTI3MDAwMDAwMDAwMDAwJyxcbiAgICAgICAgICAgICAgICAgIHNjYW5JbmRleDogMCxcbiAgICAgICAgICAgICAgICAgIGNvaW46ICd0c3VpOmRlZXAnLFxuICAgICAgICAgICAgICAgICAgc2lnbmFibGVIZXg6ICdlMzU0N2E1OGI5YzQ4ODQwYTI3NzRhZWI3MWI4NjUyYTcwYjY3ZWU1OWMzZmE1YjFmNzQzNzM4ZDhiMjk1MTk5JyxcbiAgICAgICAgICAgICAgICAgIGRlcml2YXRpb25QYXRoOiAnbS8wJyxcbiAgICAgICAgICAgICAgICAgIHBhcnNlZFR4OiB7XG4gICAgICAgICAgICAgICAgICAgIGlucHV0czogW1xuICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3M6ICcweDAxNjQ5NWRkZGE3NDhjMTE2YTIxODI0MjgzNWQzNjQ3MDlkNmM1ZWU1YzhhMWVkNjg0YzRlZjQzM2QzMTQ0MjEnLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVTdHJpbmc6ICcxMDAwJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBuZXcgQmlnTnVtYmVyKDEwMDApLFxuICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIG91dHB1dHM6IFtcbiAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzOiAnMHgwMGU0ZWFhNmEyOTFmZTAyOTE4NDUyZTY0NWI1NjUzY2QyNjBhNWZjMGZiMzVmNjE5M2Q1ODA5MTZhYTllMzg5JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlU3RyaW5nOiAnMTAwMCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2luTmFtZTogJ3RzdWk6ZGVlcCcsXG4gICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgc3BlbmRBbW91bnQ6ICcxMDAwJyxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ1Rva2VuVHJhbnNmZXInLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIGZlZUluZm86IHtcbiAgICAgICAgICAgICAgICAgICAgZmVlOiAyNTgwMDU0LFxuICAgICAgICAgICAgICAgICAgICBmZWVTdHJpbmc6ICcyNTgwMDU0JyxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBjb2luU3BlY2lmaWM6IHtcbiAgICAgICAgICAgICAgICAgICAgY29tbW9uS2V5Y2hhaW46XG4gICAgICAgICAgICAgICAgICAgICAgJzc5ZDRiOWI1OTRkZjAyOGZlZTM3MjVhNmFmNTFhZTNhYjZhMzUxOWU5ZDJjMzIyZjJjOGZkODE1Yjk2NDk2MzIzYzVhYmE3ZWE4NzRjMTAyZjk2NmYxYTYxZDNjOWE0MmI1ZjMxNzdjNmE4NTcxMmNmMzEzNzE1YWZkZGY4M2Q4JyxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzaWduYXR1cmVTaGFyZXM6IFtdLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHdhbGxldENvaW46ICd0c3VpOmRlZXAnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgdW5zaWduZWRTd2VlcFR4bkRlc2VyaWFsaXplID0gbmV3IFRyYW5zZmVyVHJhbnNhY3Rpb24oYmFzZWNvaW4pO1xuICAgICAgY29uc3Qgc2VyaWFsaXplZFR4SGV4ID0gcmVzLnR4UmVxdWVzdHNbMF0udHJhbnNhY3Rpb25zWzBdLnVuc2lnbmVkVHguc2VyaWFsaXplZFR4O1xuICAgICAgY29uc3Qgc2VyaWFsaXplZFR4QmFzZTY0ID0gQnVmZmVyLmZyb20oc2VyaWFsaXplZFR4SGV4LCAnaGV4JykudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuICAgICAgdW5zaWduZWRTd2VlcFR4bkRlc2VyaWFsaXplLmZyb21SYXdUcmFuc2FjdGlvbihzZXJpYWxpemVkVHhCYXNlNjQpO1xuICAgICAgY29uc3QgdW5zaWduZWRTd2VlcFR4bkpzb24gPSB1bnNpZ25lZFN3ZWVwVHhuRGVzZXJpYWxpemUudG9Kc29uKCk7XG4gICAgICBzaG91bGQuZXF1YWwodW5zaWduZWRTd2VlcFR4bkpzb24uaWQsICdGOHdyVWpaWWY2eHZEVzJMelc5RG9oQUt5SkZjV2dHRXZqTW9LTHhDYWptVicpO1xuICAgICAgc2hvdWxkLmVxdWFsKHVuc2lnbmVkU3dlZXBUeG5Kc29uLnNlbmRlciwgc2VuZGVyQWRkcmVzc0NvbGRXYWxsZXQpO1xuXG4gICAgICBzYW5kQm94LmFzc2VydC5jYWxsQ291bnQoYmFzZWNvaW4uZ2V0QmFsYW5jZSwgMyk7XG4gICAgICBzYW5kQm94LmFzc2VydC5jYWxsQ291bnQoYmFzZWNvaW4uZ2V0SW5wdXRDb2lucywgMik7XG4gICAgICBzYW5kQm94LmFzc2VydC5jYWxsQ291bnQoYmFzZWNvaW4uZ2V0RmVlRXN0aW1hdGUsIDEpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWNvdmVyIGEgdG9rZW4gdHhuIGZvciB1bnNpZ25lZCBzd2VlcCByZWNvdmVyeSB3aXRoIG11bHRpcGxlIGlucHV0IGNvaW5zJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgZ2V0QmFsYW5jZVN0dWJcbiAgICAgICAgLndpdGhBcmdzKHNlbmRlckFkZHJlc3NDb2xkV2FsbGV0KVxuICAgICAgICAucmVzb2x2ZXMoeyB0b3RhbEJhbGFuY2U6ICcyOTg5ODAyNDAnLCBjb2luT2JqZWN0QmFsYW5jZTogJzI5ODk4MDI0MCcsIGZ1bmRzSW5BZGRyZXNzQmFsYW5jZTogJzAnIH0pO1xuICAgICAgZ2V0QmFsYW5jZVN0dWJcbiAgICAgICAgLndpdGhBcmdzKHNlbmRlckFkZHJlc3NDb2xkV2FsbGV0LCBjb2luVHlwZSlcbiAgICAgICAgLnJlc29sdmVzKHsgdG90YWxCYWxhbmNlOiAnMTEwMDAnLCBjb2luT2JqZWN0QmFsYW5jZTogJzExMDAwJywgZnVuZHNJbkFkZHJlc3NCYWxhbmNlOiAnMCcgfSk7XG4gICAgICBnZXRJbnB1dENvaW5zU3R1Yi53aXRoQXJncyhzZW5kZXJBZGRyZXNzQ29sZFdhbGxldCwgY29pblR5cGUpLnJlc29sdmVzKFtcbiAgICAgICAge1xuICAgICAgICAgIGNvaW5UeXBlOiAnMHgzNmRiZWY4NjZhMWQ2MmJmNzMyODk4OWExMGZiMmYwN2Q3NjlmNGVlNTg3YzBkZTRhMGEyNTZlNTdlMGE1OGE4OjpkZWVwOjpERUVQJyxcbiAgICAgICAgICBvYmplY3RJZDogJzB4NGMxY2NjYzZkMDM1MTBiZDc0YTk1ZjgxYjJiN2RhMDgxMTljYjE4ZTJjNTY1NDM1ZTdhZDcxNWU2YWFkYzVhNycsXG4gICAgICAgICAgdmVyc2lvbjogJzM0Njk2ODA5JyxcbiAgICAgICAgICBkaWdlc3Q6ICdBZnk0TFc0NnR1Y3pqMzQxVGJDTGVleW54cnVwajlMdzJxQlFVcG5kSGMxYycsXG4gICAgICAgICAgYmFsYW5jZTogbmV3IEJpZ051bWJlcignMTAwMCcpLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgY29pblR5cGU6ICcweDM2ZGJlZjg2NmExZDYyYmY3MzI4OTg5YTEwZmIyZjA3ZDc2OWY0ZWU1ODdjMGRlNGEwYTI1NmU1N2UwYTU4YTg6OmRlZXA6OkRFRVAnLFxuICAgICAgICAgIG9iamVjdElkOiAnMHg3MmFkOTkxMzBhYmQzNzkwZGI3YmFjODkwOGQ1MGQzNDEyYTgwMGE4ZmNkMTBjMWNmYmQ2NGI4MjE1NTM3NTU4JyxcbiAgICAgICAgICB2ZXJzaW9uOiAnMzQ2OTY4NjUnLFxuICAgICAgICAgIGRpZ2VzdDogJ1g4dWFORGtTZllLYTZQQnpKSlVlOVN0UDRuUldSOVJab2EybkpIcXY1bW4nLFxuICAgICAgICAgIGJhbGFuY2U6IG5ldyBCaWdOdW1iZXIoJzEwMDAwJyksXG4gICAgICAgIH0sXG4gICAgICBdKTtcbiAgICAgIGdldElucHV0Q29pbnNTdHViLndpdGhBcmdzKHNlbmRlckFkZHJlc3NDb2xkV2FsbGV0KS5yZXNvbHZlcyhbXG4gICAgICAgIHtcbiAgICAgICAgICBjb2luVHlwZTogJzB4Mjo6c3VpOjpTVUknLFxuICAgICAgICAgIG9iamVjdElkOiAnMHg5ODExNGYyZGRlZmUzZjE2ZDlkMmUwMTYxOTRiNTJjNGMzYWY0MzBjMTYwMWJkYjM1MzljYmQyMzdjYmNhMDY4JyxcbiAgICAgICAgICB2ZXJzaW9uOiAnMzQ2OTY4MDknLFxuICAgICAgICAgIGRpZ2VzdDogJ0RCdG9xdld0cmNZSEUxSGpRVW80aWdUa0hZeFk3RDgzaUhTb0tYaTlBODVXJyxcbiAgICAgICAgICBiYWxhbmNlOiBuZXcgQmlnTnVtYmVyKCcyMDAwMDAwMDAnKSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGNvaW5UeXBlOiAnMHgyOjpzdWk6OlNVSScsXG4gICAgICAgICAgb2JqZWN0SWQ6ICcweDllYzEzNDQwNjQ3YjBiZWU3NGY0NTQwOTU4OWFkMmZmNWExOGM5NjE1Zjk5ZDVkOTE0Zjk4OGI4MzRkYTQ5M2UnLFxuICAgICAgICAgIHZlcnNpb246ICcyMzknLFxuICAgICAgICAgIGRpZ2VzdDogJzlkM3VWc1E0cDM3VEduelRwblhYdzJwRm9nZ2JWZlZwOUNkQzRqcFpxNjY0JyxcbiAgICAgICAgICBiYWxhbmNlOiBuZXcgQmlnTnVtYmVyKCc5ODk4MDI0MCcpLFxuICAgICAgICB9LFxuICAgICAgXSk7XG4gICAgICBnZXRGZWVFc3RpbWF0ZVN0dWJcbiAgICAgICAgLndpdGhBcmdzKFxuICAgICAgICAgICdBQUFFQVFCeXJaa1RDcjAza050N3JJa0kxUTAwRXFnQXFQelJEQno3MWt1Q0ZWTjFXS0Z1RVFJQUFBQUFJQWU0WFRpMjRiU0Y4VVZaTU5KeWxoQ0FnY3FzMTJaTVNOZlY5SVZ5N2l1OUFRQk1ITXpHMERVUXZYU3BYNEd5dDlvSUVaeXhqaXhXVkRYbnJYRmVhcTNGcDJsdUVRSUFBQUFBSUkrMG96UzRLYXpleS9vcU1vWkNyNkpOYjVVM1FQZG9NSUR1RGtzOU9wWXZBQWo0S2dBQUFBQUFBQUFnQU9UcXBxS1IvZ0tSaEZMbVJiVmxQTkpncGZ3UHMxOWhrOVdBa1dxcDQ0a0RBd0VBQUFFQkFRQUNBUUFBQVFFQ0FBRUJBZ0VBQVFNQUFXU1YzZHAwakJGcUlZSkNnMTAyUnduV3hlNWNpaDdXaE1UdlF6MHhSQ0VCbUJGUExkNytQeGJaMHVBV0dVdFN4TU92UXd3V0FiMnpVNXk5STN5OG9HaHBiaEVDQUFBQUFDQzFGcUZiVURTODFDUWxSQXhXVFBOdlE1VkMrSVp4NzNtZDNnWmg1NG1nQ1FGa2xkM2FkSXdSYWlHQ1FvTmROa2NKMXNYdVhJb2Uxb1RFNzBNOU1VUWg2QU1BQUFBQUFBQUE0ZlVGQUFBQUFBQT0nXG4gICAgICAgIClcbiAgICAgICAgLnJlc29sdmVzKG5ldyBCaWdOdW1iZXIoMTAzNjMyOCkpO1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgYmFzZWNvaW4ucmVjb3Zlcih7XG4gICAgICAgIGJpdGdvS2V5OiBrZXlzLmJpdGdvS2V5Q29sZFdhbGxldCxcbiAgICAgICAgcmVjb3ZlcnlEZXN0aW5hdGlvbixcbiAgICAgICAgdG9rZW5Db250cmFjdEFkZHJlc3MsXG4gICAgICB9KTtcblxuICAgICAgcmVzLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICB0eFJlcXVlc3RzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHJhbnNhY3Rpb25zOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB1bnNpZ25lZFR4OiB7XG4gICAgICAgICAgICAgICAgICBzZXJpYWxpemVkVHg6XG4gICAgICAgICAgICAgICAgICAgICcwMDAwMDQwMTAwNzJhZDk5MTMwYWJkMzc5MGRiN2JhYzg5MDhkNTBkMzQxMmE4MDBhOGZjZDEwYzFjZmJkNjRiODIxNTUzNzU1OGExNmUxMTAyMDAwMDAwMDAyMDA3Yjg1ZDM4YjZlMWI0ODVmMTQ1NTkzMGQyNzI5NjEwODA4MWNhYWNkNzY2NGM0OGQ3ZDVmNDg1NzJlZTJiYmQwMTAwNGMxY2NjYzZkMDM1MTBiZDc0YTk1ZjgxYjJiN2RhMDgxMTljYjE4ZTJjNTY1NDM1ZTdhZDcxNWU2YWFkYzVhNzY5NmUxMTAyMDAwMDAwMDAyMDhmYjRhMzM0YjgyOWFjZGVjYmZhMmEzMjg2NDJhZmEyNGQ2Zjk1Mzc0MGY3NjgzMDgwZWUwZTRiM2QzYTk2MmYwMDA4ZjgyYTAwMDAwMDAwMDAwMDAwMjAwMGU0ZWFhNmEyOTFmZTAyOTE4NDUyZTY0NWI1NjUzY2QyNjBhNWZjMGZiMzVmNjE5M2Q1ODA5MTZhYTllMzg5MDMwMzAxMDAwMDAxMDEwMTAwMDIwMTAwMDAwMTAxMDIwMDAxMDEwMjAxMDAwMTAzMDAwMTY0OTVkZGRhNzQ4YzExNmEyMTgyNDI4MzVkMzY0NzA5ZDZjNWVlNWM4YTFlZDY4NGM0ZWY0MzNkMzE0NDIxMDE5ODExNGYyZGRlZmUzZjE2ZDlkMmUwMTYxOTRiNTJjNGMzYWY0MzBjMTYwMWJkYjM1MzljYmQyMzdjYmNhMDY4Njk2ZTExMDIwMDAwMDAwMDIwYjUxNmExNWI1MDM0YmNkNDI0MjU0NDBjNTY0Y2YzNmY0Mzk1NDJmODg2NzFlZjc5OWRkZTA2NjFlNzg5YTAwOTAxNjQ5NWRkZGE3NDhjMTE2YTIxODI0MjgzNWQzNjQ3MDlkNmM1ZWU1YzhhMWVkNjg0YzRlZjQzM2QzMTQ0MjFlODAzMDAwMDAwMDAwMDAwZjg2NDExMDAwMDAwMDAwMDAwJyxcbiAgICAgICAgICAgICAgICAgIHNjYW5JbmRleDogMCxcbiAgICAgICAgICAgICAgICAgIGNvaW46ICd0c3VpOmRlZXAnLFxuICAgICAgICAgICAgICAgICAgc2lnbmFibGVIZXg6ICdjZDAyOGM0MDFmODE1ZGFiN2Y2YzVlOGEzMzk3Njg3OWM1Yzc5OWFlN2M5ZmRlMDFjYWZkMGFlZTAwNzVhMTc0JyxcbiAgICAgICAgICAgICAgICAgIGRlcml2YXRpb25QYXRoOiAnbS8wJyxcbiAgICAgICAgICAgICAgICAgIHBhcnNlZFR4OiB7XG4gICAgICAgICAgICAgICAgICAgIGlucHV0czogW1xuICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3M6ICcweDAxNjQ5NWRkZGE3NDhjMTE2YTIxODI0MjgzNWQzNjQ3MDlkNmM1ZWU1YzhhMWVkNjg0YzRlZjQzM2QzMTQ0MjEnLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVTdHJpbmc6ICcxMTAwMCcsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbmV3IEJpZ051bWJlcignMTEwMDAnKSxcbiAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBvdXRwdXRzOiBbXG4gICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzczogJzB4MDBlNGVhYTZhMjkxZmUwMjkxODQ1MmU2NDViNTY1M2NkMjYwYTVmYzBmYjM1ZjYxOTNkNTgwOTE2YWE5ZTM4OScsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVN0cmluZzogJzExMDAwJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvaW5OYW1lOiAndHN1aTpkZWVwJyxcbiAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBzcGVuZEFtb3VudDogJzExMDAwJyxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ1Rva2VuVHJhbnNmZXInLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIGZlZUluZm86IHtcbiAgICAgICAgICAgICAgICAgICAgZmVlOiAxMTM5OTYwLFxuICAgICAgICAgICAgICAgICAgICBmZWVTdHJpbmc6ICcxMTM5OTYwJyxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBjb2luU3BlY2lmaWM6IHtcbiAgICAgICAgICAgICAgICAgICAgY29tbW9uS2V5Y2hhaW46XG4gICAgICAgICAgICAgICAgICAgICAgJzc5ZDRiOWI1OTRkZjAyOGZlZTM3MjVhNmFmNTFhZTNhYjZhMzUxOWU5ZDJjMzIyZjJjOGZkODE1Yjk2NDk2MzIzYzVhYmE3ZWE4NzRjMTAyZjk2NmYxYTYxZDNjOWE0MmI1ZjMxNzdjNmE4NTcxMmNmMzEzNzE1YWZkZGY4M2Q4JyxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzaWduYXR1cmVTaGFyZXM6IFtdLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHdhbGxldENvaW46ICd0c3VpOmRlZXAnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgdW5zaWduZWRTd2VlcFR4bkRlc2VyaWFsaXplID0gbmV3IFRyYW5zZmVyVHJhbnNhY3Rpb24oYmFzZWNvaW4pO1xuICAgICAgY29uc3Qgc2VyaWFsaXplZFR4SGV4ID0gcmVzLnR4UmVxdWVzdHNbMF0udHJhbnNhY3Rpb25zWzBdLnVuc2lnbmVkVHguc2VyaWFsaXplZFR4O1xuICAgICAgY29uc3Qgc2VyaWFsaXplZFR4QmFzZTY0ID0gQnVmZmVyLmZyb20oc2VyaWFsaXplZFR4SGV4LCAnaGV4JykudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuICAgICAgdW5zaWduZWRTd2VlcFR4bkRlc2VyaWFsaXplLmZyb21SYXdUcmFuc2FjdGlvbihzZXJpYWxpemVkVHhCYXNlNjQpO1xuICAgICAgY29uc3QgdW5zaWduZWRTd2VlcFR4bkpzb24gPSB1bnNpZ25lZFN3ZWVwVHhuRGVzZXJpYWxpemUudG9Kc29uKCk7XG4gICAgICBzaG91bGQuZXF1YWwodW5zaWduZWRTd2VlcFR4bkpzb24uaWQsICc0cWVYSlA3cFRhNnBteUFLdUpaRzlBa0dzS001M1NEcUhWY1BqUk1GSGpjNScpO1xuICAgICAgc2hvdWxkLmVxdWFsKHVuc2lnbmVkU3dlZXBUeG5Kc29uLnNlbmRlciwgc2VuZGVyQWRkcmVzc0NvbGRXYWxsZXQpO1xuXG4gICAgICBzYW5kQm94LmFzc2VydC5jYWxsQ291bnQoYmFzZWNvaW4uZ2V0QmFsYW5jZSwgMyk7XG4gICAgICBzYW5kQm94LmFzc2VydC5jYWxsQ291bnQoYmFzZWNvaW4uZ2V0SW5wdXRDb2lucywgMik7XG4gICAgICBzYW5kQm94LmFzc2VydC5jYWxsQ291bnQoYmFzZWNvaW4uZ2V0RmVlRXN0aW1hdGUsIDEpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnUmVjb3ZlciBUcmFuc2FjdGlvbnMgZm9yIHdhbGxldCB3aXRoIG11bHRpcGxlIGFkZHJlc3NlczonLCAoKSA9PiB7XG4gICAgY29uc3Qgc2FuZEJveCA9IHNpbm9uLmNyZWF0ZVNhbmRib3goKTtcbiAgICBjb25zdCBzZW5kZXJBZGRyZXNzMCA9ICcweDkxZjI1ZTIzN2I4M2EwMGE2MjcyNGZkYzRhODFlNDNmNDk0ZGM2YjQxYTEyNDE0OTI4MjZkMzZlNGQxMzFkYTMnO1xuICAgIGNvbnN0IHNlbmRlckFkZHJlc3MxID0gJzB4MzJkOGU1N2VlNmQ5MWU1NTU4ZGEwNjc3MTU0YzJmMDg1Nzk1MzQ4ZTMxN2Y5NWFjYzllZmFkZTFiNDExMmZjYyc7XG4gICAgY29uc3QgcmVjb3ZlcnlEZXN0aW5hdGlvbiA9ICcweDAwZTRlYWE2YTI5MWZlMDI5MTg0NTJlNjQ1YjU2NTNjZDI2MGE1ZmMwZmIzNWY2MTkzZDU4MDkxNmFhOWUzODknO1xuICAgIGNvbnN0IHdhbGxldFBhc3NwaHJhc2UgPSAncCRTdzxSanZBZ2Z7bllBWUkyeE0nO1xuXG4gICAgYmVmb3JlRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBsZXQgY2FsbEJhY2sgPSBzYW5kQm94LnN0dWIoU3VpLnByb3RvdHlwZSwgJ2dldEJhbGFuY2UnIGFzIGtleW9mIFN1aSk7XG4gICAgICBjYWxsQmFja1xuICAgICAgICAud2l0aEFyZ3Moc2VuZGVyQWRkcmVzczApXG4gICAgICAgIC5yZXNvbHZlcyh7IHRvdGFsQmFsYW5jZTogJzAnLCBjb2luT2JqZWN0QmFsYW5jZTogJzAnLCBmdW5kc0luQWRkcmVzc0JhbGFuY2U6ICcwJyB9KVxuICAgICAgICAud2l0aEFyZ3Moc2VuZGVyQWRkcmVzczEpXG4gICAgICAgIC5yZXNvbHZlcyh7IHRvdGFsQmFsYW5jZTogJzE4MDAwMDAwMDAnLCBjb2luT2JqZWN0QmFsYW5jZTogJzE4MDAwMDAwMDAnLCBmdW5kc0luQWRkcmVzc0JhbGFuY2U6ICcwJyB9KTtcblxuICAgICAgY2FsbEJhY2sgPSBzYW5kQm94LnN0dWIoU3VpLnByb3RvdHlwZSwgJ2dldElucHV0Q29pbnMnIGFzIGtleW9mIFN1aSk7XG4gICAgICBjYWxsQmFjay53aXRoQXJncyhzZW5kZXJBZGRyZXNzMSkucmVzb2x2ZXMoW1xuICAgICAgICB7XG4gICAgICAgICAgY29pblR5cGU6ICcweDI6OnN1aTo6U1VJJyxcbiAgICAgICAgICBvYmplY3RJZDogJzB4ZmY5M2FkYzJmNTE2ZmNhYTBjNjA0MGUwMWY1MDAyN2EyM2Y5YjE3NjdmNTA0MGViMjI4Mjc5MGE2OTAwY2U3ZicsXG4gICAgICAgICAgdmVyc2lvbjogJzE5NicsXG4gICAgICAgICAgZGlnZXN0OiAnWHJqUk05Wk05OHhkTldpZ0hZUWpDcEdvV3Q2YVpMcHFYZFNFaXhuaGI0cCcsXG4gICAgICAgICAgYmFsYW5jZTogbmV3IEJpZ051bWJlcignMTgwMDAwMDAwMCcpLFxuICAgICAgICB9LFxuICAgICAgXSk7XG5cbiAgICAgIGNhbGxCYWNrID0gc2FuZEJveC5zdHViKFN1aS5wcm90b3R5cGUsICdnZXRGZWVFc3RpbWF0ZScgYXMga2V5b2YgU3VpKTtcbiAgICAgIGNhbGxCYWNrXG4gICAgICAgIC53aXRoQXJncyhcbiAgICAgICAgICAnQUFBQ0FBZ0E4Vk5sQUFBQUFBQWdBT1RxcHFLUi9nS1JoRkxtUmJWbFBOSmdwZndQczE5aGs5V0FrV3FwNDRrQ0FnQUJBUUFBQVFFQ0FBQUJBUUF5Mk9WKzV0a2VWVmphQm5jVlRDOElWNVUwampGL2xheko3NjNodEJFdnpBSC9rNjNDOVJiOHFneGdRT0FmVUFKNkkvbXhkbjlRUU9zaWdua0thUURPZjhRQUFBQUFBQUFBSUFmbnA5MGdNc2RCR0d6MXRXL3NGUWxBcmhrUm1ZamRpWFRYeCtDdnhIalZNdGpsZnViWkhsVlkyZ1ozRlV3dkNGZVZOSTR4ZjVXc3llK3Q0YlFSTDh6b0F3QUFBQUFBQUFEaDlRVUFBQUFBQUE9PSdcbiAgICAgICAgKVxuICAgICAgICAucmVzb2x2ZXMobmV3IEJpZ051bWJlcigxOTk3ODgwKSk7XG4gICAgfSk7XG5cbiAgICBhZnRlckVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgc2FuZEJveC5yZXN0b3JlKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlY292ZXIgYSB0eG4gZm9yIG5vbi1iaXRnbyByZWNvdmVyaWVzIGF0IGFkZHJlc3MgMSBidXQgc2VhcmNoIGZyb20gYWRkcmVzcyAwJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgYmFzZWNvaW4ucmVjb3Zlcih7XG4gICAgICAgIHVzZXJLZXk6IGtleXMudXNlcktleSxcbiAgICAgICAgYmFja3VwS2V5OiBrZXlzLmJhY2t1cEtleSxcbiAgICAgICAgYml0Z29LZXk6IGtleXMuYml0Z29LZXksXG4gICAgICAgIHJlY292ZXJ5RGVzdGluYXRpb24sXG4gICAgICAgIHdhbGxldFBhc3NwaHJhc2UsXG4gICAgICB9KTtcbiAgICAgIHJlcy5zaG91bGQubm90LmJlLmVtcHR5KCk7XG4gICAgICByZXMuc2hvdWxkLmhhc093blByb3BlcnR5KCd0cmFuc2FjdGlvbnMnKTtcbiAgICAgIGNvbnN0IHR4ID0gcmVzLnRyYW5zYWN0aW9uc1swXTtcbiAgICAgIHR4LnNjYW5JbmRleC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICB0eC5yZWNvdmVyeUFtb3VudC5zaG91bGQuZXF1YWwoJzE3OTc4MDIzMzInKTtcbiAgICAgIHR4LnNlcmlhbGl6ZWRUeC5zaG91bGQuZXF1YWwoXG4gICAgICAgICdBQUFDQUFoY1NTaHJBQUFBQUFBZ0FPVHFwcUtSL2dLUmhGTG1SYlZsUE5KZ3Bmd1BzMTloazlXQWtXcXA0NGtDQWdBQkFRQUFBUUVDQUFBQkFRQXkyT1YrNXRrZVZWamFCbmNWVEM4SVY1VTBqakYvbGF6Sjc2M2h0QkV2ekFIL2s2M0M5UmI4cWd4Z1FPQWZVQUo2SS9teGRuOVFRT3NpZ25rS2FRRE9mOFFBQUFBQUFBQUFJQWZucDkwZ01zZEJHR3oxdFcvc0ZRbEFyaGtSbVlqZGlYVFh4K0N2eEhqVk10amxmdWJaSGxWWTJnWjNGVXd2Q0ZlVk5JNHhmNVdzeWUrdDRiUVJMOHpvQXdBQUFBQUFBS1NJSVFBQUFBQUFBQT09J1xuICAgICAgKTtcblxuICAgICAgY29uc3QgVW5zaWduZWRTd2VlcFR4bkRlc2VyaWFsaXplID0gbmV3IFRyYW5zZmVyVHJhbnNhY3Rpb24oYmFzZWNvaW4pO1xuICAgICAgVW5zaWduZWRTd2VlcFR4bkRlc2VyaWFsaXplLmZyb21SYXdUcmFuc2FjdGlvbih0eC5zZXJpYWxpemVkVHgpO1xuICAgICAgY29uc3QgVW5zaWduZWRTd2VlcFR4bkpzb24gPSBVbnNpZ25lZFN3ZWVwVHhuRGVzZXJpYWxpemUudG9Kc29uKCk7XG5cbiAgICAgIHNob3VsZC5lcXVhbChVbnNpZ25lZFN3ZWVwVHhuSnNvbi5pZCwgJ0JxSGNDUjUxbXFVeWk1R0pZRUVEM2N3OUFncEozU3JhVHJ0NWFFOW5Ma0xqJyk7XG4gICAgICBzaG91bGQuZXF1YWwoVW5zaWduZWRTd2VlcFR4bkpzb24uc2VuZGVyLCBzZW5kZXJBZGRyZXNzMSk7XG4gICAgICBzYW5kQm94LmFzc2VydC5jYWxsQ291bnQoYmFzZWNvaW4uZ2V0QmFsYW5jZSwgMik7XG4gICAgICBzYW5kQm94LmFzc2VydC5jYWxsQ291bnQoYmFzZWNvaW4uZ2V0SW5wdXRDb2lucywgMSk7XG4gICAgICBzYW5kQm94LmFzc2VydC5jYWxsQ291bnQoYmFzZWNvaW4uZ2V0RmVlRXN0aW1hdGUsIDEpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWNvdmVyIGEgdHhuIGZvciBub24tYml0Z28gcmVjb3ZlcmllcyBhdCBhZGRyZXNzIDEgYnV0IHNlYXJjaCBmcm9tIGFkZHJlc3MgMScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGJhc2Vjb2luLnJlY292ZXIoe1xuICAgICAgICB1c2VyS2V5OiBrZXlzLnVzZXJLZXksXG4gICAgICAgIGJhY2t1cEtleToga2V5cy5iYWNrdXBLZXksXG4gICAgICAgIGJpdGdvS2V5OiBrZXlzLmJpdGdvS2V5LFxuICAgICAgICByZWNvdmVyeURlc3RpbmF0aW9uLFxuICAgICAgICB3YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgICBzdGFydGluZ1NjYW5JbmRleDogMSxcbiAgICAgIH0pO1xuICAgICAgcmVzLnNob3VsZC5ub3QuYmUuZW1wdHkoKTtcbiAgICAgIHJlcy5zaG91bGQuaGFzT3duUHJvcGVydHkoJ3RyYW5zYWN0aW9ucycpO1xuICAgICAgY29uc3QgdHggPSByZXMudHJhbnNhY3Rpb25zWzBdO1xuICAgICAgdHguc2NhbkluZGV4LnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIHR4LnJlY292ZXJ5QW1vdW50LnNob3VsZC5lcXVhbCgnMTc5NzgwMjMzMicpO1xuICAgICAgdHguc2VyaWFsaXplZFR4LnNob3VsZC5lcXVhbChcbiAgICAgICAgJ0FBQUNBQWhjU1NockFBQUFBQUFnQU9UcXBxS1IvZ0tSaEZMbVJiVmxQTkpncGZ3UHMxOWhrOVdBa1dxcDQ0a0NBZ0FCQVFBQUFRRUNBQUFCQVFBeTJPVis1dGtlVlZqYUJuY1ZUQzhJVjVVMGpqRi9sYXpKNzYzaHRCRXZ6QUgvazYzQzlSYjhxZ3hnUU9BZlVBSjZJL214ZG45UVFPc2lnbmtLYVFET2Y4UUFBQUFBQUFBQUlBZm5wOTBnTXNkQkdHejF0Vy9zRlFsQXJoa1JtWWpkaVhUWHgrQ3Z4SGpWTXRqbGZ1YlpIbFZZMmdaM0ZVd3ZDRmVWTkk0eGY1V3N5ZSt0NGJRUkw4em9Bd0FBQUFBQUFLU0lJUUFBQUFBQUFBPT0nXG4gICAgICApO1xuXG4gICAgICBjb25zdCBVbnNpZ25lZFN3ZWVwVHhuRGVzZXJpYWxpemUgPSBuZXcgVHJhbnNmZXJUcmFuc2FjdGlvbihiYXNlY29pbik7XG4gICAgICBVbnNpZ25lZFN3ZWVwVHhuRGVzZXJpYWxpemUuZnJvbVJhd1RyYW5zYWN0aW9uKHR4LnNlcmlhbGl6ZWRUeCk7XG4gICAgICBjb25zdCBVbnNpZ25lZFN3ZWVwVHhuSnNvbiA9IFVuc2lnbmVkU3dlZXBUeG5EZXNlcmlhbGl6ZS50b0pzb24oKTtcblxuICAgICAgc2hvdWxkLmVxdWFsKFVuc2lnbmVkU3dlZXBUeG5Kc29uLmlkLCAnQnFIY0NSNTFtcVV5aTVHSllFRUQzY3c5QWdwSjNTcmFUcnQ1YUU5bkxrTGonKTtcbiAgICAgIHNob3VsZC5lcXVhbChVbnNpZ25lZFN3ZWVwVHhuSnNvbi5zZW5kZXIsIHNlbmRlckFkZHJlc3MxKTtcbiAgICAgIHNhbmRCb3guYXNzZXJ0LmNhbGxDb3VudChiYXNlY29pbi5nZXRCYWxhbmNlLCAxKTtcbiAgICAgIHNhbmRCb3guYXNzZXJ0LmNhbGxDb3VudChiYXNlY29pbi5nZXRJbnB1dENvaW5zLCAxKTtcbiAgICAgIHNhbmRCb3guYXNzZXJ0LmNhbGxDb3VudChiYXNlY29pbi5nZXRGZWVFc3RpbWF0ZSwgMSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdSZWNvdmVyIFRva2VuIFRyYW5zYWN0aW9ucyBmb3Igd2FsbGV0IHdpdGggbXVsdGlwbGUgYWRkcmVzc2VzOicsICgpID0+IHtcbiAgICBjb25zdCBzYW5kQm94ID0gc2lub24uY3JlYXRlU2FuZGJveCgpO1xuICAgIGNvbnN0IHNlbmRlckFkZHJlc3MwID0gJzB4OTFmMjVlMjM3YjgzYTAwYTYyNzI0ZmRjNGE4MWU0M2Y0OTRkYzZiNDFhMTI0MTQ5MjgyNmQzNmU0ZDEzMWRhMyc7XG4gICAgY29uc3Qgc2VuZGVyQWRkcmVzczEgPSAnMHgzMmQ4ZTU3ZWU2ZDkxZTU1NThkYTA2NzcxNTRjMmYwODU3OTUzNDhlMzE3Zjk1YWNjOWVmYWRlMWI0MTEyZmNjJztcbiAgICBjb25zdCByZWNvdmVyeURlc3RpbmF0aW9uID0gJzB4MDBlNGVhYTZhMjkxZmUwMjkxODQ1MmU2NDViNTY1M2NkMjYwYTVmYzBmYjM1ZjYxOTNkNTgwOTE2YWE5ZTM4OSc7XG4gICAgY29uc3Qgd2FsbGV0UGFzc3BocmFzZSA9ICdwJFN3PFJqdkFnZntuWUFZSTJ4TSc7XG4gICAgY29uc3QgcGFja2FnZUlkID0gJzB4MzZkYmVmODY2YTFkNjJiZjczMjg5ODlhMTBmYjJmMDdkNzY5ZjRlZTU4N2MwZGU0YTBhMjU2ZTU3ZTBhNThhOCc7XG4gICAgY29uc3QgY29pblR5cGUgPSBgJHtwYWNrYWdlSWR9OjpkZWVwOjpERUVQYDtcbiAgICBsZXQgZ2V0QmFsYW5jZVN0dWI6IHNpbm9uLlNpbm9uU3R1YjtcbiAgICBsZXQgZ2V0SW5wdXRDb2luc1N0dWI6IHNpbm9uLlNpbm9uU3R1YjtcbiAgICBsZXQgZ2V0RmVlRXN0aW1hdGVTdHViOiBzaW5vbi5TaW5vblN0dWI7XG5cbiAgICBiZWZvcmVFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIGdldEJhbGFuY2VTdHViID0gc2FuZEJveC5zdHViKFN1aS5wcm90b3R5cGUsICdnZXRCYWxhbmNlJyBhcyBrZXlvZiBTdWkpO1xuICAgICAgZ2V0QmFsYW5jZVN0dWJcbiAgICAgICAgLndpdGhBcmdzKHNlbmRlckFkZHJlc3MwKVxuICAgICAgICAucmVzb2x2ZXMoeyB0b3RhbEJhbGFuY2U6ICc3MDY4NzU2OTInLCBjb2luT2JqZWN0QmFsYW5jZTogJzcwNjg3NTY5MicsIGZ1bmRzSW5BZGRyZXNzQmFsYW5jZTogJzAnIH0pXG4gICAgICAgIC53aXRoQXJncyhzZW5kZXJBZGRyZXNzMCwgY29pblR5cGUpXG4gICAgICAgIC5yZXNvbHZlcyh7IHRvdGFsQmFsYW5jZTogJzAnLCBjb2luT2JqZWN0QmFsYW5jZTogJzAnLCBmdW5kc0luQWRkcmVzc0JhbGFuY2U6ICcwJyB9KVxuICAgICAgICAud2l0aEFyZ3Moc2VuZGVyQWRkcmVzczEpXG4gICAgICAgIC5yZXNvbHZlcyh7IHRvdGFsQmFsYW5jZTogJzEyMDEwMTk3NicsIGNvaW5PYmplY3RCYWxhbmNlOiAnMTIwMTAxOTc2JywgZnVuZHNJbkFkZHJlc3NCYWxhbmNlOiAnMCcgfSlcbiAgICAgICAgLndpdGhBcmdzKHNlbmRlckFkZHJlc3MxLCBjb2luVHlwZSlcbiAgICAgICAgLnJlc29sdmVzKHsgdG90YWxCYWxhbmNlOiAnMTAwMCcsIGNvaW5PYmplY3RCYWxhbmNlOiAnMTAwMCcsIGZ1bmRzSW5BZGRyZXNzQmFsYW5jZTogJzAnIH0pO1xuXG4gICAgICBnZXRJbnB1dENvaW5zU3R1YiA9IHNhbmRCb3guc3R1YihTdWkucHJvdG90eXBlLCAnZ2V0SW5wdXRDb2lucycgYXMga2V5b2YgU3VpKTtcbiAgICAgIGdldElucHV0Q29pbnNTdHViLndpdGhBcmdzKHNlbmRlckFkZHJlc3MxLCBjb2luVHlwZSkucmVzb2x2ZXMoW1xuICAgICAgICB7XG4gICAgICAgICAgY29pblR5cGU6ICcweDM2ZGJlZjg2NmExZDYyYmY3MzI4OTg5YTEwZmIyZjA3ZDc2OWY0ZWU1ODdjMGRlNGEwYTI1NmU1N2UwYTU4YTg6OmRlZXA6OkRFRVAnLFxuICAgICAgICAgIG9iamVjdElkOiAnMHhjZGJhNzZiZGMzZjQ2MGVkMGQ2YWY4MzRmYzE3YjA4MmViOWVhYmQwYjg4NmY5YWYxN2NkNDI5MWYyZjg2MmZhJyxcbiAgICAgICAgICB2ZXJzaW9uOiAnMzQ2OTY4NjYnLFxuICAgICAgICAgIGRpZ2VzdDogJzd2YlNnYUd5dEFUdG5RMmZMUlFvM1Z0Q3dZcjlLanhzdXhMTE1qMmRmQ3NVJyxcbiAgICAgICAgICBiYWxhbmNlOiBuZXcgQmlnTnVtYmVyKCcxMDAwJyksXG4gICAgICAgIH0sXG4gICAgICBdKTtcbiAgICAgIGdldElucHV0Q29pbnNTdHViLndpdGhBcmdzKHNlbmRlckFkZHJlc3MxKS5yZXNvbHZlcyhbXG4gICAgICAgIHtcbiAgICAgICAgICBjb2luVHlwZTogJzB4Mjo6c3VpOjpTVUknLFxuICAgICAgICAgIG9iamVjdElkOiAnMHgwZWNhNzg5MDFlMzQyYjI1MTVmYmY5OWJlMjQzYjNmMDBhZGUwYTdhNTA2NzViMzczMDdmNDRjYzE5NWM5MDQ2JyxcbiAgICAgICAgICB2ZXJzaW9uOiAnMzQ2OTY4NzUnLFxuICAgICAgICAgIGRpZ2VzdDogJ0FQRTNuajR6WW00aFkyWG45QzJuM3lueVBpWXF4Z1RSZWpZVDdQYXJocFU3JyxcbiAgICAgICAgICBiYWxhbmNlOiBuZXcgQmlnTnVtYmVyKCcxMjAwMDAwMDAnKSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGNvaW5UeXBlOiAnMHgyOjpzdWk6OlNVSScsXG4gICAgICAgICAgb2JqZWN0SWQ6ICcweDc2MTIyMjM0MGRiODBkZDlkYTE0NGQ1NTA5ODg3MGJjODFhNzg4MjA1ZTBiYmRkMzRjMmY4ZGYxMmNmNDVhZWInLFxuICAgICAgICAgIHZlcnNpb246ICcyMjcnLFxuICAgICAgICAgIGRpZ2VzdDogJzlid3lqYVNIM1g4YW5yakdVcEQxTnFNckxGVXRHU0NLOUxGdUxiaGpYNjlFJyxcbiAgICAgICAgICBiYWxhbmNlOiBuZXcgQmlnTnVtYmVyKCcxMDE5NzYnKSxcbiAgICAgICAgfSxcbiAgICAgIF0pO1xuXG4gICAgICBnZXRGZWVFc3RpbWF0ZVN0dWIgPSBzYW5kQm94LnN0dWIoU3VpLnByb3RvdHlwZSwgJ2dldEZlZUVzdGltYXRlJyBhcyBrZXlvZiBTdWkpO1xuICAgICAgZ2V0RmVlRXN0aW1hdGVTdHViXG4gICAgICAgIC53aXRoQXJncyhcbiAgICAgICAgICAnQUFBREFRRE51bmE5dy9SZzdRMXErRFQ4RjdDQzY1NnIwTGlHK2E4WHpVS1I4dmhpK3FKdUVRSUFBQUFBSUdiZzJWcGh1RWV6elRWTHlCVHJRR0MrR0pXTVJTVjVZSldrYTdmd21EOUxBQWpvQXdBQUFBQUFBQUFnQU9UcXBxS1IvZ0tSaEZMbVJiVmxQTkpncGZ3UHMxOWhrOVdBa1dxcDQ0a0NBZ0VBQUFFQkFRQUJBUUlBQUFFQ0FETFk1WDdtMlI1VldOb0dkeFZNTHdoWGxUU09NWCtWck1udnJlRzBFUy9NQVE3S2VKQWVOQ3NsRmZ2NW0rSkRzL0FLM2dwNlVHZGJOekIvUk13WlhKQkdxMjRSQWdBQUFBQWdpMnEyc1VnZDBmcmd4V1pWa2dhakpBYjFWNWYxVnphVHJYRVlJeGtMcURBeTJPVis1dGtlVlZqYUJuY1ZUQzhJVjVVMGpqRi9sYXpKNzYzaHRCRXZ6T2dEQUFBQUFBQUFBT0gxQlFBQUFBQUEnXG4gICAgICAgIClcbiAgICAgICAgLnJlc29sdmVzKG5ldyBCaWdOdW1iZXIoMjM0NTUwNCkpO1xuICAgIH0pO1xuXG4gICAgYWZ0ZXJFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIHNhbmRCb3gucmVzdG9yZSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWNvdmVyIGEgdG9rZW4gdHhuIGZvciBub24tYml0Z28gcmVjb3ZlcmllcyBhdCBhZGRyZXNzIDEgYnV0IHNlYXJjaCBmcm9tIGFkZHJlc3MgMCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGJhc2Vjb2luLnJlY292ZXIoe1xuICAgICAgICB1c2VyS2V5OiBrZXlzLnVzZXJLZXksXG4gICAgICAgIGJhY2t1cEtleToga2V5cy5iYWNrdXBLZXksXG4gICAgICAgIGJpdGdvS2V5OiBrZXlzLmJpdGdvS2V5LFxuICAgICAgICByZWNvdmVyeURlc3RpbmF0aW9uLFxuICAgICAgICB3YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgICB0b2tlbkNvbnRyYWN0QWRkcmVzczogcGFja2FnZUlkLFxuICAgICAgfSk7XG4gICAgICByZXMuc2hvdWxkLm5vdC5iZS5lbXB0eSgpO1xuICAgICAgcmVzLnNob3VsZC5oYXNPd25Qcm9wZXJ0eSgndHJhbnNhY3Rpb25zJyk7XG4gICAgICBjb25zdCB0eCA9IHJlcy50cmFuc2FjdGlvbnNbMF07XG4gICAgICB0eC5zY2FuSW5kZXguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgdHgucmVjb3ZlcnlBbW91bnQuc2hvdWxkLmVxdWFsKCcxMDAwJyk7XG4gICAgICB0eC5zZXJpYWxpemVkVHguc2hvdWxkLmVxdWFsKFxuICAgICAgICAnQUFBREFRRE51bmE5dy9SZzdRMXErRFQ4RjdDQzY1NnIwTGlHK2E4WHpVS1I4dmhpK3FKdUVRSUFBQUFBSUdiZzJWcGh1RWV6elRWTHlCVHJRR0MrR0pXTVJTVjVZSldrYTdmd21EOUxBQWpvQXdBQUFBQUFBQUFnQU9UcXBxS1IvZ0tSaEZMbVJiVmxQTkpncGZ3UHMxOWhrOVdBa1dxcDQ0a0NBZ0VBQUFFQkFRQUJBUUlBQUFFQ0FETFk1WDdtMlI1VldOb0dkeFZNTHdoWGxUU09NWCtWck1udnJlRzBFUy9NQVE3S2VKQWVOQ3NsRmZ2NW0rSkRzL0FLM2dwNlVHZGJOekIvUk13WlhKQkdxMjRSQWdBQUFBQWdpMnEyc1VnZDBmcmd4V1pWa2dhakpBYjFWNWYxVnphVHJYRVlJeGtMcURBeTJPVis1dGtlVlZqYUJuY1ZUQzhJVjVVMGpqRi9sYXpKNzYzaHRCRXZ6T2dEQUFBQUFBQUFWbDRuQUFBQUFBQUEnXG4gICAgICApO1xuXG4gICAgICBjb25zdCBVbnNpZ25lZFN3ZWVwVHhuRGVzZXJpYWxpemUgPSBuZXcgVHJhbnNmZXJUcmFuc2FjdGlvbihiYXNlY29pbik7XG4gICAgICBVbnNpZ25lZFN3ZWVwVHhuRGVzZXJpYWxpemUuZnJvbVJhd1RyYW5zYWN0aW9uKHR4LnNlcmlhbGl6ZWRUeCk7XG4gICAgICBjb25zdCBVbnNpZ25lZFN3ZWVwVHhuSnNvbiA9IFVuc2lnbmVkU3dlZXBUeG5EZXNlcmlhbGl6ZS50b0pzb24oKTtcblxuICAgICAgc2hvdWxkLmVxdWFsKFVuc2lnbmVkU3dlZXBUeG5Kc29uLmlkLCAnR0Z1azFWS3kzd3pURmVBVXRybVVlNnN4Umh0ZXp6ckdEZktkcFFUeHY5c28nKTtcbiAgICAgIHNob3VsZC5lcXVhbChVbnNpZ25lZFN3ZWVwVHhuSnNvbi5zZW5kZXIsIHNlbmRlckFkZHJlc3MxKTtcbiAgICAgIHNhbmRCb3guYXNzZXJ0LmNhbGxDb3VudChiYXNlY29pbi5nZXRCYWxhbmNlLCA1KTtcbiAgICAgIHNhbmRCb3guYXNzZXJ0LmNhbGxDb3VudChiYXNlY29pbi5nZXRJbnB1dENvaW5zLCAyKTtcbiAgICAgIHNhbmRCb3guYXNzZXJ0LmNhbGxDb3VudChiYXNlY29pbi5nZXRGZWVFc3RpbWF0ZSwgMSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlY292ZXIgYSB0b2tlbiB0eG4gZm9yIG5vbi1iaXRnbyByZWNvdmVyaWVzIGF0IGFkZHJlc3MgMSBidXQgc2VhcmNoIGZyb20gYWRkcmVzcyAxJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgYmFzZWNvaW4ucmVjb3Zlcih7XG4gICAgICAgIHVzZXJLZXk6IGtleXMudXNlcktleSxcbiAgICAgICAgYmFja3VwS2V5OiBrZXlzLmJhY2t1cEtleSxcbiAgICAgICAgYml0Z29LZXk6IGtleXMuYml0Z29LZXksXG4gICAgICAgIHJlY292ZXJ5RGVzdGluYXRpb24sXG4gICAgICAgIHdhbGxldFBhc3NwaHJhc2UsXG4gICAgICAgIHRva2VuQ29udHJhY3RBZGRyZXNzOiBwYWNrYWdlSWQsXG4gICAgICAgIHN0YXJ0aW5nU2NhbkluZGV4OiAxLFxuICAgICAgfSk7XG4gICAgICByZXMuc2hvdWxkLm5vdC5iZS5lbXB0eSgpO1xuICAgICAgcmVzLnNob3VsZC5oYXNPd25Qcm9wZXJ0eSgndHJhbnNhY3Rpb25zJyk7XG4gICAgICBjb25zdCB0eCA9IHJlcy50cmFuc2FjdGlvbnNbMF07XG4gICAgICB0eC5zY2FuSW5kZXguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgdHgucmVjb3ZlcnlBbW91bnQuc2hvdWxkLmVxdWFsKCcxMDAwJyk7XG4gICAgICB0eC5zZXJpYWxpemVkVHguc2hvdWxkLmVxdWFsKFxuICAgICAgICAnQUFBREFRRE51bmE5dy9SZzdRMXErRFQ4RjdDQzY1NnIwTGlHK2E4WHpVS1I4dmhpK3FKdUVRSUFBQUFBSUdiZzJWcGh1RWV6elRWTHlCVHJRR0MrR0pXTVJTVjVZSldrYTdmd21EOUxBQWpvQXdBQUFBQUFBQUFnQU9UcXBxS1IvZ0tSaEZMbVJiVmxQTkpncGZ3UHMxOWhrOVdBa1dxcDQ0a0NBZ0VBQUFFQkFRQUJBUUlBQUFFQ0FETFk1WDdtMlI1VldOb0dkeFZNTHdoWGxUU09NWCtWck1udnJlRzBFUy9NQVE3S2VKQWVOQ3NsRmZ2NW0rSkRzL0FLM2dwNlVHZGJOekIvUk13WlhKQkdxMjRSQWdBQUFBQWdpMnEyc1VnZDBmcmd4V1pWa2dhakpBYjFWNWYxVnphVHJYRVlJeGtMcURBeTJPVis1dGtlVlZqYUJuY1ZUQzhJVjVVMGpqRi9sYXpKNzYzaHRCRXZ6T2dEQUFBQUFBQUFWbDRuQUFBQUFBQUEnXG4gICAgICApO1xuXG4gICAgICBjb25zdCBVbnNpZ25lZFN3ZWVwVHhuRGVzZXJpYWxpemUgPSBuZXcgVHJhbnNmZXJUcmFuc2FjdGlvbihiYXNlY29pbik7XG4gICAgICBVbnNpZ25lZFN3ZWVwVHhuRGVzZXJpYWxpemUuZnJvbVJhd1RyYW5zYWN0aW9uKHR4LnNlcmlhbGl6ZWRUeCk7XG4gICAgICBjb25zdCBVbnNpZ25lZFN3ZWVwVHhuSnNvbiA9IFVuc2lnbmVkU3dlZXBUeG5EZXNlcmlhbGl6ZS50b0pzb24oKTtcblxuICAgICAgc2hvdWxkLmVxdWFsKFVuc2lnbmVkU3dlZXBUeG5Kc29uLmlkLCAnR0Z1azFWS3kzd3pURmVBVXRybVVlNnN4Umh0ZXp6ckdEZktkcFFUeHY5c28nKTtcbiAgICAgIHNob3VsZC5lcXVhbChVbnNpZ25lZFN3ZWVwVHhuSnNvbi5zZW5kZXIsIHNlbmRlckFkZHJlc3MxKTtcbiAgICAgIHNhbmRCb3guYXNzZXJ0LmNhbGxDb3VudChiYXNlY29pbi5nZXRCYWxhbmNlLCAzKTtcbiAgICAgIHNhbmRCb3guYXNzZXJ0LmNhbGxDb3VudChiYXNlY29pbi5nZXRJbnB1dENvaW5zLCAyKTtcbiAgICAgIHNhbmRCb3guYXNzZXJ0LmNhbGxDb3VudChiYXNlY29pbi5nZXRGZWVFc3RpbWF0ZSwgMSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdSZWNvdmVyIENvbnNvbGlkYXRpb24gVHJhbnNhY3Rpb25zJywgKCkgPT4ge1xuICAgIGNvbnN0IHNhbmRCb3ggPSBzaW5vbi5jcmVhdGVTYW5kYm94KCk7XG4gICAgY29uc3QgcmVjZWl2ZUFkZHJlc3MxID0gJzB4MzJkOGU1N2VlNmQ5MWU1NTU4ZGEwNjc3MTU0YzJmMDg1Nzk1MzQ4ZTMxN2Y5NWFjYzllZmFkZTFiNDExMmZjYyc7XG4gICAgY29uc3QgcmVjZWl2ZUFkZHJlc3MyID0gJzB4ZGY0MDdlM2UyNWU5NDAwZjk3NzlhYzc1NzE1MzdjMjM2MTY4NDE5NGYxYWE1ZGIxMjZhOGY1NzRiNWVkODUxYyc7XG4gICAgY29uc3Qgd2FsbGV0UGFzc3BocmFzZSA9ICdwJFN3PFJqdkFnZntuWUFZSTJ4TSc7XG5cbiAgICBjb25zdCBzZWVkUmVjZWl2ZUFkZHJlc3MxID0gJzB4ZDIwMTU2NmU2YTBiYzAyMGZkMmU2ZjcyZTliZGUyMjIzZjU1MGQ2NGRhYTYxMzk4Y2Q5MTdjMmY3NTAxMzI0YSc7XG4gICAgY29uc3Qgc2VlZFJlY2VpdmVBZGRyZXNzMiA9ICcweDJmYTVkODM5NGJkNmJlYzU1MjViOTU1MGJmNDNiZTA3NWI4MzQyMmQwMTA3YzA1YzcwMDk0NGUzZWFlYzI2ZjknO1xuXG4gICAgYmVmb3JlRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBsZXQgY2FsbEJhY2sgPSBzYW5kQm94LnN0dWIoU3VpLnByb3RvdHlwZSwgJ2dldEJhbGFuY2UnIGFzIGtleW9mIFN1aSk7XG4gICAgICBjYWxsQmFja1xuICAgICAgICAud2l0aEFyZ3MocmVjZWl2ZUFkZHJlc3MxKVxuICAgICAgICAucmVzb2x2ZXMoeyB0b3RhbEJhbGFuY2U6ICcyMDAxMDE5NzYnLCBjb2luT2JqZWN0QmFsYW5jZTogJzIwMDEwMTk3NicsIGZ1bmRzSW5BZGRyZXNzQmFsYW5jZTogJzAnIH0pXG4gICAgICAgIC53aXRoQXJncyhyZWNlaXZlQWRkcmVzczIpXG4gICAgICAgIC5yZXNvbHZlcyh7IHRvdGFsQmFsYW5jZTogJzIwMDAwMDAwMCcsIGNvaW5PYmplY3RCYWxhbmNlOiAnMjAwMDAwMDAwJywgZnVuZHNJbkFkZHJlc3NCYWxhbmNlOiAnMCcgfSlcbiAgICAgICAgLndpdGhBcmdzKHNlZWRSZWNlaXZlQWRkcmVzczEpXG4gICAgICAgIC5yZXNvbHZlcyh7IHRvdGFsQmFsYW5jZTogJzUwMDAwMDAwMCcsIGNvaW5PYmplY3RCYWxhbmNlOiAnNTAwMDAwMDAwJywgZnVuZHNJbkFkZHJlc3NCYWxhbmNlOiAnMCcgfSlcbiAgICAgICAgLndpdGhBcmdzKHNlZWRSZWNlaXZlQWRkcmVzczIpXG4gICAgICAgIC5yZXNvbHZlcyh7IHRvdGFsQmFsYW5jZTogJzIwMDAwMDAwMCcsIGNvaW5PYmplY3RCYWxhbmNlOiAnMjAwMDAwMDAwJywgZnVuZHNJbkFkZHJlc3NCYWxhbmNlOiAnMCcgfSk7XG5cbiAgICAgIGNhbGxCYWNrID0gc2FuZEJveC5zdHViKFN1aS5wcm90b3R5cGUsICdnZXRJbnB1dENvaW5zJyBhcyBrZXlvZiBTdWkpO1xuICAgICAgY2FsbEJhY2tcbiAgICAgICAgLndpdGhBcmdzKHJlY2VpdmVBZGRyZXNzMSlcbiAgICAgICAgLnJlc29sdmVzKFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb2luVHlwZTogJzB4Mjo6c3VpOjpTVUknLFxuICAgICAgICAgICAgb2JqZWN0SWQ6ICcweDk5NmFhYjM2NWQ0NTUxYjZkMTI3NGY1MjBiYmZhN2IwYTU2NmQ1NDhiMmQ1OTBiNTU2NWM2MjM4MTJlN2U3NmQnLFxuICAgICAgICAgICAgdmVyc2lvbjogJzIwMScsXG4gICAgICAgICAgICBkaWdlc3Q6ICdIWHBOVGZ4OVRCZHhGY1hIaTRSemlac1F1REFIYXZSYXNLNlJpMTVyVnd1QScsXG4gICAgICAgICAgICBiYWxhbmNlOiBuZXcgQmlnTnVtYmVyKCcyMDAwMDAwMDAnKSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvaW5UeXBlOiAnMHgyOjpzdWk6OlNVSScsXG4gICAgICAgICAgICBvYmplY3RJZDogJzB4YjM5YzVmMzgwMjA4Y2NlN2ZlMWJhMTI1OGM4ZDE5YmVmYjAyYTgwZjE0OTUyNjE3ZWQzNzA5OGRiZDRkMmRmMCcsXG4gICAgICAgICAgICB2ZXJzaW9uOiAnMTk5JyxcbiAgICAgICAgICAgIGRpZ2VzdDogJ21xazM3aFhMa2lVWWdrWXhrMk15cU55a0NrQ1h3ZTk3dU11czdiRFBoZTInLFxuICAgICAgICAgICAgYmFsYW5jZTogbmV3IEJpZ051bWJlcignMTAxOTc2JyksXG4gICAgICAgICAgfSxcbiAgICAgICAgXSlcbiAgICAgICAgLndpdGhBcmdzKHJlY2VpdmVBZGRyZXNzMilcbiAgICAgICAgLnJlc29sdmVzKFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb2luVHlwZTogJzB4Mjo6c3VpOjpTVUknLFxuICAgICAgICAgICAgb2JqZWN0SWQ6ICcweGZhMDQxMDVlZWRlYmRhYmY3MjlkY2NlY2YwMWQwY2Y1ZjFiNzcwODkyZmFjMmVkOGYxZTY5ZDcxYTMyYTJkMjQnLFxuICAgICAgICAgICAgdmVyc2lvbjogJzIwMicsXG4gICAgICAgICAgICBkaWdlc3Q6ICdEZUFwUlZTclRhOXR0WHZOeUxleFQ0UEpjQWt5eXhTcGkzSlFlVWc0dWE4UScsXG4gICAgICAgICAgICBiYWxhbmNlOiBuZXcgQmlnTnVtYmVyKCcyMDAwMDAwMDAnKSxcbiAgICAgICAgICB9LFxuICAgICAgICBdKVxuICAgICAgICAud2l0aEFyZ3Moc2VlZFJlY2VpdmVBZGRyZXNzMSlcbiAgICAgICAgLnJlc29sdmVzKFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb2luVHlwZTogJzB4Mjo6c3VpOjpTVUknLFxuICAgICAgICAgICAgb2JqZWN0SWQ6ICcweDg2ZTcyOGZkNzI0MmIzYmU2MGU5YzE5NDFhZGQyYzQ3ZmI2NTU3NzkxMDhjMzUwMGEyMTYzMTAyMTg3NDhlMmQnLFxuICAgICAgICAgICAgdmVyc2lvbjogJzE0NycsXG4gICAgICAgICAgICBkaWdlc3Q6ICc2UEpleUVYNEw4Umtqc05hRjVHU01Dd1JqbUZHWXJRQjdmYm1KUEZNTVBITCcsXG4gICAgICAgICAgICBiYWxhbmNlOiAnNTAwMDAwMDAwJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdKVxuICAgICAgICAud2l0aEFyZ3Moc2VlZFJlY2VpdmVBZGRyZXNzMilcbiAgICAgICAgLnJlc29sdmVzKFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb2luVHlwZTogJzB4Mjo6c3VpOjpTVUknLFxuICAgICAgICAgICAgb2JqZWN0SWQ6ICcweGZkNjZkYmZlN2ExNDk3ZjIxMDc0N2IwNTMyZjYyZTY5MjZjYjE0NGM3NWU1MTlmMmRmZmYxN2E0ZjZlNTE1ZmMnLFxuICAgICAgICAgICAgdmVyc2lvbjogJzE0OCcsXG4gICAgICAgICAgICBkaWdlc3Q6ICdQSjNqZlMxRVJTaFNNdEZXWmdtYTRoNmR1V1g4bm01QmVpMXozQnN6eUJrJyxcbiAgICAgICAgICAgIGJhbGFuY2U6ICcyMDAwMDAwMDAnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuXG4gICAgICBjYWxsQmFjayA9IHNhbmRCb3guc3R1YihTdWkucHJvdG90eXBlLCAnZ2V0RmVlRXN0aW1hdGUnIGFzIGtleW9mIFN1aSk7XG4gICAgICBjYWxsQmFja1xuICAgICAgICAud2l0aEFyZ3MoXG4gICAgICAgICAgJ0FBQUNBQWhZYi9jRkFBQUFBQUFna2ZKZUkzdURvQXBpY2svY1NvSGtQMGxOeHJRYUVrRkpLQ2JUYmswVEhhTUNBZ0FCQVFBQUFRRUNBQUFCQVFBeTJPVis1dGtlVlZqYUJuY1ZUQzhJVjVVMGpqRi9sYXpKNzYzaHRCRXZ6QUtaYXFzMlhVVlJ0dEVuVDFJTHY2ZXdwV2JWU0xMVmtMVldYR0k0RXVmbmJja0FBQUFBQUFBQUlQV2YrZjFFa2xXMWdnaTNyd281SnczTGZ0dTlXL1VzeXJackkwRllzQlRaczV4Zk9BSUl6T2YrRzZFbGpJMFp2dnNDcUE4VWxTWVg3VGNKamIxTkxmREhBQUFBQUFBQUFDQUxmS3NaNFQ5WTJ5MXJybEJ4UVEyQm91UzlWRmpCZ1ZmdmJiRmY5VStmOHpMWTVYN20yUjVWV05vR2R4Vk1Md2hYbFRTT01YK1ZyTW52cmVHMEVTL002QU1BQUFBQUFBQUE0ZlVGQUFBQUFBQT0nXG4gICAgICAgIClcbiAgICAgICAgLnJlc29sdmVzKG5ldyBCaWdOdW1iZXIoJzEwMTk3NjAnKSlcbiAgICAgICAgLndpdGhBcmdzKFxuICAgICAgICAgICdBQUFDQUFnQTRmVUZBQUFBQUFBZ2tmSmVJM3VEb0FwaWNrL2NTb0hrUDBsTnhyUWFFa0ZKS0NiVGJrMFRIYU1DQWdBQkFRQUFBUUVDQUFBQkFRRGZRSDQrSmVsQUQ1ZDVySFZ4VTN3allXaEJsUEdxWGJFbXFQVjB0ZTJGSEFINkJCQmU3ZXZhdjNLZHpPendIUXoxOGJkd2lTK3NMdGp4NXAxeG95b3RKTW9BQUFBQUFBQUFJTHZSMVhqbEtLeWxSR2g5cFg0VXBCRkJzQ3Y1QXQ2UkJuK1hYREFibmZSQjMwQitQaVhwUUErWGVheDFjVk44STJGb1FaVHhxbDJ4SnFqMWRMWHRoUnpvQXdBQUFBQUFBQURoOVFVQUFBQUFBQT09J1xuICAgICAgICApXG4gICAgICAgIC5yZXNvbHZlcyhuZXcgQmlnTnVtYmVyKCcxOTk3ODgwJykpXG4gICAgICAgIC53aXRoQXJncyhcbiAgICAgICAgICAnQUFBQ0FBZ0FoTmNYQUFBQUFBQWdpTW1lRGJpY3VoMjVmTHJkZnpleXBMS2l0QUlsbEtEQVN5dk1nMzVMSkFRQ0FnQUJBUUFBQVFFQ0FBQUJBUURTQVZadWFndkFJUDB1YjNMcHZlSWlQMVVOWk5xbUU1ak5rWHd2ZFFFeVNnR0c1eWo5Y2tLenZtRHB3WlFhM1N4SCsyVlhlUkNNTlFDaUZqRUNHSFNPTFpNQUFBQUFBQUFBSUZBQkxMTGpNSmM1MVIwUDhESHkwUGJYd3NZVUQwYjVndlZtaVpzdXBhZnIwZ0ZXYm1vTHdDRDlMbTl5NmIzaUlqOVZEV1RhcGhPWXpaRjhMM1VCTWtyb0F3QUFBQUFBQUFEaDlRVUFBQUFBQUE9PSdcbiAgICAgICAgKVxuICAgICAgICAucmVzb2x2ZXMobmV3IEJpZ051bWJlcignMTk5Nzg4MCcpKVxuICAgICAgICAud2l0aEFyZ3MoXG4gICAgICAgICAgJ0FBQUNBQWdBNGZVRkFBQUFBQUFnaU1tZURiaWN1aDI1ZkxyZGZ6ZXlwTEtpdEFJbGxLREFTeXZNZzM1TEpBUUNBZ0FCQVFBQUFRRUNBQUFCQVFBdnBkZzVTOWEreFZKYmxWQy9RNzRIVzROQ0xRRUh3Rnh3Q1VUajZ1d20rUUg5WnR2K2VoU1g4aEIwZXdVeTlpNXBKc3NVVEhYbEdmTGYveGVrOXVVVi9KUUFBQUFBQUFBQUlBVzJEWmRWV0o5RU5udkw0WjJQT09IZksyWjc0RGdTZ0RRY2k2ME1kUXVYTDZYWU9Vdld2c1ZTVzVWUXYwTytCMXVEUWkwQkI4QmNjQWxFNCtyc0p2bm9Bd0FBQUFBQUFBRGg5UVVBQUFBQUFBPT0nXG4gICAgICAgIClcbiAgICAgICAgLnJlc29sdmVzKG5ldyBCaWdOdW1iZXIoJzE5OTc4ODAnKSk7XG4gICAgfSk7XG5cbiAgICBhZnRlckVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgc2FuZEJveC5yZXN0b3JlKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIHNpZ25lZCBjb25zb2xpZGF0aW9uIHRyYW5zYWN0aW9ucyBmb3IgaG90IHdhbGxldCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGJhc2Vjb2luLnJlY292ZXJDb25zb2xpZGF0aW9ucyh7XG4gICAgICAgIHVzZXJLZXk6IGtleXMudXNlcktleSxcbiAgICAgICAgYmFja3VwS2V5OiBrZXlzLmJhY2t1cEtleSxcbiAgICAgICAgYml0Z29LZXk6IGtleXMuYml0Z29LZXksXG4gICAgICAgIHdhbGxldFBhc3NwaHJhc2UsXG4gICAgICAgIHN0YXJ0aW5nU2NhbkluZGV4OiAxLFxuICAgICAgICBlbmRpbmdTY2FuSW5kZXg6IDMsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgdHJhbnNhY3Rpb25zID0gcmVzLnRyYW5zYWN0aW9ucztcbiAgICAgIHRyYW5zYWN0aW9ucy5sZW5ndGguc2hvdWxkLmVxdWFsKDIpO1xuICAgICAgY29uc3QgdHhuMSA9IHRyYW5zYWN0aW9uc1swXTtcbiAgICAgIHR4bjEuc2NhbkluZGV4LnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIHR4bjEucmVjb3ZlcnlBbW91bnQuc2hvdWxkLmVxdWFsKCcxOTg5ODAyNDAnKTtcbiAgICAgIHR4bjEuc2VyaWFsaXplZFR4LnNob3VsZC5lcXVhbChcbiAgICAgICAgJ0FBQUNBQWlRTXR3TEFBQUFBQUFna2ZKZUkzdURvQXBpY2svY1NvSGtQMGxOeHJRYUVrRkpLQ2JUYmswVEhhTUNBZ0FCQVFBQUFRRUNBQUFCQVFBeTJPVis1dGtlVlZqYUJuY1ZUQzhJVjVVMGpqRi9sYXpKNzYzaHRCRXZ6QUtaYXFzMlhVVlJ0dEVuVDFJTHY2ZXdwV2JWU0xMVmtMVldYR0k0RXVmbmJja0FBQUFBQUFBQUlQV2YrZjFFa2xXMWdnaTNyd281SnczTGZ0dTlXL1VzeXJackkwRllzQlRaczV4Zk9BSUl6T2YrRzZFbGpJMFp2dnNDcUE4VWxTWVg3VGNKamIxTkxmREhBQUFBQUFBQUFDQUxmS3NaNFQ5WTJ5MXJybEJ4UVEyQm91UzlWRmpCZ1ZmdmJiRmY5VStmOHpMWTVYN20yUjVWV05vR2R4Vk1Md2hYbFRTT01YK1ZyTW52cmVHMEVTL002QU1BQUFBQUFBRElIUkVBQUFBQUFBQT0nXG4gICAgICApO1xuXG4gICAgICBjb25zdCB0eG4yID0gdHJhbnNhY3Rpb25zWzFdO1xuICAgICAgdHhuMi5zY2FuSW5kZXguc2hvdWxkLmVxdWFsKDIpO1xuICAgICAgdHhuMi5yZWNvdmVyeUFtb3VudC5zaG91bGQuZXF1YWwoJzE5NzgwMjMzMicpO1xuICAgICAgdHhuMi5zZXJpYWxpemVkVHguc2hvdWxkLmVxdWFsKFxuICAgICAgICAnQUFBQ0FBaGNPY29MQUFBQUFBQWdrZkplSTN1RG9BcGljay9jU29Ia1AwbE54clFhRWtGSktDYlRiazBUSGFNQ0FnQUJBUUFBQVFFQ0FBQUJBUURmUUg0K0plbEFENWQ1ckhWeFUzd2pZV2hCbFBHcVhiRW1xUFYwdGUyRkhBSDZCQkJlN2V2YXYzS2R6T3p3SFF6MThiZHdpUytzTHRqeDVwMXhveW90Sk1vQUFBQUFBQUFBSUx2UjFYamxLS3lsUkdoOXBYNFVwQkZCc0N2NUF0NlJCbitYWERBYm5mUkIzMEIrUGlYcFFBK1hlYXgxY1ZOOEkyRm9RWlR4cWwyeEpxajFkTFh0aFJ6b0F3QUFBQUFBQUtTSUlRQUFBQUFBQUE9PSdcbiAgICAgICk7XG5cbiAgICAgIHJlcy5sYXN0U2NhbkluZGV4LnNob3VsZC5lcXVhbCgyKTtcblxuICAgICAgc2FuZEJveC5hc3NlcnQuY2FsbENvdW50KGJhc2Vjb2luLmdldEJhbGFuY2UsIDIpO1xuICAgICAgc2FuZEJveC5hc3NlcnQuY2FsbENvdW50KGJhc2Vjb2luLmdldElucHV0Q29pbnMsIDIpO1xuICAgICAgc2FuZEJveC5hc3NlcnQuY2FsbENvdW50KGJhc2Vjb2luLmdldEZlZUVzdGltYXRlLCAyKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgdW5zaWduZWQgY29uc29saWRhdGlvbiB0cmFuc2FjdGlvbnMgZm9yIGNvbGQgd2FsbGV0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgYmFzZWNvaW4ucmVjb3ZlckNvbnNvbGlkYXRpb25zKHtcbiAgICAgICAgYml0Z29LZXk6IGtleXMuYml0Z29LZXksXG4gICAgICAgIHN0YXJ0aW5nU2NhbkluZGV4OiAxLFxuICAgICAgICBlbmRpbmdTY2FuSW5kZXg6IDMsXG4gICAgICB9KTtcbiAgICAgIHJlcy5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgdHhSZXF1ZXN0czogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRyYW5zYWN0aW9uczogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdW5zaWduZWRUeDoge1xuICAgICAgICAgICAgICAgICAgc2VyaWFsaXplZFR4OlxuICAgICAgICAgICAgICAgICAgICAnMDAwMDAyMDAwODkwMzJkYzBiMDAwMDAwMDAwMDIwOTFmMjVlMjM3YjgzYTAwYTYyNzI0ZmRjNGE4MWU0M2Y0OTRkYzZiNDFhMTI0MTQ5MjgyNmQzNmU0ZDEzMWRhMzAyMDIwMDAxMDEwMDAwMDEwMTAyMDAwMDAxMDEwMDMyZDhlNTdlZTZkOTFlNTU1OGRhMDY3NzE1NGMyZjA4NTc5NTM0OGUzMTdmOTVhY2M5ZWZhZGUxYjQxMTJmY2MwMjk5NmFhYjM2NWQ0NTUxYjZkMTI3NGY1MjBiYmZhN2IwYTU2NmQ1NDhiMmQ1OTBiNTU2NWM2MjM4MTJlN2U3NmRjOTAwMDAwMDAwMDAwMDAwMjBmNTlmZjlmZDQ0OTI1NWI1ODIwOGI3YWYwYTM5MjcwZGNiN2VkYmJkNWJmNTJjY2FiNjZiMjM0MTU4YjAxNGQ5YjM5YzVmMzgwMjA4Y2NlN2ZlMWJhMTI1OGM4ZDE5YmVmYjAyYTgwZjE0OTUyNjE3ZWQzNzA5OGRiZDRkMmRmMGM3MDAwMDAwMDAwMDAwMDAyMDBiN2NhYjE5ZTEzZjU4ZGIyZDZiYWU1MDcxNDEwZDgxYTJlNGJkNTQ1OGMxODE1N2VmNmRiMTVmZjU0ZjlmZjMzMmQ4ZTU3ZWU2ZDkxZTU1NThkYTA2NzcxNTRjMmYwODU3OTUzNDhlMzE3Zjk1YWNjOWVmYWRlMWI0MTEyZmNjZTgwMzAwMDAwMDAwMDAwMGM4MWQxMTAwMDAwMDAwMDAwMCcsXG4gICAgICAgICAgICAgICAgICBzY2FuSW5kZXg6IDEsXG4gICAgICAgICAgICAgICAgICBjb2luOiAndHN1aScsXG4gICAgICAgICAgICAgICAgICBzaWduYWJsZUhleDogJ2FiODRjOWQwOWM2NzhjMDM4NDM5ZjYzZmNkNDBkMjY1MzVjYzE0ODUxNTEyNTdmNGYxNzViNmU4YTBlOTQzMTYnLFxuICAgICAgICAgICAgICAgICAgZGVyaXZhdGlvblBhdGg6ICdtLzEnLFxuICAgICAgICAgICAgICAgICAgcGFyc2VkVHg6IHtcbiAgICAgICAgICAgICAgICAgICAgaW5wdXRzOiBbXG4gICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzczogJzB4MzJkOGU1N2VlNmQ5MWU1NTU4ZGEwNjc3MTU0YzJmMDg1Nzk1MzQ4ZTMxN2Y5NWFjYzllZmFkZTFiNDExMmZjYycsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVN0cmluZzogJzE5ODk4MDI0MCcsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbmV3IEJpZ051bWJlcignMTk4OTgwMjQwJyksXG4gICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0czogW1xuICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3M6ICcweDkxZjI1ZTIzN2I4M2EwMGE2MjcyNGZkYzRhODFlNDNmNDk0ZGM2YjQxYTEyNDE0OTI4MjZkMzZlNGQxMzFkYTMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVTdHJpbmc6ICcxOTg5ODAyNDAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29pbk5hbWU6ICd0c3VpJyxcbiAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBzcGVuZEFtb3VudDogJzE5ODk4MDI0MCcsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdUcmFuc2ZlcicsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgZmVlSW5mbzoge1xuICAgICAgICAgICAgICAgICAgICBmZWU6IDExMjE3MzYsXG4gICAgICAgICAgICAgICAgICAgIGZlZVN0cmluZzogJzExMjE3MzYnLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIGNvaW5TcGVjaWZpYzoge1xuICAgICAgICAgICAgICAgICAgICBjb21tb25LZXljaGFpbjpcbiAgICAgICAgICAgICAgICAgICAgICAnM2I4OWVlYzlkMmQyZjNiMDQ5ZWNkYTJlN2I1ZjQ3ODI3Zjc5MjdmZTY2MThkNmU4YjEzZjY0ZTdjOTVmNGIwMGI5NTc3YWIwMTM5NWVjZjhlZWI4MDRiNTkwY2VkYWUxNGZmNWZkMzk0N2JmM2I3YTk1YjkzMjdjNDllMjdjNTQnLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHNpZ25hdHVyZVNoYXJlczogW10sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgd2FsbGV0Q29pbjogJ3RzdWknLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHJhbnNhY3Rpb25zOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB1bnNpZ25lZFR4OiB7XG4gICAgICAgICAgICAgICAgICBzZXJpYWxpemVkVHg6XG4gICAgICAgICAgICAgICAgICAgICcwMDAwMDIwMDA4NWMzOWNhMGIwMDAwMDAwMDAwMjA5MWYyNWUyMzdiODNhMDBhNjI3MjRmZGM0YTgxZTQzZjQ5NGRjNmI0MWExMjQxNDkyODI2ZDM2ZTRkMTMxZGEzMDIwMjAwMDEwMTAwMDAwMTAxMDIwMDAwMDEwMTAwZGY0MDdlM2UyNWU5NDAwZjk3NzlhYzc1NzE1MzdjMjM2MTY4NDE5NGYxYWE1ZGIxMjZhOGY1NzRiNWVkODUxYzAxZmEwNDEwNWVlZGViZGFiZjcyOWRjY2VjZjAxZDBjZjVmMWI3NzA4OTJmYWMyZWQ4ZjFlNjlkNzFhMzJhMmQyNGNhMDAwMDAwMDAwMDAwMDAyMGJiZDFkNTc4ZTUyOGFjYTU0NDY4N2RhNTdlMTRhNDExNDFiMDJiZjkwMmRlOTEwNjdmOTc1YzMwMWI5ZGY0NDFkZjQwN2UzZTI1ZTk0MDBmOTc3OWFjNzU3MTUzN2MyMzYxNjg0MTk0ZjFhYTVkYjEyNmE4ZjU3NGI1ZWQ4NTFjZTgwMzAwMDAwMDAwMDAwMGE0ODgyMTAwMDAwMDAwMDAwMCcsXG4gICAgICAgICAgICAgICAgICBzY2FuSW5kZXg6IDIsXG4gICAgICAgICAgICAgICAgICBjb2luOiAndHN1aScsXG4gICAgICAgICAgICAgICAgICBzaWduYWJsZUhleDogJzY2ZDY1MGI0YzRkZWRmNWFiMzNjOTM4MWVlNDYxNDBiMzBiYjg5NmNmMmM2NmI3YjI0MWNhZTcwZDE0MTRmMTYnLFxuICAgICAgICAgICAgICAgICAgZGVyaXZhdGlvblBhdGg6ICdtLzInLFxuICAgICAgICAgICAgICAgICAgcGFyc2VkVHg6IHtcbiAgICAgICAgICAgICAgICAgICAgaW5wdXRzOiBbXG4gICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzczogJzB4ZGY0MDdlM2UyNWU5NDAwZjk3NzlhYzc1NzE1MzdjMjM2MTY4NDE5NGYxYWE1ZGIxMjZhOGY1NzRiNWVkODUxYycsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVN0cmluZzogJzE5NzgwMjMzMicsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbmV3IEJpZ051bWJlcignMTk3ODAyMzMyJyksXG4gICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0czogW1xuICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3M6ICcweDkxZjI1ZTIzN2I4M2EwMGE2MjcyNGZkYzRhODFlNDNmNDk0ZGM2YjQxYTEyNDE0OTI4MjZkMzZlNGQxMzFkYTMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVTdHJpbmc6ICcxOTc4MDIzMzInLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29pbk5hbWU6ICd0c3VpJyxcbiAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBzcGVuZEFtb3VudDogJzE5NzgwMjMzMicsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdUcmFuc2ZlcicsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgZmVlSW5mbzoge1xuICAgICAgICAgICAgICAgICAgICBmZWU6IDIxOTc2NjgsXG4gICAgICAgICAgICAgICAgICAgIGZlZVN0cmluZzogJzIxOTc2NjgnLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIGNvaW5TcGVjaWZpYzoge1xuICAgICAgICAgICAgICAgICAgICBjb21tb25LZXljaGFpbjpcbiAgICAgICAgICAgICAgICAgICAgICAnM2I4OWVlYzlkMmQyZjNiMDQ5ZWNkYTJlN2I1ZjQ3ODI3Zjc5MjdmZTY2MThkNmU4YjEzZjY0ZTdjOTVmNGIwMGI5NTc3YWIwMTM5NWVjZjhlZWI4MDRiNTkwY2VkYWUxNGZmNWZkMzk0N2JmM2I3YTk1YjkzMjdjNDllMjdjNTQnLFxuICAgICAgICAgICAgICAgICAgICBsYXN0U2NhbkluZGV4OiAyLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHNpZ25hdHVyZVNoYXJlczogW10sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgd2FsbGV0Q29pbjogJ3RzdWknLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9KTtcblxuICAgICAgc2FuZEJveC5hc3NlcnQuY2FsbENvdW50KGJhc2Vjb2luLmdldEJhbGFuY2UsIDIpO1xuICAgICAgc2FuZEJveC5hc3NlcnQuY2FsbENvdW50KGJhc2Vjb2luLmdldElucHV0Q29pbnMsIDIpO1xuICAgICAgc2FuZEJveC5hc3NlcnQuY2FsbENvdW50KGJhc2Vjb2luLmdldEZlZUVzdGltYXRlLCAyKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgdW5zaWduZWQgY29uc29saWRhdGlvbiB0cmFuc2FjdGlvbnMgZm9yIGNvbGQgd2FsbGV0IHdpdGggc2VlZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGJhc2Vjb2luLnJlY292ZXJDb25zb2xpZGF0aW9ucyh7XG4gICAgICAgIGJpdGdvS2V5OiBrZXlzLmJpdGdvS2V5V2l0aFNlZWQsXG4gICAgICAgIHN0YXJ0aW5nU2NhbkluZGV4OiAxLFxuICAgICAgICBlbmRpbmdTY2FuSW5kZXg6IDMsXG4gICAgICAgIHNlZWQ6ICcxMjMnLFxuICAgICAgfSk7XG4gICAgICByZXMuc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIHR4UmVxdWVzdHM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0cmFuc2FjdGlvbnM6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHVuc2lnbmVkVHg6IHtcbiAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWRUeDpcbiAgICAgICAgICAgICAgICAgICAgJzAwMDAwMjAwMDg1Y2RjYWIxZDAwMDAwMDAwMDAyMDg4Yzk5ZTBkYjg5Y2JhMWRiOTdjYmFkZDdmMzdiMmE0YjJhMmI0MDIyNTk0YTBjMDRiMmJjYzgzN2U0YjI0MDQwMjAyMDAwMTAxMDAwMDAxMDEwMjAwMDAwMTAxMDBkMjAxNTY2ZTZhMGJjMDIwZmQyZTZmNzJlOWJkZTIyMjNmNTUwZDY0ZGFhNjEzOThjZDkxN2MyZjc1MDEzMjRhMDE4NmU3MjhmZDcyNDJiM2JlNjBlOWMxOTQxYWRkMmM0N2ZiNjU1Nzc5MTA4YzM1MDBhMjE2MzEwMjE4NzQ4ZTJkOTMwMDAwMDAwMDAwMDAwMDIwNTAwMTJjYjJlMzMwOTczOWQ1MWQwZmYwMzFmMmQwZjZkN2MyYzYxNDBmNDZmOTgyZjU2Njg5OWIyZWE1YTdlYmQyMDE1NjZlNmEwYmMwMjBmZDJlNmY3MmU5YmRlMjIyM2Y1NTBkNjRkYWE2MTM5OGNkOTE3YzJmNzUwMTMyNGFlODAzMDAwMDAwMDAwMDAwYTQ4ODIxMDAwMDAwMDAwMDAwJyxcbiAgICAgICAgICAgICAgICAgIHNjYW5JbmRleDogMSxcbiAgICAgICAgICAgICAgICAgIGNvaW46ICd0c3VpJyxcbiAgICAgICAgICAgICAgICAgIHNpZ25hYmxlSGV4OiAnNmQ3YTRjNDg4Mjc0NTcwN2MyY2Q0MGIwYzU3NTY2NjAxYTJhNGQyNjlmNWNiMGE2OTI4Mjg1NTEyMTJjZjQ1MicsXG4gICAgICAgICAgICAgICAgICBkZXJpdmF0aW9uUGF0aDogJ20vOTk5OTk5Lzk0ODYyNjIyLzE1NzM2MzUwOS8xJyxcbiAgICAgICAgICAgICAgICAgIHBhcnNlZFR4OiB7XG4gICAgICAgICAgICAgICAgICAgIGlucHV0czogW1xuICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3M6ICcweGQyMDE1NjZlNmEwYmMwMjBmZDJlNmY3MmU5YmRlMjIyM2Y1NTBkNjRkYWE2MTM5OGNkOTE3YzJmNzUwMTMyNGEnLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVTdHJpbmc6ICc0OTc4MDIzMzInLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG5ldyBCaWdOdW1iZXIoNDk3ODAyMzMyKSxcbiAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBvdXRwdXRzOiBbXG4gICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzczogJzB4ODhjOTllMGRiODljYmExZGI5N2NiYWRkN2YzN2IyYTRiMmEyYjQwMjI1OTRhMGMwNGIyYmNjODM3ZTRiMjQwNCcsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVN0cmluZzogJzQ5NzgwMjMzMicsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2luTmFtZTogJ3RzdWknLFxuICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIHNwZW5kQW1vdW50OiAnNDk3ODAyMzMyJyxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ1RyYW5zZmVyJyxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBmZWVJbmZvOiB7XG4gICAgICAgICAgICAgICAgICAgIGZlZTogMjE5NzY2OCxcbiAgICAgICAgICAgICAgICAgICAgZmVlU3RyaW5nOiAnMjE5NzY2OCcsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgY29pblNwZWNpZmljOiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbW1vbktleWNoYWluOlxuICAgICAgICAgICAgICAgICAgICAgICdjYTBhMDE0YmE2ZjExMTA2YTE1NWVmOGUyY2FiMmY3NmQyNzdlNGYwMWNmZmE1OTFhOWI0MDg0ODM0MzgyM2IzZDkxMDc1MmE0OWM5NmJmNTgxMzk4NTIwNmUyM2M5ZjljZDNhNzhmMWNjY2Y1Y2Y4OGRlZjUyYjU3M2NlZGM5MycsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc2lnbmF0dXJlU2hhcmVzOiBbXSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB3YWxsZXRDb2luOiAndHN1aScsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0cmFuc2FjdGlvbnM6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHVuc2lnbmVkVHg6IHtcbiAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWRUeDpcbiAgICAgICAgICAgICAgICAgICAgJzAwMDAwMjAwMDg1YzM5Y2EwYjAwMDAwMDAwMDAyMDg4Yzk5ZTBkYjg5Y2JhMWRiOTdjYmFkZDdmMzdiMmE0YjJhMmI0MDIyNTk0YTBjMDRiMmJjYzgzN2U0YjI0MDQwMjAyMDAwMTAxMDAwMDAxMDEwMjAwMDAwMTAxMDAyZmE1ZDgzOTRiZDZiZWM1NTI1Yjk1NTBiZjQzYmUwNzViODM0MjJkMDEwN2MwNWM3MDA5NDRlM2VhZWMyNmY5MDFmZDY2ZGJmZTdhMTQ5N2YyMTA3NDdiMDUzMmY2MmU2OTI2Y2IxNDRjNzVlNTE5ZjJkZmZmMTdhNGY2ZTUxNWZjOTQwMDAwMDAwMDAwMDAwMDIwMDViNjBkOTc1NTU4OWY0NDM2N2JjYmUxOWQ4ZjM4ZTFkZjJiNjY3YmUwMzgxMjgwMzQxYzhiYWQwYzc1MGI5NzJmYTVkODM5NGJkNmJlYzU1MjViOTU1MGJmNDNiZTA3NWI4MzQyMmQwMTA3YzA1YzcwMDk0NGUzZWFlYzI2ZjllODAzMDAwMDAwMDAwMDAwYTQ4ODIxMDAwMDAwMDAwMDAwJyxcbiAgICAgICAgICAgICAgICAgIHNjYW5JbmRleDogMixcbiAgICAgICAgICAgICAgICAgIGNvaW46ICd0c3VpJyxcbiAgICAgICAgICAgICAgICAgIHNpZ25hYmxlSGV4OiAnMzJhMDBhNmQ4OTI2MzA0NjdjN2QwNjY2MzkwZDNiMjdjYWFmNGFlZmVlM2RkYTllMGM5N2MzZjhiYzA2YmNlYScsXG4gICAgICAgICAgICAgICAgICBkZXJpdmF0aW9uUGF0aDogJ20vOTk5OTk5Lzk0ODYyNjIyLzE1NzM2MzUwOS8yJyxcbiAgICAgICAgICAgICAgICAgIHBhcnNlZFR4OiB7XG4gICAgICAgICAgICAgICAgICAgIGlucHV0czogW1xuICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3M6ICcweDJmYTVkODM5NGJkNmJlYzU1MjViOTU1MGJmNDNiZTA3NWI4MzQyMmQwMTA3YzA1YzcwMDk0NGUzZWFlYzI2ZjknLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVTdHJpbmc6ICcxOTc4MDIzMzInLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG5ldyBCaWdOdW1iZXIoMTk3ODAyMzMyKSxcbiAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBvdXRwdXRzOiBbXG4gICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzczogJzB4ODhjOTllMGRiODljYmExZGI5N2NiYWRkN2YzN2IyYTRiMmEyYjQwMjI1OTRhMGMwNGIyYmNjODM3ZTRiMjQwNCcsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVN0cmluZzogJzE5NzgwMjMzMicsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2luTmFtZTogJ3RzdWknLFxuICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIHNwZW5kQW1vdW50OiAnMTk3ODAyMzMyJyxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ1RyYW5zZmVyJyxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBmZWVJbmZvOiB7XG4gICAgICAgICAgICAgICAgICAgIGZlZTogMjE5NzY2OCxcbiAgICAgICAgICAgICAgICAgICAgZmVlU3RyaW5nOiAnMjE5NzY2OCcsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgY29pblNwZWNpZmljOiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbW1vbktleWNoYWluOlxuICAgICAgICAgICAgICAgICAgICAgICdjYTBhMDE0YmE2ZjExMTA2YTE1NWVmOGUyY2FiMmY3NmQyNzdlNGYwMWNmZmE1OTFhOWI0MDg0ODM0MzgyM2IzZDkxMDc1MmE0OWM5NmJmNTgxMzk4NTIwNmUyM2M5ZjljZDNhNzhmMWNjY2Y1Y2Y4OGRlZjUyYjU3M2NlZGM5MycsXG4gICAgICAgICAgICAgICAgICAgIGxhc3RTY2FuSW5kZXg6IDIsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc2lnbmF0dXJlU2hhcmVzOiBbXSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB3YWxsZXRDb2luOiAndHN1aScsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0pO1xuXG4gICAgICBzYW5kQm94LmFzc2VydC5jYWxsQ291bnQoYmFzZWNvaW4uZ2V0QmFsYW5jZSwgMik7XG4gICAgICBzYW5kQm94LmFzc2VydC5jYWxsQ291bnQoYmFzZWNvaW4uZ2V0SW5wdXRDb2lucywgMik7XG4gICAgICBzYW5kQm94LmFzc2VydC5jYWxsQ291bnQoYmFzZWNvaW4uZ2V0RmVlRXN0aW1hdGUsIDIpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnUmVjb3ZlciBUb2tlbiBDb25zb2xpZGF0aW9uIFRyYW5zYWN0aW9ucycsICgpID0+IHtcbiAgICBjb25zdCBzYW5kQm94ID0gc2lub24uY3JlYXRlU2FuZGJveCgpO1xuICAgIGNvbnN0IHdhbGxldFBhc3NwaHJhc2UgPSAncCRTdzxSanZBZ2Z7bllBWUkyeE0nO1xuXG4gICAgY29uc3Qgc2VlZFJlY2VpdmVBZGRyZXNzMSA9ICcweGQyMDE1NjZlNmEwYmMwMjBmZDJlNmY3MmU5YmRlMjIyM2Y1NTBkNjRkYWE2MTM5OGNkOTE3YzJmNzUwMTMyNGEnO1xuICAgIGNvbnN0IHNlZWRSZWNlaXZlQWRkcmVzczIgPSAnMHgyZmE1ZDgzOTRiZDZiZWM1NTI1Yjk1NTBiZjQzYmUwNzViODM0MjJkMDEwN2MwNWM3MDA5NDRlM2VhZWMyNmY5JztcblxuICAgIGNvbnN0IHBhY2thZ2VJZCA9ICcweDM2ZGJlZjg2NmExZDYyYmY3MzI4OTg5YTEwZmIyZjA3ZDc2OWY0ZWU1ODdjMGRlNGEwYTI1NmU1N2UwYTU4YTgnO1xuICAgIGNvbnN0IGNvaW5UeXBlID0gYCR7cGFja2FnZUlkfTo6ZGVlcDo6REVFUGA7XG4gICAgY29uc3QgaG90V2FsbGV0UmVjZWl2ZUFkZHJlc3MxID0gJzB4MzJkOGU1N2VlNmQ5MWU1NTU4ZGEwNjc3MTU0YzJmMDg1Nzk1MzQ4ZTMxN2Y5NWFjYzllZmFkZTFiNDExMmZjYyc7XG4gICAgY29uc3QgaG90V2FsbGV0UmVjZWl2ZUFkZHJlc3MyID0gJzB4ZGY0MDdlM2UyNWU5NDAwZjk3NzlhYzc1NzE1MzdjMjM2MTY4NDE5NGYxYWE1ZGIxMjZhOGY1NzRiNWVkODUxYyc7XG4gICAgY29uc3QgY29sZFdhbGxldFJlY2VpdmVBZGRyZXNzMSA9ICcweGE5OTI3MDk1OTFkZWI3NDcxZmIzMGRkYTBmMzM5ZGI3YWI1NDhkMzM5MWE4OWQzZjFmYTBjNzJkMjA5MjY3NWYnO1xuICAgIGNvbnN0IGNvbGRXYWxsZXRSZWNlaXZlQWRkcmVzczIgPSAnMHhjM2FjMmE4NmUzNWI2MmJmYWRhODNmNjM4OGZmMjdjN2RkYTcwOTJjZjBiODI5ZDJkMWY0YzI4MTNlMjhhZTM5JztcblxuICAgIGxldCBnZXRCYWxhbmNlU3R1Yjogc2lub24uU2lub25TdHViO1xuICAgIGxldCBnZXRJbnB1dENvaW5zU3R1Yjogc2lub24uU2lub25TdHViO1xuICAgIGxldCBnZXRGZWVFc3RpbWF0ZVN0dWI6IHNpbm9uLlNpbm9uU3R1YjtcblxuICAgIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgZ2V0QmFsYW5jZVN0dWIgPSBzYW5kQm94LnN0dWIoU3VpLnByb3RvdHlwZSwgJ2dldEJhbGFuY2UnIGFzIGtleW9mIFN1aSk7XG4gICAgICBnZXRJbnB1dENvaW5zU3R1YiA9IHNhbmRCb3guc3R1YihTdWkucHJvdG90eXBlLCAnZ2V0SW5wdXRDb2lucycgYXMga2V5b2YgU3VpKTtcbiAgICAgIGdldEZlZUVzdGltYXRlU3R1YiA9IHNhbmRCb3guc3R1YihTdWkucHJvdG90eXBlLCAnZ2V0RmVlRXN0aW1hdGUnIGFzIGtleW9mIFN1aSk7XG4gICAgfSk7XG5cbiAgICBhZnRlckVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgc2FuZEJveC5yZXN0b3JlKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIHNpZ25lZCB0b2tlbiBjb25zb2xpZGF0aW9uIHRyYW5zYWN0aW9ucyBmb3IgaG90IHdhbGxldCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGdldEJhbGFuY2VTdHViXG4gICAgICAgIC53aXRoQXJncyhob3RXYWxsZXRSZWNlaXZlQWRkcmVzczEpXG4gICAgICAgIC5yZXNvbHZlcyh7IHRvdGFsQmFsYW5jZTogJzExNjcyMDE0NCcsIGNvaW5PYmplY3RCYWxhbmNlOiAnMTE2NzIwMTQ0JywgZnVuZHNJbkFkZHJlc3NCYWxhbmNlOiAnMCcgfSlcbiAgICAgICAgLndpdGhBcmdzKGhvdFdhbGxldFJlY2VpdmVBZGRyZXNzMSwgY29pblR5cGUpXG4gICAgICAgIC5yZXNvbHZlcyh7IHRvdGFsQmFsYW5jZTogJzE1MDAnLCBjb2luT2JqZWN0QmFsYW5jZTogJzE1MDAnLCBmdW5kc0luQWRkcmVzc0JhbGFuY2U6ICcwJyB9KVxuICAgICAgICAud2l0aEFyZ3MoaG90V2FsbGV0UmVjZWl2ZUFkZHJlc3MyKVxuICAgICAgICAucmVzb2x2ZXMoeyB0b3RhbEJhbGFuY2U6ICcxMjAxMDE5NzYnLCBjb2luT2JqZWN0QmFsYW5jZTogJzEyMDEwMTk3NicsIGZ1bmRzSW5BZGRyZXNzQmFsYW5jZTogJzAnIH0pXG4gICAgICAgIC53aXRoQXJncyhob3RXYWxsZXRSZWNlaXZlQWRkcmVzczIsIGNvaW5UeXBlKVxuICAgICAgICAucmVzb2x2ZXMoeyB0b3RhbEJhbGFuY2U6ICcyMDAwJywgY29pbk9iamVjdEJhbGFuY2U6ICcyMDAwJywgZnVuZHNJbkFkZHJlc3NCYWxhbmNlOiAnMCcgfSk7XG4gICAgICBnZXRJbnB1dENvaW5zU3R1YlxuICAgICAgICAud2l0aEFyZ3MoaG90V2FsbGV0UmVjZWl2ZUFkZHJlc3MxLCBjb2luVHlwZSlcbiAgICAgICAgLnJlc29sdmVzKFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb2luVHlwZTogJzB4MzZkYmVmODY2YTFkNjJiZjczMjg5ODlhMTBmYjJmMDdkNzY5ZjRlZTU4N2MwZGU0YTBhMjU2ZTU3ZTBhNThhODo6ZGVlcDo6REVFUCcsXG4gICAgICAgICAgICBvYmplY3RJZDogJzB4OGQyZGE1NzcyMjdlOWI3MTY2ZGJiOWIzY2NlNDgwOTY4Y2Y1NDliNDQ4YzY2Mjc3MWQxMTI0ZDY0MjBiZjc5MicsXG4gICAgICAgICAgICB2ZXJzaW9uOiAnMzQ2OTY4NzgnLFxuICAgICAgICAgICAgZGlnZXN0OiAnQm5pV2lHM3Y3MW96elJpcmIzaE5LRVAxNnBUdTNDcE50M3ZveTF1emdNaTknLFxuICAgICAgICAgICAgYmFsYW5jZTogbmV3IEJpZ051bWJlcignMTUwMCcpLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pXG4gICAgICAgIC53aXRoQXJncyhob3RXYWxsZXRSZWNlaXZlQWRkcmVzczEpXG4gICAgICAgIC5yZXNvbHZlcyhbXG4gICAgICAgICAge1xuICAgICAgICAgICAgY29pblR5cGU6ICcweDI6OnN1aTo6U1VJJyxcbiAgICAgICAgICAgIG9iamVjdElkOiAnMHgwZWNhNzg5MDFlMzQyYjI1MTVmYmY5OWJlMjQzYjNmMDBhZGUwYTdhNTA2NzViMzczMDdmNDRjYzE5NWM5MDQ2JyxcbiAgICAgICAgICAgIHZlcnNpb246ICczNDY5Njg3NycsXG4gICAgICAgICAgICBkaWdlc3Q6ICdEOFhxSlhya1ZHb2VyOTUyR3ZIQmRCRFhwb2Y4SDRGNHBSSkoxd1NuRVNOVycsXG4gICAgICAgICAgICBiYWxhbmNlOiBuZXcgQmlnTnVtYmVyKCcxMTY2MTgxNjgnKSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvaW5UeXBlOiAnMHgyOjpzdWk6OlNVSScsXG4gICAgICAgICAgICBvYmplY3RJZDogJzB4NzYxMjIyMzQwZGI4MGRkOWRhMTQ0ZDU1MDk4ODcwYmM4MWE3ODgyMDVlMGJiZGQzNGMyZjhkZjEyY2Y0NWFlYicsXG4gICAgICAgICAgICB2ZXJzaW9uOiAnMjI3JyxcbiAgICAgICAgICAgIGRpZ2VzdDogJzlid3lqYVNIM1g4YW5yakdVcEQxTnFNckxGVXRHU0NLOUxGdUxiaGpYNjlFJyxcbiAgICAgICAgICAgIGJhbGFuY2U6IG5ldyBCaWdOdW1iZXIoJzEwMTk3NicpLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pXG4gICAgICAgIC53aXRoQXJncyhob3RXYWxsZXRSZWNlaXZlQWRkcmVzczIsIGNvaW5UeXBlKVxuICAgICAgICAucmVzb2x2ZXMoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvaW5UeXBlOiAnMHgzNmRiZWY4NjZhMWQ2MmJmNzMyODk4OWExMGZiMmYwN2Q3NjlmNGVlNTg3YzBkZTRhMGEyNTZlNTdlMGE1OGE4OjpkZWVwOjpERUVQJyxcbiAgICAgICAgICAgIG9iamVjdElkOiAnMHg4ZTE4YmQxNGMzNGUzM2Y4MWM0OTRmNGQ2YzE4ZDA3YzY4NmM3ZjM2MTk2ODJkMjA2NmIzZjU1ZWNmZTcwN2EyJyxcbiAgICAgICAgICAgIHZlcnNpb246ICczNDY5Njg2OCcsXG4gICAgICAgICAgICBkaWdlc3Q6ICc2alpGdThQUldMSllQZXdXN0szbzRHTFZQWW5SeU5vM2tQNjQ1NGVMdUhabScsXG4gICAgICAgICAgICBiYWxhbmNlOiBuZXcgQmlnTnVtYmVyKCcyMDAwJyksXG4gICAgICAgICAgfSxcbiAgICAgICAgXSlcbiAgICAgICAgLndpdGhBcmdzKGhvdFdhbGxldFJlY2VpdmVBZGRyZXNzMilcbiAgICAgICAgLnJlc29sdmVzKFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb2luVHlwZTogJzB4Mjo6c3VpOjpTVUknLFxuICAgICAgICAgICAgb2JqZWN0SWQ6ICcweDgxMWE3NTA2NjEzNDk0NWUzYjAzM2Y0YWM1NGVjODg1ZWMwMzg0ZjQyYTgwOTk0ZDg4YTQ4ZDdkMThjNDI2MGEnLFxuICAgICAgICAgICAgdmVyc2lvbjogJzIzNicsXG4gICAgICAgICAgICBkaWdlc3Q6ICczMk45WnlmZXJHREVWN1BZM3lraWpWVktoTGpFRlNMNml0cWNmUlBDeTRvVycsXG4gICAgICAgICAgICBiYWxhbmNlOiBuZXcgQmlnTnVtYmVyKCcxMDE5NzYnKSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvaW5UeXBlOiAnMHgyOjpzdWk6OlNVSScsXG4gICAgICAgICAgICBvYmplY3RJZDogJzB4Zjg1YTczOGEzMDU2NmQ1NTg4MDAyMjhmMmQ1YzE5M2E1Y2EzZGRiYmRkY2EyYTY1YTQ4YTkzMzIzMDY3MTVjYycsXG4gICAgICAgICAgICB2ZXJzaW9uOiAnMzQ2OTY4NzYnLFxuICAgICAgICAgICAgZGlnZXN0OiAnN2dKZ0NNREVQZFFhTWV1WFo1Q0ZOb25GS01QUXl3Nms1c1QxUnBhSEVYcGUnLFxuICAgICAgICAgICAgYmFsYW5jZTogbmV3IEJpZ051bWJlcignMTIwMDAwMDAwJyksXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG4gICAgICBnZXRGZWVFc3RpbWF0ZVN0dWJcbiAgICAgICAgLndpdGhBcmdzKFxuICAgICAgICAgICdBQUFEQVFDTkxhVjNJbjZiY1diYnViUE01SUNXalBWSnRFakdZbmNkRVNUV1FndjNrcTV1RVFJQUFBQUFJS0JLOFpqcTR5ei9QVEZaTGc2amY2Z0RUc29naWc2M3BkdVhlaUtnek1WS0FBamNCUUFBQUFBQUFBQWdrZkplSTN1RG9BcGljay9jU29Ia1AwbE54clFhRWtGSktDYlRiazBUSGFNQ0FnRUFBQUVCQVFBQkFRSUFBQUVDQURMWTVYN20yUjVWV05vR2R4Vk1Md2hYbFRTT01YK1ZyTW52cmVHMEVTL01BUTdLZUpBZU5Dc2xGZnY1bStKRHMvQUszZ3A2VUdkYk56Qi9STXdaWEpCR3JXNFJBZ0FBQUFBZ3REb3I2YjlFSkhPU1dkSlpDUWRMa0twUzJjUG9CYzViMjhLcFgxcmc3bHN5Mk9WKzV0a2VWVmphQm5jVlRDOElWNVUwampGL2xheko3NjNodEJFdnpPZ0RBQUFBQUFBQUFPSDFCUUFBQUFBQSdcbiAgICAgICAgKVxuICAgICAgICAucmVzb2x2ZXMobmV3IEJpZ051bWJlcignMjM0NTUwNCcpKVxuICAgICAgICAud2l0aEFyZ3MoXG4gICAgICAgICAgJ0FBQURBUUNPR0wwVXcwNHorQnhKVDAxc0dOQjhhR3gvTmhsb0xTQm1zL1ZleitjSG9xUnVFUUlBQUFBQUlGVXhUVFF5VEtNNmJWamVGSEhUOEtWclYyZmdUT0NYN1VvZXZrMnI1SlBjQUFqUUJ3QUFBQUFBQUFBZ2tmSmVJM3VEb0FwaWNrL2NTb0hrUDBsTnhyUWFFa0ZKS0NiVGJrMFRIYU1DQWdFQUFBRUJBUUFCQVFJQUFBRUNBTjlBZmo0bDZVQVBsM21zZFhGVGZDTmhhRUdVOGFwZHNTYW85WFMxN1lVY0FmaGFjNG93Vm0xVmlBQWlqeTFjR1RwY285MjczY29xWmFTS2t6SXdaeFhNckc0UkFnQUFBQUFnWXpmQ1dpeXBDbW1lOElKWmhxbjVuVDgrem9QM1M3c2ZRS2Zlelc5OVlXdmZRSDQrSmVsQUQ1ZDVySFZ4VTN3allXaEJsUEdxWGJFbXFQVjB0ZTJGSE9nREFBQUFBQUFBQU9IMUJRQUFBQUFBJ1xuICAgICAgICApXG4gICAgICAgIC5yZXNvbHZlcyhuZXcgQmlnTnVtYmVyKCcyMzQ1NTA0JykpO1xuXG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBiYXNlY29pbi5yZWNvdmVyQ29uc29saWRhdGlvbnMoe1xuICAgICAgICB1c2VyS2V5OiBrZXlzLnVzZXJLZXksXG4gICAgICAgIGJhY2t1cEtleToga2V5cy5iYWNrdXBLZXksXG4gICAgICAgIGJpdGdvS2V5OiBrZXlzLmJpdGdvS2V5LFxuICAgICAgICB3YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgICB0b2tlbkNvbnRyYWN0QWRkcmVzczogcGFja2FnZUlkLFxuICAgICAgICBzdGFydGluZ1NjYW5JbmRleDogMSxcbiAgICAgICAgZW5kaW5nU2NhbkluZGV4OiAzLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHRyYW5zYWN0aW9ucyA9IHJlcy50cmFuc2FjdGlvbnM7XG4gICAgICB0cmFuc2FjdGlvbnMubGVuZ3RoLnNob3VsZC5lcXVhbCgyKTtcbiAgICAgIGNvbnN0IHR4bjEgPSB0cmFuc2FjdGlvbnNbMF07XG4gICAgICB0eG4xLnNjYW5JbmRleC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICB0eG4xLnJlY292ZXJ5QW1vdW50LnNob3VsZC5lcXVhbCgnMTUwMCcpO1xuICAgICAgdHhuMS5zZXJpYWxpemVkVHguc2hvdWxkLmVxdWFsKFxuICAgICAgICAnQUFBREFRQ05MYVYzSW42YmNXYmJ1YlBNNUlDV2pQVkp0RWpHWW5jZEVTVFdRZ3Yza3E1dUVRSUFBQUFBSUtCSzhaanE0eXovUFRGWkxnNmpmNmdEVHNvZ2lnNjNwZHVYZWlLZ3pNVktBQWpjQlFBQUFBQUFBQUFna2ZKZUkzdURvQXBpY2svY1NvSGtQMGxOeHJRYUVrRkpLQ2JUYmswVEhhTUNBZ0VBQUFFQkFRQUJBUUlBQUFFQ0FETFk1WDdtMlI1VldOb0dkeFZNTHdoWGxUU09NWCtWck1udnJlRzBFUy9NQVE3S2VKQWVOQ3NsRmZ2NW0rSkRzL0FLM2dwNlVHZGJOekIvUk13WlhKQkdyVzRSQWdBQUFBQWd0RG9yNmI5RUpIT1NXZEpaQ1FkTGtLcFMyY1BvQmM1YjI4S3BYMXJnN2xzeTJPVis1dGtlVlZqYUJuY1ZUQzhJVjVVMGpqRi9sYXpKNzYzaHRCRXZ6T2dEQUFBQUFBQUFWbDRuQUFBQUFBQUEnXG4gICAgICApO1xuXG4gICAgICBjb25zdCB0eG4yID0gdHJhbnNhY3Rpb25zWzFdO1xuICAgICAgdHhuMi5zY2FuSW5kZXguc2hvdWxkLmVxdWFsKDIpO1xuICAgICAgdHhuMi5yZWNvdmVyeUFtb3VudC5zaG91bGQuZXF1YWwoJzIwMDAnKTtcbiAgICAgIHR4bjIuc2VyaWFsaXplZFR4LnNob3VsZC5lcXVhbChcbiAgICAgICAgJ0FBQURBUUNPR0wwVXcwNHorQnhKVDAxc0dOQjhhR3gvTmhsb0xTQm1zL1ZleitjSG9xUnVFUUlBQUFBQUlGVXhUVFF5VEtNNmJWamVGSEhUOEtWclYyZmdUT0NYN1VvZXZrMnI1SlBjQUFqUUJ3QUFBQUFBQUFBZ2tmSmVJM3VEb0FwaWNrL2NTb0hrUDBsTnhyUWFFa0ZKS0NiVGJrMFRIYU1DQWdFQUFBRUJBUUFCQVFJQUFBRUNBTjlBZmo0bDZVQVBsM21zZFhGVGZDTmhhRUdVOGFwZHNTYW85WFMxN1lVY0FmaGFjNG93Vm0xVmlBQWlqeTFjR1RwY285MjczY29xWmFTS2t6SXdaeFhNckc0UkFnQUFBQUFnWXpmQ1dpeXBDbW1lOElKWmhxbjVuVDgrem9QM1M3c2ZRS2Zlelc5OVlXdmZRSDQrSmVsQUQ1ZDVySFZ4VTN3allXaEJsUEdxWGJFbXFQVjB0ZTJGSE9nREFBQUFBQUFBVmw0bkFBQUFBQUFBJ1xuICAgICAgKTtcblxuICAgICAgcmVzLmxhc3RTY2FuSW5kZXguc2hvdWxkLmVxdWFsKDIpO1xuXG4gICAgICBzYW5kQm94LmFzc2VydC5jYWxsQ291bnQoYmFzZWNvaW4uZ2V0QmFsYW5jZSwgNik7XG4gICAgICBzYW5kQm94LmFzc2VydC5jYWxsQ291bnQoYmFzZWNvaW4uZ2V0SW5wdXRDb2lucywgNCk7XG4gICAgICBzYW5kQm94LmFzc2VydC5jYWxsQ291bnQoYmFzZWNvaW4uZ2V0RmVlRXN0aW1hdGUsIDIpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBidWlsZCB1bnNpZ25lZCB0b2tlbiBjb25zb2xpZGF0aW9uIHRyYW5zYWN0aW9ucyBmb3IgY29sZCB3YWxsZXQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBnZXRCYWxhbmNlU3R1YlxuICAgICAgICAud2l0aEFyZ3MoY29sZFdhbGxldFJlY2VpdmVBZGRyZXNzMSlcbiAgICAgICAgLnJlc29sdmVzKHsgdG90YWxCYWxhbmNlOiAnMTE2NzIwMTQ0JywgY29pbk9iamVjdEJhbGFuY2U6ICcxMTY3MjAxNDQnLCBmdW5kc0luQWRkcmVzc0JhbGFuY2U6ICcwJyB9KVxuICAgICAgICAud2l0aEFyZ3MoY29sZFdhbGxldFJlY2VpdmVBZGRyZXNzMSwgY29pblR5cGUpXG4gICAgICAgIC5yZXNvbHZlcyh7IHRvdGFsQmFsYW5jZTogJzQwMDAnLCBjb2luT2JqZWN0QmFsYW5jZTogJzQwMDAnLCBmdW5kc0luQWRkcmVzc0JhbGFuY2U6ICcwJyB9KVxuICAgICAgICAud2l0aEFyZ3MoY29sZFdhbGxldFJlY2VpdmVBZGRyZXNzMilcbiAgICAgICAgLnJlc29sdmVzKHsgdG90YWxCYWxhbmNlOiAnMTIwMTAxOTc2JywgY29pbk9iamVjdEJhbGFuY2U6ICcxMjAxMDE5NzYnLCBmdW5kc0luQWRkcmVzc0JhbGFuY2U6ICcwJyB9KVxuICAgICAgICAud2l0aEFyZ3MoY29sZFdhbGxldFJlY2VpdmVBZGRyZXNzMiwgY29pblR5cGUpXG4gICAgICAgIC5yZXNvbHZlcyh7IHRvdGFsQmFsYW5jZTogJzYwMDAnLCBjb2luT2JqZWN0QmFsYW5jZTogJzYwMDAnLCBmdW5kc0luQWRkcmVzc0JhbGFuY2U6ICcwJyB9KTtcbiAgICAgIGdldElucHV0Q29pbnNTdHViXG4gICAgICAgIC53aXRoQXJncyhjb2xkV2FsbGV0UmVjZWl2ZUFkZHJlc3MxLCBjb2luVHlwZSlcbiAgICAgICAgLnJlc29sdmVzKFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb2luVHlwZTogJzB4MzZkYmVmODY2YTFkNjJiZjczMjg5ODlhMTBmYjJmMDdkNzY5ZjRlZTU4N2MwZGU0YTBhMjU2ZTU3ZTBhNThhODo6ZGVlcDo6REVFUCcsXG4gICAgICAgICAgICBvYmplY3RJZDogJzB4OWUyNjE4Njg1ZmZmMzhiOTk5MzU1ZTkzYTQ2OTNjNGJkMThmNjhkZDZiNjU0ZmY2NTU1ZjFmNGFkMjI5ZGNkYicsXG4gICAgICAgICAgICB2ZXJzaW9uOiAnMzQ2OTY4NzYnLFxuICAgICAgICAgICAgZGlnZXN0OiAnRjVpR2pzOTVDblNjQ3RYSEZ1VEpoZFprZkx5YWdXUjFRbTF6REg2U25nTUcnLFxuICAgICAgICAgICAgYmFsYW5jZTogbmV3IEJpZ051bWJlcignNDAwMCcpLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pXG4gICAgICAgIC53aXRoQXJncyhjb2xkV2FsbGV0UmVjZWl2ZUFkZHJlc3MxKVxuICAgICAgICAucmVzb2x2ZXMoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvaW5UeXBlOiAnMHgyOjpzdWk6OlNVSScsXG4gICAgICAgICAgICBvYmplY3RJZDogJzB4OGYzZjdjODk2MTk5NzMyNzE2NmIxNTcxMTE3ZmY2NzIzMmNjZDEyNjdlYzUyYTdlOTczNjc3YmEwNDMxZmZhZCcsXG4gICAgICAgICAgICB2ZXJzaW9uOiAnMjI2JyxcbiAgICAgICAgICAgIGRpZ2VzdDogJ0FXaDd0UG1TOXhtSDRhMnpZTENHNzNZRGlza0NmOHVpemJManBDU3RIaE5WJyxcbiAgICAgICAgICAgIGJhbGFuY2U6IG5ldyBCaWdOdW1iZXIoJzk4OTgwMjQwJyksXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb2luVHlwZTogJzB4Mjo6c3VpOjpTVUknLFxuICAgICAgICAgICAgb2JqZWN0SWQ6ICcweDkxNmUzNWEwYWM2YjUyNWI3ZDM4YTQ0YjY2NzM5NGFhZWU3Y2RlNDFkZmZjODc2OTgwY2ZiYzg4NDU1OTBjZGQnLFxuICAgICAgICAgICAgdmVyc2lvbjogJzM0Njk2ODc4JyxcbiAgICAgICAgICAgIGRpZ2VzdDogJzE0UGZOd1V2ZmNSM21OQVMxYmNOWFRvYW9vVkxuWFFIRGRHeFBGUkpRdFknLFxuICAgICAgICAgICAgYmFsYW5jZTogbmV3IEJpZ051bWJlcignMTIwMDAwMDAwJyksXG4gICAgICAgICAgfSxcbiAgICAgICAgXSlcbiAgICAgICAgLndpdGhBcmdzKGNvbGRXYWxsZXRSZWNlaXZlQWRkcmVzczIsIGNvaW5UeXBlKVxuICAgICAgICAucmVzb2x2ZXMoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvaW5UeXBlOiAnMHgzNmRiZWY4NjZhMWQ2MmJmNzMyODk4OWExMGZiMmYwN2Q3NjlmNGVlNTg3YzBkZTRhMGEyNTZlNTdlMGE1OGE4OjpkZWVwOjpERUVQJyxcbiAgICAgICAgICAgIG9iamVjdElkOiAnMHhjNTQ4YzIyMDQ1NGQyMGUwNzEyYmQyODU4YjA3MjYwYzgyOWExYzg0N2YzODE4YjQ3ODA1OTYxYjU3NDgxM2FiJyxcbiAgICAgICAgICAgIHZlcnNpb246ICczNDY5Njg3NycsXG4gICAgICAgICAgICBkaWdlc3Q6ICc4bUFOZG9za0c4ZUxMeTd6VlU1cm1IUkFYVkhVeUpQQUJmUzFtWUhTbUFZdCcsXG4gICAgICAgICAgICBiYWxhbmNlOiBuZXcgQmlnTnVtYmVyKCc2MDAwJyksXG4gICAgICAgICAgfSxcbiAgICAgICAgXSlcbiAgICAgICAgLndpdGhBcmdzKGNvbGRXYWxsZXRSZWNlaXZlQWRkcmVzczIpXG4gICAgICAgIC5yZXNvbHZlcyhbXG4gICAgICAgICAge1xuICAgICAgICAgICAgY29pblR5cGU6ICcweDI6OnN1aTo6U1VJJyxcbiAgICAgICAgICAgIG9iamVjdElkOiAnMHgzOTZhYjA5ZWU1OGZiMmM5ZmJjY2E4ODdjMDBlZjAxYTMzZDViZmU1NWE1ZDUwNTE0ZTMyYTU5Zjk0OGU5YTA1JyxcbiAgICAgICAgICAgIHZlcnNpb246ICcyMzQnLFxuICAgICAgICAgICAgZGlnZXN0OiAnSFdLVzU2ZHQ4Qk54U1R2WGlXN2R0RFZtTTJneEVleEZ5TlZ6R2o4SFBWcDQnLFxuICAgICAgICAgICAgYmFsYW5jZTogbmV3IEJpZ051bWJlcignMTAxOTc2JyksXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb2luVHlwZTogJzB4Mjo6c3VpOjpTVUknLFxuICAgICAgICAgICAgb2JqZWN0SWQ6ICcweGQ0YmZlZmE1MzI4MjdkNzYxOWE1ODI3OWE4N2RiODE2MzJlMjY3Y2M0OGU2Yjk0YWI4MWE0MzY3ZjAyY2JlZmEnLFxuICAgICAgICAgICAgdmVyc2lvbjogJzM0Njk2ODc5JyxcbiAgICAgICAgICAgIGRpZ2VzdDogJ0dKbnAxb1hOalZYTGNZWTZocVJWOFJtN0c3b2JtazNzOE5oajFiRnNma1VvJyxcbiAgICAgICAgICAgIGJhbGFuY2U6IG5ldyBCaWdOdW1iZXIoJzEyMDAwMDAwMCcpLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuICAgICAgZ2V0RmVlRXN0aW1hdGVTdHViXG4gICAgICAgIC53aXRoQXJncyhcbiAgICAgICAgICAnQUFBREFRQ2VKaGhvWC84NHVaazFYcE9rYVR4TDBZOW8zV3RsVC9aVlh4OUswaW5jMjZ4dUVRSUFBQUFBSU5FNG14czFoR01tb3ZUVTVkZm5Gb291V09QZFZuMG5SRFBidVh5bUFMUExBQWlnRHdBQUFBQUFBQUFnQVdTVjNkcDBqQkZxSVlKQ2cxMDJSd25XeGU1Y2loN1doTVR2UXoweFJDRUNBZ0VBQUFFQkFRQUJBUUlBQUFFQ0FLbVNjSldSM3JkSEg3TU4yZzh6bmJlclZJMHprYWlkUHgrZ3h5MGdrbWRmQVpGdU5hQ3NhMUpiZlRpa1MyWnpsS3J1Zk41QjMveUhhWURQdkloRldRemRybTRSQWdBQUFBQWdBQVBWZWxlYjhwTXU3by9jcDlNd3RHc1VNd0tBMjhDdmlPKzVONzlmb05HcGtuQ1ZrZDYzUngrekRkb1BNNTIzcTFTTk01R29uVDhmb01jdElKSm5YK2dEQUFBQUFBQUFBT0gxQlFBQUFBQUEnXG4gICAgICAgIClcbiAgICAgICAgLnJlc29sdmVzKG5ldyBCaWdOdW1iZXIoJzIzNDU1MDQnKSlcbiAgICAgICAgLndpdGhBcmdzKFxuICAgICAgICAgICdBQUFEQVFERlNNSWdSVTBnNEhFcjBvV0xCeVlNZ3BvY2hIODRHTFI0QlpZYlYwZ1RxNjF1RVFJQUFBQUFJSE5SOWxGN2I3TmRoV2d1dGtseDV2d0xtaWhpalJPSTZUMjRjdHp4OWc2dEFBaHdGd0FBQUFBQUFBQWdBV1NWM2RwMGpCRnFJWUpDZzEwMlJ3bld4ZTVjaWg3V2hNVHZRejB4UkNFQ0FnRUFBQUVCQVFBQkFRSUFBQUVDQU1Pc0tvYmpXMksvcmFnL1k0ai9KOGZkcHdrczhMZ3AwdEgwd29FK0tLNDVBZFMvNzZVeWduMTJHYVdDZWFoOXVCWXk0bWZNU09hNVNyZ2FRMmZ3TEw3NnIyNFJBZ0FBQUFBZzQyMzUwTHFxYWFudWI1VHBqSm5ZbEtpdXBqRjJYYytxZ0RJb2lQT2tVNmpEckNxRzQxdGl2NjJvUDJPSS95ZkgzYWNKTFBDNEtkTFI5TUtCUGlpdU9lZ0RBQUFBQUFBQUFPSDFCUUFBQUFBQSdcbiAgICAgICAgKVxuICAgICAgICAucmVzb2x2ZXMobmV3IEJpZ051bWJlcignMjM0NTUwNCcpKTtcblxuICAgICAgY29uc3QgcmVzID0gYXdhaXQgYmFzZWNvaW4ucmVjb3ZlckNvbnNvbGlkYXRpb25zKHtcbiAgICAgICAgYml0Z29LZXk6IGtleXMuYml0Z29LZXlDb2xkV2FsbGV0LFxuICAgICAgICB0b2tlbkNvbnRyYWN0QWRkcmVzczogcGFja2FnZUlkLFxuICAgICAgICBzdGFydGluZ1NjYW5JbmRleDogMSxcbiAgICAgICAgZW5kaW5nU2NhbkluZGV4OiAzLFxuICAgICAgfSk7XG4gICAgICByZXMuc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIHR4UmVxdWVzdHM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0cmFuc2FjdGlvbnM6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHVuc2lnbmVkVHg6IHtcbiAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWRUeDpcbiAgICAgICAgICAgICAgICAgICAgJzAwMDAwMzAxMDA5ZTI2MTg2ODVmZmYzOGI5OTkzNTVlOTNhNDY5M2M0YmQxOGY2OGRkNmI2NTRmZjY1NTVmMWY0YWQyMjlkY2RiYWM2ZTExMDIwMDAwMDAwMDIwZDEzODliMWIzNTg0NjMyNmEyZjRkNGU1ZDdlNzE2OGEyZTU4ZTNkZDU2N2QyNzQ0MzNkYmI5N2NhNjAwYjNjYjAwMDhhMDBmMDAwMDAwMDAwMDAwMDAyMDAxNjQ5NWRkZGE3NDhjMTE2YTIxODI0MjgzNWQzNjQ3MDlkNmM1ZWU1YzhhMWVkNjg0YzRlZjQzM2QzMTQ0MjEwMjAyMDEwMDAwMDEwMTAxMDAwMTAxMDIwMDAwMDEwMjAwYTk5MjcwOTU5MWRlYjc0NzFmYjMwZGRhMGYzMzlkYjdhYjU0OGQzMzkxYTg5ZDNmMWZhMGM3MmQyMDkyNjc1ZjAxOTE2ZTM1YTBhYzZiNTI1YjdkMzhhNDRiNjY3Mzk0YWFlZTdjZGU0MWRmZmM4NzY5ODBjZmJjODg0NTU5MGNkZGFlNmUxMTAyMDAwMDAwMDAyMDAwMDNkNTdhNTc5YmYyOTMyZWVlOGZkY2E3ZDMzMGI0NmIxNDMzMDI4MGRiYzBhZjg4ZWZiOTM3YmY1ZmEwZDFhOTkyNzA5NTkxZGViNzQ3MWZiMzBkZGEwZjMzOWRiN2FiNTQ4ZDMzOTFhODlkM2YxZmEwYzcyZDIwOTI2NzVmZTgwMzAwMDAwMDAwMDAwMDU2NWUyNzAwMDAwMDAwMDAwMCcsXG4gICAgICAgICAgICAgICAgICBzY2FuSW5kZXg6IDEsXG4gICAgICAgICAgICAgICAgICBjb2luOiAndHN1aTpkZWVwJyxcbiAgICAgICAgICAgICAgICAgIHNpZ25hYmxlSGV4OiAnY2VkYWRlNmMxYzk5ZTM1MzFjOTA1MzZmYTIyOGYwZmIxNDhmMzU2MDVkMWE0ZWRmYmU4ZWI3MzliZGM5OWE0OCcsXG4gICAgICAgICAgICAgICAgICBkZXJpdmF0aW9uUGF0aDogJ20vMScsXG4gICAgICAgICAgICAgICAgICBwYXJzZWRUeDoge1xuICAgICAgICAgICAgICAgICAgICBpbnB1dHM6IFtcbiAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzOiAnMHhhOTkyNzA5NTkxZGViNzQ3MWZiMzBkZGEwZjMzOWRiN2FiNTQ4ZDMzOTFhODlkM2YxZmEwYzcyZDIwOTI2NzVmJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlU3RyaW5nOiAnNDAwMCcsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbmV3IEJpZ051bWJlcignNDAwMCcpLFxuICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIG91dHB1dHM6IFtcbiAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzOiAnMHgwMTY0OTVkZGRhNzQ4YzExNmEyMTgyNDI4MzVkMzY0NzA5ZDZjNWVlNWM4YTFlZDY4NGM0ZWY0MzNkMzE0NDIxJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlU3RyaW5nOiAnNDAwMCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2luTmFtZTogJ3RzdWk6ZGVlcCcsXG4gICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgc3BlbmRBbW91bnQ6ICc0MDAwJyxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ1Rva2VuVHJhbnNmZXInLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIGZlZUluZm86IHtcbiAgICAgICAgICAgICAgICAgICAgZmVlOiAyNTgwMDU0LFxuICAgICAgICAgICAgICAgICAgICBmZWVTdHJpbmc6ICcyNTgwMDU0JyxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBjb2luU3BlY2lmaWM6IHtcbiAgICAgICAgICAgICAgICAgICAgY29tbW9uS2V5Y2hhaW46XG4gICAgICAgICAgICAgICAgICAgICAgJzc5ZDRiOWI1OTRkZjAyOGZlZTM3MjVhNmFmNTFhZTNhYjZhMzUxOWU5ZDJjMzIyZjJjOGZkODE1Yjk2NDk2MzIzYzVhYmE3ZWE4NzRjMTAyZjk2NmYxYTYxZDNjOWE0MmI1ZjMxNzdjNmE4NTcxMmNmMzEzNzE1YWZkZGY4M2Q4JyxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzaWduYXR1cmVTaGFyZXM6IFtdLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHdhbGxldENvaW46ICd0c3VpOmRlZXAnLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHJhbnNhY3Rpb25zOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB1bnNpZ25lZFR4OiB7XG4gICAgICAgICAgICAgICAgICBzZXJpYWxpemVkVHg6XG4gICAgICAgICAgICAgICAgICAgICcwMDAwMDMwMTAwYzU0OGMyMjA0NTRkMjBlMDcxMmJkMjg1OGIwNzI2MGM4MjlhMWM4NDdmMzgxOGI0NzgwNTk2MWI1NzQ4MTNhYmFkNmUxMTAyMDAwMDAwMDAyMDczNTFmNjUxN2I2ZmIzNWQ4NTY4MmViNjQ5NzFlNmZjMGI5YTI4NjI4ZDEzODhlOTNkYjg3MmRjZjFmNjBlYWQwMDA4NzAxNzAwMDAwMDAwMDAwMDAwMjAwMTY0OTVkZGRhNzQ4YzExNmEyMTgyNDI4MzVkMzY0NzA5ZDZjNWVlNWM4YTFlZDY4NGM0ZWY0MzNkMzE0NDIxMDIwMjAxMDAwMDAxMDEwMTAwMDEwMTAyMDAwMDAxMDIwMGMzYWMyYTg2ZTM1YjYyYmZhZGE4M2Y2Mzg4ZmYyN2M3ZGRhNzA5MmNmMGI4MjlkMmQxZjRjMjgxM2UyOGFlMzkwMWQ0YmZlZmE1MzI4MjdkNzYxOWE1ODI3OWE4N2RiODE2MzJlMjY3Y2M0OGU2Yjk0YWI4MWE0MzY3ZjAyY2JlZmFhZjZlMTEwMjAwMDAwMDAwMjBlMzZkZjlkMGJhYWE2OWE5ZWU2Zjk0ZTk4Yzk5ZDg5NGE4YWVhNjMxNzY1ZGNmYWE4MDMyMjg4OGYzYTQ1M2E4YzNhYzJhODZlMzViNjJiZmFkYTgzZjYzODhmZjI3YzdkZGE3MDkyY2YwYjgyOWQyZDFmNGMyODEzZTI4YWUzOWU4MDMwMDAwMDAwMDAwMDA1NjVlMjcwMDAwMDAwMDAwMDAnLFxuICAgICAgICAgICAgICAgICAgc2NhbkluZGV4OiAyLFxuICAgICAgICAgICAgICAgICAgY29pbjogJ3RzdWk6ZGVlcCcsXG4gICAgICAgICAgICAgICAgICBzaWduYWJsZUhleDogJ2QwNTUxNDA5ZDI0OGFjY2RkODk0NzEzYTRjMDNhNmQ4ZjI0MDM0OWE1ZTg1YjkwYWVmMDE5YjVmNDI2MDYyYzgnLFxuICAgICAgICAgICAgICAgICAgZGVyaXZhdGlvblBhdGg6ICdtLzInLFxuICAgICAgICAgICAgICAgICAgcGFyc2VkVHg6IHtcbiAgICAgICAgICAgICAgICAgICAgaW5wdXRzOiBbXG4gICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzczogJzB4YzNhYzJhODZlMzViNjJiZmFkYTgzZjYzODhmZjI3YzdkZGE3MDkyY2YwYjgyOWQyZDFmNGMyODEzZTI4YWUzOScsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVN0cmluZzogJzYwMDAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG5ldyBCaWdOdW1iZXIoJzYwMDAnKSxcbiAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBvdXRwdXRzOiBbXG4gICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzczogJzB4MDE2NDk1ZGRkYTc0OGMxMTZhMjE4MjQyODM1ZDM2NDcwOWQ2YzVlZTVjOGExZWQ2ODRjNGVmNDMzZDMxNDQyMScsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVN0cmluZzogJzYwMDAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29pbk5hbWU6ICd0c3VpOmRlZXAnLFxuICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIHNwZW5kQW1vdW50OiAnNjAwMCcsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdUb2tlblRyYW5zZmVyJyxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBmZWVJbmZvOiB7XG4gICAgICAgICAgICAgICAgICAgIGZlZTogMjU4MDA1NCxcbiAgICAgICAgICAgICAgICAgICAgZmVlU3RyaW5nOiAnMjU4MDA1NCcsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgY29pblNwZWNpZmljOiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbW1vbktleWNoYWluOlxuICAgICAgICAgICAgICAgICAgICAgICc3OWQ0YjliNTk0ZGYwMjhmZWUzNzI1YTZhZjUxYWUzYWI2YTM1MTllOWQyYzMyMmYyYzhmZDgxNWI5NjQ5NjMyM2M1YWJhN2VhODc0YzEwMmY5NjZmMWE2MWQzYzlhNDJiNWYzMTc3YzZhODU3MTJjZjMxMzcxNWFmZGRmODNkOCcsXG4gICAgICAgICAgICAgICAgICAgIGxhc3RTY2FuSW5kZXg6IDIsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc2lnbmF0dXJlU2hhcmVzOiBbXSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB3YWxsZXRDb2luOiAndHN1aTpkZWVwJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSk7XG5cbiAgICAgIHNhbmRCb3guYXNzZXJ0LmNhbGxDb3VudChiYXNlY29pbi5nZXRCYWxhbmNlLCA2KTtcbiAgICAgIHNhbmRCb3guYXNzZXJ0LmNhbGxDb3VudChiYXNlY29pbi5nZXRJbnB1dENvaW5zLCA0KTtcbiAgICAgIHNhbmRCb3guYXNzZXJ0LmNhbGxDb3VudChiYXNlY29pbi5nZXRGZWVFc3RpbWF0ZSwgMik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIHVuc2lnbmVkIHRva2VuIGNvbnNvbGlkYXRpb24gdHJhbnNhY3Rpb25zIGZvciBjb2xkIHdhbGxldCB3aXRoIHNlZWQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBnZXRCYWxhbmNlU3R1YlxuICAgICAgICAud2l0aEFyZ3Moc2VlZFJlY2VpdmVBZGRyZXNzMSlcbiAgICAgICAgLnJlc29sdmVzKHsgdG90YWxCYWxhbmNlOiAnMTIwMTk5Nzg4JywgY29pbk9iamVjdEJhbGFuY2U6ICcxMjAxOTk3ODgnLCBmdW5kc0luQWRkcmVzc0JhbGFuY2U6ICcwJyB9KVxuICAgICAgICAud2l0aEFyZ3Moc2VlZFJlY2VpdmVBZGRyZXNzMSwgY29pblR5cGUpXG4gICAgICAgIC5yZXNvbHZlcyh7IHRvdGFsQmFsYW5jZTogJzE1MDAnLCBjb2luT2JqZWN0QmFsYW5jZTogJzE1MDAnLCBmdW5kc0luQWRkcmVzc0JhbGFuY2U6ICcwJyB9KVxuICAgICAgICAud2l0aEFyZ3Moc2VlZFJlY2VpdmVBZGRyZXNzMilcbiAgICAgICAgLnJlc29sdmVzKHsgdG90YWxCYWxhbmNlOiAnMTIwMTk5Nzg4JywgY29pbk9iamVjdEJhbGFuY2U6ICcxMjAxOTk3ODgnLCBmdW5kc0luQWRkcmVzc0JhbGFuY2U6ICcwJyB9KVxuICAgICAgICAud2l0aEFyZ3Moc2VlZFJlY2VpdmVBZGRyZXNzMiwgY29pblR5cGUpXG4gICAgICAgIC5yZXNvbHZlcyh7IHRvdGFsQmFsYW5jZTogJzIwMDAnLCBjb2luT2JqZWN0QmFsYW5jZTogJzIwMDAnLCBmdW5kc0luQWRkcmVzc0JhbGFuY2U6ICcwJyB9KTtcblxuICAgICAgZ2V0SW5wdXRDb2luc1N0dWJcbiAgICAgICAgLndpdGhBcmdzKHNlZWRSZWNlaXZlQWRkcmVzczEsIGNvaW5UeXBlKVxuICAgICAgICAucmVzb2x2ZXMoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvaW5UeXBlOiAnMHgzNmRiZWY4NjZhMWQ2MmJmNzMyODk4OWExMGZiMmYwN2Q3NjlmNGVlNTg3YzBkZTRhMGEyNTZlNTdlMGE1OGE4OjpkZWVwOjpERUVQJyxcbiAgICAgICAgICAgIG9iamVjdElkOiAnMHhhN2E4YzkxMDI4MDM1YWI0OTk3N2U3MmIwODRlMTQ1ZWIxYzFkZGNmZTJlMDY5MjVmMGY4MzNjZWYyZDFmNjlmJyxcbiAgICAgICAgICAgIHZlcnNpb246ICczNDY5Njg3OCcsXG4gICAgICAgICAgICBkaWdlc3Q6ICdDS2l1WGtGTWFWa24xMmlLaW5aQ3I5YURIZkdwQ1FpUGR5WlVRek5ESjlReCcsXG4gICAgICAgICAgICBiYWxhbmNlOiBuZXcgQmlnTnVtYmVyKCcxNTAwJyksXG4gICAgICAgICAgfSxcbiAgICAgICAgXSlcbiAgICAgICAgLndpdGhBcmdzKHNlZWRSZWNlaXZlQWRkcmVzczEpXG4gICAgICAgIC5yZXNvbHZlcyhbXG4gICAgICAgICAge1xuICAgICAgICAgICAgY29pblR5cGU6ICcweDI6OnN1aTo6U1VJJyxcbiAgICAgICAgICAgIG9iamVjdElkOiAnMHg1ZWVhMDM1M2YwNzgwMTZiNzFhODRjYjQ5NGU2Zjc5MWU5N2NiOGRlNTM0NGRlZjNiYWVkZmZjODljMjdhNGI1JyxcbiAgICAgICAgICAgIHZlcnNpb246ICczNDY5Njg3OScsXG4gICAgICAgICAgICBkaWdlc3Q6ICc2S3Fyd2pLSGhKQ2U0RFhmZEgyeU1MRzhiWEdjU1FvVGVKeTRzaGdoRGJUWicsXG4gICAgICAgICAgICBiYWxhbmNlOiBuZXcgQmlnTnVtYmVyKCcxMjAwMDAwMDAnKSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvaW5UeXBlOiAnMHgyOjpzdWk6OlNVSScsXG4gICAgICAgICAgICBvYmplY3RJZDogJzB4ODZlNzI4ZmQ3MjQyYjNiZTYwZTljMTk0MWFkZDJjNDdmYjY1NTc3OTEwOGMzNTAwYTIxNjMxMDIxODc0OGUyZCcsXG4gICAgICAgICAgICB2ZXJzaW9uOiAnMTQ4JyxcbiAgICAgICAgICAgIGRpZ2VzdDogJ0I5ekpmRVlraVhuQXVMRTZxM1hGSmVMYlBjM0s3cW1qZ0RySFZ2Sm5UNXdhJyxcbiAgICAgICAgICAgIGJhbGFuY2U6IG5ldyBCaWdOdW1iZXIoJzE5OTc4OCcpLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pXG4gICAgICAgIC53aXRoQXJncyhzZWVkUmVjZWl2ZUFkZHJlc3MyLCBjb2luVHlwZSlcbiAgICAgICAgLnJlc29sdmVzKFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb2luVHlwZTogJzB4MzZkYmVmODY2YTFkNjJiZjczMjg5ODlhMTBmYjJmMDdkNzY5ZjRlZTU4N2MwZGU0YTBhMjU2ZTU3ZTBhNThhODo6ZGVlcDo6REVFUCcsXG4gICAgICAgICAgICBvYmplY3RJZDogJzB4ZTE5MWYxNjZlNzFiMWVmMjBmZmRhMGM5MWIyNGRhOTVlY2M5M2I2NTdjNDY0ZDhhMDZmNTYxZDQ2OTI3MjJmMCcsXG4gICAgICAgICAgICB2ZXJzaW9uOiAnMzQ2OTY4ODAnLFxuICAgICAgICAgICAgZGlnZXN0OiAnNEt5aHpmUFFjVFVybnA0VUJ2UjNHc1BFM0RMY2NWREVQZ0JqRHhhV1ZSY3InLFxuICAgICAgICAgICAgYmFsYW5jZTogbmV3IEJpZ051bWJlcignMjAwMCcpLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pXG4gICAgICAgIC53aXRoQXJncyhzZWVkUmVjZWl2ZUFkZHJlc3MyKVxuICAgICAgICAucmVzb2x2ZXMoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvaW5UeXBlOiAnMHgyOjpzdWk6OlNVSScsXG4gICAgICAgICAgICBvYmplY3RJZDogJzB4ZDMyZjk0ODg5ZDBiZmMwNWMyNGVkNmMwMjNkNWQzZDM2NTQyOTRhODM3ZDg1MGQzNzM4YjBlMzUyZTFmNDg2NycsXG4gICAgICAgICAgICB2ZXJzaW9uOiAnMzQ2OTY4ODAnLFxuICAgICAgICAgICAgZGlnZXN0OiAnNVBvMTJZaXVMM05rTlRBdnlXdlJ3dFI1NUp2aXlQVmJjRGZUdkN3UXJUa3InLFxuICAgICAgICAgICAgYmFsYW5jZTogbmV3IEJpZ051bWJlcignMTIwMDAwMDAwJyksXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb2luVHlwZTogJzB4Mjo6c3VpOjpTVUknLFxuICAgICAgICAgICAgb2JqZWN0SWQ6ICcweGZkNjZkYmZlN2ExNDk3ZjIxMDc0N2IwNTMyZjYyZTY5MjZjYjE0NGM3NWU1MTlmMmRmZmYxN2E0ZjZlNTE1ZmMnLFxuICAgICAgICAgICAgdmVyc2lvbjogJzE0OScsXG4gICAgICAgICAgICBkaWdlc3Q6ICc1ZVZjYmJtM05URjZqcWFkVGI0R2paTXpuNzVLRFpCcWNzcFJ6M3NWcnBiUicsXG4gICAgICAgICAgICBiYWxhbmNlOiBuZXcgQmlnTnVtYmVyKCcxOTk3ODgnKSxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcblxuICAgICAgZ2V0RmVlRXN0aW1hdGVTdHViXG4gICAgICAgIC53aXRoQXJncyhcbiAgICAgICAgICAnQUFBREFRQ25xTWtRS0FOYXRKbDM1eXNJVGhSZXNjSGR6K0xnYVNYdytEUE84dEgybjY1dUVRSUFBQUFBSUtnOFpNZUYyWExMYkJkUFF5UG1mdThiWXFDQjJ6L3VhUjVzRzdGb2JsN1ZBQWpjQlFBQUFBQUFBQUFnaU1tZURiaWN1aDI1ZkxyZGZ6ZXlwTEtpdEFJbGxLREFTeXZNZzM1TEpBUUNBZ0VBQUFFQkFRQUJBUUlBQUFFQ0FOSUJWbTVxQzhBZy9TNXZjdW05NGlJL1ZRMWsycVlUbU0yUmZDOTFBVEpLQVY3cUExUHdlQUZyY2FoTXRKVG05NUhwZkxqZVUwVGU4N3J0LzhpY0o2UzFyMjRSQWdBQUFBQWdUeDRpK1JnY0xkQTVxK3Z5bU0rV0VUcHZDbnFFcVI0b1k3UnFRZE5qMm96U0FWWnVhZ3ZBSVAwdWIzTHB2ZUlpUDFVTlpOcW1FNWpOa1h3dmRRRXlTdWdEQUFBQUFBQUFBT0gxQlFBQUFBQUEnXG4gICAgICAgIClcbiAgICAgICAgLnJlc29sdmVzKG5ldyBCaWdOdW1iZXIoJzIzNDU1MDQnKSlcbiAgICAgICAgLndpdGhBcmdzKFxuICAgICAgICAgICdBQUFEQVFEaGtmRm01eHNlOGcvOW9Na2JKTnFWN01rN1pYeEdUWW9HOVdIVWFTY2k4TEJ1RVFJQUFBQUFJREZ2b2tpbkJ4b1d5ZUw2NGxQTTltSlZPcEIwVU9qWmpEdStKMXNrUGNRUEFBalFCd0FBQUFBQUFBQWdpTW1lRGJpY3VoMjVmTHJkZnpleXBMS2l0QUlsbEtEQVN5dk1nMzVMSkFRQ0FnRUFBQUVCQVFBQkFRSUFBQUVDQUMrbDJEbEwxcjdGVWx1VlVMOUR2Z2RiZzBJdEFRZkFYSEFKUk9QcTdDYjVBZE12bElpZEMvd0Z3azdXd0NQVjA5TmxRcFNvTjloUTAzT0xEalV1SDBobnNHNFJBZ0FBQUFBZ1FVV0owL3RQWnQrK3E3S25MWW1BUFdSUm9ubi9XL1hHWXh6eFk2ODl6Szh2cGRnNVM5YSt4VkpibFZDL1E3NEhXNE5DTFFFSHdGeHdDVVRqNnV3bStlZ0RBQUFBQUFBQUFPSDFCUUFBQUFBQSdcbiAgICAgICAgKVxuICAgICAgICAucmVzb2x2ZXMobmV3IEJpZ051bWJlcignMjM0NTUwNCcpKTtcblxuICAgICAgY29uc3QgcmVzID0gYXdhaXQgYmFzZWNvaW4ucmVjb3ZlckNvbnNvbGlkYXRpb25zKHtcbiAgICAgICAgYml0Z29LZXk6IGtleXMuYml0Z29LZXlXaXRoU2VlZCxcbiAgICAgICAgdG9rZW5Db250cmFjdEFkZHJlc3M6IHBhY2thZ2VJZCxcbiAgICAgICAgc3RhcnRpbmdTY2FuSW5kZXg6IDEsXG4gICAgICAgIGVuZGluZ1NjYW5JbmRleDogMyxcbiAgICAgICAgc2VlZDogJzEyMycsXG4gICAgICB9KTtcbiAgICAgIHJlcy5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgdHhSZXF1ZXN0czogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRyYW5zYWN0aW9uczogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdW5zaWduZWRUeDoge1xuICAgICAgICAgICAgICAgICAgc2VyaWFsaXplZFR4OlxuICAgICAgICAgICAgICAgICAgICAnMDAwMDAzMDEwMGE3YThjOTEwMjgwMzVhYjQ5OTc3ZTcyYjA4NGUxNDVlYjFjMWRkY2ZlMmUwNjkyNWYwZjgzM2NlZjJkMWY2OWZhZTZlMTEwMjAwMDAwMDAwMjBhODNjNjRjNzg1ZDk3MmNiNmMxNzRmNDMyM2U2N2VlZjFiNjJhMDgxZGIzZmVlNjkxZTZjMWJiMTY4NmU1ZWQ1MDAwOGRjMDUwMDAwMDAwMDAwMDAwMDIwODhjOTllMGRiODljYmExZGI5N2NiYWRkN2YzN2IyYTRiMmEyYjQwMjI1OTRhMGMwNGIyYmNjODM3ZTRiMjQwNDAyMDIwMTAwMDAwMTAxMDEwMDAxMDEwMjAwMDAwMTAyMDBkMjAxNTY2ZTZhMGJjMDIwZmQyZTZmNzJlOWJkZTIyMjNmNTUwZDY0ZGFhNjEzOThjZDkxN2MyZjc1MDEzMjRhMDE1ZWVhMDM1M2YwNzgwMTZiNzFhODRjYjQ5NGU2Zjc5MWU5N2NiOGRlNTM0NGRlZjNiYWVkZmZjODljMjdhNGI1YWY2ZTExMDIwMDAwMDAwMDIwNGYxZTIyZjkxODFjMmRkMDM5YWJlYmYyOThjZjk2MTEzYTZmMGE3YTg0YTkxZTI4NjNiNDZhNDFkMzYzZGE4Y2QyMDE1NjZlNmEwYmMwMjBmZDJlNmY3MmU5YmRlMjIyM2Y1NTBkNjRkYWE2MTM5OGNkOTE3YzJmNzUwMTMyNGFlODAzMDAwMDAwMDAwMDAwNTY1ZTI3MDAwMDAwMDAwMDAwJyxcbiAgICAgICAgICAgICAgICAgIHNjYW5JbmRleDogMSxcbiAgICAgICAgICAgICAgICAgIGNvaW46ICd0c3VpOmRlZXAnLFxuICAgICAgICAgICAgICAgICAgc2lnbmFibGVIZXg6ICcyMmRlZmE5MTAxZWEzYTM4MzljM2MwMDI2YjI3YTk4MzcxNjVjMDdmY2VjZmY4ZTk0MzUzYmNmM2Q1YTAxMzI4JyxcbiAgICAgICAgICAgICAgICAgIGRlcml2YXRpb25QYXRoOiAnbS85OTk5OTkvOTQ4NjI2MjIvMTU3MzYzNTA5LzEnLFxuICAgICAgICAgICAgICAgICAgcGFyc2VkVHg6IHtcbiAgICAgICAgICAgICAgICAgICAgaW5wdXRzOiBbXG4gICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzczogJzB4ZDIwMTU2NmU2YTBiYzAyMGZkMmU2ZjcyZTliZGUyMjIzZjU1MGQ2NGRhYTYxMzk4Y2Q5MTdjMmY3NTAxMzI0YScsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVN0cmluZzogJzE1MDAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG5ldyBCaWdOdW1iZXIoJzE1MDAnKSxcbiAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBvdXRwdXRzOiBbXG4gICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzczogJzB4ODhjOTllMGRiODljYmExZGI5N2NiYWRkN2YzN2IyYTRiMmEyYjQwMjI1OTRhMGMwNGIyYmNjODM3ZTRiMjQwNCcsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVN0cmluZzogJzE1MDAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29pbk5hbWU6ICd0c3VpOmRlZXAnLFxuICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIHNwZW5kQW1vdW50OiAnMTUwMCcsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdUb2tlblRyYW5zZmVyJyxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBmZWVJbmZvOiB7XG4gICAgICAgICAgICAgICAgICAgIGZlZTogMjU4MDA1NCxcbiAgICAgICAgICAgICAgICAgICAgZmVlU3RyaW5nOiAnMjU4MDA1NCcsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgY29pblNwZWNpZmljOiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbW1vbktleWNoYWluOlxuICAgICAgICAgICAgICAgICAgICAgICdjYTBhMDE0YmE2ZjExMTA2YTE1NWVmOGUyY2FiMmY3NmQyNzdlNGYwMWNmZmE1OTFhOWI0MDg0ODM0MzgyM2IzZDkxMDc1MmE0OWM5NmJmNTgxMzk4NTIwNmUyM2M5ZjljZDNhNzhmMWNjY2Y1Y2Y4OGRlZjUyYjU3M2NlZGM5MycsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc2lnbmF0dXJlU2hhcmVzOiBbXSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB3YWxsZXRDb2luOiAndHN1aTpkZWVwJyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRyYW5zYWN0aW9uczogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdW5zaWduZWRUeDoge1xuICAgICAgICAgICAgICAgICAgc2VyaWFsaXplZFR4OlxuICAgICAgICAgICAgICAgICAgICAnMDAwMDAzMDEwMGUxOTFmMTY2ZTcxYjFlZjIwZmZkYTBjOTFiMjRkYTk1ZWNjOTNiNjU3YzQ2NGQ4YTA2ZjU2MWQ0NjkyNzIyZjBiMDZlMTEwMjAwMDAwMDAwMjAzMTZmYTI0OGE3MDcxYTE2YzllMmZhZTI1M2NjZjY2MjU1M2E5MDc0NTBlOGQ5OGMzYmJlMjc1YjI0M2RjNDBmMDAwOGQwMDcwMDAwMDAwMDAwMDAwMDIwODhjOTllMGRiODljYmExZGI5N2NiYWRkN2YzN2IyYTRiMmEyYjQwMjI1OTRhMGMwNGIyYmNjODM3ZTRiMjQwNDAyMDIwMTAwMDAwMTAxMDEwMDAxMDEwMjAwMDAwMTAyMDAyZmE1ZDgzOTRiZDZiZWM1NTI1Yjk1NTBiZjQzYmUwNzViODM0MjJkMDEwN2MwNWM3MDA5NDRlM2VhZWMyNmY5MDFkMzJmOTQ4ODlkMGJmYzA1YzI0ZWQ2YzAyM2Q1ZDNkMzY1NDI5NGE4MzdkODUwZDM3MzhiMGUzNTJlMWY0ODY3YjA2ZTExMDIwMDAwMDAwMDIwNDE0NTg5ZDNmYjRmNjZkZmJlYWJiMmE3MmQ4OTgwM2Q2NDUxYTI3OWZmNWJmNWM2NjMxY2YxNjNhZjNkY2NhZjJmYTVkODM5NGJkNmJlYzU1MjViOTU1MGJmNDNiZTA3NWI4MzQyMmQwMTA3YzA1YzcwMDk0NGUzZWFlYzI2ZjllODAzMDAwMDAwMDAwMDAwNTY1ZTI3MDAwMDAwMDAwMDAwJyxcbiAgICAgICAgICAgICAgICAgIHNjYW5JbmRleDogMixcbiAgICAgICAgICAgICAgICAgIGNvaW46ICd0c3VpOmRlZXAnLFxuICAgICAgICAgICAgICAgICAgc2lnbmFibGVIZXg6ICcyZTZiYjE3MTY2ZWUxOTcxMDI3MjliZGE0N2IwNmI3YzBiNTk2MmJmNDMxYmJiMDU2MmI5MWUyNjdiNzUxMjlkJyxcbiAgICAgICAgICAgICAgICAgIGRlcml2YXRpb25QYXRoOiAnbS85OTk5OTkvOTQ4NjI2MjIvMTU3MzYzNTA5LzInLFxuICAgICAgICAgICAgICAgICAgcGFyc2VkVHg6IHtcbiAgICAgICAgICAgICAgICAgICAgaW5wdXRzOiBbXG4gICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzczogJzB4MmZhNWQ4Mzk0YmQ2YmVjNTUyNWI5NTUwYmY0M2JlMDc1YjgzNDIyZDAxMDdjMDVjNzAwOTQ0ZTNlYWVjMjZmOScsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVN0cmluZzogJzIwMDAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG5ldyBCaWdOdW1iZXIoJzIwMDAnKSxcbiAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBvdXRwdXRzOiBbXG4gICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzczogJzB4ODhjOTllMGRiODljYmExZGI5N2NiYWRkN2YzN2IyYTRiMmEyYjQwMjI1OTRhMGMwNGIyYmNjODM3ZTRiMjQwNCcsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVN0cmluZzogJzIwMDAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29pbk5hbWU6ICd0c3VpOmRlZXAnLFxuICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIHNwZW5kQW1vdW50OiAnMjAwMCcsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdUb2tlblRyYW5zZmVyJyxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBmZWVJbmZvOiB7XG4gICAgICAgICAgICAgICAgICAgIGZlZTogMjU4MDA1NCxcbiAgICAgICAgICAgICAgICAgICAgZmVlU3RyaW5nOiAnMjU4MDA1NCcsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgY29pblNwZWNpZmljOiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbW1vbktleWNoYWluOlxuICAgICAgICAgICAgICAgICAgICAgICdjYTBhMDE0YmE2ZjExMTA2YTE1NWVmOGUyY2FiMmY3NmQyNzdlNGYwMWNmZmE1OTFhOWI0MDg0ODM0MzgyM2IzZDkxMDc1MmE0OWM5NmJmNTgxMzk4NTIwNmUyM2M5ZjljZDNhNzhmMWNjY2Y1Y2Y4OGRlZjUyYjU3M2NlZGM5MycsXG4gICAgICAgICAgICAgICAgICAgIGxhc3RTY2FuSW5kZXg6IDIsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc2lnbmF0dXJlU2hhcmVzOiBbXSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB3YWxsZXRDb2luOiAndHN1aTpkZWVwJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSk7XG5cbiAgICAgIHNhbmRCb3guYXNzZXJ0LmNhbGxDb3VudChiYXNlY29pbi5nZXRCYWxhbmNlLCA2KTtcbiAgICAgIHNhbmRCb3guYXNzZXJ0LmNhbGxDb3VudChiYXNlY29pbi5nZXRJbnB1dENvaW5zLCA0KTtcbiAgICAgIHNhbmRCb3guYXNzZXJ0LmNhbGxDb3VudChiYXNlY29pbi5nZXRGZWVFc3RpbWF0ZSwgMik7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdDcmVhdGUgQnJvYWRjYXN0YWJsZSBNUEMgVHJhbnNhY3Rpb24nLCAoKSA9PiB7XG4gICAgaXQoJ2NyZWF0ZSBicm9hZGNhc3RhYmxlIE1QQyB0cmFuc2FjdGlvbiBmb3IgT1ZDIHNpZ25lZCBzd2VlcCB0cmFuc2FjdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHNpZ25hdHVyZVNoYXJlcyA9IHtcbiAgICAgICAgc2lnbmF0dXJlU2hhcmVzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHhSZXF1ZXN0OiB7XG4gICAgICAgICAgICAgIHRyYW5zYWN0aW9uczogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkVHg6IHtcbiAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplZFR4OlxuICAgICAgICAgICAgICAgICAgICAgICcwMDAwMDIwMDA4Yzg4YjkwMmYwMDAwMDAwMDAwMjBkZjQwN2UzZTI1ZTk0MDBmOTc3OWFjNzU3MTUzN2MyMzYxNjg0MTk0ZjFhYTVkYjEyNmE4ZjU3NGI1ZWQ4NTFjMDIwMjAwMDEwMTAwMDAwMTAxMDIwMDAwMDEwMTAwMDE2NDk1ZGRkYTc0OGMxMTZhMjE4MjQyODM1ZDM2NDcwOWQ2YzVlZTVjOGExZWQ2ODRjNGVmNDMzZDMxNDQyMTAxNDU1M2IwZjZmNzllZDk1OTQyMTQxODM1ZGUzYWIwODZiZjM4ZDFmMWQ5NjI3Mjk4MWUxMzkwYjg0ZmI4NmIzNmM5MDAwMDAwMDAwMDAwMDAyMDBiMWRlOGZkZmJiYjhhNmZhMmM2NWVjNzlhNTU3MDNjOWE5ZjBjMjY4NWE3NjhmMmI4MWEwNDI2YmM5MzJlYzMwMTY0OTVkZGRhNzQ4YzExNmEyMTgyNDI4MzVkMzY0NzA5ZDZjNWVlNWM4YTFlZDY4NGM0ZWY0MzNkMzE0NDIxZTgwMzAwMDAwMDAwMDAwMGE0ODgyMTAwMDAwMDAwMDAwMCcsXG4gICAgICAgICAgICAgICAgICAgIHNjYW5JbmRleDogMCxcbiAgICAgICAgICAgICAgICAgICAgY29pbjogJ3RzdWknLFxuICAgICAgICAgICAgICAgICAgICBzaWduYWJsZUhleDogJ2E0Y2U4ZWIxMTM2MmNkNDVjMDk5MzZlNzQ1MDQ0ZGM3OGIyNjg5ZTVkODE0N2I5ZWE5YTdkZTQzZWU0MzkyM2EnLFxuICAgICAgICAgICAgICAgICAgICBkZXJpdmF0aW9uUGF0aDogJ20vMCcsXG4gICAgICAgICAgICAgICAgICAgIHBhcnNlZFR4OiB7XG4gICAgICAgICAgICAgICAgICAgICAgaW5wdXRzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3M6ICcweDAxNjQ5NWRkZGE3NDhjMTE2YTIxODI0MjgzNWQzNjQ3MDlkNmM1ZWU1YzhhMWVkNjg0YzRlZjQzM2QzMTQ0MjEnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVN0cmluZzogJzc5ODAwMjEyMCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgczogMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlOiA4LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGM6IFs3OTgwMDIxMjBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgIG91dHB1dHM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzczogJzB4ZGY0MDdlM2UyNWU5NDAwZjk3NzlhYzc1NzE1MzdjMjM2MTY4NDE5NGYxYWE1ZGIxMjZhOGY1NzRiNWVkODUxYycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlU3RyaW5nOiAnNzk4MDAyMTIwJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29pbk5hbWU6ICd0c3VpJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICBzcGVuZEFtb3VudDogJzc5ODAwMjEyMCcsXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ1RyYW5zZmVyJyxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgZmVlSW5mbzoge1xuICAgICAgICAgICAgICAgICAgICAgIGZlZTogMjE5NzY2OCxcbiAgICAgICAgICAgICAgICAgICAgICBmZWVTdHJpbmc6ICcyMTk3NjY4JyxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgY29pblNwZWNpZmljOiB7XG4gICAgICAgICAgICAgICAgICAgICAgY29tbW9uS2V5Y2hhaW46XG4gICAgICAgICAgICAgICAgICAgICAgICAnNzlkNGI5YjU5NGRmMDI4ZmVlMzcyNWE2YWY1MWFlM2FiNmEzNTE5ZTlkMmMzMjJmMmM4ZmQ4MTViOTY0OTYzMjNjNWFiYTdlYTg3NGMxMDJmOTY2ZjFhNjFkM2M5YTQyYjVmMzE3N2M2YTg1NzEyY2YzMTM3MTVhZmRkZjgzZDgnLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZVNoYXJlczogW10sXG4gICAgICAgICAgICAgICAgICBzaWduYXR1cmVTaGFyZToge1xuICAgICAgICAgICAgICAgICAgICBmcm9tOiAnYmFja3VwJyxcbiAgICAgICAgICAgICAgICAgICAgdG86ICd1c2VyJyxcbiAgICAgICAgICAgICAgICAgICAgc2hhcmU6XG4gICAgICAgICAgICAgICAgICAgICAgJzZmNDcwOTA2ZGY4OGMzM2IyN2M4ZDExM2VkOTQ0ZWQwYTRmYzQ5OWJhNmNjNzZmMDBiODkyNDk0MjgxMmQ3ODM1NzkyZWU0NTVjYmM4OTQxZmFiYTdiY2M5M2IxNWE5Y2QxOThhMjBkYzNmMGI2MjlmNWZkY2VhYjM0ZTY2MTAwJyxcbiAgICAgICAgICAgICAgICAgICAgcHVibGljU2hhcmU6ICcyODQ0OTZjYTA0Y2M2MDM4MjNmNzk5M2FlZjEzZjcyZjMzMWQ5NzA4NWIyMTg0ZDdhNmE0NjNhOTBhYTkyN2QwJyxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgd2FsbGV0Q29pbjogJ3RzdWknLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRzc1ZlcnNpb246ICcwLjAuMScsXG4gICAgICAgICAgICBvdmM6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGVkZHNhU2lnbmF0dXJlOiB7XG4gICAgICAgICAgICAgICAgICB5OiAnMjg0NDk2Y2EwNGNjNjAzODIzZjc5OTNhZWYxM2Y3MmYzMzFkOTcwODViMjE4NGQ3YTZhNDYzYTkwYWE5MjdkMCcsXG4gICAgICAgICAgICAgICAgICBSOiAnNmY0NzA5MDZkZjg4YzMzYjI3YzhkMTEzZWQ5NDRlZDBhNGZjNDk5YmE2Y2M3NmYwMGI4OTI0OTQyODEyZDc4MycsXG4gICAgICAgICAgICAgICAgICBzaWdtYTogJzVjMjNhOGM3MmNlMTkyNzMxZTcwMmRhNDYwYWVhNzllZDY2MzM0YjRhNzgzZGNmNmRkMjc1ODM0N2Q2YzlmMGQnLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBiYXNlY29pbi5jcmVhdGVCcm9hZGNhc3RhYmxlU3dlZXBUcmFuc2FjdGlvbihzaWduYXR1cmVTaGFyZXMpO1xuXG4gICAgICByZXMuc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIHRyYW5zYWN0aW9uczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHNlcmlhbGl6ZWRUeDpcbiAgICAgICAgICAgICAgJ0FBQUNBQWpJaTVBdkFBQUFBQUFnMzBCK1BpWHBRQStYZWF4MWNWTjhJMkZvUVpUeHFsMnhKcWoxZExYdGhSd0NBZ0FCQVFBQUFRRUNBQUFCQVFBQlpKWGQyblNNRVdvaGdrS0RYVFpIQ2RiRjdseUtIdGFFeE85RFBURkVJUUZGVTdEMjk1N1pXVUlVR0RYZU9yQ0d2empSOGRsaWNwZ2VFNUM0VDdock5za0FBQUFBQUFBQUlBc2Q2UDM3dTRwdm9zWmV4NXBWY0R5YW53d21oYWRvOHJnYUJDYThreTdEQVdTVjNkcDBqQkZxSVlKQ2cxMDJSd25XeGU1Y2loN1doTVR2UXoweFJDSG9Bd0FBQUFBQUFLU0lJUUFBQUFBQUFBPT0nLFxuICAgICAgICAgICAgc2NhbkluZGV4OiAwLFxuICAgICAgICAgICAgc2lnbmF0dXJlOlxuICAgICAgICAgICAgICAnQUc5SENRYmZpTU03SjhqUkUrMlVUdENrL0VtYnBzeDI4QXVKSkpRb0V0ZURYQ09veHl6aGtuTWVjQzJrWUs2bm50WmpOTFNuZzl6MjNTZFlOSDFzbncwb1JKYktCTXhnT0NQM21UcnZFL2N2TXgyWENGc2hoTmVtcEdPcENxa24wQT09JyxcbiAgICAgICAgICAgIHJlY292ZXJ5QW1vdW50OiAnNzk4MDAyMTIwJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBsYXN0U2NhbkluZGV4OiAwLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnY3JlYXRlIGJyb2FkY2FzdGFibGUgTVBDIHRva2VuIHRyYW5zYWN0aW9uIGZvciBPVkMgc2lnbmVkIHN3ZWVwIHRyYW5zYWN0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgc2lnbmF0dXJlU2hhcmVzID0ge1xuICAgICAgICBzaWduYXR1cmVTaGFyZXM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eFJlcXVlc3Q6IHtcbiAgICAgICAgICAgICAgdHJhbnNhY3Rpb25zOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgdW5zaWduZWRUeDoge1xuICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemVkVHg6XG4gICAgICAgICAgICAgICAgICAgICAgJzAwMDAwNDAxMDA3MmFkOTkxMzBhYmQzNzkwZGI3YmFjODkwOGQ1MGQzNDEyYTgwMGE4ZmNkMTBjMWNmYmQ2NGI4MjE1NTM3NTU4YTE2ZTExMDIwMDAwMDAwMDIwMDdiODVkMzhiNmUxYjQ4NWYxNDU1OTMwZDI3Mjk2MTA4MDgxY2FhY2Q3NjY0YzQ4ZDdkNWY0ODU3MmVlMmJiZDAxMDA0YzFjY2NjNmQwMzUxMGJkNzRhOTVmODFiMmI3ZGEwODExOWNiMThlMmM1NjU0MzVlN2FkNzE1ZTZhYWRjNWE3Njk2ZTExMDIwMDAwMDAwMDIwOGZiNGEzMzRiODI5YWNkZWNiZmEyYTMyODY0MmFmYTI0ZDZmOTUzNzQwZjc2ODMwODBlZTBlNGIzZDNhOTYyZjAwMDhmODJhMDAwMDAwMDAwMDAwMDAyMDkxZjI1ZTIzN2I4M2EwMGE2MjcyNGZkYzRhODFlNDNmNDk0ZGM2YjQxYTEyNDE0OTI4MjZkMzZlNGQxMzFkYTMwMzAzMDEwMDAwMDEwMTAxMDAwMjAxMDAwMDAxMDEwMjAwMDEwMTAyMDEwMDAxMDMwMDAxNjQ5NWRkZGE3NDhjMTE2YTIxODI0MjgzNWQzNjQ3MDlkNmM1ZWU1YzhhMWVkNjg0YzRlZjQzM2QzMTQ0MjEwMTk4MTE0ZjJkZGVmZTNmMTZkOWQyZTAxNjE5NGI1MmM0YzNhZjQzMGMxNjAxYmRiMzUzOWNiZDIzN2NiY2EwNjg2OTZlMTEwMjAwMDAwMDAwMjBiNTE2YTE1YjUwMzRiY2Q0MjQyNTQ0MGM1NjRjZjM2ZjQzOTU0MmY4ODY3MWVmNzk5ZGRlMDY2MWU3ODlhMDA5MDE2NDk1ZGRkYTc0OGMxMTZhMjE4MjQyODM1ZDM2NDcwOWQ2YzVlZTVjOGExZWQ2ODRjNGVmNDMzZDMxNDQyMWU4MDMwMDAwMDAwMDAwMDBmODY0MTEwMDAwMDAwMDAwMDAnLFxuICAgICAgICAgICAgICAgICAgICBzY2FuSW5kZXg6IDAsXG4gICAgICAgICAgICAgICAgICAgIGNvaW46ICd0c3VpOmRlZXAnLFxuICAgICAgICAgICAgICAgICAgICBzaWduYWJsZUhleDogJzQ0OWFkZTE5NTkwNjg1YjFlYjBjZWZjYjJlYzQxZjRjNjhlMzdkOGVhZjc1Njg3YzQ1OTY1ZTI4OGU3MWNhYTQnLFxuICAgICAgICAgICAgICAgICAgICBkZXJpdmF0aW9uUGF0aDogJ20vMCcsXG4gICAgICAgICAgICAgICAgICAgIHBhcnNlZFR4OiB7XG4gICAgICAgICAgICAgICAgICAgICAgaW5wdXRzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3M6ICcweDAxNjQ5NWRkZGE3NDhjMTE2YTIxODI0MjgzNWQzNjQ3MDlkNmM1ZWU1YzhhMWVkNjg0YzRlZjQzM2QzMTQ0MjEnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVN0cmluZzogJzExMDAwJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzOiAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGU6IDQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYzogWzExMDAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3M6ICcweDkxZjI1ZTIzN2I4M2EwMGE2MjcyNGZkYzRhODFlNDNmNDk0ZGM2YjQxYTEyNDE0OTI4MjZkMzZlNGQxMzFkYTMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVN0cmluZzogJzExMDAwJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29pbk5hbWU6ICd0c3VpOmRlZXAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgIHNwZW5kQW1vdW50OiAnMTEwMDAnLFxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdUb2tlblRyYW5zZmVyJyxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgZmVlSW5mbzoge1xuICAgICAgICAgICAgICAgICAgICAgIGZlZTogMTEzOTk2MCxcbiAgICAgICAgICAgICAgICAgICAgICBmZWVTdHJpbmc6ICcxMTM5OTYwJyxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgY29pblNwZWNpZmljOiB7XG4gICAgICAgICAgICAgICAgICAgICAgY29tbW9uS2V5Y2hhaW46XG4gICAgICAgICAgICAgICAgICAgICAgICAnNzlkNGI5YjU5NGRmMDI4ZmVlMzcyNWE2YWY1MWFlM2FiNmEzNTE5ZTlkMmMzMjJmMmM4ZmQ4MTViOTY0OTYzMjNjNWFiYTdlYTg3NGMxMDJmOTY2ZjFhNjFkM2M5YTQyYjVmMzE3N2M2YTg1NzEyY2YzMTM3MTVhZmRkZjgzZDgnLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZVNoYXJlczogW10sXG4gICAgICAgICAgICAgICAgICBzaWduYXR1cmVTaGFyZToge1xuICAgICAgICAgICAgICAgICAgICBmcm9tOiAnYmFja3VwJyxcbiAgICAgICAgICAgICAgICAgICAgdG86ICd1c2VyJyxcbiAgICAgICAgICAgICAgICAgICAgc2hhcmU6XG4gICAgICAgICAgICAgICAgICAgICAgJzIzYzUzZTU0ZjI3MTM4NjU3OGQ5OWE2OTMyZmY3MDg5NjA5MDAxODhhYjNlNWJjZTFhZWMxZjAxOWU1M2E4NWQzMTk3ZjhiNjRhOWZlYWRiZWRiYmQzN2FhNDJlNDQ0NDYwOWYwMDA3NDNhZGMwYTk0ZmZjYzcyMWM3MDU3ZDA0JyxcbiAgICAgICAgICAgICAgICAgICAgcHVibGljU2hhcmU6ICcyODQ0OTZjYTA0Y2M2MDM4MjNmNzk5M2FlZjEzZjcyZjMzMWQ5NzA4NWIyMTg0ZDdhNmE0NjNhOTBhYTkyN2QwJyxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgd2FsbGV0Q29pbjogJ3RzdWk6ZGVlcCcsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdHNzVmVyc2lvbjogJzAuMC4xJyxcbiAgICAgICAgICAgIG92YzogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZWRkc2FTaWduYXR1cmU6IHtcbiAgICAgICAgICAgICAgICAgIHk6ICcyODQ0OTZjYTA0Y2M2MDM4MjNmNzk5M2FlZjEzZjcyZjMzMWQ5NzA4NWIyMTg0ZDdhNmE0NjNhOTBhYTkyN2QwJyxcbiAgICAgICAgICAgICAgICAgIFI6ICcyM2M1M2U1NGYyNzEzODY1NzhkOTlhNjkzMmZmNzA4OTYwOTAwMTg4YWIzZTViY2UxYWVjMWYwMTllNTNhODVkJyxcbiAgICAgICAgICAgICAgICAgIHNpZ21hOiAnOWI1MmI0NWM0ZDUzOWZhZDkwNjgwNWY5ZmNiYWI2ZmI1ZTQxNTIyNDNjYWVlMjUyODU1YzM2YzM0MDQ4Y2MwOScsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGJhc2Vjb2luLmNyZWF0ZUJyb2FkY2FzdGFibGVTd2VlcFRyYW5zYWN0aW9uKHNpZ25hdHVyZVNoYXJlcyk7XG5cbiAgICAgIHJlcy5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgdHJhbnNhY3Rpb25zOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgc2VyaWFsaXplZFR4OlxuICAgICAgICAgICAgICAnQUFBRUFRQnlyWmtUQ3IwM2tOdDdySWtJMVEwMEVxZ0FxUHpSREJ6NzFrdUNGVk4xV0tGdUVRSUFBQUFBSUFlNFhUaTI0YlNGOFVWWk1OSnlsaENBZ2NxczEyWk1TTmZWOUlWeTdpdTlBUUJNSE16RzBEVVF2WFNwWDRHeXQ5b0lFWnl4aml4V1ZEWG5yWEZlYXEzRnAybHVFUUlBQUFBQUlJKzBvelM0S2F6ZXkvb3FNb1pDcjZKTmI1VTNRUGRvTUlEdURrczlPcFl2QUFqNEtnQUFBQUFBQUFBZ2tmSmVJM3VEb0FwaWNrL2NTb0hrUDBsTnhyUWFFa0ZKS0NiVGJrMFRIYU1EQXdFQUFBRUJBUUFDQVFBQUFRRUNBQUVCQWdFQUFRTUFBV1NWM2RwMGpCRnFJWUpDZzEwMlJ3bld4ZTVjaWg3V2hNVHZRejB4UkNFQm1CRlBMZDcrUHhiWjB1QVdHVXRTeE1PdlF3d1dBYjJ6VTV5OUkzeThvR2hwYmhFQ0FBQUFBQ0MxRnFGYlVEUzgxQ1FsUkF4V1RQTnZRNVZDK0laeDczbWQzZ1poNTRtZ0NRRmtsZDNhZEl3UmFpR0NRb05kTmtjSjFzWHVYSW9lMW9URTcwTTlNVVFoNkFNQUFBQUFBQUQ0WkJFQUFBQUFBQUE9JyxcbiAgICAgICAgICAgIHNjYW5JbmRleDogMCxcbiAgICAgICAgICAgIHNpZ25hdHVyZTpcbiAgICAgICAgICAgICAgJ0FDUEZQbFR5Y1RobGVObWFhVEwvY0lsZ2tBR0lxejViemhyc0h3R2VVNmhkbTFLMFhFMVRuNjJRYUFYNS9McTIrMTVCVWlROHJ1SlNoVncydzBCSXpBa29SSmJLQk14Z09DUDNtVHJ2RS9jdk14MlhDRnNoaE5lbXBHT3BDcWtuMEE9PScsXG4gICAgICAgICAgICByZWNvdmVyeUFtb3VudDogJzExMDAwJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBsYXN0U2NhbkluZGV4OiAwLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnY3JlYXRlIGJyb2FkY2FzdGFibGUgTVBDIHRyYW5zYWN0aW9uIGZvciBPVkMgc2lnbmVkIGNvbnNvbGlkYXRpb24gdHJhbnNhY3Rpb25zJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgc2lnbmF0dXJlU2hhcmVzID0ge1xuICAgICAgICBzaWduYXR1cmVTaGFyZXM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eFJlcXVlc3Q6IHtcbiAgICAgICAgICAgICAgdHJhbnNhY3Rpb25zOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgdW5zaWduZWRUeDoge1xuICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemVkVHg6XG4gICAgICAgICAgICAgICAgICAgICAgJzAwMDAwMjAwMDgyMGMyZDYwNTAwMDAwMDAwMDAyMDAxNjQ5NWRkZGE3NDhjMTE2YTIxODI0MjgzNWQzNjQ3MDlkNmM1ZWU1YzhhMWVkNjg0YzRlZjQzM2QzMTQ0MjEwMjAyMDAwMTAxMDAwMDAxMDEwMjAwMDAwMTAxMDBhOTkyNzA5NTkxZGViNzQ3MWZiMzBkZGEwZjMzOWRiN2FiNTQ4ZDMzOTFhODlkM2YxZmEwYzcyZDIwOTI2NzVmMDE1NjhiZWZmZTc2NTEwMzNhMDgxYTczNzVhM2JiNDNkNGQyYThlMjkwYTM5NmU4MjYyMzZlNzNkMDk3M2I0OWI1ZDAwMDAwMDAwMDAwMDAwMDIwOGJjMDc2NGE0NTRkZTc1MzhiNWVjZWE2ZmQwYmQyMjFjOWM4NTIwN2FmMjk3NjEyOTQ0YTk2N2Q0M2U4ZGQzYmE5OTI3MDk1OTFkZWI3NDcxZmIzMGRkYTBmMzM5ZGI3YWI1NDhkMzM5MWE4OWQzZjFmYTBjNzJkMjA5MjY3NWZlODAzMDAwMDAwMDAwMDAwYTQ4ODIxMDAwMDAwMDAwMDAwJyxcbiAgICAgICAgICAgICAgICAgICAgc2NhbkluZGV4OiAxLFxuICAgICAgICAgICAgICAgICAgICBjb2luOiAndHN1aScsXG4gICAgICAgICAgICAgICAgICAgIHNpZ25hYmxlSGV4OiAnODU3YTJmMjY2ODdjMDExYTYxYTA2MGE0MWQ0YzgwYzEwYjJmZDMxZTk4ZmU2NzA0ZDZiY2RhMjZmNTdiMDNiYicsXG4gICAgICAgICAgICAgICAgICAgIGRlcml2YXRpb25QYXRoOiAnbS8xJyxcbiAgICAgICAgICAgICAgICAgICAgcGFyc2VkVHg6IHtcbiAgICAgICAgICAgICAgICAgICAgICBpbnB1dHM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzczogJzB4YTk5MjcwOTU5MWRlYjc0NzFmYjMwZGRhMGYzMzlkYjdhYjU0OGQzMzkxYTg5ZDNmMWZhMGM3MmQyMDkyNjc1ZicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlU3RyaW5nOiAnOTc5NjA0ODAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHM6IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZTogNyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjOiBbOTc5NjA0ODBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgIG91dHB1dHM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzczogJzB4MDE2NDk1ZGRkYTc0OGMxMTZhMjE4MjQyODM1ZDM2NDcwOWQ2YzVlZTVjOGExZWQ2ODRjNGVmNDMzZDMxNDQyMScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlU3RyaW5nOiAnOTc5NjA0ODAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb2luTmFtZTogJ3RzdWknLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgIHNwZW5kQW1vdW50OiAnOTc5NjA0ODAnLFxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdUcmFuc2ZlcicsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGZlZUluZm86IHtcbiAgICAgICAgICAgICAgICAgICAgICBmZWU6IDIxOTc2NjgsXG4gICAgICAgICAgICAgICAgICAgICAgZmVlU3RyaW5nOiAnMjE5NzY2OCcsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGNvaW5TcGVjaWZpYzoge1xuICAgICAgICAgICAgICAgICAgICAgIGNvbW1vbktleWNoYWluOlxuICAgICAgICAgICAgICAgICAgICAgICAgJzc5ZDRiOWI1OTRkZjAyOGZlZTM3MjVhNmFmNTFhZTNhYjZhMzUxOWU5ZDJjMzIyZjJjOGZkODE1Yjk2NDk2MzIzYzVhYmE3ZWE4NzRjMTAyZjk2NmYxYTYxZDNjOWE0MmI1ZjMxNzdjNmE4NTcxMmNmMzEzNzE1YWZkZGY4M2Q4JyxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBzaWduYXR1cmVTaGFyZXM6IFtdLFxuICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlU2hhcmU6IHtcbiAgICAgICAgICAgICAgICAgICAgZnJvbTogJ2JhY2t1cCcsXG4gICAgICAgICAgICAgICAgICAgIHRvOiAndXNlcicsXG4gICAgICAgICAgICAgICAgICAgIHNoYXJlOlxuICAgICAgICAgICAgICAgICAgICAgICdjZGZlMTVkN2MwZjgwZjhhYWQ4OWQ4Nzg3MDY2NzNjZTI0Mjk0N2IxMjY4NTJjMDBlZTMwOWVmMDVmN2E4MzAxYjJlOTAyYjkwZDM3ZWE3ZGZlODZjZTc5YzdhOTliMmIyN2ExNzVjM2Y3MTRjMzEwZmQ5ZTEwZWE4NzdjYzYwZicsXG4gICAgICAgICAgICAgICAgICAgIHB1YmxpY1NoYXJlOiAnZTQ0NWJkMDkyYTQ2N2RmNTc3MDAxY2ZiZDYwODFiMTQ0NWNhMGY3NTE0NzIzMzU2MWVkMmY1M2Y2YTMwZTQ1YScsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIHdhbGxldENvaW46ICd0c3VpJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0c3NWZXJzaW9uOiAnMC4wLjEnLFxuICAgICAgICAgICAgb3ZjOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBlZGRzYVNpZ25hdHVyZToge1xuICAgICAgICAgICAgICAgICAgeTogJ2U0NDViZDA5MmE0NjdkZjU3NzAwMWNmYmQ2MDgxYjE0NDVjYTBmNzUxNDcyMzM1NjFlZDJmNTNmNmEzMGU0NWEnLFxuICAgICAgICAgICAgICAgICAgUjogJ2NkZmUxNWQ3YzBmODBmOGFhZDg5ZDg3ODcwNjY3M2NlMjQyOTQ3YjEyNjg1MmMwMGVlMzA5ZWYwNWY3YTgzMDEnLFxuICAgICAgICAgICAgICAgICAgc2lnbWE6ICcyYTMxMzI5YjJlNWVmOGMzZjIyMmViOTFjZDlkNzBlNzE2ZjIyOWVlMTlkM2NhOTQxN2M4YWNjMTZiMWRhMTAwJyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR4UmVxdWVzdDoge1xuICAgICAgICAgICAgICB0cmFuc2FjdGlvbnM6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICB1bnNpZ25lZFR4OiB7XG4gICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWRUeDpcbiAgICAgICAgICAgICAgICAgICAgICAnMDAwMDAyMDAwODAwYzJlYjBiMDAwMDAwMDAwMDIwMDE2NDk1ZGRkYTc0OGMxMTZhMjE4MjQyODM1ZDM2NDcwOWQ2YzVlZTVjOGExZWQ2ODRjNGVmNDMzZDMxNDQyMTAyMDIwMDAxMDEwMDAwMDEwMTAyMDAwMDAxMDEwMGMzYWMyYTg2ZTM1YjYyYmZhZGE4M2Y2Mzg4ZmYyN2M3ZGRhNzA5MmNmMGI4MjlkMmQxZjRjMjgxM2UyOGFlMzkwMWQ2OGZlYjQ3ODA4ODZjY2ZhODFhMzcwMzY5NThlYzljOGJmYWJmZTc1YTBiYjdjNGQxYTQ1ODc5OTIzNDNmNWJjZjAwMDAwMDAwMDAwMDAwMjA1YWQ0ZjYzMWEzNzhmOGIwOTU0MmQ0ZGY2Njk0MmI2ZGFiYjJmNjVjYjIwY2Y4ZjYyOGM5MWM2NGY5MzUyZTRlYzNhYzJhODZlMzViNjJiZmFkYTgzZjYzODhmZjI3YzdkZGE3MDkyY2YwYjgyOWQyZDFmNGMyODEzZTI4YWUzOWU4MDMwMDAwMDAwMDAwMDBhNDg4MjEwMDAwMDAwMDAwMDAnLFxuICAgICAgICAgICAgICAgICAgICBzY2FuSW5kZXg6IDIsXG4gICAgICAgICAgICAgICAgICAgIGNvaW46ICd0c3VpJyxcbiAgICAgICAgICAgICAgICAgICAgc2lnbmFibGVIZXg6ICdmMmI1NmE3NGU3ODdiMmE5OGRlY2YxODllNzFiMWUwYzVkNGNjZWU4ODY5N2IzOTkxYTQ4ZGUyOTEwNjc2MDIwJyxcbiAgICAgICAgICAgICAgICAgICAgZGVyaXZhdGlvblBhdGg6ICdtLzInLFxuICAgICAgICAgICAgICAgICAgICBwYXJzZWRUeDoge1xuICAgICAgICAgICAgICAgICAgICAgIGlucHV0czogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzOiAnMHhjM2FjMmE4NmUzNWI2MmJmYWRhODNmNjM4OGZmMjdjN2RkYTcwOTJjZjBiODI5ZDJkMWY0YzI4MTNlMjhhZTM5JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVTdHJpbmc6ICcyMDAwMDAwMDAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHM6IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZTogOCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjOiBbMjAwMDAwMDAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3M6ICcweDAxNjQ5NWRkZGE3NDhjMTE2YTIxODI0MjgzNWQzNjQ3MDlkNmM1ZWU1YzhhMWVkNjg0YzRlZjQzM2QzMTQ0MjEnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVN0cmluZzogJzIwMDAwMDAwMCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvaW5OYW1lOiAndHN1aScsXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgc3BlbmRBbW91bnQ6ICcyMDAwMDAwMDAnLFxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdUcmFuc2ZlcicsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGZlZUluZm86IHtcbiAgICAgICAgICAgICAgICAgICAgICBmZWU6IDIxOTc2NjgsXG4gICAgICAgICAgICAgICAgICAgICAgZmVlU3RyaW5nOiAnMjE5NzY2OCcsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGNvaW5TcGVjaWZpYzoge1xuICAgICAgICAgICAgICAgICAgICAgIGNvbW1vbktleWNoYWluOlxuICAgICAgICAgICAgICAgICAgICAgICAgJzc5ZDRiOWI1OTRkZjAyOGZlZTM3MjVhNmFmNTFhZTNhYjZhMzUxOWU5ZDJjMzIyZjJjOGZkODE1Yjk2NDk2MzIzYzVhYmE3ZWE4NzRjMTAyZjk2NmYxYTYxZDNjOWE0MmI1ZjMxNzdjNmE4NTcxMmNmMzEzNzE1YWZkZGY4M2Q4JyxcbiAgICAgICAgICAgICAgICAgICAgICBsYXN0U2NhbkluZGV4OiAyMCxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBzaWduYXR1cmVTaGFyZXM6IFtdLFxuICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlU2hhcmU6IHtcbiAgICAgICAgICAgICAgICAgICAgZnJvbTogJ2JhY2t1cCcsXG4gICAgICAgICAgICAgICAgICAgIHRvOiAndXNlcicsXG4gICAgICAgICAgICAgICAgICAgIHNoYXJlOlxuICAgICAgICAgICAgICAgICAgICAgICczNTE4NjEzZWE1Y2VmYTM2Y2QyMmUxYjA5Mjc0MmQ4ZDA1Mjc0NDE4ODUxODA0MDM5N2YxYTY1YTc1NGY5ZTk1MzI0ODg5MzEyZDcwMTQ2ODExZGJkYzJhOTYyNDVjNTE4ZTE2ZmM2MWJkMWE1YTJiNTNiNTNlYmNlYzVkNGEwMycsXG4gICAgICAgICAgICAgICAgICAgIHB1YmxpY1NoYXJlOiAnNGIxNDNhMTI4MzViZGRhMDQ4MzFhOWVkODUxZjllYWRkN2JhNWI0NmU5YzA3ZmQwODdiNzUxZjQ2YTNmMzY0ZCcsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIHdhbGxldENvaW46ICd0c3VpJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0c3NWZXJzaW9uOiAnMC4wLjEnLFxuICAgICAgICAgICAgb3ZjOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBlZGRzYVNpZ25hdHVyZToge1xuICAgICAgICAgICAgICAgICAgeTogJzRiMTQzYTEyODM1YmRkYTA0ODMxYTllZDg1MWY5ZWFkZDdiYTViNDZlOWMwN2ZkMDg3Yjc1MWY0NmEzZjM2NGQnLFxuICAgICAgICAgICAgICAgICAgUjogJzM1MTg2MTNlYTVjZWZhMzZjZDIyZTFiMDkyNzQyZDhkMDUyNzQ0MTg4NTE4MDQwMzk3ZjFhNjVhNzU0ZjllOTUnLFxuICAgICAgICAgICAgICAgICAgc2lnbWE6ICcyZGY0OGVkNjBmZjYyYjBlODY4OWM1ZWJlNTczMThmM2RhZDc2Mjg4NjQ3NTI0YjQyMGFjZjdiMWE4NGNjMDAwJyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgcmVzID0gYXdhaXQgYmFzZWNvaW4uY3JlYXRlQnJvYWRjYXN0YWJsZVN3ZWVwVHJhbnNhY3Rpb24oc2lnbmF0dXJlU2hhcmVzKTtcblxuICAgICAgcmVzLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICB0cmFuc2FjdGlvbnM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBzZXJpYWxpemVkVHg6XG4gICAgICAgICAgICAgICdBQUFDQUFnZ3d0WUZBQUFBQUFBZ0FXU1YzZHAwakJGcUlZSkNnMTAyUnduV3hlNWNpaDdXaE1UdlF6MHhSQ0VDQWdBQkFRQUFBUUVDQUFBQkFRQ3BrbkNWa2Q2M1J4K3pEZG9QTTUyM3ExU05NNUdvblQ4Zm9NY3RJSkpuWHdGV2krLytkbEVET2dnYWMzV2p1MFBVMHFqaWtLT1c2Q1lqYm5QUWx6dEp0ZEFBQUFBQUFBQUFJSXZBZGtwRlRlZFRpMTdPcHYwTDBpSEp5RklIcnlsMkVwUktsbjFENk4wN3FaSndsWkhldDBjZnN3M2FEek9kdDZ0VWpUT1JxSjAvSDZESExTQ1NaMS9vQXdBQUFBQUFBS1NJSVFBQUFBQUFBQT09JyxcbiAgICAgICAgICAgIHNjYW5JbmRleDogMSxcbiAgICAgICAgICAgIHNpZ25hdHVyZTpcbiAgICAgICAgICAgICAgJ0FNMytGZGZBK0ErS3JZblllSEJtYzg0a0tVZXhKb1VzQU80d252QmZlb01CS2pFeW15NWUrTVB5SXV1UnpaMXc1eGJ5S2U0WjA4cVVGOGlzd1dzZG9RRGtSYjBKS2taOTlYY0FIUHZXQ0JzVVJjb1BkUlJ5TTFZZTB2VS9hakRrV2c9PScsXG4gICAgICAgICAgICByZWNvdmVyeUFtb3VudDogJzk3OTYwNDgwJyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHNlcmlhbGl6ZWRUeDpcbiAgICAgICAgICAgICAgJ0FBQUNBQWdBd3VzTEFBQUFBQUFnQVdTVjNkcDBqQkZxSVlKQ2cxMDJSd25XeGU1Y2loN1doTVR2UXoweFJDRUNBZ0FCQVFBQUFRRUNBQUFCQVFERHJDcUc0MXRpdjYyb1AyT0kveWZIM2FjSkxQQzRLZExSOU1LQlBpaXVPUUhXait0SGdJaHN6NmdhTndOcFdPeWNpL3EvNTFvTHQ4VFJwRmg1a2pRL1c4OEFBQUFBQUFBQUlGclU5akdqZVBpd2xVTFUzMmFVSzIycnN2WmNzZ3o0OWlqSkhHVDVOUzVPdzZ3cWh1TmJZcit0cUQ5amlQOG54OTJuQ1N6d3VDblMwZlRDZ1Q0b3Jqbm9Bd0FBQUFBQUFLU0lJUUFBQUFBQUFBPT0nLFxuICAgICAgICAgICAgc2NhbkluZGV4OiAyLFxuICAgICAgICAgICAgc2lnbmF0dXJlOlxuICAgICAgICAgICAgICAnQURVWVlUNmx6dm8yelNMaHNKSjBMWTBGSjBRWWhSZ0VBNWZ4cGxwMVQ1NlZMZlNPMWcvMkt3NkdpY1hyNVhNWTg5clhZb2hrZFNTMElLejNzYWhNd0FCTEZEb1NnMXZkb0VneHFlMkZINTZ0MTdwYlJ1bkFmOUNIdDFIMGFqODJUUT09JyxcbiAgICAgICAgICAgIHJlY292ZXJ5QW1vdW50OiAnMjAwMDAwMDAwJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBsYXN0U2NhbkluZGV4OiAyMCxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2NyZWF0ZSBicm9hZGNhc3RhYmxlIE1QQyB0cmFuc2FjdGlvbiBmb3IgT1ZDIHNpZ25lZCB0b2tlbiBjb25zb2xpZGF0aW9uIHRyYW5zYWN0aW9ucycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHNpZ25hdHVyZVNoYXJlcyA9IHtcbiAgICAgICAgc2lnbmF0dXJlU2hhcmVzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHhSZXF1ZXN0OiB7XG4gICAgICAgICAgICAgIHRyYW5zYWN0aW9uczogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkVHg6IHtcbiAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplZFR4OlxuICAgICAgICAgICAgICAgICAgICAgICcwMDAwMDMwMTAwYTdhOGM5MTAyODAzNWFiNDk5NzdlNzJiMDg0ZTE0NWViMWMxZGRjZmUyZTA2OTI1ZjBmODMzY2VmMmQxZjY5ZmFlNmUxMTAyMDAwMDAwMDAyMGE4M2M2NGM3ODVkOTcyY2I2YzE3NGY0MzIzZTY3ZWVmMWI2MmEwODFkYjNmZWU2OTFlNmMxYmIxNjg2ZTVlZDUwMDA4ZGMwNTAwMDAwMDAwMDAwMDAwMjA4OGM5OWUwZGI4OWNiYTFkYjk3Y2JhZGQ3ZjM3YjJhNGIyYTJiNDAyMjU5NGEwYzA0YjJiY2M4MzdlNGIyNDA0MDIwMjAxMDAwMDAxMDEwMTAwMDEwMTAyMDAwMDAxMDIwMGQyMDE1NjZlNmEwYmMwMjBmZDJlNmY3MmU5YmRlMjIyM2Y1NTBkNjRkYWE2MTM5OGNkOTE3YzJmNzUwMTMyNGEwMTVlZWEwMzUzZjA3ODAxNmI3MWE4NGNiNDk0ZTZmNzkxZTk3Y2I4ZGU1MzQ0ZGVmM2JhZWRmZmM4OWMyN2E0YjVhZjZlMTEwMjAwMDAwMDAwMjA0ZjFlMjJmOTE4MWMyZGQwMzlhYmViZjI5OGNmOTYxMTNhNmYwYTdhODRhOTFlMjg2M2I0NmE0MWQzNjNkYThjZDIwMTU2NmU2YTBiYzAyMGZkMmU2ZjcyZTliZGUyMjIzZjU1MGQ2NGRhYTYxMzk4Y2Q5MTdjMmY3NTAxMzI0YWU4MDMwMDAwMDAwMDAwMDA1NjVlMjcwMDAwMDAwMDAwMDAnLFxuICAgICAgICAgICAgICAgICAgICBzY2FuSW5kZXg6IDEsXG4gICAgICAgICAgICAgICAgICAgIGNvaW46ICd0c3VpOmRlZXAnLFxuICAgICAgICAgICAgICAgICAgICBzaWduYWJsZUhleDogJzIyZGVmYTkxMDFlYTNhMzgzOWMzYzAwMjZiMjdhOTgzNzE2NWMwN2ZjZWNmZjhlOTQzNTNiY2YzZDVhMDEzMjgnLFxuICAgICAgICAgICAgICAgICAgICBkZXJpdmF0aW9uUGF0aDogJ20vOTk5OTk5Lzk0ODYyNjIyLzE1NzM2MzUwOS8xJyxcbiAgICAgICAgICAgICAgICAgICAgcGFyc2VkVHg6IHtcbiAgICAgICAgICAgICAgICAgICAgICBpbnB1dHM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzczogJzB4ZDIwMTU2NmU2YTBiYzAyMGZkMmU2ZjcyZTliZGUyMjIzZjU1MGQ2NGRhYTYxMzk4Y2Q5MTdjMmY3NTAxMzI0YScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlU3RyaW5nOiAnMTUwMCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgczogMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlOiAzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGM6IFsxNTAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3M6ICcweDg4Yzk5ZTBkYjg5Y2JhMWRiOTdjYmFkZDdmMzdiMmE0YjJhMmI0MDIyNTk0YTBjMDRiMmJjYzgzN2U0YjI0MDQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVN0cmluZzogJzE1MDAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb2luTmFtZTogJ3RzdWk6ZGVlcCcsXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgc3BlbmRBbW91bnQ6ICcxNTAwJyxcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnVG9rZW5UcmFuc2ZlcicsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGZlZUluZm86IHtcbiAgICAgICAgICAgICAgICAgICAgICBmZWU6IDI1ODAwNTQsXG4gICAgICAgICAgICAgICAgICAgICAgZmVlU3RyaW5nOiAnMjU4MDA1NCcsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGNvaW5TcGVjaWZpYzoge1xuICAgICAgICAgICAgICAgICAgICAgIGNvbW1vbktleWNoYWluOlxuICAgICAgICAgICAgICAgICAgICAgICAgJ2NhMGEwMTRiYTZmMTExMDZhMTU1ZWY4ZTJjYWIyZjc2ZDI3N2U0ZjAxY2ZmYTU5MWE5YjQwODQ4MzQzODIzYjNkOTEwNzUyYTQ5Yzk2YmY1ODEzOTg1MjA2ZTIzYzlmOWNkM2E3OGYxY2NjZjVjZjg4ZGVmNTJiNTczY2VkYzkzJyxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBzaWduYXR1cmVTaGFyZXM6IFtdLFxuICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlU2hhcmU6IHtcbiAgICAgICAgICAgICAgICAgICAgZnJvbTogJ2JhY2t1cCcsXG4gICAgICAgICAgICAgICAgICAgIHRvOiAndXNlcicsXG4gICAgICAgICAgICAgICAgICAgIHNoYXJlOlxuICAgICAgICAgICAgICAgICAgICAgICcxOTg5NDIwY2U4MDBlMzVlMWM1OTA5MDdmMjAxN2I1NTI5OTQ1NDg0YjNmZjg4NGY4ZTg4MzkwZGE4ODkzNmU2YTU4NDRlNDg2MGRmMGY0ODllMmEwOTc1NTE5YzFkNmY1ZjAyNTVkZDA5MWVkYmY4NTljNzQwNjNhN2YxZTIwZScsXG4gICAgICAgICAgICAgICAgICAgIHB1YmxpY1NoYXJlOiAnNDA4YzdhMTE5NjcxNTJlZmVlOTUzZjNlYjE2MTkxMDA0OTQ2Njg1ZmRjNGRkODA4N2I5MWUzYWZjYjc3YzkxNicsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIHdhbGxldENvaW46ICd0c3VpOmRlZXAnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRzc1ZlcnNpb246ICcwLjAuMScsXG4gICAgICAgICAgICBvdmM6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGVkZHNhU2lnbmF0dXJlOiB7XG4gICAgICAgICAgICAgICAgICB5OiAnNDA4YzdhMTE5NjcxNTJlZmVlOTUzZjNlYjE2MTkxMDA0OTQ2Njg1ZmRjNGRkODA4N2I5MWUzYWZjYjc3YzkxNicsXG4gICAgICAgICAgICAgICAgICBSOiAnMTk4OTQyMGNlODAwZTM1ZTFjNTkwOTA3ZjIwMTdiNTUyOTk0NTQ4NGIzZmY4ODRmOGU4ODM5MGRhODg5MzZlNicsXG4gICAgICAgICAgICAgICAgICBzaWdtYTogJ2MyY2U1MjhmMWYzMjNmZTlhZjI1NmFiYjU3NDI4OTczYjJlOTdlNGZhNTRmYTZmNTBjMzk0MzAzNjgxNTg2MGUnLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHhSZXF1ZXN0OiB7XG4gICAgICAgICAgICAgIHRyYW5zYWN0aW9uczogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkVHg6IHtcbiAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplZFR4OlxuICAgICAgICAgICAgICAgICAgICAgICcwMDAwMDMwMTAwZTE5MWYxNjZlNzFiMWVmMjBmZmRhMGM5MWIyNGRhOTVlY2M5M2I2NTdjNDY0ZDhhMDZmNTYxZDQ2OTI3MjJmMGIwNmUxMTAyMDAwMDAwMDAyMDMxNmZhMjQ4YTcwNzFhMTZjOWUyZmFlMjUzY2NmNjYyNTUzYTkwNzQ1MGU4ZDk4YzNiYmUyNzViMjQzZGM0MGYwMDA4ZDAwNzAwMDAwMDAwMDAwMDAwMjA4OGM5OWUwZGI4OWNiYTFkYjk3Y2JhZGQ3ZjM3YjJhNGIyYTJiNDAyMjU5NGEwYzA0YjJiY2M4MzdlNGIyNDA0MDIwMjAxMDAwMDAxMDEwMTAwMDEwMTAyMDAwMDAxMDIwMDJmYTVkODM5NGJkNmJlYzU1MjViOTU1MGJmNDNiZTA3NWI4MzQyMmQwMTA3YzA1YzcwMDk0NGUzZWFlYzI2ZjkwMWQzMmY5NDg4OWQwYmZjMDVjMjRlZDZjMDIzZDVkM2QzNjU0Mjk0YTgzN2Q4NTBkMzczOGIwZTM1MmUxZjQ4NjdiMDZlMTEwMjAwMDAwMDAwMjA0MTQ1ODlkM2ZiNGY2NmRmYmVhYmIyYTcyZDg5ODAzZDY0NTFhMjc5ZmY1YmY1YzY2MzFjZjE2M2FmM2RjY2FmMmZhNWQ4Mzk0YmQ2YmVjNTUyNWI5NTUwYmY0M2JlMDc1YjgzNDIyZDAxMDdjMDVjNzAwOTQ0ZTNlYWVjMjZmOWU4MDMwMDAwMDAwMDAwMDA1NjVlMjcwMDAwMDAwMDAwMDAnLFxuICAgICAgICAgICAgICAgICAgICBzY2FuSW5kZXg6IDIsXG4gICAgICAgICAgICAgICAgICAgIGNvaW46ICd0c3VpOmRlZXAnLFxuICAgICAgICAgICAgICAgICAgICBzaWduYWJsZUhleDogJzJlNmJiMTcxNjZlZTE5NzEwMjcyOWJkYTQ3YjA2YjdjMGI1OTYyYmY0MzFiYmIwNTYyYjkxZTI2N2I3NTEyOWQnLFxuICAgICAgICAgICAgICAgICAgICBkZXJpdmF0aW9uUGF0aDogJ20vOTk5OTk5Lzk0ODYyNjIyLzE1NzM2MzUwOS8yJyxcbiAgICAgICAgICAgICAgICAgICAgcGFyc2VkVHg6IHtcbiAgICAgICAgICAgICAgICAgICAgICBpbnB1dHM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzczogJzB4MmZhNWQ4Mzk0YmQ2YmVjNTUyNWI5NTUwYmY0M2JlMDc1YjgzNDIyZDAxMDdjMDVjNzAwOTQ0ZTNlYWVjMjZmOScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlU3RyaW5nOiAnMjAwMCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgczogMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlOiAzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGM6IFsyMDAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3M6ICcweDg4Yzk5ZTBkYjg5Y2JhMWRiOTdjYmFkZDdmMzdiMmE0YjJhMmI0MDIyNTk0YTBjMDRiMmJjYzgzN2U0YjI0MDQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVN0cmluZzogJzIwMDAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb2luTmFtZTogJ3RzdWk6ZGVlcCcsXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgc3BlbmRBbW91bnQ6ICcyMDAwJyxcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnVG9rZW5UcmFuc2ZlcicsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGZlZUluZm86IHtcbiAgICAgICAgICAgICAgICAgICAgICBmZWU6IDI1ODAwNTQsXG4gICAgICAgICAgICAgICAgICAgICAgZmVlU3RyaW5nOiAnMjU4MDA1NCcsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGNvaW5TcGVjaWZpYzoge1xuICAgICAgICAgICAgICAgICAgICAgIGNvbW1vbktleWNoYWluOlxuICAgICAgICAgICAgICAgICAgICAgICAgJ2NhMGEwMTRiYTZmMTExMDZhMTU1ZWY4ZTJjYWIyZjc2ZDI3N2U0ZjAxY2ZmYTU5MWE5YjQwODQ4MzQzODIzYjNkOTEwNzUyYTQ5Yzk2YmY1ODEzOTg1MjA2ZTIzYzlmOWNkM2E3OGYxY2NjZjVjZjg4ZGVmNTJiNTczY2VkYzkzJyxcbiAgICAgICAgICAgICAgICAgICAgICBsYXN0U2NhbkluZGV4OiAyMCxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBzaWduYXR1cmVTaGFyZXM6IFtdLFxuICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlU2hhcmU6IHtcbiAgICAgICAgICAgICAgICAgICAgZnJvbTogJ2JhY2t1cCcsXG4gICAgICAgICAgICAgICAgICAgIHRvOiAndXNlcicsXG4gICAgICAgICAgICAgICAgICAgIHNoYXJlOlxuICAgICAgICAgICAgICAgICAgICAgICc5ZTFkMGZkNjY0MDc4MGNmNGRjMjA5ZmE2ZWQ4OTU3ZDY5NThlMGQwMjcyZDhhMmZkNDg0MzhjMDExZjY3YTIyMDBkZTFhNzhlMjNiYzJhN2QyNjFkMGQwMmE0MjIxNDUzMDFhYTljZTk3ZDNkMzA2YjM1MDFiMWY0NGQ5NTYwNicsXG4gICAgICAgICAgICAgICAgICAgIHB1YmxpY1NoYXJlOiAnMzYyZDcxNmE1YTIzMGQ2ODNiNjBkMjllY2U5NDExOTdlMDk2MjdjMjM0YzcxNDQ5ZmFjYWI1MTRjM2E3YWJhZicsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIHdhbGxldENvaW46ICd0c3VpOmRlZXAnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRzc1ZlcnNpb246ICcwLjAuMScsXG4gICAgICAgICAgICBvdmM6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGVkZHNhU2lnbmF0dXJlOiB7XG4gICAgICAgICAgICAgICAgICB5OiAnMzYyZDcxNmE1YTIzMGQ2ODNiNjBkMjllY2U5NDExOTdlMDk2MjdjMjM0YzcxNDQ5ZmFjYWI1MTRjM2E3YWJhZicsXG4gICAgICAgICAgICAgICAgICBSOiAnOWUxZDBmZDY2NDA3ODBjZjRkYzIwOWZhNmVkODk1N2Q2OTU4ZTBkMDI3MmQ4YTJmZDQ4NDM4YzAxMWY2N2EyMicsXG4gICAgICAgICAgICAgICAgICBzaWdtYTogJzE1YTgyZjdjNGFlZGI5ZWJkNGFiNDgxYjQyODFkNmZjYWRiMmE4NDIyNjM1ZjE2ZTRlMzE5NjcwOTcwMDE4MDYnLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBiYXNlY29pbi5jcmVhdGVCcm9hZGNhc3RhYmxlU3dlZXBUcmFuc2FjdGlvbihzaWduYXR1cmVTaGFyZXMpO1xuXG4gICAgICByZXMuc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIHRyYW5zYWN0aW9uczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHNlcmlhbGl6ZWRUeDpcbiAgICAgICAgICAgICAgJ0FBQURBUUNucU1rUUtBTmF0SmwzNXlzSVRoUmVzY0hkeitMZ2FTWHcrRFBPOHRIMm42NXVFUUlBQUFBQUlLZzhaTWVGMlhMTGJCZFBReVBtZnU4YllxQ0Iyei91YVI1c0c3Rm9ibDdWQUFqY0JRQUFBQUFBQUFBZ2lNbWVEYmljdWgyNWZMcmRmemV5cExLaXRBSWxsS0RBU3l2TWczNUxKQVFDQWdFQUFBRUJBUUFCQVFJQUFBRUNBTklCVm01cUM4QWcvUzV2Y3VtOTRpSS9WUTFrMnFZVG1NMlJmQzkxQVRKS0FWN3FBMVB3ZUFGcmNhaE10SlRtOTVIcGZMamVVMFRlODdydC84aWNKNlMxcjI0UkFnQUFBQUFnVHg0aStSZ2NMZEE1cSt2eW1NK1dFVHB2Q25xRXFSNG9ZN1JxUWROajJvelNBVlp1YWd2QUlQMHViM0xwdmVJaVAxVU5aTnFtRTVqTmtYd3ZkUUV5U3VnREFBQUFBQUFBVmw0bkFBQUFBQUFBJyxcbiAgICAgICAgICAgIHNjYW5JbmRleDogMSxcbiAgICAgICAgICAgIHNpZ25hdHVyZTpcbiAgICAgICAgICAgICAgJ0FCbUpRZ3pvQU9OZUhGa0pCL0lCZTFVcGxGU0VzLytJVDQ2SU9RMm9pVGJtd3M1U2p4OHlQK212SldxN1YwS0pjN0xwZmsrbFQ2YjFERGxEQTJnVmhnNUFqSG9SbG5GUzcrNlZQejZ4WVpFQVNVWm9YOXhOMkFoN2tlT3Z5M2ZKRmc9PScsXG4gICAgICAgICAgICByZWNvdmVyeUFtb3VudDogJzE1MDAnLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgc2VyaWFsaXplZFR4OlxuICAgICAgICAgICAgICAnQUFBREFRRGhrZkZtNXhzZThnLzlvTWtiSk5xVjdNazdaWHhHVFlvRzlXSFVhU2NpOExCdUVRSUFBQUFBSURGdm9raW5CeG9XeWVMNjRsUE05bUpWT3BCMFVPalpqRHUrSjFza1BjUVBBQWpRQndBQUFBQUFBQUFnaU1tZURiaWN1aDI1ZkxyZGZ6ZXlwTEtpdEFJbGxLREFTeXZNZzM1TEpBUUNBZ0VBQUFFQkFRQUJBUUlBQUFFQ0FDK2wyRGxMMXI3RlVsdVZVTDlEdmdkYmcwSXRBUWZBWEhBSlJPUHE3Q2I1QWRNdmxJaWRDL3dGd2s3V3dDUFYwOU5sUXBTb045aFEwM09MRGpVdUgwaG5zRzRSQWdBQUFBQWdRVVdKMC90UFp0KytxN0tuTFltQVBXUlJvbm4vVy9YR1l4enhZNjg5eks4dnBkZzVTOWEreFZKYmxWQy9RNzRIVzROQ0xRRUh3Rnh3Q1VUajZ1d20rZWdEQUFBQUFBQUFWbDRuQUFBQUFBQUEnLFxuICAgICAgICAgICAgc2NhbkluZGV4OiAyLFxuICAgICAgICAgICAgc2lnbmF0dXJlOlxuICAgICAgICAgICAgICAnQUo0ZEQ5WmtCNERQVGNJSittN1lsWDFwV09EUUp5MktMOVNFT01BUjlub2lGYWd2ZkVydHVldlVxMGdiUW9IVy9LMnlxRUltTmZGdVRqR1djSmNBR0FZMkxYRnFXaU1OYUR0ZzBwN09sQkdYNEpZbndqVEhGRW42eXJVVXc2ZXJydz09JyxcbiAgICAgICAgICAgIHJlY292ZXJ5QW1vdW50OiAnMjAwMCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgbGFzdFNjYW5JbmRleDogMjAsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1JlY292ZXIgVHJhbnNhY3Rpb24gRmFpbHVyZXM6JywgKCkgPT4ge1xuICAgIGNvbnN0IHNhbmRCb3ggPSBzaW5vbi5jcmVhdGVTYW5kYm94KCk7XG4gICAgY29uc3Qgc2VuZGVyQWRkcmVzczAgPSAnMHg5MWYyNWUyMzdiODNhMDBhNjI3MjRmZGM0YTgxZTQzZjQ5NGRjNmI0MWExMjQxNDkyODI2ZDM2ZTRkMTMxZGEzJztcbiAgICBjb25zdCByZWNvdmVyeURlc3RpbmF0aW9uID0gJzB4MDBlNGVhYTZhMjkxZmUwMjkxODQ1MmU2NDViNTY1M2NkMjYwYTVmYzBmYjM1ZjYxOTNkNTgwOTE2YWE5ZTM4OSc7XG4gICAgY29uc3Qgd2FsbGV0UGFzc3BocmFzZSA9ICdwJFN3PFJqdkFnZntuWUFZSTJ4TSc7XG5cbiAgICBhZnRlckVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgc2FuZEJveC5yZXN0b3JlKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgdG8gcmVjb3ZlciBkdWUgdG8gbm9uLXplcm8gZnVuZCBidXQgaW5zdWZmaWNpZW50IGZ1bmRzIGFkZHJlc3MnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBjYWxsQmFjayA9IHNhbmRCb3guc3R1YihTdWkucHJvdG90eXBlLCAnZ2V0QmFsYW5jZScgYXMga2V5b2YgU3VpKTtcbiAgICAgIGNhbGxCYWNrXG4gICAgICAgIC53aXRoQXJncyhzZW5kZXJBZGRyZXNzMClcbiAgICAgICAgLnJlc29sdmVzKHsgdG90YWxCYWxhbmNlOiAnOTgwMDIxMicsIGNvaW5PYmplY3RCYWxhbmNlOiAnOTgwMDIxMicsIGZ1bmRzSW5BZGRyZXNzQmFsYW5jZTogJzAnIH0pO1xuXG4gICAgICBhd2FpdCBiYXNlY29pblxuICAgICAgICAucmVjb3Zlcih7XG4gICAgICAgICAgdXNlcktleToga2V5cy51c2VyS2V5LFxuICAgICAgICAgIGJhY2t1cEtleToga2V5cy5iYWNrdXBLZXksXG4gICAgICAgICAgYml0Z29LZXk6IGtleXMuYml0Z29LZXksXG4gICAgICAgICAgcmVjb3ZlcnlEZXN0aW5hdGlvbixcbiAgICAgICAgICB3YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgICAgIHN0YXJ0aW5nU2NhbkluZGV4OiAnMCcsXG4gICAgICAgICAgc2NhbjogMSxcbiAgICAgICAgfSlcbiAgICAgICAgLnNob3VsZC5yZWplY3RlZFdpdGgoXG4gICAgICAgICAgJ0RpZCBub3QgZmluZCBhbiBhZGRyZXNzIHdpdGggc3VmZmljaWVudCBmdW5kcyB0byByZWNvdmVyLiBQbGVhc2Ugc3RhcnQgdGhlIG5leHQgc2NhbiBhdCBhZGRyZXNzIGluZGV4IDEuIElmIGl0IGlzIHRva2VuIHRyYW5zYWN0aW9uLCBwbGVhc2Uga2VlcCBzdWZmaWNpZW50IFN1aSBiYWxhbmNlIGluIHRoZSBhZGRyZXNzIGZvciB0aGUgdHJhbnNhY3Rpb24gZmVlLidcbiAgICAgICAgKTtcblxuICAgICAgc2FuZEJveC5hc3NlcnQuY2FsbENvdW50KGJhc2Vjb2luLmdldEJhbGFuY2UsIDEpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHRvIHJlY292ZXIgZHVlIHRvIG5vdCBmaW5kaW5nIGFuIGFkZHJlc3Mgd2l0aCBmdW5kcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGNhbGxCYWNrID0gc2FuZEJveC5zdHViKFN1aS5wcm90b3R5cGUsICdnZXRCYWxhbmNlJyBhcyBrZXlvZiBTdWkpO1xuICAgICAgY2FsbEJhY2sucmVzb2x2ZXMoeyB0b3RhbEJhbGFuY2U6ICcwJywgY29pbk9iamVjdEJhbGFuY2U6ICcwJywgZnVuZHNJbkFkZHJlc3NCYWxhbmNlOiAnMCcgfSk7XG5cbiAgICAgIGF3YWl0IGJhc2Vjb2luXG4gICAgICAgIC5yZWNvdmVyKHtcbiAgICAgICAgICB1c2VyS2V5OiBrZXlzLnVzZXJLZXksXG4gICAgICAgICAgYmFja3VwS2V5OiBrZXlzLmJhY2t1cEtleSxcbiAgICAgICAgICBiaXRnb0tleToga2V5cy5iaXRnb0tleSxcbiAgICAgICAgICByZWNvdmVyeURlc3RpbmF0aW9uLFxuICAgICAgICAgIHdhbGxldFBhc3NwaHJhc2UsXG4gICAgICAgICAgc2NhbjogJzEwJyxcbiAgICAgICAgfSlcbiAgICAgICAgLnNob3VsZC5yZWplY3RlZFdpdGgoXG4gICAgICAgICAgJ0RpZCBub3QgZmluZCBhbiBhZGRyZXNzIHdpdGggc3VmZmljaWVudCBmdW5kcyB0byByZWNvdmVyLiBQbGVhc2Ugc3RhcnQgdGhlIG5leHQgc2NhbiBhdCBhZGRyZXNzIGluZGV4IDEwLiBJZiBpdCBpcyB0b2tlbiB0cmFuc2FjdGlvbiwgcGxlYXNlIGtlZXAgc3VmZmljaWVudCBTdWkgYmFsYW5jZSBpbiB0aGUgYWRkcmVzcyBmb3IgdGhlIHRyYW5zYWN0aW9uIGZlZS4nXG4gICAgICAgICk7XG5cbiAgICAgIHNhbmRCb3guYXNzZXJ0LmNhbGxDb3VudChiYXNlY29pbi5nZXRCYWxhbmNlLCAxMCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdDb25zb2xpZGF0aW9uIFRyYW5zYWN0aW9uIEZhaWx1cmVzOicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGZhaWwgZHVlIHRvIGluc3VmZmljaWVudCBmdW5kcyBpbiByZWNlaXZlIGFkZHJlc3MnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBzYW5kQm94ID0gc2lub24uY3JlYXRlU2FuZGJveCgpO1xuICAgICAgY29uc3QgcmVjZWl2ZUFkZHJlc3MxID0gJzB4MzJkOGU1N2VlNmQ5MWU1NTU4ZGEwNjc3MTU0YzJmMDg1Nzk1MzQ4ZTMxN2Y5NWFjYzllZmFkZTFiNDExMmZjYyc7XG4gICAgICBjb25zdCB3YWxsZXRQYXNzcGhyYXNlID0gJ3AkU3c8Ump2QWdme25ZQVlJMnhNJztcblxuICAgICAgY29uc3QgY2FsbEJhY2sgPSBzYW5kQm94LnN0dWIoU3VpLnByb3RvdHlwZSwgJ2dldEJhbGFuY2UnIGFzIGtleW9mIFN1aSk7XG4gICAgICBjYWxsQmFja1xuICAgICAgICAud2l0aEFyZ3MocmVjZWl2ZUFkZHJlc3MxKVxuICAgICAgICAucmVzb2x2ZXMoeyB0b3RhbEJhbGFuY2U6ICcxJywgY29pbk9iamVjdEJhbGFuY2U6ICcxJywgZnVuZHNJbkFkZHJlc3NCYWxhbmNlOiAnMCcgfSk7XG5cbiAgICAgIGF3YWl0IGJhc2Vjb2luXG4gICAgICAgIC5yZWNvdmVyQ29uc29saWRhdGlvbnMoe1xuICAgICAgICAgIHVzZXJLZXk6IGtleXMudXNlcktleSxcbiAgICAgICAgICBiYWNrdXBLZXk6IGtleXMuYmFja3VwS2V5LFxuICAgICAgICAgIGJpdGdvS2V5OiBrZXlzLmJpdGdvS2V5LFxuICAgICAgICAgIHdhbGxldFBhc3NwaHJhc2UsXG4gICAgICAgICAgc3RhcnRpbmdTY2FuSW5kZXg6ICcxJyxcbiAgICAgICAgICBlbmRpbmdTY2FuSW5kZXg6ICcyJyxcbiAgICAgICAgfSlcbiAgICAgICAgLnNob3VsZC5yZWplY3RlZFdpdGgoXG4gICAgICAgICAgJ0RpZCBub3QgZmluZCBhbiBhZGRyZXNzIHdpdGggc3VmZmljaWVudCBmdW5kcyB0byByZWNvdmVyLiBQbGVhc2Ugc3RhcnQgdGhlIG5leHQgc2NhbiBhdCBhZGRyZXNzIGluZGV4IDIuJ1xuICAgICAgICApO1xuXG4gICAgICBzYW5kQm94LmFzc2VydC5jYWxsQ291bnQoYmFzZWNvaW4uZ2V0QmFsYW5jZSwgMSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
|