@bitgo-beta/sdk-coin-apt 1.0.1-beta.90 → 1.0.1-beta.901
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/apt.d.ts +9 -2
- package/dist/src/apt.d.ts.map +1 -1
- package/dist/src/apt.js +37 -11
- package/dist/src/aptNFTCollection.d.ts +18 -0
- package/dist/src/aptNFTCollection.d.ts.map +1 -0
- package/dist/src/aptNFTCollection.js +52 -0
- package/dist/src/aptToken.d.ts +19 -0
- package/dist/src/aptToken.d.ts.map +1 -0
- package/dist/src/aptToken.js +52 -0
- package/dist/src/index.d.ts +2 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +3 -1
- package/dist/src/lib/constants.d.ts +16 -0
- package/dist/src/lib/constants.d.ts.map +1 -1
- package/dist/src/lib/constants.js +18 -2
- package/dist/src/lib/iface.d.ts +99 -2
- package/dist/src/lib/iface.d.ts.map +1 -1
- package/dist/src/lib/iface.js +1 -1
- package/dist/src/lib/index.d.ts +18 -4
- package/dist/src/lib/index.d.ts.map +1 -1
- package/dist/src/lib/index.js +35 -7
- package/dist/src/lib/transaction/abstractDelegationPoolAmountBasedTransaction.d.ts +21 -0
- package/dist/src/lib/transaction/abstractDelegationPoolAmountBasedTransaction.d.ts.map +1 -0
- package/dist/src/lib/transaction/abstractDelegationPoolAmountBasedTransaction.js +61 -0
- package/dist/src/lib/transaction/abstractDelegationPoolTransaction.d.ts +13 -0
- package/dist/src/lib/transaction/abstractDelegationPoolTransaction.d.ts.map +1 -0
- package/dist/src/lib/transaction/abstractDelegationPoolTransaction.js +23 -0
- package/dist/src/lib/transaction/abstractTransferTransaction.d.ts +10 -0
- package/dist/src/lib/transaction/abstractTransferTransaction.d.ts.map +1 -0
- package/dist/src/lib/transaction/abstractTransferTransaction.js +39 -0
- package/dist/src/lib/transaction/customTransaction.d.ts +89 -0
- package/dist/src/lib/transaction/customTransaction.d.ts.map +1 -0
- package/dist/src/lib/transaction/customTransaction.js +278 -0
- package/dist/src/lib/transaction/delegationPoolAddStakeTransaction.d.ts +10 -0
- package/dist/src/lib/transaction/delegationPoolAddStakeTransaction.d.ts.map +1 -0
- package/dist/src/lib/transaction/delegationPoolAddStakeTransaction.js +48 -0
- package/dist/src/lib/transaction/delegationPoolUnlockTransaction.d.ts +10 -0
- package/dist/src/lib/transaction/delegationPoolUnlockTransaction.d.ts.map +1 -0
- package/dist/src/lib/transaction/delegationPoolUnlockTransaction.js +24 -0
- package/dist/src/lib/transaction/delegationPoolWithdrawTransaction.d.ts +10 -0
- package/dist/src/lib/transaction/delegationPoolWithdrawTransaction.d.ts.map +1 -0
- package/dist/src/lib/transaction/delegationPoolWithdrawTransaction.js +43 -0
- package/dist/src/lib/transaction/digitalAssetTransfer.d.ts +10 -0
- package/dist/src/lib/transaction/digitalAssetTransfer.d.ts.map +1 -0
- package/dist/src/lib/transaction/digitalAssetTransfer.js +45 -0
- package/dist/src/lib/transaction/fungibleAssetTransfer.d.ts +12 -0
- package/dist/src/lib/transaction/fungibleAssetTransfer.d.ts.map +1 -0
- package/dist/src/lib/transaction/fungibleAssetTransfer.js +73 -0
- package/dist/src/lib/transaction/transaction.d.ts +45 -7
- package/dist/src/lib/transaction/transaction.d.ts.map +1 -1
- package/dist/src/lib/transaction/transaction.js +175 -61
- package/dist/src/lib/transaction/transferTransaction.d.ts +10 -8
- package/dist/src/lib/transaction/transferTransaction.d.ts.map +1 -1
- package/dist/src/lib/transaction/transferTransaction.js +48 -40
- package/dist/src/lib/transactionBuilder/customTransactionBuilder.d.ts +64 -0
- package/dist/src/lib/transactionBuilder/customTransactionBuilder.d.ts.map +1 -0
- package/dist/src/lib/transactionBuilder/customTransactionBuilder.js +127 -0
- package/dist/src/lib/transactionBuilder/delegationPoolAddStakeTransactionBuilder.d.ts +15 -0
- package/dist/src/lib/transactionBuilder/delegationPoolAddStakeTransactionBuilder.d.ts.map +1 -0
- package/dist/src/lib/transactionBuilder/delegationPoolAddStakeTransactionBuilder.js +50 -0
- package/dist/src/lib/transactionBuilder/delegationPoolUnlockTransactionBuilder.d.ts +15 -0
- package/dist/src/lib/transactionBuilder/delegationPoolUnlockTransactionBuilder.d.ts.map +1 -0
- package/dist/src/lib/transactionBuilder/delegationPoolUnlockTransactionBuilder.js +50 -0
- package/dist/src/lib/transactionBuilder/delegationPoolWithdrawTransactionBuilder.d.ts +15 -0
- package/dist/src/lib/transactionBuilder/delegationPoolWithdrawTransactionBuilder.d.ts.map +1 -0
- package/dist/src/lib/transactionBuilder/delegationPoolWithdrawTransactionBuilder.js +50 -0
- package/dist/src/lib/transactionBuilder/digitalAssetTransferBuilder.d.ts +14 -0
- package/dist/src/lib/transactionBuilder/digitalAssetTransferBuilder.d.ts.map +1 -0
- package/dist/src/lib/transactionBuilder/digitalAssetTransferBuilder.js +55 -0
- package/dist/src/lib/transactionBuilder/fungibleAssetTransferBuilder.d.ts +15 -0
- package/dist/src/lib/transactionBuilder/fungibleAssetTransferBuilder.d.ts.map +1 -0
- package/dist/src/lib/transactionBuilder/fungibleAssetTransferBuilder.js +61 -0
- package/dist/src/lib/{transactionBuilder.d.ts → transactionBuilder/transactionBuilder.d.ts} +25 -11
- package/dist/src/lib/transactionBuilder/transactionBuilder.d.ts.map +1 -0
- package/dist/src/lib/transactionBuilder/transactionBuilder.js +169 -0
- package/dist/src/lib/{transferBuilder.d.ts → transactionBuilder/transferBuilder.d.ts} +5 -7
- package/dist/src/lib/transactionBuilder/transferBuilder.d.ts.map +1 -0
- package/dist/src/lib/transactionBuilder/transferBuilder.js +56 -0
- package/dist/src/lib/transactionBuilderFactory.d.ts +26 -10
- package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilderFactory.js +82 -18
- package/dist/src/lib/utils/validation.d.ts +32 -0
- package/dist/src/lib/utils/validation.d.ts.map +1 -0
- package/dist/src/lib/utils/validation.js +99 -0
- package/dist/src/lib/utils.d.ts +29 -5
- package/dist/src/lib/utils.d.ts.map +1 -1
- package/dist/src/lib/utils.js +111 -28
- package/dist/src/register.d.ts.map +1 -1
- package/dist/src/register.js +9 -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/resources/apt.d.ts +56 -0
- package/dist/test/resources/apt.d.ts.map +1 -0
- package/dist/test/resources/apt.js +115 -0
- package/dist/test/unit/apt.d.ts +2 -0
- package/dist/test/unit/apt.d.ts.map +1 -0
- package/dist/test/unit/apt.js +375 -0
- package/dist/test/unit/aptToken.d.ts +2 -0
- package/dist/test/unit/aptToken.d.ts.map +1 -0
- package/dist/test/unit/aptToken.js +92 -0
- package/dist/test/unit/customTransaction.test.d.ts +2 -0
- package/dist/test/unit/customTransaction.test.d.ts.map +1 -0
- package/dist/test/unit/customTransaction.test.js +264 -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 +71 -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 +743 -0
- package/dist/test/unit/transactionBuilder/delegationPoolAddStakeTransactionBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/delegationPoolAddStakeTransactionBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/delegationPoolAddStakeTransactionBuilder.js +172 -0
- package/dist/test/unit/transactionBuilder/delegationPoolUnlockTransactionBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/delegationPoolUnlockTransactionBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/delegationPoolUnlockTransactionBuilder.js +148 -0
- package/dist/test/unit/transactionBuilder/delegationPoolWithdrawTransactionBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/delegationPoolWithdrawTransactionBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/delegationPoolWithdrawTransactionBuilder.js +172 -0
- package/dist/test/unit/transactionBuilder/digitalAssetTransferBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/digitalAssetTransferBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/digitalAssetTransferBuilder.js +276 -0
- package/dist/test/unit/transactionBuilder/fungibleAssetTransferBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/fungibleAssetTransferBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/fungibleAssetTransferBuilder.js +449 -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 +529 -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 +108 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +14 -11
- package/.eslintignore +0 -4
- package/.gitignore +0 -3
- package/.mocharc.yml +0 -8
- package/.prettierignore +0 -2
- package/CHANGELOG.md +0 -72
- package/dist/src/lib/transactionBuilder.d.ts.map +0 -1
- package/dist/src/lib/transactionBuilder.js +0 -118
- package/dist/src/lib/transferBuilder.d.ts.map +0 -1
- package/dist/src/lib/transferBuilder.js +0 -25
|
@@ -0,0 +1,743 @@
|
|
|
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 statics_1 = require("@bitgo-beta/statics");
|
|
40
|
+
const src_1 = require("../../../src");
|
|
41
|
+
const testData = __importStar(require("../../resources/apt"));
|
|
42
|
+
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
43
|
+
const should_1 = __importDefault(require("should"));
|
|
44
|
+
const ts_sdk_1 = require("@aptos-labs/ts-sdk");
|
|
45
|
+
describe('Apt Custom Transaction Builder', () => {
|
|
46
|
+
const factory = new src_1.TransactionBuilderFactory(statics_1.coins.get('tapt'));
|
|
47
|
+
// Common ABI patterns for tests
|
|
48
|
+
const transferCoinsAbi = {
|
|
49
|
+
typeParameters: [{ constraints: [] }],
|
|
50
|
+
parameters: [new ts_sdk_1.TypeTagAddress(), new ts_sdk_1.TypeTagU64()],
|
|
51
|
+
};
|
|
52
|
+
const mintAbi = {
|
|
53
|
+
typeParameters: [{ constraints: [] }], // Expects 1 type parameter for Coin<T>
|
|
54
|
+
parameters: [new ts_sdk_1.TypeTagAddress(), new ts_sdk_1.TypeTagU64()],
|
|
55
|
+
};
|
|
56
|
+
const burnAbi = {
|
|
57
|
+
typeParameters: [{ constraints: [] }], // Expects 1 type parameter for Coin<T>
|
|
58
|
+
parameters: [new ts_sdk_1.TypeTagU64()],
|
|
59
|
+
};
|
|
60
|
+
const basicAbi = {
|
|
61
|
+
typeParameters: [],
|
|
62
|
+
parameters: [],
|
|
63
|
+
};
|
|
64
|
+
// ABI for custom token functions that don't use type parameters
|
|
65
|
+
const customTokenMintAbi = {
|
|
66
|
+
typeParameters: [], // No type parameters for custom token
|
|
67
|
+
parameters: [new ts_sdk_1.TypeTagAddress(), new ts_sdk_1.TypeTagU64()],
|
|
68
|
+
};
|
|
69
|
+
const customTokenBurnAbi = {
|
|
70
|
+
typeParameters: [], // No type parameters for custom token
|
|
71
|
+
parameters: [new ts_sdk_1.TypeTagU64()],
|
|
72
|
+
};
|
|
73
|
+
// Wrong ABI for testing - has wrong parameter count but correct type parameter count
|
|
74
|
+
const wrongAbi = {
|
|
75
|
+
typeParameters: [{ constraints: [] }],
|
|
76
|
+
parameters: [new ts_sdk_1.TypeTagAddress(), new ts_sdk_1.TypeTagU64(), new ts_sdk_1.TypeTagAddress()], // Wrong - 3 params instead of 2
|
|
77
|
+
};
|
|
78
|
+
describe('Custom Entry Function Call', () => {
|
|
79
|
+
describe('Succeed', () => {
|
|
80
|
+
it('should build a custom transaction with transfer_coins function', async function () {
|
|
81
|
+
const transaction = new src_1.CustomTransaction(statics_1.coins.get('tapt'));
|
|
82
|
+
const txBuilder = factory.getCustomTransactionBuilder(transaction);
|
|
83
|
+
txBuilder.sender(testData.sender2.address);
|
|
84
|
+
txBuilder.gasData({
|
|
85
|
+
maxGasAmount: 200000,
|
|
86
|
+
gasUnitPrice: 100,
|
|
87
|
+
});
|
|
88
|
+
txBuilder.sequenceNumber(14);
|
|
89
|
+
txBuilder.expirationTime(1736246155);
|
|
90
|
+
txBuilder.customTransaction({
|
|
91
|
+
moduleName: '0x1::aptos_account',
|
|
92
|
+
functionName: 'transfer_coins',
|
|
93
|
+
typeArguments: ['0x1::aptos_coin::AptosCoin'],
|
|
94
|
+
functionArguments: [testData.recipients[0].address, testData.recipients[0].amount],
|
|
95
|
+
abi: transferCoinsAbi,
|
|
96
|
+
});
|
|
97
|
+
txBuilder.addFeePayerAddress(testData.feePayer.address);
|
|
98
|
+
txBuilder.setIsSimulateTxn(true);
|
|
99
|
+
const tx = (await txBuilder.build());
|
|
100
|
+
should_1.default.equal(tx.sender, testData.sender2.address);
|
|
101
|
+
should_1.default.equal(tx.maxGasAmount, 200000);
|
|
102
|
+
should_1.default.equal(tx.gasUnitPrice, 100);
|
|
103
|
+
should_1.default.equal(tx.sequenceNumber, 14);
|
|
104
|
+
should_1.default.equal(tx.expirationTime, 1736246155);
|
|
105
|
+
should_1.default.equal(tx.type, sdk_core_1.TransactionType.CustomTx);
|
|
106
|
+
const rawTx = tx.toBroadcastFormat();
|
|
107
|
+
should_1.default.equal(txBuilder.isValidRawTransaction(rawTx), true);
|
|
108
|
+
});
|
|
109
|
+
it('should succeed to validate a valid signablePayload', async function () {
|
|
110
|
+
const transaction = new src_1.CustomTransaction(statics_1.coins.get('tapt'));
|
|
111
|
+
const txBuilder = factory.getCustomTransactionBuilder(transaction);
|
|
112
|
+
txBuilder.sender(testData.sender2.address);
|
|
113
|
+
txBuilder.gasData({
|
|
114
|
+
maxGasAmount: 200000,
|
|
115
|
+
gasUnitPrice: 100,
|
|
116
|
+
});
|
|
117
|
+
txBuilder.sequenceNumber(14);
|
|
118
|
+
txBuilder.expirationTime(1736246155);
|
|
119
|
+
txBuilder.customTransaction({
|
|
120
|
+
moduleName: '0x1::aptos_account',
|
|
121
|
+
functionName: 'transfer_coins',
|
|
122
|
+
typeArguments: ['0x1::aptos_coin::AptosCoin'],
|
|
123
|
+
functionArguments: [testData.recipients[0].address, testData.recipients[0].amount],
|
|
124
|
+
abi: transferCoinsAbi,
|
|
125
|
+
});
|
|
126
|
+
txBuilder.addFeePayerAddress(testData.feePayer.address);
|
|
127
|
+
const tx = (await txBuilder.build());
|
|
128
|
+
const signablePayload = tx.signablePayload;
|
|
129
|
+
should_1.default.exist(signablePayload);
|
|
130
|
+
});
|
|
131
|
+
it('should build a unsigned tx and validate basic properties', async function () {
|
|
132
|
+
const transaction = new src_1.CustomTransaction(statics_1.coins.get('tapt'));
|
|
133
|
+
const txBuilder = factory.getCustomTransactionBuilder(transaction);
|
|
134
|
+
txBuilder.sender(testData.sender2.address);
|
|
135
|
+
txBuilder.gasData({
|
|
136
|
+
maxGasAmount: 200000,
|
|
137
|
+
gasUnitPrice: 100,
|
|
138
|
+
});
|
|
139
|
+
txBuilder.sequenceNumber(14);
|
|
140
|
+
txBuilder.expirationTime(1736246155);
|
|
141
|
+
txBuilder.customTransaction({
|
|
142
|
+
moduleName: '0x1::aptos_account',
|
|
143
|
+
functionName: 'transfer_coins',
|
|
144
|
+
typeArguments: ['0x1::aptos_coin::AptosCoin'],
|
|
145
|
+
functionArguments: [testData.recipients[0].address, testData.recipients[0].amount],
|
|
146
|
+
abi: transferCoinsAbi,
|
|
147
|
+
});
|
|
148
|
+
txBuilder.addFeePayerAddress(testData.feePayer.address);
|
|
149
|
+
const tx = (await txBuilder.build());
|
|
150
|
+
should_1.default.equal(tx.sender, testData.sender2.address);
|
|
151
|
+
should_1.default.equal(tx.sequenceNumber, 14);
|
|
152
|
+
should_1.default.equal(tx.maxGasAmount, 200000);
|
|
153
|
+
should_1.default.equal(tx.gasUnitPrice, 100);
|
|
154
|
+
should_1.default.equal(tx.expirationTime, 1736246155);
|
|
155
|
+
should_1.default.equal(tx.feePayerAddress, testData.feePayer.address);
|
|
156
|
+
});
|
|
157
|
+
it('should build a custom transaction with token mint function', async function () {
|
|
158
|
+
const transaction = new src_1.CustomTransaction(statics_1.coins.get('tapt'));
|
|
159
|
+
const txBuilder = factory.getCustomTransactionBuilder(transaction);
|
|
160
|
+
txBuilder.sender(testData.sender2.address);
|
|
161
|
+
txBuilder.gasData({
|
|
162
|
+
maxGasAmount: 200000,
|
|
163
|
+
gasUnitPrice: 100,
|
|
164
|
+
});
|
|
165
|
+
txBuilder.sequenceNumber(15);
|
|
166
|
+
txBuilder.expirationTime(1736246155);
|
|
167
|
+
txBuilder.customTransaction({
|
|
168
|
+
moduleName: '0x1::managed_coin',
|
|
169
|
+
functionName: 'mint',
|
|
170
|
+
typeArguments: ['0x1::aptos_coin::AptosCoin'],
|
|
171
|
+
functionArguments: [testData.recipients[0].address, testData.recipients[0].amount],
|
|
172
|
+
abi: mintAbi,
|
|
173
|
+
});
|
|
174
|
+
txBuilder.addFeePayerAddress(testData.feePayer.address);
|
|
175
|
+
txBuilder.setIsSimulateTxn(true);
|
|
176
|
+
const tx = (await txBuilder.build());
|
|
177
|
+
should_1.default.equal(tx.sender, testData.sender2.address);
|
|
178
|
+
should_1.default.equal(tx.maxGasAmount, 200000);
|
|
179
|
+
should_1.default.equal(tx.gasUnitPrice, 100);
|
|
180
|
+
should_1.default.equal(tx.sequenceNumber, 15);
|
|
181
|
+
should_1.default.equal(tx.expirationTime, 1736246155);
|
|
182
|
+
should_1.default.equal(tx.type, sdk_core_1.TransactionType.CustomTx);
|
|
183
|
+
const rawTx = tx.toBroadcastFormat();
|
|
184
|
+
should_1.default.equal(txBuilder.isValidRawTransaction(rawTx), true);
|
|
185
|
+
});
|
|
186
|
+
it('should build a custom transaction with token burn function', async function () {
|
|
187
|
+
const transaction = new src_1.CustomTransaction(statics_1.coins.get('tapt'));
|
|
188
|
+
const txBuilder = factory.getCustomTransactionBuilder(transaction);
|
|
189
|
+
txBuilder.sender(testData.sender2.address);
|
|
190
|
+
txBuilder.gasData({
|
|
191
|
+
maxGasAmount: 200000,
|
|
192
|
+
gasUnitPrice: 100,
|
|
193
|
+
});
|
|
194
|
+
txBuilder.sequenceNumber(16);
|
|
195
|
+
txBuilder.expirationTime(1736246155);
|
|
196
|
+
txBuilder.customTransaction({
|
|
197
|
+
moduleName: '0x1::managed_coin',
|
|
198
|
+
functionName: 'burn',
|
|
199
|
+
typeArguments: ['0x1::aptos_coin::AptosCoin'],
|
|
200
|
+
functionArguments: [
|
|
201
|
+
testData.recipients[0].amount, // amount
|
|
202
|
+
],
|
|
203
|
+
abi: burnAbi,
|
|
204
|
+
});
|
|
205
|
+
txBuilder.addFeePayerAddress(testData.feePayer.address);
|
|
206
|
+
txBuilder.setIsSimulateTxn(true);
|
|
207
|
+
const tx = (await txBuilder.build());
|
|
208
|
+
should_1.default.equal(tx.sender, testData.sender2.address);
|
|
209
|
+
should_1.default.equal(tx.maxGasAmount, 200000);
|
|
210
|
+
should_1.default.equal(tx.gasUnitPrice, 100);
|
|
211
|
+
should_1.default.equal(tx.sequenceNumber, 16);
|
|
212
|
+
should_1.default.equal(tx.expirationTime, 1736246155);
|
|
213
|
+
should_1.default.equal(tx.type, sdk_core_1.TransactionType.CustomTx);
|
|
214
|
+
const rawTx = tx.toBroadcastFormat();
|
|
215
|
+
should_1.default.equal(txBuilder.isValidRawTransaction(rawTx), true);
|
|
216
|
+
});
|
|
217
|
+
it('should build and rebuild custom transaction with correct U64 amount parsing', async function () {
|
|
218
|
+
// Use the provided serialized hex with amount 1000
|
|
219
|
+
const serializedHex = '0xf22fa009b6473cdc539ecbd570d00d0585682f5939ffe256a90ddee0d616292f000000000000000002000000000000000000000000000000000000000000000000000000000000000104636f696e087472616e73666572010700000000000000000000000000000000000000000000000000000000000000010a6170746f735f636f696e094170746f73436f696e000220da22bdc19f873fd6ce48c32912965c8a9dde578b2a3cf4fae3dd85dfaac784c908e803000000000000a8610000000000006400000000000000901cdd680000000002030020000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000adba44b46722b8da1797645f71ddcdab28626c06acd36b88d5198a684966306c0020453ed5aa75b01f3eb03ab1d3030be10996206e5a073a74983ea3fcd013ffe1ea4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000';
|
|
220
|
+
const transferCoinsAbi = {
|
|
221
|
+
typeParameters: [{ constraints: [] }],
|
|
222
|
+
parameters: [new ts_sdk_1.TypeTagAddress(), new ts_sdk_1.TypeTagU64()],
|
|
223
|
+
};
|
|
224
|
+
// Build transaction from serialized hex
|
|
225
|
+
const txBuilder = factory.from(serializedHex, transferCoinsAbi);
|
|
226
|
+
const tx = (await txBuilder.build());
|
|
227
|
+
// Validate the transaction was parsed correctly
|
|
228
|
+
should_1.default.equal(tx.type, sdk_core_1.TransactionType.CustomTx);
|
|
229
|
+
should_1.default.exist(tx.fullFunctionName);
|
|
230
|
+
should_1.default.equal(tx.fullFunctionName, '0x1::coin::transfer');
|
|
231
|
+
// Get the custom transaction parameters
|
|
232
|
+
const customParams = tx.getCustomTransactionParams();
|
|
233
|
+
should_1.default.exist(customParams);
|
|
234
|
+
should_1.default.equal(customParams.moduleName, '0x1::coin');
|
|
235
|
+
should_1.default.equal(customParams.functionName, 'transfer');
|
|
236
|
+
should_1.default.exist(customParams.functionArguments);
|
|
237
|
+
should_1.default.equal(customParams.functionArguments.length, 2);
|
|
238
|
+
// Validate the amount argument was parsed correctly as 1000
|
|
239
|
+
const parsedAmount = customParams.functionArguments[1];
|
|
240
|
+
should_1.default.equal(parsedAmount, '1000', 'Amount should be correctly parsed as 1000 from U64 bytes');
|
|
241
|
+
// Validate the address argument (first argument)
|
|
242
|
+
const parsedAddress = customParams.functionArguments[0];
|
|
243
|
+
should_1.default.exist(parsedAddress);
|
|
244
|
+
should_1.default.equal(typeof parsedAddress, 'string', 'Address should be a string');
|
|
245
|
+
parsedAddress.should.match(/^0x[a-fA-F0-9]+$/, 'Address should be valid hex format');
|
|
246
|
+
// Ensure the transaction can be rebuilt (round-trip test)
|
|
247
|
+
const rawTx = tx.toBroadcastFormat();
|
|
248
|
+
should_1.default.equal(txBuilder.isValidRawTransaction(rawTx), true);
|
|
249
|
+
});
|
|
250
|
+
});
|
|
251
|
+
describe('Fail', () => {
|
|
252
|
+
it('should fail for invalid sender', async function () {
|
|
253
|
+
const transaction = new src_1.CustomTransaction(statics_1.coins.get('tapt'));
|
|
254
|
+
const builder = factory.getCustomTransactionBuilder(transaction);
|
|
255
|
+
(0, should_1.default)(() => builder.sender('randomString')).throwError('Invalid address randomString');
|
|
256
|
+
});
|
|
257
|
+
it('should fail for missing module name', async function () {
|
|
258
|
+
const builder = factory.getCustomTransactionBuilder();
|
|
259
|
+
(0, should_1.default)(() => builder.customTransaction({
|
|
260
|
+
moduleName: '',
|
|
261
|
+
functionName: 'register_domain',
|
|
262
|
+
typeArguments: [],
|
|
263
|
+
functionArguments: [],
|
|
264
|
+
abi: basicAbi,
|
|
265
|
+
})).throwError('Missing module name');
|
|
266
|
+
});
|
|
267
|
+
it('should fail for missing function name', async function () {
|
|
268
|
+
const builder = factory.getCustomTransactionBuilder();
|
|
269
|
+
(0, should_1.default)(() => builder.customTransaction({
|
|
270
|
+
moduleName: '0x1::aptos_account',
|
|
271
|
+
functionName: '',
|
|
272
|
+
typeArguments: [],
|
|
273
|
+
functionArguments: [],
|
|
274
|
+
abi: basicAbi,
|
|
275
|
+
})).throwError('Missing function name');
|
|
276
|
+
});
|
|
277
|
+
it('should fail for invalid module name format', async function () {
|
|
278
|
+
const builder = factory.getCustomTransactionBuilder();
|
|
279
|
+
(0, should_1.default)(() => builder.customTransaction({
|
|
280
|
+
moduleName: 'invalid_format',
|
|
281
|
+
functionName: 'transfer',
|
|
282
|
+
typeArguments: [],
|
|
283
|
+
functionArguments: [],
|
|
284
|
+
abi: basicAbi,
|
|
285
|
+
})).throwError(/Invalid module name format/);
|
|
286
|
+
});
|
|
287
|
+
it('should fail for invalid function name format', async function () {
|
|
288
|
+
const builder = factory.getCustomTransactionBuilder();
|
|
289
|
+
(0, should_1.default)(() => builder.customTransaction({
|
|
290
|
+
moduleName: '0x1::aptos_account',
|
|
291
|
+
functionName: '123invalid',
|
|
292
|
+
typeArguments: [],
|
|
293
|
+
functionArguments: [],
|
|
294
|
+
abi: basicAbi,
|
|
295
|
+
})).throwError(/Invalid function name format/);
|
|
296
|
+
});
|
|
297
|
+
it('should accept valid SHORT address format', async function () {
|
|
298
|
+
const builder = factory.getCustomTransactionBuilder();
|
|
299
|
+
(0, should_1.default)(() => builder.customTransaction({
|
|
300
|
+
moduleName: '0x1::aptos_account',
|
|
301
|
+
functionName: 'transfer_coins',
|
|
302
|
+
typeArguments: [],
|
|
303
|
+
functionArguments: [],
|
|
304
|
+
abi: basicAbi,
|
|
305
|
+
})).not.throw();
|
|
306
|
+
});
|
|
307
|
+
it('should accept valid LONG address format', async function () {
|
|
308
|
+
const builder = factory.getCustomTransactionBuilder();
|
|
309
|
+
(0, should_1.default)(() => builder.customTransaction({
|
|
310
|
+
moduleName: '0x0000000000000000000000000000000000000000000000000000000000000001::aptos_account',
|
|
311
|
+
functionName: 'transfer_coins',
|
|
312
|
+
typeArguments: [],
|
|
313
|
+
functionArguments: [],
|
|
314
|
+
abi: basicAbi,
|
|
315
|
+
})).not.throw();
|
|
316
|
+
});
|
|
317
|
+
it('should reject named addresses', async function () {
|
|
318
|
+
const builder = factory.getCustomTransactionBuilder();
|
|
319
|
+
(0, should_1.default)(() => builder.customTransaction({
|
|
320
|
+
moduleName: 'aptos_framework::aptos_account',
|
|
321
|
+
functionName: 'transfer_coins',
|
|
322
|
+
typeArguments: [],
|
|
323
|
+
functionArguments: [],
|
|
324
|
+
abi: basicAbi,
|
|
325
|
+
})).throwError(/Invalid module name format.*hex addresses only/);
|
|
326
|
+
});
|
|
327
|
+
it('should validate transaction payloads properly', async function () {
|
|
328
|
+
const transaction = new src_1.CustomTransaction(statics_1.coins.get('tapt'));
|
|
329
|
+
const txBuilder = factory.getCustomTransactionBuilder(transaction);
|
|
330
|
+
// Valid payload should pass validation
|
|
331
|
+
txBuilder.sender(testData.sender2.address);
|
|
332
|
+
txBuilder.gasData({
|
|
333
|
+
maxGasAmount: 200000,
|
|
334
|
+
gasUnitPrice: 100,
|
|
335
|
+
});
|
|
336
|
+
txBuilder.sequenceNumber(14);
|
|
337
|
+
txBuilder.expirationTime(1736246155);
|
|
338
|
+
txBuilder.customTransaction({
|
|
339
|
+
moduleName: '0x1::managed_coin',
|
|
340
|
+
functionName: 'mint',
|
|
341
|
+
typeArguments: ['0x1::aptos_coin::AptosCoin'],
|
|
342
|
+
functionArguments: [testData.recipients[0].address, testData.recipients[0].amount],
|
|
343
|
+
abi: mintAbi,
|
|
344
|
+
});
|
|
345
|
+
const tx = await txBuilder.build();
|
|
346
|
+
should_1.default.exist(tx);
|
|
347
|
+
should_1.default.equal(tx.type, sdk_core_1.TransactionType.CustomTx);
|
|
348
|
+
});
|
|
349
|
+
it('should fail for invalid gas amount', async function () {
|
|
350
|
+
const builder = factory.getCustomTransactionBuilder();
|
|
351
|
+
(0, should_1.default)(() => builder.gasData({ maxGasAmount: -1, gasUnitPrice: 100 })).throwError('Value cannot be less than zero');
|
|
352
|
+
(0, should_1.default)(() => builder.gasData({ maxGasAmount: 200000, gasUnitPrice: -1 })).throwError('Value cannot be less than zero');
|
|
353
|
+
});
|
|
354
|
+
it('should fail to build without required parameters', async function () {
|
|
355
|
+
const transaction = new src_1.CustomTransaction(statics_1.coins.get('tapt'));
|
|
356
|
+
const txBuilder = factory.getCustomTransactionBuilder(transaction);
|
|
357
|
+
txBuilder.sender(testData.sender2.address);
|
|
358
|
+
txBuilder.gasData({
|
|
359
|
+
maxGasAmount: 200000,
|
|
360
|
+
gasUnitPrice: 100,
|
|
361
|
+
});
|
|
362
|
+
txBuilder.sequenceNumber(14);
|
|
363
|
+
txBuilder.expirationTime(1736246155);
|
|
364
|
+
await (0, should_1.default)(txBuilder.build()).be.rejectedWith('Missing required module or function name');
|
|
365
|
+
});
|
|
366
|
+
});
|
|
367
|
+
describe('ABI Behavior Tests', () => {
|
|
368
|
+
it('should succeed when ABI is not provided (undefined)', async function () {
|
|
369
|
+
const transaction = new src_1.CustomTransaction(statics_1.coins.get('tapt'));
|
|
370
|
+
const txBuilder = factory.getCustomTransactionBuilder(transaction);
|
|
371
|
+
txBuilder.sender(testData.sender2.address);
|
|
372
|
+
txBuilder.gasData({
|
|
373
|
+
maxGasAmount: 200000,
|
|
374
|
+
gasUnitPrice: 100,
|
|
375
|
+
});
|
|
376
|
+
txBuilder.sequenceNumber(14);
|
|
377
|
+
txBuilder.expirationTime(1736246155);
|
|
378
|
+
txBuilder.customTransaction({
|
|
379
|
+
moduleName: '0x1::aptos_account',
|
|
380
|
+
functionName: 'transfer_coins',
|
|
381
|
+
typeArguments: ['0x1::aptos_coin::AptosCoin'],
|
|
382
|
+
functionArguments: [testData.recipients[0].address, testData.recipients[0].amount],
|
|
383
|
+
abi: transferCoinsAbi, // ABI is now required
|
|
384
|
+
});
|
|
385
|
+
txBuilder.addFeePayerAddress(testData.feePayer.address);
|
|
386
|
+
txBuilder.setIsSimulateTxn(true);
|
|
387
|
+
const tx = (await txBuilder.build());
|
|
388
|
+
should_1.default.equal(tx.type, sdk_core_1.TransactionType.CustomTx);
|
|
389
|
+
const rawTx = tx.toBroadcastFormat();
|
|
390
|
+
should_1.default.equal(txBuilder.isValidRawTransaction(rawTx), true);
|
|
391
|
+
});
|
|
392
|
+
it('should fail with invalid ABI string', async function () {
|
|
393
|
+
const transaction = new src_1.CustomTransaction(statics_1.coins.get('tapt'));
|
|
394
|
+
const txBuilder = factory.getCustomTransactionBuilder(transaction);
|
|
395
|
+
txBuilder.sender(testData.sender2.address);
|
|
396
|
+
txBuilder.gasData({
|
|
397
|
+
maxGasAmount: 200000,
|
|
398
|
+
gasUnitPrice: 100,
|
|
399
|
+
});
|
|
400
|
+
txBuilder.sequenceNumber(14);
|
|
401
|
+
txBuilder.expirationTime(1736246155);
|
|
402
|
+
txBuilder.customTransaction({
|
|
403
|
+
moduleName: '0x1::aptos_account',
|
|
404
|
+
functionName: 'transfer_coins',
|
|
405
|
+
typeArguments: ['0x1::aptos_coin::AptosCoin'],
|
|
406
|
+
functionArguments: [testData.recipients[0].address, testData.recipients[0].amount],
|
|
407
|
+
abi: transferCoinsAbi,
|
|
408
|
+
});
|
|
409
|
+
// Pass invalid ABI by bypassing TypeScript (cast as any)
|
|
410
|
+
txBuilder.entryFunctionAbi('random_invalid_abi');
|
|
411
|
+
txBuilder.addFeePayerAddress(testData.feePayer.address);
|
|
412
|
+
txBuilder.setIsSimulateTxn(true);
|
|
413
|
+
// Should fail due to invalid ABI during build
|
|
414
|
+
await (0, should_1.default)(txBuilder.build()).be.rejected();
|
|
415
|
+
});
|
|
416
|
+
it('should work with correct ABI for transfer_coins', async function () {
|
|
417
|
+
const { TypeTagAddress, TypeTagU64 } = await Promise.resolve().then(() => __importStar(require('@aptos-labs/ts-sdk')));
|
|
418
|
+
const transaction = new src_1.CustomTransaction(statics_1.coins.get('tapt'));
|
|
419
|
+
const txBuilder = factory.getCustomTransactionBuilder(transaction);
|
|
420
|
+
txBuilder.sender(testData.sender2.address);
|
|
421
|
+
txBuilder.gasData({
|
|
422
|
+
maxGasAmount: 200000,
|
|
423
|
+
gasUnitPrice: 100,
|
|
424
|
+
});
|
|
425
|
+
txBuilder.sequenceNumber(14);
|
|
426
|
+
txBuilder.expirationTime(1736246155);
|
|
427
|
+
txBuilder.customTransaction({
|
|
428
|
+
moduleName: '0x1::aptos_account',
|
|
429
|
+
functionName: 'transfer_coins',
|
|
430
|
+
typeArguments: ['0x1::aptos_coin::AptosCoin'],
|
|
431
|
+
functionArguments: [testData.recipients[0].address, testData.recipients[0].amount],
|
|
432
|
+
abi: transferCoinsAbi,
|
|
433
|
+
});
|
|
434
|
+
// Provide correct ABI (same as TransferTransaction uses)
|
|
435
|
+
const correctAbi = {
|
|
436
|
+
typeParameters: [{ constraints: [] }],
|
|
437
|
+
parameters: [new TypeTagAddress(), new TypeTagU64()],
|
|
438
|
+
};
|
|
439
|
+
txBuilder.entryFunctionAbi(correctAbi);
|
|
440
|
+
txBuilder.addFeePayerAddress(testData.feePayer.address);
|
|
441
|
+
txBuilder.setIsSimulateTxn(true);
|
|
442
|
+
const tx = (await txBuilder.build());
|
|
443
|
+
should_1.default.equal(tx.type, sdk_core_1.TransactionType.CustomTx);
|
|
444
|
+
const rawTx = tx.toBroadcastFormat();
|
|
445
|
+
should_1.default.equal(txBuilder.isValidRawTransaction(rawTx), true);
|
|
446
|
+
});
|
|
447
|
+
it('should build transaction with custom token mint at deployed address', async function () {
|
|
448
|
+
const transaction = new src_1.CustomTransaction(statics_1.coins.get('tapt'));
|
|
449
|
+
const txBuilder = factory.getCustomTransactionBuilder(transaction);
|
|
450
|
+
txBuilder.sender(testData.sender2.address);
|
|
451
|
+
txBuilder.gasData({
|
|
452
|
+
maxGasAmount: 200000,
|
|
453
|
+
gasUnitPrice: 100,
|
|
454
|
+
});
|
|
455
|
+
txBuilder.sequenceNumber(15);
|
|
456
|
+
txBuilder.expirationTime(1736246155);
|
|
457
|
+
txBuilder.customTransaction({
|
|
458
|
+
moduleName: '0xa85107ee0e345969d2b76e57f6f67c551ba1b066fc14d213328dded62618bf2e::sample_token',
|
|
459
|
+
functionName: 'mint',
|
|
460
|
+
typeArguments: [],
|
|
461
|
+
functionArguments: [testData.recipients[0].address, testData.recipients[0].amount],
|
|
462
|
+
abi: customTokenMintAbi,
|
|
463
|
+
});
|
|
464
|
+
txBuilder.addFeePayerAddress(testData.feePayer.address);
|
|
465
|
+
txBuilder.setIsSimulateTxn(true);
|
|
466
|
+
const tx = (await txBuilder.build());
|
|
467
|
+
should_1.default.equal(tx.type, sdk_core_1.TransactionType.CustomTx);
|
|
468
|
+
should_1.default.equal(tx.fullFunctionName, '0xa85107ee0e345969d2b76e57f6f67c551ba1b066fc14d213328dded62618bf2e::sample_token::mint');
|
|
469
|
+
const rawTx = tx.toBroadcastFormat();
|
|
470
|
+
should_1.default.equal(txBuilder.isValidRawTransaction(rawTx), true);
|
|
471
|
+
});
|
|
472
|
+
it('should build transaction with custom token burn at deployed address', async function () {
|
|
473
|
+
const transaction = new src_1.CustomTransaction(statics_1.coins.get('tapt'));
|
|
474
|
+
const txBuilder = factory.getCustomTransactionBuilder(transaction);
|
|
475
|
+
txBuilder.sender(testData.sender2.address);
|
|
476
|
+
txBuilder.gasData({
|
|
477
|
+
maxGasAmount: 200000,
|
|
478
|
+
gasUnitPrice: 100,
|
|
479
|
+
});
|
|
480
|
+
txBuilder.sequenceNumber(16);
|
|
481
|
+
txBuilder.expirationTime(1736246155);
|
|
482
|
+
txBuilder.customTransaction({
|
|
483
|
+
moduleName: '0xa85107ee0e345969d2b76e57f6f67c551ba1b066fc14d213328dded62618bf2e::sample_token',
|
|
484
|
+
functionName: 'burn',
|
|
485
|
+
typeArguments: [],
|
|
486
|
+
functionArguments: [testData.recipients[0].amount],
|
|
487
|
+
abi: customTokenBurnAbi,
|
|
488
|
+
});
|
|
489
|
+
txBuilder.addFeePayerAddress(testData.feePayer.address);
|
|
490
|
+
txBuilder.setIsSimulateTxn(true);
|
|
491
|
+
const tx = (await txBuilder.build());
|
|
492
|
+
should_1.default.equal(tx.type, sdk_core_1.TransactionType.CustomTx);
|
|
493
|
+
should_1.default.equal(tx.fullFunctionName, '0xa85107ee0e345969d2b76e57f6f67c551ba1b066fc14d213328dded62618bf2e::sample_token::burn');
|
|
494
|
+
const rawTx = tx.toBroadcastFormat();
|
|
495
|
+
should_1.default.equal(txBuilder.isValidRawTransaction(rawTx), true);
|
|
496
|
+
});
|
|
497
|
+
it('should fail with wrong ABI parameter count', async function () {
|
|
498
|
+
const transaction = new src_1.CustomTransaction(statics_1.coins.get('tapt'));
|
|
499
|
+
const txBuilder = factory.getCustomTransactionBuilder(transaction);
|
|
500
|
+
txBuilder.sender(testData.sender2.address);
|
|
501
|
+
txBuilder.gasData({
|
|
502
|
+
maxGasAmount: 200000,
|
|
503
|
+
gasUnitPrice: 100,
|
|
504
|
+
});
|
|
505
|
+
txBuilder.sequenceNumber(14);
|
|
506
|
+
txBuilder.expirationTime(1736246155);
|
|
507
|
+
txBuilder.customTransaction({
|
|
508
|
+
moduleName: '0x1::aptos_account',
|
|
509
|
+
functionName: 'transfer_coins',
|
|
510
|
+
typeArguments: ['0x1::aptos_coin::AptosCoin'],
|
|
511
|
+
functionArguments: [testData.recipients[0].address, testData.recipients[0].amount],
|
|
512
|
+
abi: transferCoinsAbi,
|
|
513
|
+
});
|
|
514
|
+
// Provide ABI with wrong parameter count (3 instead of 2)
|
|
515
|
+
const wrongAbi = {
|
|
516
|
+
typeParameters: [{ constraints: [] }],
|
|
517
|
+
parameters: [new ts_sdk_1.TypeTagAddress(), new ts_sdk_1.TypeTagU64(), new ts_sdk_1.TypeTagU128()],
|
|
518
|
+
};
|
|
519
|
+
txBuilder.entryFunctionAbi(wrongAbi);
|
|
520
|
+
txBuilder.addFeePayerAddress(testData.feePayer.address);
|
|
521
|
+
txBuilder.setIsSimulateTxn(true);
|
|
522
|
+
// Should fail due to parameter count mismatch
|
|
523
|
+
await (0, should_1.default)(txBuilder.build()).be.rejectedWith(/Too few arguments/);
|
|
524
|
+
});
|
|
525
|
+
it('should test wrong ABI behavior', async function () {
|
|
526
|
+
const transaction = new src_1.CustomTransaction(statics_1.coins.get('tapt'));
|
|
527
|
+
const txBuilder = factory.getCustomTransactionBuilder(transaction);
|
|
528
|
+
txBuilder.sender(testData.sender2.address);
|
|
529
|
+
txBuilder.gasData({
|
|
530
|
+
maxGasAmount: 200000,
|
|
531
|
+
gasUnitPrice: 100,
|
|
532
|
+
});
|
|
533
|
+
txBuilder.sequenceNumber(16);
|
|
534
|
+
txBuilder.expirationTime(1736246155);
|
|
535
|
+
// Provide function that expects 2 args but wrong ABI expects 3
|
|
536
|
+
txBuilder.customTransaction({
|
|
537
|
+
moduleName: '0x1::aptos_account',
|
|
538
|
+
functionName: 'transfer_coins',
|
|
539
|
+
typeArguments: ['0x1::aptos_coin::AptosCoin'],
|
|
540
|
+
functionArguments: [testData.recipients[0].address, testData.recipients[0].amount], // 2 args
|
|
541
|
+
abi: wrongAbi, // ABI expects 3 parameters but we provide 2
|
|
542
|
+
});
|
|
543
|
+
txBuilder.addFeePayerAddress(testData.feePayer.address);
|
|
544
|
+
txBuilder.setIsSimulateTxn(true);
|
|
545
|
+
// Should fail due to argument count mismatch
|
|
546
|
+
await (0, should_1.default)(txBuilder.build()).be.rejectedWith(/Too few arguments/);
|
|
547
|
+
});
|
|
548
|
+
it('should test wrong ABI with matching parameter count but wrong types', async function () {
|
|
549
|
+
const transaction = new src_1.CustomTransaction(statics_1.coins.get('tapt'));
|
|
550
|
+
const txBuilder = factory.getCustomTransactionBuilder(transaction);
|
|
551
|
+
txBuilder.sender(testData.sender2.address);
|
|
552
|
+
txBuilder.gasData({
|
|
553
|
+
maxGasAmount: 200000,
|
|
554
|
+
gasUnitPrice: 100,
|
|
555
|
+
});
|
|
556
|
+
txBuilder.sequenceNumber(17);
|
|
557
|
+
txBuilder.expirationTime(1736246155);
|
|
558
|
+
// Wrong ABI with correct parameter count but wrong types
|
|
559
|
+
const wrongTypesAbi = {
|
|
560
|
+
typeParameters: [{ constraints: [] }],
|
|
561
|
+
parameters: [new ts_sdk_1.TypeTagU64(), new ts_sdk_1.TypeTagU64()], // Both u64 instead of Address + u64
|
|
562
|
+
};
|
|
563
|
+
txBuilder.customTransaction({
|
|
564
|
+
moduleName: '0x1::aptos_account',
|
|
565
|
+
functionName: 'transfer_coins',
|
|
566
|
+
typeArguments: ['0x1::aptos_coin::AptosCoin'],
|
|
567
|
+
functionArguments: [testData.recipients[0].address, testData.recipients[0].amount], // Address + u64
|
|
568
|
+
abi: wrongTypesAbi,
|
|
569
|
+
});
|
|
570
|
+
txBuilder.addFeePayerAddress(testData.feePayer.address);
|
|
571
|
+
txBuilder.setIsSimulateTxn(true);
|
|
572
|
+
// Should fail due to type mismatch between ABI and actual arguments
|
|
573
|
+
await (0, should_1.default)(txBuilder.build()).be.rejected();
|
|
574
|
+
});
|
|
575
|
+
it('should build regulated token initialize with correct ABI', async function () {
|
|
576
|
+
const regulatedTokenInitializeAbi = {
|
|
577
|
+
typeParameters: [],
|
|
578
|
+
parameters: [
|
|
579
|
+
new ts_sdk_1.TypeTagVector(new ts_sdk_1.TypeTagU8()),
|
|
580
|
+
new ts_sdk_1.TypeTagVector(new ts_sdk_1.TypeTagU8()),
|
|
581
|
+
new ts_sdk_1.TypeTagU8(),
|
|
582
|
+
new ts_sdk_1.TypeTagVector(new ts_sdk_1.TypeTagU8()),
|
|
583
|
+
new ts_sdk_1.TypeTagVector(new ts_sdk_1.TypeTagU8()),
|
|
584
|
+
],
|
|
585
|
+
};
|
|
586
|
+
const transaction = new src_1.CustomTransaction(statics_1.coins.get('tapt'));
|
|
587
|
+
const txBuilder = factory.getCustomTransactionBuilder(transaction);
|
|
588
|
+
txBuilder.sender(testData.sender2.address);
|
|
589
|
+
txBuilder.gasData({
|
|
590
|
+
maxGasAmount: 200000,
|
|
591
|
+
gasUnitPrice: 100,
|
|
592
|
+
});
|
|
593
|
+
txBuilder.sequenceNumber(18);
|
|
594
|
+
txBuilder.expirationTime(1736246155);
|
|
595
|
+
txBuilder.customTransaction({
|
|
596
|
+
moduleName: '0x4a280942fd4aa7218aaf9beed6756dbc7f4d05b7f13b8a4c5564dd4a34b92192::regulated_token',
|
|
597
|
+
functionName: 'initialize',
|
|
598
|
+
typeArguments: [],
|
|
599
|
+
functionArguments: ['Regulated Token', 'RT', 6, 'https://example.com/icon.png', 'Regulated Token Project'],
|
|
600
|
+
abi: regulatedTokenInitializeAbi,
|
|
601
|
+
});
|
|
602
|
+
txBuilder.addFeePayerAddress(testData.feePayer.address);
|
|
603
|
+
txBuilder.setIsSimulateTxn(true);
|
|
604
|
+
const tx = (await txBuilder.build());
|
|
605
|
+
should_1.default.equal(tx.type, sdk_core_1.TransactionType.CustomTx);
|
|
606
|
+
should_1.default.equal(tx.fullFunctionName, '0x4a280942fd4aa7218aaf9beed6756dbc7f4d05b7f13b8a4c5564dd4a34b92192::regulated_token::initialize');
|
|
607
|
+
});
|
|
608
|
+
it('should fail regulated token initialize with wrong ABI', async function () {
|
|
609
|
+
const wrongRegulatedTokenAbi = {
|
|
610
|
+
typeParameters: [],
|
|
611
|
+
parameters: [
|
|
612
|
+
new ts_sdk_1.TypeTagU64(),
|
|
613
|
+
new ts_sdk_1.TypeTagU64(),
|
|
614
|
+
new ts_sdk_1.TypeTagU128(),
|
|
615
|
+
new ts_sdk_1.TypeTagVector(new ts_sdk_1.TypeTagU8()),
|
|
616
|
+
new ts_sdk_1.TypeTagVector(new ts_sdk_1.TypeTagU8()),
|
|
617
|
+
],
|
|
618
|
+
};
|
|
619
|
+
const transaction = new src_1.CustomTransaction(statics_1.coins.get('tapt'));
|
|
620
|
+
const txBuilder = factory.getCustomTransactionBuilder(transaction);
|
|
621
|
+
txBuilder.sender(testData.sender2.address);
|
|
622
|
+
txBuilder.gasData({
|
|
623
|
+
maxGasAmount: 200000,
|
|
624
|
+
gasUnitPrice: 100,
|
|
625
|
+
});
|
|
626
|
+
txBuilder.sequenceNumber(19);
|
|
627
|
+
txBuilder.expirationTime(1736246155);
|
|
628
|
+
txBuilder.customTransaction({
|
|
629
|
+
moduleName: '0x4a280942fd4aa7218aaf9beed6756dbc7f4d05b7f13b8a4c5564dd4a34b92192::regulated_token',
|
|
630
|
+
functionName: 'initialize',
|
|
631
|
+
typeArguments: [],
|
|
632
|
+
functionArguments: ['Regulated Token', 'RT', 6, 'https://example.com/icon.png', 'Regulated Token Project'],
|
|
633
|
+
abi: wrongRegulatedTokenAbi,
|
|
634
|
+
});
|
|
635
|
+
txBuilder.addFeePayerAddress(testData.feePayer.address);
|
|
636
|
+
txBuilder.setIsSimulateTxn(true);
|
|
637
|
+
// Should fail due to type mismatch during serialization
|
|
638
|
+
await (0, should_1.default)(txBuilder.build()).be.rejected();
|
|
639
|
+
});
|
|
640
|
+
it('should build managed trading place_order_v3 with correct ABI', async function () {
|
|
641
|
+
const placeOrderV3Abi = {
|
|
642
|
+
typeParameters: [{ constraints: [] }, { constraints: [] }],
|
|
643
|
+
parameters: [
|
|
644
|
+
new ts_sdk_1.TypeTagAddress(),
|
|
645
|
+
new ts_sdk_1.TypeTagU64(),
|
|
646
|
+
new ts_sdk_1.TypeTagU64(),
|
|
647
|
+
new ts_sdk_1.TypeTagU64(),
|
|
648
|
+
new ts_sdk_1.TypeTagBool(),
|
|
649
|
+
new ts_sdk_1.TypeTagBool(),
|
|
650
|
+
new ts_sdk_1.TypeTagBool(),
|
|
651
|
+
new ts_sdk_1.TypeTagU64(),
|
|
652
|
+
new ts_sdk_1.TypeTagU64(),
|
|
653
|
+
new ts_sdk_1.TypeTagBool(),
|
|
654
|
+
new ts_sdk_1.TypeTagAddress(),
|
|
655
|
+
],
|
|
656
|
+
};
|
|
657
|
+
const transaction = new src_1.CustomTransaction(statics_1.coins.get('tapt'));
|
|
658
|
+
const txBuilder = factory.getCustomTransactionBuilder(transaction);
|
|
659
|
+
txBuilder.sender(testData.sender2.address);
|
|
660
|
+
txBuilder.gasData({
|
|
661
|
+
maxGasAmount: 200000,
|
|
662
|
+
gasUnitPrice: 100,
|
|
663
|
+
});
|
|
664
|
+
txBuilder.sequenceNumber(20);
|
|
665
|
+
txBuilder.expirationTime(1736246155);
|
|
666
|
+
txBuilder.customTransaction({
|
|
667
|
+
moduleName: '0x33a8693758d1d28a9305946c7758b7548a04736c35929eac22eb0de2a865275d::managed_trading',
|
|
668
|
+
functionName: 'place_order_v3',
|
|
669
|
+
typeArguments: [
|
|
670
|
+
'0x33a8693758d1d28a9305946c7758b7548a04736c35929eac22eb0de2a865275d::pair_types::TRUMP_USD',
|
|
671
|
+
'0x33a8693758d1d28a9305946c7758b7548a04736c35929eac22eb0de2a865275d::fa_box::W_USDC',
|
|
672
|
+
],
|
|
673
|
+
functionArguments: [
|
|
674
|
+
'0x6a8d106dcc0f63cb8b35d0e7d33c9ff38f392d963595368cd230c46f6b7397a5',
|
|
675
|
+
'800000000',
|
|
676
|
+
'0',
|
|
677
|
+
'18446744073709551615',
|
|
678
|
+
true,
|
|
679
|
+
false,
|
|
680
|
+
true,
|
|
681
|
+
'1',
|
|
682
|
+
'18446744073709551615',
|
|
683
|
+
false,
|
|
684
|
+
'0x0',
|
|
685
|
+
],
|
|
686
|
+
abi: placeOrderV3Abi,
|
|
687
|
+
});
|
|
688
|
+
txBuilder.addFeePayerAddress(testData.feePayer.address);
|
|
689
|
+
txBuilder.setIsSimulateTxn(true);
|
|
690
|
+
const tx = (await txBuilder.build());
|
|
691
|
+
should_1.default.equal(tx.type, sdk_core_1.TransactionType.CustomTx);
|
|
692
|
+
should_1.default.equal(tx.fullFunctionName, '0x33a8693758d1d28a9305946c7758b7548a04736c35929eac22eb0de2a865275d::managed_trading::place_order_v3');
|
|
693
|
+
});
|
|
694
|
+
it('should fail managed trading place_order_v3 with wrong ABI parameter count', async function () {
|
|
695
|
+
const wrongPlaceOrderAbi = {
|
|
696
|
+
typeParameters: [{ constraints: [] }, { constraints: [] }],
|
|
697
|
+
parameters: [
|
|
698
|
+
new ts_sdk_1.TypeTagAddress(), // target_config
|
|
699
|
+
new ts_sdk_1.TypeTagU64(), // max_base
|
|
700
|
+
new ts_sdk_1.TypeTagU64(), // max_quote
|
|
701
|
+
// Missing 8 more parameters - only 3 instead of 11
|
|
702
|
+
],
|
|
703
|
+
};
|
|
704
|
+
const transaction = new src_1.CustomTransaction(statics_1.coins.get('tapt'));
|
|
705
|
+
const txBuilder = factory.getCustomTransactionBuilder(transaction);
|
|
706
|
+
txBuilder.sender(testData.sender2.address);
|
|
707
|
+
txBuilder.gasData({
|
|
708
|
+
maxGasAmount: 200000,
|
|
709
|
+
gasUnitPrice: 100,
|
|
710
|
+
});
|
|
711
|
+
txBuilder.sequenceNumber(21);
|
|
712
|
+
txBuilder.expirationTime(1736246155);
|
|
713
|
+
txBuilder.customTransaction({
|
|
714
|
+
moduleName: '0x33a8693758d1d28a9305946c7758b7548a04736c35929eac22eb0de2a865275d::managed_trading',
|
|
715
|
+
functionName: 'place_order_v3',
|
|
716
|
+
typeArguments: [
|
|
717
|
+
'0x33a8693758d1d28a9305946c7758b7548a04736c35929eac22eb0de2a865275d::pair_types::TRUMP_USD',
|
|
718
|
+
'0x33a8693758d1d28a9305946c7758b7548a04736c35929eac22eb0de2a865275d::fa_box::W_USDC',
|
|
719
|
+
],
|
|
720
|
+
functionArguments: [
|
|
721
|
+
'0x6a8d106dcc0f63cb8b35d0e7d33c9ff38f392d963595368cd230c46f6b7397a5',
|
|
722
|
+
'800000000',
|
|
723
|
+
'0',
|
|
724
|
+
'18446744073709551615',
|
|
725
|
+
true,
|
|
726
|
+
false,
|
|
727
|
+
true,
|
|
728
|
+
'1',
|
|
729
|
+
'18446744073709551615',
|
|
730
|
+
false,
|
|
731
|
+
'0x0',
|
|
732
|
+
],
|
|
733
|
+
abi: wrongPlaceOrderAbi,
|
|
734
|
+
});
|
|
735
|
+
txBuilder.addFeePayerAddress(testData.feePayer.address);
|
|
736
|
+
txBuilder.setIsSimulateTxn(true);
|
|
737
|
+
// Should fail due to parameter count mismatch (expects 3, got 11)
|
|
738
|
+
await (0, should_1.default)(txBuilder.build()).be.rejectedWith(/Too many arguments.*expected 3/);
|
|
739
|
+
});
|
|
740
|
+
});
|
|
741
|
+
});
|
|
742
|
+
});
|
|
743
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tVHJhbnNhY3Rpb25CdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC91bml0L3RyYW5zYWN0aW9uQnVpbGRlci9jdXN0b21UcmFuc2FjdGlvbkJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxpREFBNEM7QUFDNUMsc0NBQTRFO0FBQzVFLDhEQUFnRDtBQUNoRCxtREFBdUQ7QUFDdkQsb0RBQTRCO0FBQzVCLCtDQUFvSDtBQUVwSCxRQUFRLENBQUMsZ0NBQWdDLEVBQUUsR0FBRyxFQUFFO0lBQzlDLE1BQU0sT0FBTyxHQUFHLElBQUksK0JBQXlCLENBQUMsZUFBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBRWpFLGdDQUFnQztJQUNoQyxNQUFNLGdCQUFnQixHQUFHO1FBQ3ZCLGNBQWMsRUFBRSxDQUFDLEVBQUUsV0FBVyxFQUFFLEVBQUUsRUFBRSxDQUFDO1FBQ3JDLFVBQVUsRUFBRSxDQUFDLElBQUksdUJBQWMsRUFBRSxFQUFFLElBQUksbUJBQVUsRUFBRSxDQUFDO0tBQ3JELENBQUM7SUFFRixNQUFNLE9BQU8sR0FBRztRQUNkLGNBQWMsRUFBRSxDQUFDLEVBQUUsV0FBVyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsdUNBQXVDO1FBQzlFLFVBQVUsRUFBRSxDQUFDLElBQUksdUJBQWMsRUFBRSxFQUFFLElBQUksbUJBQVUsRUFBRSxDQUFDO0tBQ3JELENBQUM7SUFFRixNQUFNLE9BQU8sR0FBRztRQUNkLGNBQWMsRUFBRSxDQUFDLEVBQUUsV0FBVyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsdUNBQXVDO1FBQzlFLFVBQVUsRUFBRSxDQUFDLElBQUksbUJBQVUsRUFBRSxDQUFDO0tBQy9CLENBQUM7SUFFRixNQUFNLFFBQVEsR0FBRztRQUNmLGNBQWMsRUFBRSxFQUFFO1FBQ2xCLFVBQVUsRUFBRSxFQUFFO0tBQ2YsQ0FBQztJQUVGLGdFQUFnRTtJQUNoRSxNQUFNLGtCQUFrQixHQUFHO1FBQ3pCLGNBQWMsRUFBRSxFQUFFLEVBQUUsc0NBQXNDO1FBQzFELFVBQVUsRUFBRSxDQUFDLElBQUksdUJBQWMsRUFBRSxFQUFFLElBQUksbUJBQVUsRUFBRSxDQUFDO0tBQ3JELENBQUM7SUFFRixNQUFNLGtCQUFrQixHQUFHO1FBQ3pCLGNBQWMsRUFBRSxFQUFFLEVBQUUsc0NBQXNDO1FBQzFELFVBQVUsRUFBRSxDQUFDLElBQUksbUJBQVUsRUFBRSxDQUFDO0tBQy9CLENBQUM7SUFFRixxRkFBcUY7SUFDckYsTUFBTSxRQUFRLEdBQUc7UUFDZixjQUFjLEVBQUUsQ0FBQyxFQUFFLFdBQVcsRUFBRSxFQUFFLEVBQUUsQ0FBQztRQUNyQyxVQUFVLEVBQUUsQ0FBQyxJQUFJLHVCQUFjLEVBQUUsRUFBRSxJQUFJLG1CQUFVLEVBQUUsRUFBRSxJQUFJLHVCQUFjLEVBQUUsQ0FBQyxFQUFFLGdDQUFnQztLQUM3RyxDQUFDO0lBRUYsUUFBUSxDQUFDLDRCQUE0QixFQUFFLEdBQUcsRUFBRTtRQUMxQyxRQUFRLENBQUMsU0FBUyxFQUFFLEdBQUcsRUFBRTtZQUN2QixFQUFFLENBQUMsZ0VBQWdFLEVBQUUsS0FBSztnQkFDeEUsTUFBTSxXQUFXLEdBQUcsSUFBSSx1QkFBaUIsQ0FBQyxlQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7Z0JBQzdELE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQywyQkFBMkIsQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDbkUsU0FBUyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUMzQyxTQUFTLENBQUMsT0FBTyxDQUFDO29CQUNoQixZQUFZLEVBQUUsTUFBTTtvQkFDcEIsWUFBWSxFQUFFLEdBQUc7aUJBQ2xCLENBQUMsQ0FBQztnQkFDSCxTQUFTLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUM3QixTQUFTLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUNyQyxTQUFTLENBQUMsaUJBQWlCLENBQUM7b0JBQzFCLFVBQVUsRUFBRSxvQkFBb0I7b0JBQ2hDLFlBQVksRUFBRSxnQkFBZ0I7b0JBQzlCLGFBQWEsRUFBRSxDQUFDLDRCQUE0QixDQUFDO29CQUM3QyxpQkFBaUIsRUFBRSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO29CQUNsRixHQUFHLEVBQUUsZ0JBQWdCO2lCQUN0QixDQUFDLENBQUM7Z0JBQ0gsU0FBUyxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ3hELFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFFakMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBc0IsQ0FBQztnQkFDMUQsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUNsRCxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUN0QyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsWUFBWSxFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUNuQyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUNwQyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsY0FBYyxFQUFFLFVBQVUsQ0FBQyxDQUFDO2dCQUM1QyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLDBCQUFlLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBRWhELE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO2dCQUNyQyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDN0QsQ0FBQyxDQUFDLENBQUM7WUFFSCxFQUFFLENBQUMsb0RBQW9ELEVBQUUsS0FBSztnQkFDNUQsTUFBTSxXQUFXLEdBQUcsSUFBSSx1QkFBaUIsQ0FBQyxlQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7Z0JBQzdELE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQywyQkFBMkIsQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDbkUsU0FBUyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUMzQyxTQUFTLENBQUMsT0FBTyxDQUFDO29CQUNoQixZQUFZLEVBQUUsTUFBTTtvQkFDcEIsWUFBWSxFQUFFLEdBQUc7aUJBQ2xCLENBQUMsQ0FBQztnQkFDSCxTQUFTLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUM3QixTQUFTLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUNyQyxTQUFTLENBQUMsaUJBQWlCLENBQUM7b0JBQzFCLFVBQVUsRUFBRSxvQkFBb0I7b0JBQ2hDLFlBQVksRUFBRSxnQkFBZ0I7b0JBQzlCLGFBQWEsRUFBRSxDQUFDLDRCQUE0QixDQUFDO29CQUM3QyxpQkFBaUIsRUFBRSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO29CQUNsRixHQUFHLEVBQUUsZ0JBQWdCO2lCQUN0QixDQUFDLENBQUM7Z0JBQ0gsU0FBUyxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBRXhELE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTSxTQUFTLENBQUMsS0FBSyxFQUFFLENBQXNCLENBQUM7Z0JBQzFELE1BQU0sZUFBZSxHQUFHLEVBQUUsQ0FBQyxlQUFlLENBQUM7Z0JBQzNDLGdCQUFNLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQ2hDLENBQUMsQ0FBQyxDQUFDO1lBRUgsRUFBRSxDQUFDLDBEQUEwRCxFQUFFLEtBQUs7Z0JBQ2xFLE1BQU0sV0FBVyxHQUFHLElBQUksdUJBQWlCLENBQUMsZUFBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUM3RCxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsMkJBQTJCLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQ25FLFNBQVMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDM0MsU0FBUyxDQUFDLE9BQU8sQ0FBQztvQkFDaEIsWUFBWSxFQUFFLE1BQU07b0JBQ3BCLFlBQVksRUFBRSxHQUFHO2lCQUNsQixDQUFDLENBQUM7Z0JBQ0gsU0FBUyxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDN0IsU0FBUyxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDckMsU0FBUyxDQUFDLGlCQUFpQixDQUFDO29CQUMxQixVQUFVLEVBQUUsb0JBQW9CO29CQUNoQyxZQUFZLEVBQUUsZ0JBQWdCO29CQUM5QixhQUFhLEVBQUUsQ0FBQyw0QkFBNEIsQ0FBQztvQkFDN0MsaUJBQWlCLEVBQUUsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztvQkFDbEYsR0FBRyxFQUFFLGdCQUFnQjtpQkFDdEIsQ0FBQyxDQUFDO2dCQUNILFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUV4RCxNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU0sU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFzQixDQUFDO2dCQUMxRCxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ2xELGdCQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQ3BDLGdCQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxZQUFZLEVBQUUsTUFBTSxDQUFDLENBQUM7Z0JBQ3RDLGdCQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxZQUFZLEVBQUUsR0FBRyxDQUFDLENBQUM7Z0JBQ25DLGdCQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxjQUFjLEVBQUUsVUFBVSxDQUFDLENBQUM7Z0JBQzVDLGdCQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxlQUFlLEVBQUUsUUFBUSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUM5RCxDQUFDLENBQUMsQ0FBQztZQUVILEVBQUUsQ0FBQyw0REFBNEQsRUFBRSxLQUFLO2dCQUNwRSxNQUFNLFdBQVcsR0FBRyxJQUFJLHVCQUFpQixDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztnQkFDN0QsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLDJCQUEyQixDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUNuRSxTQUFTLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQzNDLFNBQVMsQ0FBQyxPQUFPLENBQUM7b0JBQ2hCLFlBQVksRUFBRSxNQUFNO29CQUNwQixZQUFZLEVBQUUsR0FBRztpQkFDbEIsQ0FBQyxDQUFDO2dCQUNILFNBQVMsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQzdCLFNBQVMsQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQ3JDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQztvQkFDMUIsVUFBVSxFQUFFLG1CQUFtQjtvQkFDL0IsWUFBWSxFQUFFLE1BQU07b0JBQ3BCLGFBQWEsRUFBRSxDQUFDLDRCQUE0QixDQUFDO29CQUM3QyxpQkFBaUIsRUFBRSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO29CQUNsRixHQUFHLEVBQUUsT0FBTztpQkFDYixDQUFDLENBQUM7Z0JBQ0gsU0FBUyxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ3hELFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFFakMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBc0IsQ0FBQztnQkFDMUQsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUNsRCxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUN0QyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsWUFBWSxFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUNuQyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUNwQyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsY0FBYyxFQUFFLFVBQVUsQ0FBQyxDQUFDO2dCQUM1QyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLDBCQUFlLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBRWhELE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO2dCQUNyQyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDN0QsQ0FBQyxDQUFDLENBQUM7WUFFSCxFQUFFLENBQUMsNERBQTRELEVBQUUsS0FBSztnQkFDcEUsTUFBTSxXQUFXLEdBQUcsSUFBSSx1QkFBaUIsQ0FBQyxlQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7Z0JBQzdELE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQywyQkFBMkIsQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDbkUsU0FBUyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUMzQyxTQUFTLENBQUMsT0FBTyxDQUFDO29CQUNoQixZQUFZLEVBQUUsTUFBTTtvQkFDcEIsWUFBWSxFQUFFLEdBQUc7aUJBQ2xCLENBQUMsQ0FBQztnQkFDSCxTQUFTLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUM3QixTQUFTLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUNyQyxTQUFTLENBQUMsaUJBQWlCLENBQUM7b0JBQzFCLFVBQVUsRUFBRSxtQkFBbUI7b0JBQy9CLFlBQVksRUFBRSxNQUFNO29CQUNwQixhQUFhLEVBQUUsQ0FBQyw0QkFBNEIsQ0FBQztvQkFDN0MsaUJBQWlCLEVBQUU7d0JBQ2pCLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLFNBQVM7cUJBQ3pDO29CQUNELEdBQUcsRUFBRSxPQUFPO2lCQUNiLENBQUMsQ0FBQztnQkFDSCxTQUFTLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDeEQsU0FBUyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUVqQyxNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU0sU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFzQixDQUFDO2dCQUMxRCxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ2xELGdCQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxZQUFZLEVBQUUsTUFBTSxDQUFDLENBQUM7Z0JBQ3RDLGdCQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxZQUFZLEVBQUUsR0FBRyxDQUFDLENBQUM7Z0JBQ25DLGdCQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQ3BDLGdCQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxjQUFjLEVBQUUsVUFBVSxDQUFDLENBQUM7Z0JBQzVDLGdCQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsMEJBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFFaEQsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDLGlCQUFpQixFQUFFLENBQUM7Z0JBQ3JDLGdCQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUM3RCxDQUFDLENBQUMsQ0FBQztZQUVILEVBQUUsQ0FBQyw2RUFBNkUsRUFBRSxLQUFLO2dCQUNyRixtREFBbUQ7Z0JBQ25ELE1BQU0sYUFBYSxHQUNqQiw0M0JBQTQzQixDQUFDO2dCQUUvM0IsTUFBTSxnQkFBZ0IsR0FBRztvQkFDdkIsY0FBYyxFQUFFLENBQUMsRUFBRSxXQUFXLEVBQUUsRUFBRSxFQUFFLENBQUM7b0JBQ3JDLFVBQVUsRUFBRSxDQUFDLElBQUksdUJBQWMsRUFBRSxFQUFFLElBQUksbUJBQVUsRUFBRSxDQUFDO2lCQUNyRCxDQUFDO2dCQUVGLHdDQUF3QztnQkFDeEMsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztnQkFDaEUsTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBc0IsQ0FBQztnQkFFMUQsZ0RBQWdEO2dCQUNoRCxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLDBCQUFlLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQ2hELGdCQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUNsQyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLEVBQUUscUJBQXFCLENBQUMsQ0FBQztnQkFFekQsd0NBQXdDO2dCQUN4QyxNQUFNLFlBQVksR0FBRyxFQUFFLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztnQkFDckQsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQzNCLGdCQUFNLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUUsV0FBVyxDQUFDLENBQUM7Z0JBQ25ELGdCQUFNLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxZQUFZLEVBQUUsVUFBVSxDQUFDLENBQUM7Z0JBQ3BELGdCQUFNLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO2dCQUM3QyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsaUJBQWtCLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUV4RCw0REFBNEQ7Z0JBQzVELE1BQU0sWUFBWSxHQUFHLFlBQVksQ0FBQyxpQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDeEQsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFLE1BQU0sRUFBRSwwREFBMEQsQ0FBQyxDQUFDO2dCQUUvRixpREFBaUQ7Z0JBQ2pELE1BQU0sYUFBYSxHQUFHLFlBQVksQ0FBQyxpQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDekQsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUM7Z0JBQzVCLGdCQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sYUFBYSxFQUFFLFFBQVEsRUFBRSw0QkFBNEIsQ0FBQyxDQUFDO2dCQUMxRSxhQUF3QixDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsa0JBQWtCLEVBQUUsb0NBQW9DLENBQUMsQ0FBQztnQkFFakcsMERBQTBEO2dCQUMxRCxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztnQkFDckMsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQzdELENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxRQUFRLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRTtZQUNwQixFQUFFLENBQUMsZ0NBQWdDLEVBQUUsS0FBSztnQkFDeEMsTUFBTSxXQUFXLEdBQUcsSUFBSSx1QkFBaUIsQ0FBQyxlQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7Z0JBQzdELE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQywyQkFBMkIsQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDakUsSUFBQSxnQkFBTSxFQUFDLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsOEJBQThCLENBQUMsQ0FBQztZQUMxRixDQUFDLENBQUMsQ0FBQztZQUVILEVBQUUsQ0FBQyxxQ0FBcUMsRUFBRSxLQUFLO2dCQUM3QyxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsMkJBQTJCLEVBQUUsQ0FBQztnQkFDdEQsSUFBQSxnQkFBTSxFQUFDLEdBQUcsRUFBRSxDQUNWLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQztvQkFDeEIsVUFBVSxFQUFFLEVBQUU7b0JBQ2QsWUFBWSxFQUFFLGlCQUFpQjtvQkFDL0IsYUFBYSxFQUFFLEVBQUU7b0JBQ2pCLGlCQUFpQixFQUFFLEVBQUU7b0JBQ3JCLEdBQUcsRUFBRSxRQUFRO2lCQUNkLENBQUMsQ0FDSCxDQUFDLFVBQVUsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1lBQ3RDLENBQUMsQ0FBQyxDQUFDO1lBRUgsRUFBRSxDQUFDLHVDQUF1QyxFQUFFLEtBQUs7Z0JBQy9DLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQywyQkFBMkIsRUFBRSxDQUFDO2dCQUN0RCxJQUFBLGdCQUFNLEVBQUMsR0FBRyxFQUFFLENBQ1YsT0FBTyxDQUFDLGlCQUFpQixDQUFDO29CQUN4QixVQUFVLEVBQUUsb0JBQW9CO29CQUNoQyxZQUFZLEVBQUUsRUFBRTtvQkFDaEIsYUFBYSxFQUFFLEVBQUU7b0JBQ2pCLGlCQUFpQixFQUFFLEVBQUU7b0JBQ3JCLEdBQUcsRUFBRSxRQUFRO2lCQUNkLENBQUMsQ0FDSCxDQUFDLFVBQVUsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1lBQ3hDLENBQUMsQ0FBQyxDQUFDO1lBRUgsRUFBRSxDQUFDLDRDQUE0QyxFQUFFLEtBQUs7Z0JBQ3BELE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQywyQkFBMkIsRUFBRSxDQUFDO2dCQUN0RCxJQUFBLGdCQUFNLEVBQUMsR0FBRyxFQUFFLENBQ1YsT0FBTyxDQUFDLGlCQUFpQixDQUFDO29CQUN4QixVQUFVLEVBQUUsZ0JBQWdCO29CQUM1QixZQUFZLEVBQUUsVUFBVTtvQkFDeEIsYUFBYSxFQUFFLEVBQUU7b0JBQ2pCLGlCQUFpQixFQUFFLEVBQUU7b0JBQ3JCLEdBQUcsRUFBRSxRQUFRO2lCQUNkLENBQUMsQ0FDSCxDQUFDLFVBQVUsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO1lBQzdDLENBQUMsQ0FBQyxDQUFDO1lBRUgsRUFBRSxDQUFDLDhDQUE4QyxFQUFFLEtBQUs7Z0JBQ3RELE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQywyQkFBMkIsRUFBRSxDQUFDO2dCQUN0RCxJQUFBLGdCQUFNLEVBQUMsR0FBRyxFQUFFLENBQ1YsT0FBTyxDQUFDLGlCQUFpQixDQUFDO29CQUN4QixVQUFVLEVBQUUsb0JBQW9CO29CQUNoQyxZQUFZLEVBQUUsWUFBWTtvQkFDMUIsYUFBYSxFQUFFLEVBQUU7b0JBQ2pCLGlCQUFpQixFQUFFLEVBQUU7b0JBQ3JCLEdBQUcsRUFBRSxRQUFRO2lCQUNkLENBQUMsQ0FDSCxDQUFDLFVBQVUsQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO1lBQy9DLENBQUMsQ0FBQyxDQUFDO1lBRUgsRUFBRSxDQUFDLDBDQUEwQyxFQUFFLEtBQUs7Z0JBQ2xELE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQywyQkFBMkIsRUFBRSxDQUFDO2dCQUN0RCxJQUFBLGdCQUFNLEVBQUMsR0FBRyxFQUFFLENBQ1YsT0FBTyxDQUFDLGlCQUFpQixDQUFDO29CQUN4QixVQUFVLEVBQUUsb0JBQW9CO29CQUNoQyxZQUFZLEVBQUUsZ0JBQWdCO29CQUM5QixhQUFhLEVBQUUsRUFBRTtvQkFDakIsaUJBQWlCLEVBQUUsRUFBRTtvQkFDckIsR0FBRyxFQUFFLFFBQVE7aUJBQ2QsQ0FBQyxDQUNILENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2hCLENBQUMsQ0FBQyxDQUFDO1lBRUgsRUFBRSxDQUFDLHlDQUF5QyxFQUFFLEtBQUs7Z0JBQ2pELE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQywyQkFBMkIsRUFBRSxDQUFDO2dCQUN0RCxJQUFBLGdCQUFNLEVBQUMsR0FBRyxFQUFFLENBQ1YsT0FBTyxDQUFDLGlCQUFpQixDQUFDO29CQUN4QixVQUFVLEVBQUUsbUZBQW1GO29CQUMvRixZQUFZLEVBQUUsZ0JBQWdCO29CQUM5QixhQUFhLEVBQUUsRUFBRTtvQkFDakIsaUJBQWlCLEVBQUUsRUFBRTtvQkFDckIsR0FBRyxFQUFFLFFBQVE7aUJBQ2QsQ0FBQyxDQUNILENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2hCLENBQUMsQ0FBQyxDQUFDO1lBRUgsRUFBRSxDQUFDLCtCQUErQixFQUFFLEtBQUs7Z0JBQ3ZDLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQywyQkFBMkIsRUFBRSxDQUFDO2dCQUN0RCxJQUFBLGdCQUFNLEVBQUMsR0FBRyxFQUFFLENBQ1YsT0FBTyxDQUFDLGlCQUFpQixDQUFDO29CQUN4QixVQUFVLEVBQUUsZ0NBQWdDO29CQUM1QyxZQUFZLEVBQUUsZ0JBQWdCO29CQUM5QixhQUFhLEVBQUUsRUFBRTtvQkFDakIsaUJBQWlCLEVBQUUsRUFBRTtvQkFDckIsR0FBRyxFQUFFLFFBQVE7aUJBQ2QsQ0FBQyxDQUNILENBQUMsVUFBVSxDQUFDLGdEQUFnRCxDQUFDLENBQUM7WUFDakUsQ0FBQyxDQUFDLENBQUM7WUFFSCxFQUFFLENBQUMsK0NBQStDLEVBQUUsS0FBSztnQkFDdkQsTUFBTSxXQUFXLEdBQUcsSUFBSSx1QkFBaUIsQ0FBQyxlQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7Z0JBQzdELE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQywyQkFBMkIsQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFFbkUsdUNBQXVDO2dCQUN2QyxTQUFTLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQzNDLFNBQVMsQ0FBQyxPQUFPLENBQUM7b0JBQ2hCLFlBQVksRUFBRSxNQUFNO29CQUNwQixZQUFZLEVBQUUsR0FBRztpQkFDbEIsQ0FBQyxDQUFDO2dCQUNILFNBQVMsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQzdCLFNBQVMsQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQ3JDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQztvQkFDMUIsVUFBVSxFQUFFLG1CQUFtQjtvQkFDL0IsWUFBWSxFQUFFLE1BQU07b0JBQ3BCLGFBQWEsRUFBRSxDQUFDLDRCQUE0QixDQUFDO29CQUM3QyxpQkFBaUIsRUFBRSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO29CQUNsRixHQUFHLEVBQUUsT0FBTztpQkFDYixDQUFDLENBQUM7Z0JBRUgsTUFBTSxFQUFFLEdBQUcsTUFBTSxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ25DLGdCQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNqQixnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLDBCQUFlLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDbEQsQ0FBQyxDQUFDLENBQUM7WUFFSCxFQUFFLENBQUMsb0NBQW9DLEVBQUUsS0FBSztnQkFDNUMsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLDJCQUEyQixFQUFFLENBQUM7Z0JBQ3RELElBQUEsZ0JBQU0sRUFBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQyxFQUFFLFlBQVksRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUMvRSxnQ0FBZ0MsQ0FDakMsQ0FBQztnQkFDRixJQUFBLGdCQUFNLEVBQUMsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FDbEYsZ0NBQWdDLENBQ2pDLENBQUM7WUFDSixDQUFDLENBQUMsQ0FBQztZQUVILEVBQUUsQ0FBQyxrREFBa0QsRUFBRSxLQUFLO2dCQUMxRCxNQUFNLFdBQVcsR0FBRyxJQUFJLHVCQUFpQixDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztnQkFDN0QsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLDJCQUEyQixDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUNuRSxTQUFTLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQzNDLFNBQVMsQ0FBQyxPQUFPLENBQUM7b0JBQ2hCLFlBQVksRUFBRSxNQUFNO29CQUNwQixZQUFZLEVBQUUsR0FBRztpQkFDbEIsQ0FBQyxDQUFDO2dCQUNILFNBQVMsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQzdCLFNBQVMsQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBRXJDLE1BQU0sSUFBQSxnQkFBTSxFQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsMENBQTBDLENBQUMsQ0FBQztZQUM5RixDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsUUFBUSxDQUFDLG9CQUFvQixFQUFFLEdBQUcsRUFBRTtZQUNsQyxFQUFFLENBQUMscURBQXFELEVBQUUsS0FBSztnQkFDN0QsTUFBTSxXQUFXLEdBQUcsSUFBSSx1QkFBaUIsQ0FBQyxlQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7Z0JBQzdELE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQywyQkFBMkIsQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDbkUsU0FBUyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUMzQyxTQUFTLENBQUMsT0FBTyxDQUFDO29CQUNoQixZQUFZLEVBQUUsTUFBTTtvQkFDcEIsWUFBWSxFQUFFLEdBQUc7aUJBQ2xCLENBQUMsQ0FBQztnQkFDSCxTQUFTLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUM3QixTQUFTLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUNyQyxTQUFTLENBQUMsaUJBQWlCLENBQUM7b0JBQzFCLFVBQVUsRUFBRSxvQkFBb0I7b0JBQ2hDLFlBQVksRUFBRSxnQkFBZ0I7b0JBQzlCLGFBQWEsRUFBRSxDQUFDLDRCQUE0QixDQUFDO29CQUM3QyxpQkFBaUIsRUFBRSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO29CQUNsRixHQUFHLEVBQUUsZ0JBQWdCLEVBQUUsc0JBQXNCO2lCQUM5QyxDQUFDLENBQUM7Z0JBQ0gsU0FBUyxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ3hELFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFFakMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBc0IsQ0FBQztnQkFDMUQsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSwwQkFBZSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUVoRCxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztnQkFDckMsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQzdELENBQUMsQ0FBQyxDQUFDO1lBRUgsRUFBRSxDQUFDLHFDQUFxQyxFQUFFLEtBQUs7Z0JBQzdDLE1BQU0sV0FBVyxHQUFHLElBQUksdUJBQWlCLENBQUMsZUFBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUM3RCxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsMkJBQTJCLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQ25FLFNBQVMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDM0MsU0FBUyxDQUFDLE9BQU8sQ0FBQztvQkFDaEIsWUFBWSxFQUFFLE1BQU07b0JBQ3BCLFlBQVksRUFBRSxHQUFHO2lCQUNsQixDQUFDLENBQUM7Z0JBQ0gsU0FBUyxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDN0IsU0FBUyxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDckMsU0FBUyxDQUFDLGlCQUFpQixDQUFDO29CQUMxQixVQUFVLEVBQUUsb0JBQW9CO29CQUNoQyxZQUFZLEVBQUUsZ0JBQWdCO29CQUM5QixhQUFhLEVBQUUsQ0FBQyw0QkFBNEIsQ0FBQztvQkFDN0MsaUJBQWlCLEVBQUUsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztvQkFDbEYsR0FBRyxFQUFFLGdCQUFnQjtpQkFDdEIsQ0FBQyxDQUFDO2dCQUVILHlEQUF5RDtnQkFDekQsU0FBUyxDQUFDLGdCQUFnQixDQUFDLG9CQUEyQixDQUFDLENBQUM7Z0JBQ3hELFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUN4RCxTQUFTLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBRWpDLDhDQUE4QztnQkFDOUMsTUFBTSxJQUFBLGdCQUFNLEVBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2hELENBQUMsQ0FBQyxDQUFDO1lBRUgsRUFBRSxDQUFDLGlEQUFpRCxFQUFFLEtBQUs7Z0JBQ3pELE1BQU0sRUFBRSxjQUFjLEVBQUUsVUFBVSxFQUFFLEdBQUcsd0RBQWEsb0JBQW9CLEdBQUMsQ0FBQztnQkFFMUUsTUFBTSxXQUFXLEdBQUcsSUFBSSx1QkFBaUIsQ0FBQyxlQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7Z0JBQzdELE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQywyQkFBMkIsQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDbkUsU0FBUyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUMzQyxTQUFTLENBQUMsT0FBTyxDQUFDO29CQUNoQixZQUFZLEVBQUUsTUFBTTtvQkFDcEIsWUFBWSxFQUFFLEdBQUc7aUJBQ2xCLENBQUMsQ0FBQztnQkFDSCxTQUFTLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUM3QixTQUFTLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUNyQyxTQUFTLENBQUMsaUJBQWlCLENBQUM7b0JBQzFCLFVBQVUsRUFBRSxvQkFBb0I7b0JBQ2hDLFlBQVksRUFBRSxnQkFBZ0I7b0JBQzlCLGFBQWEsRUFBRSxDQUFDLDRCQUE0QixDQUFDO29CQUM3QyxpQkFBaUIsRUFBRSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO29CQUNsRixHQUFHLEVBQUUsZ0JBQWdCO2lCQUN0QixDQUFDLENBQUM7Z0JBRUgseURBQXlEO2dCQUN6RCxNQUFNLFVBQVUsR0FBRztvQkFDakIsY0FBYyxFQUFFLENBQUMsRUFBRSxXQUFXLEVBQUUsRUFBRSxFQUFFLENBQUM7b0JBQ3JDLFVBQVUsRUFBRSxDQUFDLElBQUksY0FBYyxFQUFFLEVBQUUsSUFBSSxVQUFVLEVBQUUsQ0FBQztpQkFDckQsQ0FBQztnQkFDRixTQUFTLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQ3ZDLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUN4RCxTQUFTLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBRWpDLE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTSxTQUFTLENBQUMsS0FBSyxFQUFFLENBQXNCLENBQUM7Z0JBQzFELGdCQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsMEJBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFFaEQsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDLGlCQUFpQixFQUFFLENBQUM7Z0JBQ3JDLGdCQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUM3RCxDQUFDLENBQUMsQ0FBQztZQUVILEVBQUUsQ0FBQyxxRUFBcUUsRUFBRSxLQUFLO2dCQUM3RSxNQUFNLFdBQVcsR0FBRyxJQUFJLHVCQUFpQixDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztnQkFDN0QsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLDJCQUEyQixDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUNuRSxTQUFTLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQzNDLFNBQVMsQ0FBQyxPQUFPLENBQUM7b0JBQ2hCLFlBQVksRUFBRSxNQUFNO29CQUNwQixZQUFZLEVBQUUsR0FBRztpQkFDbEIsQ0FBQyxDQUFDO2dCQUNILFNBQVMsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQzdCLFNBQVMsQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQ3JDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQztvQkFDMUIsVUFBVSxFQUFFLGtGQUFrRjtvQkFDOUYsWUFBWSxFQUFFLE1BQU07b0JBQ3BCLGFBQWEsRUFBRSxFQUFFO29CQUNqQixpQkFBaUIsRUFBRSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO29CQUNsRixHQUFHLEVBQUUsa0JBQWtCO2lCQUN4QixDQUFDLENBQUM7Z0JBQ0gsU0FBUyxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ3hELFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFFakMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBc0IsQ0FBQztnQkFDMUQsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSwwQkFBZSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUNoRCxnQkFBTSxDQUFDLEtBQUssQ0FDVixFQUFFLENBQUMsZ0JBQWdCLEVBQ25CLHdGQUF3RixDQUN6RixDQUFDO2dCQUVGLE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO2dCQUNyQyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDN0QsQ0FBQyxDQUFDLENBQUM7WUFFSCxFQUFFLENBQUMscUVBQXFFLEVBQUUsS0FBSztnQkFDN0UsTUFBTSxXQUFXLEdBQUcsSUFBSSx1QkFBaUIsQ0FBQyxlQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7Z0JBQzdELE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQywyQkFBMkIsQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDbkUsU0FBUyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUMzQyxTQUFTLENBQUMsT0FBTyxDQUFDO29CQUNoQixZQUFZLEVBQUUsTUFBTTtvQkFDcEIsWUFBWSxFQUFFLEdBQUc7aUJBQ2xCLENBQUMsQ0FBQztnQkFDSCxTQUFTLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUM3QixTQUFTLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUNyQyxTQUFTLENBQUMsaUJBQWlCLENBQUM7b0JBQzFCLFVBQVUsRUFBRSxrRkFBa0Y7b0JBQzlGLFlBQVksRUFBRSxNQUFNO29CQUNwQixhQUFhLEVBQUUsRUFBRTtvQkFDakIsaUJBQWlCLEVBQUUsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztvQkFDbEQsR0FBRyxFQUFFLGtCQUFrQjtpQkFDeEIsQ0FBQyxDQUFDO2dCQUNILFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUN4RCxTQUFTLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBRWpDLE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTSxTQUFTLENBQUMsS0FBSyxFQUFFLENBQXNCLENBQUM7Z0JBQzFELGdCQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsMEJBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDaEQsZ0JBQU0sQ0FBQyxLQUFLLENBQ1YsRUFBRSxDQUFDLGdCQUFnQixFQUNuQix3RkFBd0YsQ0FDekYsQ0FBQztnQkFFRixNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztnQkFDckMsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQzdELENBQUMsQ0FBQyxDQUFDO1lBRUgsRUFBRSxDQUFDLDRDQUE0QyxFQUFFLEtBQUs7Z0JBQ3BELE1BQU0sV0FBVyxHQUFHLElBQUksdUJBQWlCLENBQUMsZUFBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUM3RCxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsMkJBQTJCLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQ25FLFNBQVMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDM0MsU0FBUyxDQUFDLE9BQU8sQ0FBQztvQkFDaEIsWUFBWSxFQUFFLE1BQU07b0JBQ3BCLFlBQVksRUFBRSxHQUFHO2lCQUNsQixDQUFDLENBQUM7Z0JBQ0gsU0FBUyxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDN0IsU0FBUyxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDckMsU0FBUyxDQUFDLGlCQUFpQixDQUFDO29CQUMxQixVQUFVLEVBQUUsb0JBQW9CO29CQUNoQyxZQUFZLEVBQUUsZ0JBQWdCO29CQUM5QixhQUFhLEVBQUUsQ0FBQyw0QkFBNEIsQ0FBQztvQkFDN0MsaUJBQWlCLEVBQUUsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztvQkFDbEYsR0FBRyxFQUFFLGdCQUFnQjtpQkFDdEIsQ0FBQyxDQUFDO2dCQUVILDBEQUEwRDtnQkFDMUQsTUFBTSxRQUFRLEdBQUc7b0JBQ2YsY0FBYyxFQUFFLENBQUMsRUFBRSxXQUFXLEVBQUUsRUFBRSxFQUFFLENBQUM7b0JBQ3JDLFVBQVUsRUFBRSxDQUFDLElBQUksdUJBQWMsRUFBRSxFQUFFLElBQUksbUJBQVUsRUFBRSxFQUFFLElBQUksb0JBQVcsRUFBRSxDQUFDO2lCQUN4RSxDQUFDO2dCQUNGLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDckMsU0FBUyxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ3hELFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFFakMsOENBQThDO2dCQUM5QyxNQUFNLElBQUEsZ0JBQU0sRUFBQyxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLG1CQUFtQixDQUFDLENBQUM7WUFDdkUsQ0FBQyxDQUFDLENBQUM7WUFFSCxFQUFFLENBQUMsZ0NBQWdDLEVBQUUsS0FBSztnQkFDeEMsTUFBTSxXQUFXLEdBQUcsSUFBSSx1QkFBaUIsQ0FBQyxlQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7Z0JBQzdELE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQywyQkFBMkIsQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDbkUsU0FBUyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUMzQyxTQUFTLENBQUMsT0FBTyxDQUFDO29CQUNoQixZQUFZLEVBQUUsTUFBTTtvQkFDcEIsWUFBWSxFQUFFLEdBQUc7aUJBQ2xCLENBQUMsQ0FBQztnQkFDSCxTQUFTLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUM3QixTQUFTLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUVyQywrREFBK0Q7Z0JBQy9ELFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQztvQkFDMUIsVUFBVSxFQUFFLG9CQUFvQjtvQkFDaEMsWUFBWSxFQUFFLGdCQUFnQjtvQkFDOUIsYUFBYSxFQUFFLENBQUMsNEJBQTRCLENBQUM7b0JBQzdDLGlCQUFpQixFQUFFLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxTQUFTO29CQUM3RixHQUFHLEVBQUUsUUFBUSxFQUFFLDRDQUE0QztpQkFDNUQsQ0FBQyxDQUFDO2dCQUNILFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUN4RCxTQUFTLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBRWpDLDZDQUE2QztnQkFDN0MsTUFBTSxJQUFBLGdCQUFNLEVBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1lBQ3ZFLENBQUMsQ0FBQyxDQUFDO1lBRUgsRUFBRSxDQUFDLHFFQUFxRSxFQUFFLEtBQUs7Z0JBQzdFLE1BQU0sV0FBVyxHQUFHLElBQUksdUJBQWlCLENBQUMsZUFBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUM3RCxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsMkJBQTJCLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQ25FLFNBQVMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDM0MsU0FBUyxDQUFDLE9BQU8sQ0FBQztvQkFDaEIsWUFBWSxFQUFFLE1BQU07b0JBQ3BCLFlBQVksRUFBRSxHQUFHO2lCQUNsQixDQUFDLENBQUM7Z0JBQ0gsU0FBUyxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDN0IsU0FBUyxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFFckMseURBQXlEO2dCQUN6RCxNQUFNLGFBQWEsR0FBRztvQkFDcEIsY0FBYyxFQUFFLENBQUMsRUFBRSxXQUFXLEVBQUUsRUFBRSxFQUFFLENBQUM7b0JBQ3JDLFVBQVUsRUFBRSxDQUFDLElBQUksbUJBQVUsRUFBRSxFQUFFLElBQUksbUJBQVUsRUFBRSxDQUFDLEVBQUUsb0NBQW9DO2lCQUN2RixDQUFDO2dCQUVGLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQztvQkFDMUIsVUFBVSxFQUFFLG9CQUFvQjtvQkFDaEMsWUFBWSxFQUFFLGdCQUFnQjtvQkFDOUIsYUFBYSxFQUFFLENBQUMsNEJBQTRCLENBQUM7b0JBQzdDLGlCQUFpQixFQUFFLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxnQkFBZ0I7b0JBQ3BHLEdBQUcsRUFBRSxhQUFhO2lCQUNuQixDQUFDLENBQUM7Z0JBQ0gsU0FBUyxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ3hELFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFFakMsb0VBQW9FO2dCQUNwRSxNQUFNLElBQUEsZ0JBQU0sRUFBQyxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDaEQsQ0FBQyxDQUFDLENBQUM7WUFFSCxFQUFFLENBQUMsMERBQTBELEVBQUUsS0FBSztnQkFDbEUsTUFBTSwyQkFBMkIsR0FBRztvQkFDbEMsY0FBYyxFQUFFLEVBQUU7b0JBQ2xCLFVBQVUsRUFBRTt3QkFDVixJQUFJLHNCQUFhLENBQUMsSUFBSSxrQkFBUyxFQUFFLENBQUM7d0JBQ2xDLElBQUksc0JBQWEsQ0FBQyxJQUFJLGtCQUFTLEVBQUUsQ0FBQzt3QkFDbEMsSUFBSSxrQkFBUyxFQUFFO3dCQUNmLElBQUksc0JBQWEsQ0FBQyxJQUFJLGtCQUFTLEVBQUUsQ0FBQzt3QkFDbEMsSUFBSSxzQkFBYSxDQUFDLElBQUksa0JBQVMsRUFBRSxDQUFDO3FCQUNuQztpQkFDRixDQUFDO2dCQUVGLE1BQU0sV0FBVyxHQUFHLElBQUksdUJBQWlCLENBQUMsZUFBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUM3RCxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsMkJBQTJCLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQ25FLFNBQVMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDM0MsU0FBUyxDQUFDLE9BQU8sQ0FBQztvQkFDaEIsWUFBWSxFQUFFLE1BQU07b0JBQ3BCLFlBQVksRUFBRSxHQUFHO2lCQUNsQixDQUFDLENBQUM7Z0JBQ0gsU0FBUyxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDN0IsU0FBUyxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDckMsU0FBUyxDQUFDLGlCQUFpQixDQUFDO29CQUMxQixVQUFVLEVBQUUscUZBQXFGO29CQUNqRyxZQUFZLEVBQUUsWUFBWTtvQkFDMUIsYUFBYSxFQUFFLEVBQUU7b0JBQ2pCLGlCQUFpQixFQUFFLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSw4QkFBOEIsRUFBRSx5QkFBeUIsQ0FBQztvQkFDMUcsR0FBRyxFQUFFLDJCQUEyQjtpQkFDakMsQ0FBQyxDQUFDO2dCQUNILFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUN4RCxTQUFTLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBRWpDLE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTSxTQUFTLENBQUMsS0FBSyxFQUFFLENBQXNCLENBQUM7Z0JBQzFELGdCQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsMEJBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDaEQsZ0JBQU0sQ0FBQyxLQUFLLENBQ1YsRUFBRSxDQUFDLGdCQUFnQixFQUNuQixpR0FBaUcsQ0FDbEcsQ0FBQztZQUNKLENBQUMsQ0FBQyxDQUFDO1lBRUgsRUFBRSxDQUFDLHVEQUF1RCxFQUFFLEtBQUs7Z0JBQy9ELE1BQU0sc0JBQXNCLEdBQUc7b0JBQzdCLGNBQWMsRUFBRSxFQUFFO29CQUNsQixVQUFVLEVBQUU7d0JBQ1YsSUFBSSxtQkFBVSxFQUFFO3dCQUNoQixJQUFJLG1CQUFVLEVBQUU7d0JBQ2hCLElBQUksb0JBQVcsRUFBRTt3QkFDakIsSUFBSSxzQkFBYSxDQUFDLElBQUksa0JBQVMsRUFBRSxDQUFDO3dCQUNsQyxJQUFJLHNCQUFhLENBQUMsSUFBSSxrQkFBUyxFQUFFLENBQUM7cUJBQ25DO2lCQUNGLENBQUM7Z0JBRUYsTUFBTSxXQUFXLEdBQUcsSUFBSSx1QkFBaUIsQ0FBQyxlQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7Z0JBQzdELE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQywyQkFBMkIsQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDbkUsU0FBUyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUMzQyxTQUFTLENBQUMsT0FBTyxDQUFDO29CQUNoQixZQUFZLEVBQUUsTUFBTTtvQkFDcEIsWUFBWSxFQUFFLEdBQUc7aUJBQ2xCLENBQUMsQ0FBQztnQkFDSCxTQUFTLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUM3QixTQUFTLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUNyQyxTQUFTLENBQUMsaUJBQWlCLENBQUM7b0JBQzFCLFVBQVUsRUFBRSxxRkFBcUY7b0JBQ2pHLFlBQVksRUFBRSxZQUFZO29CQUMxQixhQUFhLEVBQUUsRUFBRTtvQkFDakIsaUJBQWlCLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLDhCQUE4QixFQUFFLHlCQUF5QixDQUFDO29CQUMxRyxHQUFHLEVBQUUsc0JBQXNCO2lCQUM1QixDQUFDLENBQUM7Z0JBQ0gsU0FBUyxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ3hELFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFFakMsd0RBQXdEO2dCQUN4RCxNQUFNLElBQUEsZ0JBQU0sRUFBQyxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDaEQsQ0FBQyxDQUFDLENBQUM7WUFFSCxFQUFFLENBQUMsOERBQThELEVBQUUsS0FBSztnQkFDdEUsTUFBTSxlQUFlLEdBQUc7b0JBQ3RCLGNBQWMsRUFBRSxDQUFDLEVBQUUsV0FBVyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsV0FBVyxFQUFFLEVBQUUsRUFBRSxDQUFDO29CQUMxRCxVQUFVLEVBQUU7d0JBQ1YsSUFBSSx1QkFBYyxFQUFFO3dCQUNwQixJQUFJLG1CQUFVLEVBQUU7d0JBQ2hCLElBQUksbUJBQVUsRUFBRTt3QkFDaEIsSUFBSSxtQkFBVSxFQUFFO3dCQUNoQixJQUFJLG9CQUFXLEVBQUU7d0JBQ2pCLElBQUksb0JBQVcsRUFBRTt3QkFDakIsSUFBSSxvQkFBVyxFQUFFO3dCQUNqQixJQUFJLG1CQUFVLEVBQUU7d0JBQ2hCLElBQUksbUJBQVUsRUFBRTt3QkFDaEIsSUFBSSxvQkFBVyxFQUFFO3dCQUNqQixJQUFJLHVCQUFjLEVBQUU7cUJBQ3JCO2lCQUNGLENBQUM7Z0JBRUYsTUFBTSxXQUFXLEdBQUcsSUFBSSx1QkFBaUIsQ0FBQyxlQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7Z0JBQzdELE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQywyQkFBMkIsQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDbkUsU0FBUyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUMzQyxTQUFTLENBQUMsT0FBTyxDQUFDO29CQUNoQixZQUFZLEVBQUUsTUFBTTtvQkFDcEIsWUFBWSxFQUFFLEdBQUc7aUJBQ2xCLENBQUMsQ0FBQztnQkFDSCxTQUFTLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUM3QixTQUFTLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUNyQyxTQUFTLENBQUMsaUJBQWlCLENBQUM7b0JBQzFCLFVBQVUsRUFBRSxxRkFBcUY7b0JBQ2pHLFlBQVksRUFBRSxnQkFBZ0I7b0JBQzlCLGFBQWEsRUFBRTt3QkFDYiwyRkFBMkY7d0JBQzNGLG9GQUFvRjtxQkFDckY7b0JBQ0QsaUJBQWlCLEVBQUU7d0JBQ2pCLG9FQUFvRTt3QkFDcEUsV0FBVzt3QkFDWCxHQUFHO3dCQUNILHNCQUFzQjt3QkFDdEIsSUFBSTt3QkFDSixLQUFLO3dCQUNMLElBQUk7d0JBQ0osR0FBRzt3QkFDSCxzQkFBc0I7d0JBQ3RCLEtBQUs7d0JBQ0wsS0FBSztxQkFDTjtvQkFDRCxHQUFHLEVBQUUsZUFBZTtpQkFDckIsQ0FBQyxDQUFDO2dCQUNILFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUN4RCxTQUFTLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBRWpDLE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTSxTQUFTLENBQUMsS0FBSyxFQUFFLENBQXNCLENBQUM7Z0JBQzFELGdCQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsMEJBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDaEQsZ0JBQU0sQ0FBQyxLQUFLLENBQ1YsRUFBRSxDQUFDLGdCQUFnQixFQUNuQixxR0FBcUcsQ0FDdEcsQ0FBQztZQUNKLENBQUMsQ0FBQyxDQUFDO1lBRUgsRUFBRSxDQUFDLDJFQUEyRSxFQUFFLEtBQUs7Z0JBQ25GLE1BQU0sa0JBQWtCLEdBQUc7b0JBQ3pCLGNBQWMsRUFBRSxDQUFDLEVBQUUsV0FBVyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsV0FBVyxFQUFFLEVBQUUsRUFBRSxDQUFDO29CQUMxRCxVQUFVLEVBQUU7d0JBQ1YsSUFBSSx1QkFBYyxFQUFFLEVBQUUsZ0JBQWdCO3dCQUN0QyxJQUFJLG1CQUFVLEVBQUUsRUFBRSxXQUFXO3dCQUM3QixJQUFJLG1CQUFVLEVBQUUsRUFBRSxZQUFZO3dCQUM5QixtREFBbUQ7cUJBQ3BEO2lCQUNGLENBQUM7Z0JBRUYsTUFBTSxXQUFXLEdBQUcsSUFBSSx1QkFBaUIsQ0FBQyxlQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7Z0JBQzdELE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQywyQkFBMkIsQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDbkUsU0FBUyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUMzQyxTQUFTLENBQUMsT0FBTyxDQUFDO29CQUNoQixZQUFZLEVBQUUsTUFBTTtvQkFDcEIsWUFBWSxFQUFFLEdBQUc7aUJBQ2xCLENBQUMsQ0FBQztnQkFDSCxTQUFTLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUM3QixTQUFTLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUNyQyxTQUFTLENBQUMsaUJBQWlCLENBQUM7b0JBQzFCLFVBQVUsRUFBRSxxRkFBcUY7b0JBQ2pHLFlBQVksRUFBRSxnQkFBZ0I7b0JBQzlCLGFBQWEsRUFBRTt3QkFDYiwyRkFBMkY7d0JBQzNGLG9GQUFvRjtxQkFDckY7b0JBQ0QsaUJBQWlCLEVBQUU7d0JBQ2pCLG9FQUFvRTt3QkFDcEUsV0FBVzt3QkFDWCxHQUFHO3dCQUNILHNCQUFzQjt3QkFDdEIsSUFBSTt3QkFDSixLQUFLO3dCQUNMLElBQUk7d0JBQ0osR0FBRzt3QkFDSCxzQkFBc0I7d0JBQ3RCLEtBQUs7d0JBQ0wsS0FBSztxQkFDTjtvQkFDRCxHQUFHLEVBQUUsa0JBQWtCO2lCQUN4QixDQUFDLENBQUM7Z0JBQ0gsU0FBUyxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ3hELFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFFakMsa0VBQWtFO2dCQUNsRSxNQUFNLElBQUEsZ0JBQU0sRUFBQyxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLGdDQUFnQyxDQUFDLENBQUM7WUFDcEYsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjb2lucyB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeSwgQ3VzdG9tVHJhbnNhY3Rpb24gfSBmcm9tICcuLi8uLi8uLi9zcmMnO1xuaW1wb3J0ICogYXMgdGVzdERhdGEgZnJvbSAnLi4vLi4vcmVzb3VyY2VzL2FwdCc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvblR5cGUgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgc2hvdWxkIGZyb20gJ3Nob3VsZCc7XG5pbXBvcnQgeyBUeXBlVGFnQWRkcmVzcywgVHlwZVRhZ1U2NCwgVHlwZVRhZ1UxMjgsIFR5cGVUYWdWZWN0b3IsIFR5cGVUYWdVOCwgVHlwZVRhZ0Jvb2wgfSBmcm9tICdAYXB0b3MtbGFicy90cy1zZGsnO1xuXG5kZXNjcmliZSgnQXB0IEN1c3RvbSBUcmFuc2FjdGlvbiBCdWlsZGVyJywgKCkgPT4ge1xuICBjb25zdCBmYWN0b3J5ID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0YXB0JykpO1xuXG4gIC8vIENvbW1vbiBBQkkgcGF0dGVybnMgZm9yIHRlc3RzXG4gIGNvbnN0IHRyYW5zZmVyQ29pbnNBYmkgPSB7XG4gICAgdHlwZVBhcmFtZXRlcnM6IFt7IGNvbnN0cmFpbnRzOiBbXSB9XSxcbiAgICBwYXJhbWV0ZXJzOiBbbmV3IFR5cGVUYWdBZGRyZXNzKCksIG5ldyBUeXBlVGFnVTY0KCldLFxuICB9O1xuXG4gIGNvbnN0IG1pbnRBYmkgPSB7XG4gICAgdHlwZVBhcmFtZXRlcnM6IFt7IGNvbnN0cmFpbnRzOiBbXSB9XSwgLy8gRXhwZWN0cyAxIHR5cGUgcGFyYW1ldGVyIGZvciBDb2luPFQ+XG4gICAgcGFyYW1ldGVyczogW25ldyBUeXBlVGFnQWRkcmVzcygpLCBuZXcgVHlwZVRhZ1U2NCgpXSxcbiAgfTtcblxuICBjb25zdCBidXJuQWJpID0ge1xuICAgIHR5cGVQYXJhbWV0ZXJzOiBbeyBjb25zdHJhaW50czogW10gfV0sIC8vIEV4cGVjdHMgMSB0eXBlIHBhcmFtZXRlciBmb3IgQ29pbjxUPlxuICAgIHBhcmFtZXRlcnM6IFtuZXcgVHlwZVRhZ1U2NCgpXSxcbiAgfTtcblxuICBjb25zdCBiYXNpY0FiaSA9IHtcbiAgICB0eXBlUGFyYW1ldGVyczogW10sXG4gICAgcGFyYW1ldGVyczogW10sXG4gIH07XG5cbiAgLy8gQUJJIGZvciBjdXN0b20gdG9rZW4gZnVuY3Rpb25zIHRoYXQgZG9uJ3QgdXNlIHR5cGUgcGFyYW1ldGVyc1xuICBjb25zdCBjdXN0b21Ub2tlbk1pbnRBYmkgPSB7XG4gICAgdHlwZVBhcmFtZXRlcnM6IFtdLCAvLyBObyB0eXBlIHBhcmFtZXRlcnMgZm9yIGN1c3RvbSB0b2tlblxuICAgIHBhcmFtZXRlcnM6IFtuZXcgVHlwZVRhZ0FkZHJlc3MoKSwgbmV3IFR5cGVUYWdVNjQoKV0sXG4gIH07XG5cbiAgY29uc3QgY3VzdG9tVG9rZW5CdXJuQWJpID0ge1xuICAgIHR5cGVQYXJhbWV0ZXJzOiBbXSwgLy8gTm8gdHlwZSBwYXJhbWV0ZXJzIGZvciBjdXN0b20gdG9rZW5cbiAgICBwYXJhbWV0ZXJzOiBbbmV3IFR5cGVUYWdVNjQoKV0sXG4gIH07XG5cbiAgLy8gV3JvbmcgQUJJIGZvciB0ZXN0aW5nIC0gaGFzIHdyb25nIHBhcmFtZXRlciBjb3VudCBidXQgY29ycmVjdCB0eXBlIHBhcmFtZXRlciBjb3VudFxuICBjb25zdCB3cm9uZ0FiaSA9IHtcbiAgICB0eXBlUGFyYW1ldGVyczogW3sgY29uc3RyYWludHM6IFtdIH1dLFxuICAgIHBhcmFtZXRlcnM6IFtuZXcgVHlwZVRhZ0FkZHJlc3MoKSwgbmV3IFR5cGVUYWdVNjQoKSwgbmV3IFR5cGVUYWdBZGRyZXNzKCldLCAvLyBXcm9uZyAtIDMgcGFyYW1zIGluc3RlYWQgb2YgMlxuICB9O1xuXG4gIGRlc2NyaWJlKCdDdXN0b20gRW50cnkgRnVuY3Rpb24gQ2FsbCcsICgpID0+IHtcbiAgICBkZXNjcmliZSgnU3VjY2VlZCcsICgpID0+IHtcbiAgICAgIGl0KCdzaG91bGQgYnVpbGQgYSBjdXN0b20gdHJhbnNhY3Rpb24gd2l0aCB0cmFuc2Zlcl9jb2lucyBmdW5jdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSBuZXcgQ3VzdG9tVHJhbnNhY3Rpb24oY29pbnMuZ2V0KCd0YXB0JykpO1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldEN1c3RvbVRyYW5zYWN0aW9uQnVpbGRlcih0cmFuc2FjdGlvbik7XG4gICAgICAgIHR4QnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyMi5hZGRyZXNzKTtcbiAgICAgICAgdHhCdWlsZGVyLmdhc0RhdGEoe1xuICAgICAgICAgIG1heEdhc0Ftb3VudDogMjAwMDAwLFxuICAgICAgICAgIGdhc1VuaXRQcmljZTogMTAwLFxuICAgICAgICB9KTtcbiAgICAgICAgdHhCdWlsZGVyLnNlcXVlbmNlTnVtYmVyKDE0KTtcbiAgICAgICAgdHhCdWlsZGVyLmV4cGlyYXRpb25UaW1lKDE3MzYyNDYxNTUpO1xuICAgICAgICB0eEJ1aWxkZXIuY3VzdG9tVHJhbnNhY3Rpb24oe1xuICAgICAgICAgIG1vZHVsZU5hbWU6ICcweDE6OmFwdG9zX2FjY291bnQnLFxuICAgICAgICAgIGZ1bmN0aW9uTmFtZTogJ3RyYW5zZmVyX2NvaW5zJyxcbiAgICAgICAgICB0eXBlQXJndW1lbnRzOiBbJzB4MTo6YXB0b3NfY29pbjo6QXB0b3NDb2luJ10sXG4gICAgICAgICAgZnVuY3Rpb25Bcmd1bWVudHM6IFt0ZXN0RGF0YS5yZWNpcGllbnRzWzBdLmFkZHJlc3MsIHRlc3REYXRhLnJlY2lwaWVudHNbMF0uYW1vdW50XSxcbiAgICAgICAgICBhYmk6IHRyYW5zZmVyQ29pbnNBYmksXG4gICAgICAgIH0pO1xuICAgICAgICB0eEJ1aWxkZXIuYWRkRmVlUGF5ZXJBZGRyZXNzKHRlc3REYXRhLmZlZVBheWVyLmFkZHJlc3MpO1xuICAgICAgICB0eEJ1aWxkZXIuc2V0SXNTaW11bGF0ZVR4bih0cnVlKTtcblxuICAgICAgICBjb25zdCB0eCA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgQ3VzdG9tVHJhbnNhY3Rpb247XG4gICAgICAgIHNob3VsZC5lcXVhbCh0eC5zZW5kZXIsIHRlc3REYXRhLnNlbmRlcjIuYWRkcmVzcyk7XG4gICAgICAgIHNob3VsZC5lcXVhbCh0eC5tYXhHYXNBbW91bnQsIDIwMDAwMCk7XG4gICAgICAgIHNob3VsZC5lcXVhbCh0eC5nYXNVbml0UHJpY2UsIDEwMCk7XG4gICAgICAgIHNob3VsZC5lcXVhbCh0eC5zZXF1ZW5jZU51bWJlciwgMTQpO1xuICAgICAgICBzaG91bGQuZXF1YWwodHguZXhwaXJhdGlvblRpbWUsIDE3MzYyNDYxNTUpO1xuICAgICAgICBzaG91bGQuZXF1YWwodHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLkN1c3RvbVR4KTtcblxuICAgICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICAgIHNob3VsZC5lcXVhbCh0eEJ1aWxkZXIuaXNWYWxpZFJhd1RyYW5zYWN0aW9uKHJhd1R4KSwgdHJ1ZSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBzdWNjZWVkIHRvIHZhbGlkYXRlIGEgdmFsaWQgc2lnbmFibGVQYXlsb2FkJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IG5ldyBDdXN0b21UcmFuc2FjdGlvbihjb2lucy5nZXQoJ3RhcHQnKSk7XG4gICAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0Q3VzdG9tVHJhbnNhY3Rpb25CdWlsZGVyKHRyYW5zYWN0aW9uKTtcbiAgICAgICAgdHhCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIyLmFkZHJlc3MpO1xuICAgICAgICB0eEJ1aWxkZXIuZ2FzRGF0YSh7XG4gICAgICAgICAgbWF4R2FzQW1vdW50OiAyMDAwMDAsXG4gICAgICAgICAgZ2FzVW5pdFByaWNlOiAxMDAsXG4gICAgICAgIH0pO1xuICAgICAgICB0eEJ1aWxkZXIuc2VxdWVuY2VOdW1iZXIoMTQpO1xuICAgICAgICB0eEJ1aWxkZXIuZXhwaXJhdGlvblRpbWUoMTczNjI0NjE1NSk7XG4gICAgICAgIHR4QnVpbGRlci5jdXN0b21UcmFuc2FjdGlvbih7XG4gICAgICAgICAgbW9kdWxlTmFtZTogJzB4MTo6YXB0b3NfYWNjb3VudCcsXG4gICAgICAgICAgZnVuY3Rpb25OYW1lOiAndHJhbnNmZXJfY29pbnMnLFxuICAgICAgICAgIHR5cGVBcmd1bWVudHM6IFsnMHgxOjphcHRvc19jb2luOjpBcHRvc0NvaW4nXSxcbiAgICAgICAgICBmdW5jdGlvbkFyZ3VtZW50czogW3Rlc3REYXRhLnJlY2lwaWVudHNbMF0uYWRkcmVzcywgdGVzdERhdGEucmVjaXBpZW50c1swXS5hbW91bnRdLFxuICAgICAgICAgIGFiaTogdHJhbnNmZXJDb2luc0FiaSxcbiAgICAgICAgfSk7XG4gICAgICAgIHR4QnVpbGRlci5hZGRGZWVQYXllckFkZHJlc3ModGVzdERhdGEuZmVlUGF5ZXIuYWRkcmVzcyk7XG5cbiAgICAgICAgY29uc3QgdHggPSAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIEN1c3RvbVRyYW5zYWN0aW9uO1xuICAgICAgICBjb25zdCBzaWduYWJsZVBheWxvYWQgPSB0eC5zaWduYWJsZVBheWxvYWQ7XG4gICAgICAgIHNob3VsZC5leGlzdChzaWduYWJsZVBheWxvYWQpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgYnVpbGQgYSB1bnNpZ25lZCB0eCBhbmQgdmFsaWRhdGUgYmFzaWMgcHJvcGVydGllcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSBuZXcgQ3VzdG9tVHJhbnNhY3Rpb24oY29pbnMuZ2V0KCd0YXB0JykpO1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldEN1c3RvbVRyYW5zYWN0aW9uQnVpbGRlcih0cmFuc2FjdGlvbik7XG4gICAgICAgIHR4QnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyMi5hZGRyZXNzKTtcbiAgICAgICAgdHhCdWlsZGVyLmdhc0RhdGEoe1xuICAgICAgICAgIG1heEdhc0Ftb3VudDogMjAwMDAwLFxuICAgICAgICAgIGdhc1VuaXRQcmljZTogMTAwLFxuICAgICAgICB9KTtcbiAgICAgICAgdHhCdWlsZGVyLnNlcXVlbmNlTnVtYmVyKDE0KTtcbiAgICAgICAgdHhCdWlsZGVyLmV4cGlyYXRpb25UaW1lKDE3MzYyNDYxNTUpO1xuICAgICAgICB0eEJ1aWxkZXIuY3VzdG9tVHJhbnNhY3Rpb24oe1xuICAgICAgICAgIG1vZHVsZU5hbWU6ICcweDE6OmFwdG9zX2FjY291bnQnLFxuICAgICAgICAgIGZ1bmN0aW9uTmFtZTogJ3RyYW5zZmVyX2NvaW5zJyxcbiAgICAgICAgICB0eXBlQXJndW1lbnRzOiBbJzB4MTo6YXB0b3NfY29pbjo6QXB0b3NDb2luJ10sXG4gICAgICAgICAgZnVuY3Rpb25Bcmd1bWVudHM6IFt0ZXN0RGF0YS5yZWNpcGllbnRzWzBdLmFkZHJlc3MsIHRlc3REYXRhLnJlY2lwaWVudHNbMF0uYW1vdW50XSxcbiAgICAgICAgICBhYmk6IHRyYW5zZmVyQ29pbnNBYmksXG4gICAgICAgIH0pO1xuICAgICAgICB0eEJ1aWxkZXIuYWRkRmVlUGF5ZXJBZGRyZXNzKHRlc3REYXRhLmZlZVBheWVyLmFkZHJlc3MpO1xuXG4gICAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBDdXN0b21UcmFuc2FjdGlvbjtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHR4LnNlbmRlciwgdGVzdERhdGEuc2VuZGVyMi5hZGRyZXNzKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHR4LnNlcXVlbmNlTnVtYmVyLCAxNCk7XG4gICAgICAgIHNob3VsZC5lcXVhbCh0eC5tYXhHYXNBbW91bnQsIDIwMDAwMCk7XG4gICAgICAgIHNob3VsZC5lcXVhbCh0eC5nYXNVbml0UHJpY2UsIDEwMCk7XG4gICAgICAgIHNob3VsZC5lcXVhbCh0eC5leHBpcmF0aW9uVGltZSwgMTczNjI0NjE1NSk7XG4gICAgICAgIHNob3VsZC5lcXVhbCh0eC5mZWVQYXllckFkZHJlc3MsIHRlc3REYXRhLmZlZVBheWVyLmFkZHJlc3MpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgYnVpbGQgYSBjdXN0b20gdHJhbnNhY3Rpb24gd2l0aCB0b2tlbiBtaW50IGZ1bmN0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IG5ldyBDdXN0b21UcmFuc2FjdGlvbihjb2lucy5nZXQoJ3RhcHQnKSk7XG4gICAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0Q3VzdG9tVHJhbnNhY3Rpb25CdWlsZGVyKHRyYW5zYWN0aW9uKTtcbiAgICAgICAgdHhCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIyLmFkZHJlc3MpO1xuICAgICAgICB0eEJ1aWxkZXIuZ2FzRGF0YSh7XG4gICAgICAgICAgbWF4R2FzQW1vdW50OiAyMDAwMDAsXG4gICAgICAgICAgZ2FzVW5pdFByaWNlOiAxMDAsXG4gICAgICAgIH0pO1xuICAgICAgICB0eEJ1aWxkZXIuc2VxdWVuY2VOdW1iZXIoMTUpO1xuICAgICAgICB0eEJ1aWxkZXIuZXhwaXJhdGlvblRpbWUoMTczNjI0NjE1NSk7XG4gICAgICAgIHR4QnVpbGRlci5jdXN0b21UcmFuc2FjdGlvbih7XG4gICAgICAgICAgbW9kdWxlTmFtZTogJzB4MTo6bWFuYWdlZF9jb2luJyxcbiAgICAgICAgICBmdW5jdGlvbk5hbWU6ICdtaW50JyxcbiAgICAgICAgICB0eXBlQXJndW1lbnRzOiBbJzB4MTo6YXB0b3NfY29pbjo6QXB0b3NDb2luJ10sXG4gICAgICAgICAgZnVuY3Rpb25Bcmd1bWVudHM6IFt0ZXN0RGF0YS5yZWNpcGllbnRzWzBdLmFkZHJlc3MsIHRlc3REYXRhLnJlY2lwaWVudHNbMF0uYW1vdW50XSxcbiAgICAgICAgICBhYmk6IG1pbnRBYmksXG4gICAgICAgIH0pO1xuICAgICAgICB0eEJ1aWxkZXIuYWRkRmVlUGF5ZXJBZGRyZXNzKHRlc3REYXRhLmZlZVBheWVyLmFkZHJlc3MpO1xuICAgICAgICB0eEJ1aWxkZXIuc2V0SXNTaW11bGF0ZVR4bih0cnVlKTtcblxuICAgICAgICBjb25zdCB0eCA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgQ3VzdG9tVHJhbnNhY3Rpb247XG4gICAgICAgIHNob3VsZC5lcXVhbCh0eC5zZW5kZXIsIHRlc3REYXRhLnNlbmRlcjIuYWRkcmVzcyk7XG4gICAgICAgIHNob3VsZC5lcXVhbCh0eC5tYXhHYXNBbW91bnQsIDIwMDAwMCk7XG4gICAgICAgIHNob3VsZC5lcXVhbCh0eC5nYXNVbml0UHJpY2UsIDEwMCk7XG4gICAgICAgIHNob3VsZC5lcXVhbCh0eC5zZXF1ZW5jZU51bWJlciwgMTUpO1xuICAgICAgICBzaG91bGQuZXF1YWwodHguZXhwaXJhdGlvblRpbWUsIDE3MzYyNDYxNTUpO1xuICAgICAgICBzaG91bGQuZXF1YWwodHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLkN1c3RvbVR4KTtcblxuICAgICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICAgIHNob3VsZC5lcXVhbCh0eEJ1aWxkZXIuaXNWYWxpZFJhd1RyYW5zYWN0aW9uKHJhd1R4KSwgdHJ1ZSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBidWlsZCBhIGN1c3RvbSB0cmFuc2FjdGlvbiB3aXRoIHRva2VuIGJ1cm4gZnVuY3Rpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gbmV3IEN1c3RvbVRyYW5zYWN0aW9uKGNvaW5zLmdldCgndGFwdCcpKTtcbiAgICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRDdXN0b21UcmFuc2FjdGlvbkJ1aWxkZXIodHJhbnNhY3Rpb24pO1xuICAgICAgICB0eEJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlcjIuYWRkcmVzcyk7XG4gICAgICAgIHR4QnVpbGRlci5nYXNEYXRhKHtcbiAgICAgICAgICBtYXhHYXNBbW91bnQ6IDIwMDAwMCxcbiAgICAgICAgICBnYXNVbml0UHJpY2U6IDEwMCxcbiAgICAgICAgfSk7XG4gICAgICAgIHR4QnVpbGRlci5zZXF1ZW5jZU51bWJlcigxNik7XG4gICAgICAgIHR4QnVpbGRlci5leHBpcmF0aW9uVGltZSgxNzM2MjQ2MTU1KTtcbiAgICAgICAgdHhCdWlsZGVyLmN1c3RvbVRyYW5zYWN0aW9uKHtcbiAgICAgICAgICBtb2R1bGVOYW1lOiAnMHgxOjptYW5hZ2VkX2NvaW4nLFxuICAgICAgICAgIGZ1bmN0aW9uTmFtZTogJ2J1cm4nLFxuICAgICAgICAgIHR5cGVBcmd1bWVudHM6IFsnMHgxOjphcHRvc19jb2luOjpBcHRvc0NvaW4nXSxcbiAgICAgICAgICBmdW5jdGlvbkFyZ3VtZW50czogW1xuICAgICAgICAgICAgdGVzdERhdGEucmVjaXBpZW50c1swXS5hbW91bnQsIC8vIGFtb3VudFxuICAgICAgICAgIF0sXG4gICAgICAgICAgYWJpOiBidXJuQWJpLFxuICAgICAgICB9KTtcbiAgICAgICAgdHhCdWlsZGVyLmFkZEZlZVBheWVyQWRkcmVzcyh0ZXN0RGF0YS5mZWVQYXllci5hZGRyZXNzKTtcbiAgICAgICAgdHhCdWlsZGVyLnNldElzU2ltdWxhdGVUeG4odHJ1ZSk7XG5cbiAgICAgICAgY29uc3QgdHggPSAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIEN1c3RvbVRyYW5zYWN0aW9uO1xuICAgICAgICBzaG91bGQuZXF1YWwodHguc2VuZGVyLCB0ZXN0RGF0YS5zZW5kZXIyLmFkZHJlc3MpO1xuICAgICAgICBzaG91bGQuZXF1YWwodHgubWF4R2FzQW1vdW50LCAyMDAwMDApO1xuICAgICAgICBzaG91bGQuZXF1YWwodHguZ2FzVW5pdFByaWNlLCAxMDApO1xuICAgICAgICBzaG91bGQuZXF1YWwodHguc2VxdWVuY2VOdW1iZXIsIDE2KTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHR4LmV4cGlyYXRpb25UaW1lLCAxNzM2MjQ2MTU1KTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5DdXN0b21UeCk7XG5cbiAgICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgICBzaG91bGQuZXF1YWwodHhCdWlsZGVyLmlzVmFsaWRSYXdUcmFuc2FjdGlvbihyYXdUeCksIHRydWUpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgYnVpbGQgYW5kIHJlYnVpbGQgY3VzdG9tIHRyYW5zYWN0aW9uIHdpdGggY29ycmVjdCBVNjQgYW1vdW50IHBhcnNpbmcnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIFVzZSB0aGUgcHJvdmlkZWQgc2VyaWFsaXplZCBoZXggd2l0aCBhbW91bnQgMTAwMFxuICAgICAgICBjb25zdCBzZXJpYWxpemVkSGV4ID1cbiAgICAgICAgICAnMHhmMjJmYTAwOWI2NDczY2RjNTM5ZWNiZDU3MGQwMGQwNTg1NjgyZjU5MzlmZmUyNTZhOTBkZGVlMGQ2MTYyOTJmMDAwMDAwMDAwMDAwMDAwMDAyMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTA0NjM2ZjY5NmUwODc0NzI2MTZlNzM2NjY1NzIwMTA3MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTBhNjE3MDc0NmY3MzVmNjM2ZjY5NmUwOTQxNzA3NDZmNzM0MzZmNjk2ZTAwMDIyMGRhMjJiZGMxOWY4NzNmZDZjZTQ4YzMyOTEyOTY1YzhhOWRkZTU3OGIyYTNjZjRmYWUzZGQ4NWRmYWFjNzg0YzkwOGU4MDMwMDAwMDAwMDAwMDBhODYxMDAwMDAwMDAwMDAwNjQwMDAwMDAwMDAwMDAwMDkwMWNkZDY4MDAwMDAwMDAwMjAzMDAyMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA0MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMGFkYmE0NGI0NjcyMmI4ZGExNzk3NjQ1ZjcxZGRjZGFiMjg2MjZjMDZhY2QzNmI4OGQ1MTk4YTY4NDk2NjMwNmMwMDIwNDUzZWQ1YWE3NWIwMWYzZWIwM2FiMWQzMDMwYmUxMDk5NjIwNmU1YTA3M2E3NDk4M2VhM2ZjZDAxM2ZmZTFlYTQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnO1xuXG4gICAgICAgIGNvbnN0IHRyYW5zZmVyQ29pbnNBYmkgPSB7XG4gICAgICAgICAgdHlwZVBhcmFtZXRlcnM6IFt7IGNvbnN0cmFpbnRzOiBbXSB9XSxcbiAgICAgICAgICBwYXJhbWV0ZXJzOiBbbmV3IFR5cGVUYWdBZGRyZXNzKCksIG5ldyBUeXBlVGFnVTY0KCldLFxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIEJ1aWxkIHRyYW5zYWN0aW9uIGZyb20gc2VyaWFsaXplZCBoZXhcbiAgICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5mcm9tKHNlcmlhbGl6ZWRIZXgsIHRyYW5zZmVyQ29pbnNBYmkpO1xuICAgICAgICBjb25zdCB0eCA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgQ3VzdG9tVHJhbnNhY3Rpb247XG5cbiAgICAgICAgLy8gVmFsaWRhdGUgdGhlIHRyYW5zYWN0aW9uIHdhcyBwYXJzZWQgY29ycmVjdGx5XG4gICAgICAgIHNob3VsZC5lcXVhbCh0eC50eXBlLCBUcmFuc2FjdGlvblR5cGUuQ3VzdG9tVHgpO1xuICAgICAgICBzaG91bGQuZXhpc3QodHguZnVsbEZ1bmN0aW9uTmFtZSk7XG4gICAgICAgIHNob3VsZC5lcXVhbCh0eC5mdWxsRnVuY3Rpb25OYW1lLCAnMHgxOjpjb2luOjp0cmFuc2ZlcicpO1xuXG4gICAgICAgIC8vIEdldCB0aGUgY3VzdG9tIHRyYW5zYWN0aW9uIHBhcmFtZXRlcnNcbiAgICAgICAgY29uc3QgY3VzdG9tUGFyYW1zID0gdHguZ2V0Q3VzdG9tVHJhbnNhY3Rpb25QYXJhbXMoKTtcbiAgICAgICAgc2hvdWxkLmV4aXN0KGN1c3RvbVBhcmFtcyk7XG4gICAgICAgIHNob3VsZC5lcXVhbChjdXN0b21QYXJhbXMubW9kdWxlTmFtZSwgJzB4MTo6Y29pbicpO1xuICAgICAgICBzaG91bGQuZXF1YWwoY3VzdG9tUGFyYW1zLmZ1bmN0aW9uTmFtZSwgJ3RyYW5zZmVyJyk7XG4gICAgICAgIHNob3VsZC5leGlzdChjdXN0b21QYXJhbXMuZnVuY3Rpb25Bcmd1bWVudHMpO1xuICAgICAgICBzaG91bGQuZXF1YWwoY3VzdG9tUGFyYW1zLmZ1bmN0aW9uQXJndW1lbnRzIS5sZW5ndGgsIDIpO1xuXG4gICAgICAgIC8vIFZhbGlkYXRlIHRoZSBhbW91bnQgYXJndW1lbnQgd2FzIHBhcnNlZCBjb3JyZWN0bHkgYXMgMTAwMFxuICAgICAgICBjb25zdCBwYXJzZWRBbW91bnQgPSBjdXN0b21QYXJhbXMuZnVuY3Rpb25Bcmd1bWVudHMhWzFdO1xuICAgICAgICBzaG91bGQuZXF1YWwocGFyc2VkQW1vdW50LCAnMTAwMCcsICdBbW91bnQgc2hvdWxkIGJlIGNvcnJlY3RseSBwYXJzZWQgYXMgMTAwMCBmcm9tIFU2NCBieXRlcycpO1xuXG4gICAgICAgIC8vIFZhbGlkYXRlIHRoZSBhZGRyZXNzIGFyZ3VtZW50IChmaXJzdCBhcmd1bWVudClcbiAgICAgICAgY29uc3QgcGFyc2VkQWRkcmVzcyA9IGN1c3RvbVBhcmFtcy5mdW5jdGlvbkFyZ3VtZW50cyFbMF07XG4gICAgICAgIHNob3VsZC5leGlzdChwYXJzZWRBZGRyZXNzKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHR5cGVvZiBwYXJzZWRBZGRyZXNzLCAnc3RyaW5nJywgJ0FkZHJlc3Mgc2hvdWxkIGJlIGEgc3RyaW5nJyk7XG4gICAgICAgIChwYXJzZWRBZGRyZXNzIGFzIHN0cmluZykuc2hvdWxkLm1hdGNoKC9eMHhbYS1mQS1GMC05XSskLywgJ0FkZHJlc3Mgc2hvdWxkIGJlIHZhbGlkIGhleCBmb3JtYXQnKTtcblxuICAgICAgICAvLyBFbnN1cmUgdGhlIHRyYW5zYWN0aW9uIGNhbiBiZSByZWJ1aWx0IChyb3VuZC10cmlwIHRlc3QpXG4gICAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHR4QnVpbGRlci5pc1ZhbGlkUmF3VHJhbnNhY3Rpb24ocmF3VHgpLCB0cnVlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ0ZhaWwnLCAoKSA9PiB7XG4gICAgICBpdCgnc2hvdWxkIGZhaWwgZm9yIGludmFsaWQgc2VuZGVyJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IG5ldyBDdXN0b21UcmFuc2FjdGlvbihjb2lucy5nZXQoJ3RhcHQnKSk7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmdldEN1c3RvbVRyYW5zYWN0aW9uQnVpbGRlcih0cmFuc2FjdGlvbik7XG4gICAgICAgIHNob3VsZCgoKSA9PiBidWlsZGVyLnNlbmRlcigncmFuZG9tU3RyaW5nJykpLnRocm93RXJyb3IoJ0ludmFsaWQgYWRkcmVzcyByYW5kb21TdHJpbmcnKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGZhaWwgZm9yIG1pc3NpbmcgbW9kdWxlIG5hbWUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmdldEN1c3RvbVRyYW5zYWN0aW9uQnVpbGRlcigpO1xuICAgICAgICBzaG91bGQoKCkgPT5cbiAgICAgICAgICBidWlsZGVyLmN1c3RvbVRyYW5zYWN0aW9uKHtcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICcnLFxuICAgICAgICAgICAgZnVuY3Rpb25OYW1lOiAncmVnaXN0ZXJfZG9tYWluJyxcbiAgICAgICAgICAgIHR5cGVBcmd1bWVudHM6IFtdLFxuICAgICAgICAgICAgZnVuY3Rpb25Bcmd1bWVudHM6IFtdLFxuICAgICAgICAgICAgYWJpOiBiYXNpY0FiaSxcbiAgICAgICAgICB9KVxuICAgICAgICApLnRocm93RXJyb3IoJ01pc3NpbmcgbW9kdWxlIG5hbWUnKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGZhaWwgZm9yIG1pc3NpbmcgZnVuY3Rpb24gbmFtZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0Q3VzdG9tVHJhbnNhY3Rpb25CdWlsZGVyKCk7XG4gICAgICAgIHNob3VsZCgoKSA9PlxuICAgICAgICAgIGJ1aWxkZXIuY3VzdG9tVHJhbnNhY3Rpb24oe1xuICAgICAgICAgICAgbW9kdWxlTmFtZTogJzB4MTo6YXB0b3NfYWNjb3VudCcsXG4gICAgICAgICAgICBmdW5jdGlvbk5hbWU6ICcnLFxuICAgICAgICAgICAgdHlwZUFyZ3VtZW50czogW10sXG4gICAgICAgICAgICBmdW5jdGlvbkFyZ3VtZW50czogW10sXG4gICAgICAgICAgICBhYmk6IGJhc2ljQWJpLFxuICAgICAgICAgIH0pXG4gICAgICAgICkudGhyb3dFcnJvcignTWlzc2luZyBmdW5jdGlvbiBuYW1lJyk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBmYWlsIGZvciBpbnZhbGlkIG1vZHVsZSBuYW1lIGZvcm1hdCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0Q3VzdG9tVHJhbnNhY3Rpb25CdWlsZGVyKCk7XG4gICAgICAgIHNob3VsZCgoKSA9PlxuICAgICAgICAgIGJ1aWxkZXIuY3VzdG9tVHJhbnNhY3Rpb24oe1xuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ2ludmFsaWRfZm9ybWF0JyxcbiAgICAgICAgICAgIGZ1bmN0aW9uTmFtZTogJ3RyYW5zZmVyJyxcbiAgICAgICAgICAgIHR5cGVBcmd1bWVudHM6IFtdLFxuICAgICAgICAgICAgZnVuY3Rpb25Bcmd1bWVudHM6IFtdLFxuICAgICAgICAgICAgYWJpOiBiYXNpY0FiaSxcbiAgICAgICAgICB9KVxuICAgICAgICApLnRocm93RXJyb3IoL0ludmFsaWQgbW9kdWxlIG5hbWUgZm9ybWF0Lyk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBmYWlsIGZvciBpbnZhbGlkIGZ1bmN0aW9uIG5hbWUgZm9ybWF0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5nZXRDdXN0b21UcmFuc2FjdGlvbkJ1aWxkZXIoKTtcbiAgICAgICAgc2hvdWxkKCgpID0+XG4gICAgICAgICAgYnVpbGRlci5jdXN0b21UcmFuc2FjdGlvbih7XG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnMHgxOjphcHRvc19hY2NvdW50JyxcbiAgICAgICAgICAgIGZ1bmN0aW9uTmFtZTogJzEyM2ludmFsaWQnLFxuICAgICAgICAgICAgdHlwZUFyZ3VtZW50czogW10sXG4gICAgICAgICAgICBmdW5jdGlvbkFyZ3VtZW50czogW10sXG4gICAgICAgICAgICBhYmk6IGJhc2ljQWJpLFxuICAgICAgICAgIH0pXG4gICAgICAgICkudGhyb3dFcnJvcigvSW52YWxpZCBmdW5jdGlvbiBuYW1lIGZvcm1hdC8pO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgYWNjZXB0IHZhbGlkIFNIT1JUIGFkZHJlc3MgZm9ybWF0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5nZXRDdXN0b21UcmFuc2FjdGlvbkJ1aWxkZXIoKTtcbiAgICAgICAgc2hvdWxkKCgpID0+XG4gICAgICAgICAgYnVpbGRlci5jdXN0b21UcmFuc2FjdGlvbih7XG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnMHgxOjphcHRvc19hY2NvdW50JyxcbiAgICAgICAgICAgIGZ1bmN0aW9uTmFtZTogJ3RyYW5zZmVyX2NvaW5zJyxcbiAgICAgICAgICAgIHR5cGVBcmd1bWVudHM6IFtdLFxuICAgICAgICAgICAgZnVuY3Rpb25Bcmd1bWVudHM6IFtdLFxuICAgICAgICAgICAgYWJpOiBiYXNpY0FiaSxcbiAgICAgICAgICB9KVxuICAgICAgICApLm5vdC50aHJvdygpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgYWNjZXB0IHZhbGlkIExPTkcgYWRkcmVzcyBmb3JtYXQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmdldEN1c3RvbVRyYW5zYWN0aW9uQnVpbGRlcigpO1xuICAgICAgICBzaG91bGQoKCkgPT5cbiAgICAgICAgICBidWlsZGVyLmN1c3RvbVRyYW5zYWN0aW9uKHtcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICcweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDE6OmFwdG9zX2FjY291bnQnLFxuICAgICAgICAgICAgZnVuY3Rpb25OYW1lOiAndHJhbnNmZXJfY29pbnMnLFxuICAgICAgICAgICAgdHlwZUFyZ3VtZW50czogW10sXG4gICAgICAgICAgICBmdW5jdGlvbkFyZ3VtZW50czogW10sXG4gICAgICAgICAgICBhYmk6IGJhc2ljQWJpLFxuICAgICAgICAgIH0pXG4gICAgICAgICkubm90LnRocm93KCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCByZWplY3QgbmFtZWQgYWRkcmVzc2VzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5nZXRDdXN0b21UcmFuc2FjdGlvbkJ1aWxkZXIoKTtcbiAgICAgICAgc2hvdWxkKCgpID0+XG4gICAgICAgICAgYnVpbGRlci5jdXN0b21UcmFuc2FjdGlvbih7XG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnYXB0b3NfZnJhbWV3b3JrOjphcHRvc19hY2NvdW50JyxcbiAgICAgICAgICAgIGZ1bmN0aW9uTmFtZTogJ3RyYW5zZmVyX2NvaW5zJyxcbiAgICAgICAgICAgIHR5cGVBcmd1bWVudHM6IFtdLFxuICAgICAgICAgICAgZnVuY3Rpb25Bcmd1bWVudHM6IFtdLFxuICAgICAgICAgICAgYWJpOiBiYXNpY0FiaSxcbiAgICAgICAgICB9KVxuICAgICAgICApLnRocm93RXJyb3IoL0ludmFsaWQgbW9kdWxlIG5hbWUgZm9ybWF0LipoZXggYWRkcmVzc2VzIG9ubHkvKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIHRyYW5zYWN0aW9uIHBheWxvYWRzIHByb3Blcmx5JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IG5ldyBDdXN0b21UcmFuc2FjdGlvbihjb2lucy5nZXQoJ3RhcHQnKSk7XG4gICAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0Q3VzdG9tVHJhbnNhY3Rpb25CdWlsZGVyKHRyYW5zYWN0aW9uKTtcblxuICAgICAgICAvLyBWYWxpZCBwYXlsb2FkIHNob3VsZCBwYXNzIHZhbGlkYXRpb25cbiAgICAgICAgdHhCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIyLmFkZHJlc3MpO1xuICAgICAgICB0eEJ1aWxkZXIuZ2FzRGF0YSh7XG4gICAgICAgICAgbWF4R2FzQW1vdW50OiAyMDAwMDAsXG4gICAgICAgICAgZ2FzVW5pdFByaWNlOiAxMDAsXG4gICAgICAgIH0pO1xuICAgICAgICB0eEJ1aWxkZXIuc2VxdWVuY2VOdW1iZXIoMTQpO1xuICAgICAgICB0eEJ1aWxkZXIuZXhwaXJhdGlvblRpbWUoMTczNjI0NjE1NSk7XG4gICAgICAgIHR4QnVpbGRlci5jdXN0b21UcmFuc2FjdGlvbih7XG4gICAgICAgICAgbW9kdWxlTmFtZTogJzB4MTo6bWFuYWdlZF9jb2luJyxcbiAgICAgICAgICBmdW5jdGlvbk5hbWU6ICdtaW50JyxcbiAgICAgICAgICB0eXBlQXJndW1lbnRzOiBbJzB4MTo6YXB0b3NfY29pbjo6QXB0b3NDb2luJ10sXG4gICAgICAgICAgZnVuY3Rpb25Bcmd1bWVudHM6IFt0ZXN0RGF0YS5yZWNpcGllbnRzWzBdLmFkZHJlc3MsIHRlc3REYXRhLnJlY2lwaWVudHNbMF0uYW1vdW50XSxcbiAgICAgICAgICBhYmk6IG1pbnRBYmksXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICAgIHNob3VsZC5leGlzdCh0eCk7XG4gICAgICAgIHNob3VsZC5lcXVhbCh0eC50eXBlLCBUcmFuc2FjdGlvblR5cGUuQ3VzdG9tVHgpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgZmFpbCBmb3IgaW52YWxpZCBnYXMgYW1vdW50JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5nZXRDdXN0b21UcmFuc2FjdGlvbkJ1aWxkZXIoKTtcbiAgICAgICAgc2hvdWxkKCgpID0+IGJ1aWxkZXIuZ2FzRGF0YSh7IG1heEdhc0Ftb3VudDogLTEsIGdhc1VuaXRQcmljZTogMTAwIH0pKS50aHJvd0Vycm9yKFxuICAgICAgICAgICdWYWx1ZSBjYW5ub3QgYmUgbGVzcyB0aGFuIHplcm8nXG4gICAgICAgICk7XG4gICAgICAgIHNob3VsZCgoKSA9PiBidWlsZGVyLmdhc0RhdGEoeyBtYXhHYXNBbW91bnQ6IDIwMDAwMCwgZ2FzVW5pdFByaWNlOiAtMSB9KSkudGhyb3dFcnJvcihcbiAgICAgICAgICAnVmFsdWUgY2Fubm90IGJlIGxlc3MgdGhhbiB6ZXJvJ1xuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgZmFpbCB0byBidWlsZCB3aXRob3V0IHJlcXVpcmVkIHBhcmFtZXRlcnMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gbmV3IEN1c3RvbVRyYW5zYWN0aW9uKGNvaW5zLmdldCgndGFwdCcpKTtcbiAgICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRDdXN0b21UcmFuc2FjdGlvbkJ1aWxkZXIodHJhbnNhY3Rpb24pO1xuICAgICAgICB0eEJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlcjIuYWRkcmVzcyk7XG4gICAgICAgIHR4QnVpbGRlci5nYXNEYXRhKHtcbiAgICAgICAgICBtYXhHYXNBbW91bnQ6IDIwMDAwMCxcbiAgICAgICAgICBnYXNVbml0UHJpY2U6IDEwMCxcbiAgICAgICAgfSk7XG4gICAgICAgIHR4QnVpbGRlci5zZXF1ZW5jZU51bWJlcigxNCk7XG4gICAgICAgIHR4QnVpbGRlci5leHBpcmF0aW9uVGltZSgxNzM2MjQ2MTU1KTtcblxuICAgICAgICBhd2FpdCBzaG91bGQodHhCdWlsZGVyLmJ1aWxkKCkpLmJlLnJlamVjdGVkV2l0aCgnTWlzc2luZyByZXF1aXJlZCBtb2R1bGUgb3IgZnVuY3Rpb24gbmFtZScpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnQUJJIEJlaGF2aW9yIFRlc3RzJywgKCkgPT4ge1xuICAgICAgaXQoJ3Nob3VsZCBzdWNjZWVkIHdoZW4gQUJJIGlzIG5vdCBwcm92aWRlZCAodW5kZWZpbmVkKScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSBuZXcgQ3VzdG9tVHJhbnNhY3Rpb24oY29pbnMuZ2V0KCd0YXB0JykpO1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldEN1c3RvbVRyYW5zYWN0aW9uQnVpbGRlcih0cmFuc2FjdGlvbik7XG4gICAgICAgIHR4QnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyMi5hZGRyZXNzKTtcbiAgICAgICAgdHhCdWlsZGVyLmdhc0RhdGEoe1xuICAgICAgICAgIG1heEdhc0Ftb3VudDogMjAwMDAwLFxuICAgICAgICAgIGdhc1VuaXRQcmljZTogMTAwLFxuICAgICAgICB9KTtcbiAgICAgICAgdHhCdWlsZGVyLnNlcXVlbmNlTnVtYmVyKDE0KTtcbiAgICAgICAgdHhCdWlsZGVyLmV4cGlyYXRpb25UaW1lKDE3MzYyNDYxNTUpO1xuICAgICAgICB0eEJ1aWxkZXIuY3VzdG9tVHJhbnNhY3Rpb24oe1xuICAgICAgICAgIG1vZHVsZU5hbWU6ICcweDE6OmFwdG9zX2FjY291bnQnLFxuICAgICAgICAgIGZ1bmN0aW9uTmFtZTogJ3RyYW5zZmVyX2NvaW5zJyxcbiAgICAgICAgICB0eXBlQXJndW1lbnRzOiBbJzB4MTo6YXB0b3NfY29pbjo6QXB0b3NDb2luJ10sXG4gICAgICAgICAgZnVuY3Rpb25Bcmd1bWVudHM6IFt0ZXN0RGF0YS5yZWNpcGllbnRzWzBdLmFkZHJlc3MsIHRlc3REYXRhLnJlY2lwaWVudHNbMF0uYW1vdW50XSxcbiAgICAgICAgICBhYmk6IHRyYW5zZmVyQ29pbnNBYmksIC8vIEFCSSBpcyBub3cgcmVxdWlyZWRcbiAgICAgICAgfSk7XG4gICAgICAgIHR4QnVpbGRlci5hZGRGZWVQYXllckFkZHJlc3ModGVzdERhdGEuZmVlUGF5ZXIuYWRkcmVzcyk7XG4gICAgICAgIHR4QnVpbGRlci5zZXRJc1NpbXVsYXRlVHhuKHRydWUpO1xuXG4gICAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBDdXN0b21UcmFuc2FjdGlvbjtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5DdXN0b21UeCk7XG5cbiAgICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgICBzaG91bGQuZXF1YWwodHhCdWlsZGVyLmlzVmFsaWRSYXdUcmFuc2FjdGlvbihyYXdUeCksIHRydWUpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgZmFpbCB3aXRoIGludmFsaWQgQUJJIHN0cmluZycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSBuZXcgQ3VzdG9tVHJhbnNhY3Rpb24oY29pbnMuZ2V0KCd0YXB0JykpO1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldEN1c3RvbVRyYW5zYWN0aW9uQnVpbGRlcih0cmFuc2FjdGlvbik7XG4gICAgICAgIHR4QnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyMi5hZGRyZXNzKTtcbiAgICAgICAgdHhCdWlsZGVyLmdhc0RhdGEoe1xuICAgICAgICAgIG1heEdhc0Ftb3VudDogMjAwMDAwLFxuICAgICAgICAgIGdhc1VuaXRQcmljZTogMTAwLFxuICAgICAgICB9KTtcbiAgICAgICAgdHhCdWlsZGVyLnNlcXVlbmNlTnVtYmVyKDE0KTtcbiAgICAgICAgdHhCdWlsZGVyLmV4cGlyYXRpb25UaW1lKDE3MzYyNDYxNTUpO1xuICAgICAgICB0eEJ1aWxkZXIuY3VzdG9tVHJhbnNhY3Rpb24oe1xuICAgICAgICAgIG1vZHVsZU5hbWU6ICcweDE6OmFwdG9zX2FjY291bnQnLFxuICAgICAgICAgIGZ1bmN0aW9uTmFtZTogJ3RyYW5zZmVyX2NvaW5zJyxcbiAgICAgICAgICB0eXBlQXJndW1lbnRzOiBbJzB4MTo6YXB0b3NfY29pbjo6QXB0b3NDb2luJ10sXG4gICAgICAgICAgZnVuY3Rpb25Bcmd1bWVudHM6IFt0ZXN0RGF0YS5yZWNpcGllbnRzWzBdLmFkZHJlc3MsIHRlc3REYXRhLnJlY2lwaWVudHNbMF0uYW1vdW50XSxcbiAgICAgICAgICBhYmk6IHRyYW5zZmVyQ29pbnNBYmksXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFBhc3MgaW52YWxpZCBBQkkgYnkgYnlwYXNzaW5nIFR5cGVTY3JpcHQgKGNhc3QgYXMgYW55KVxuICAgICAgICB0eEJ1aWxkZXIuZW50cnlGdW5jdGlvbkFiaSgncmFuZG9tX2ludmFsaWRfYWJpJyBhcyBhbnkpO1xuICAgICAgICB0eEJ1aWxkZXIuYWRkRmVlUGF5ZXJBZGRyZXNzKHRlc3REYXRhLmZlZVBheWVyLmFkZHJlc3MpO1xuICAgICAgICB0eEJ1aWxkZXIuc2V0SXNTaW11bGF0ZVR4bih0cnVlKTtcblxuICAgICAgICAvLyBTaG91bGQgZmFpbCBkdWUgdG8gaW52YWxpZCBBQkkgZHVyaW5nIGJ1aWxkXG4gICAgICAgIGF3YWl0IHNob3VsZCh0eEJ1aWxkZXIuYnVpbGQoKSkuYmUucmVqZWN0ZWQoKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHdvcmsgd2l0aCBjb3JyZWN0IEFCSSBmb3IgdHJhbnNmZXJfY29pbnMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHsgVHlwZVRhZ0FkZHJlc3MsIFR5cGVUYWdVNjQgfSA9IGF3YWl0IGltcG9ydCgnQGFwdG9zLWxhYnMvdHMtc2RrJyk7XG5cbiAgICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSBuZXcgQ3VzdG9tVHJhbnNhY3Rpb24oY29pbnMuZ2V0KCd0YXB0JykpO1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldEN1c3RvbVRyYW5zYWN0aW9uQnVpbGRlcih0cmFuc2FjdGlvbik7XG4gICAgICAgIHR4QnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyMi5hZGRyZXNzKTtcbiAgICAgICAgdHhCdWlsZGVyLmdhc0RhdGEoe1xuICAgICAgICAgIG1heEdhc0Ftb3VudDogMjAwMDAwLFxuICAgICAgICAgIGdhc1VuaXRQcmljZTogMTAwLFxuICAgICAgICB9KTtcbiAgICAgICAgdHhCdWlsZGVyLnNlcXVlbmNlTnVtYmVyKDE0KTtcbiAgICAgICAgdHhCdWlsZGVyLmV4cGlyYXRpb25UaW1lKDE3MzYyNDYxNTUpO1xuICAgICAgICB0eEJ1aWxkZXIuY3VzdG9tVHJhbnNhY3Rpb24oe1xuICAgICAgICAgIG1vZHVsZU5hbWU6ICcweDE6OmFwdG9zX2FjY291bnQnLFxuICAgICAgICAgIGZ1bmN0aW9uTmFtZTogJ3RyYW5zZmVyX2NvaW5zJyxcbiAgICAgICAgICB0eXBlQXJndW1lbnRzOiBbJzB4MTo6YXB0b3NfY29pbjo6QXB0b3NDb2luJ10sXG4gICAgICAgICAgZnVuY3Rpb25Bcmd1bWVudHM6IFt0ZXN0RGF0YS5yZWNpcGllbnRzWzBdLmFkZHJlc3MsIHRlc3REYXRhLnJlY2lwaWVudHNbMF0uYW1vdW50XSxcbiAgICAgICAgICBhYmk6IHRyYW5zZmVyQ29pbnNBYmksXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFByb3ZpZGUgY29ycmVjdCBBQkkgKHNhbWUgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbiB1c2VzKVxuICAgICAgICBjb25zdCBjb3JyZWN0QWJpID0ge1xuICAgICAgICAgIHR5cGVQYXJhbWV0ZXJzOiBbeyBjb25zdHJhaW50czogW10gfV0sXG4gICAgICAgICAgcGFyYW1ldGVyczogW25ldyBUeXBlVGFnQWRkcmVzcygpLCBuZXcgVHlwZVRhZ1U2NCgpXSxcbiAgICAgICAgfTtcbiAgICAgICAgdHhCdWlsZGVyLmVudHJ5RnVuY3Rpb25BYmkoY29ycmVjdEFiaSk7XG4gICAgICAgIHR4QnVpbGRlci5hZGRGZWVQYXllckFkZHJlc3ModGVzdERhdGEuZmVlUGF5ZXIuYWRkcmVzcyk7XG4gICAgICAgIHR4QnVpbGRlci5zZXRJc1NpbXVsYXRlVHhuKHRydWUpO1xuXG4gICAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBDdXN0b21UcmFuc2FjdGlvbjtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5DdXN0b21UeCk7XG5cbiAgICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgICBzaG91bGQuZXF1YWwodHhCdWlsZGVyLmlzVmFsaWRSYXdUcmFuc2FjdGlvbihyYXdUeCksIHRydWUpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgYnVpbGQgdHJhbnNhY3Rpb24gd2l0aCBjdXN0b20gdG9rZW4gbWludCBhdCBkZXBsb3llZCBhZGRyZXNzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IG5ldyBDdXN0b21UcmFuc2FjdGlvbihjb2lucy5nZXQoJ3RhcHQnKSk7XG4gICAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0Q3VzdG9tVHJhbnNhY3Rpb25CdWlsZGVyKHRyYW5zYWN0aW9uKTtcbiAgICAgICAgdHhCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIyLmFkZHJlc3MpO1xuICAgICAgICB0eEJ1aWxkZXIuZ2FzRGF0YSh7XG4gICAgICAgICAgbWF4R2FzQW1vdW50OiAyMDAwMDAsXG4gICAgICAgICAgZ2FzVW5pdFByaWNlOiAxMDAsXG4gICAgICAgIH0pO1xuICAgICAgICB0eEJ1aWxkZXIuc2VxdWVuY2VOdW1iZXIoMTUpO1xuICAgICAgICB0eEJ1aWxkZXIuZXhwaXJhdGlvblRpbWUoMTczNjI0NjE1NSk7XG4gICAgICAgIHR4QnVpbGRlci5jdXN0b21UcmFuc2FjdGlvbih7XG4gICAgICAgICAgbW9kdWxlTmFtZTogJzB4YTg1MTA3ZWUwZTM0NTk2OWQyYjc2ZTU3ZjZmNjdjNTUxYmExYjA2NmZjMTRkMjEzMzI4ZGRlZDYyNjE4YmYyZTo6c2FtcGxlX3Rva2VuJyxcbiAgICAgICAgICBmdW5jdGlvbk5hbWU6ICdtaW50JyxcbiAgICAgICAgICB0eXBlQXJndW1lbnRzOiBbXSxcbiAgICAgICAgICBmdW5jdGlvbkFyZ3VtZW50czogW3Rlc3REYXRhLnJlY2lwaWVudHNbMF0uYWRkcmVzcywgdGVzdERhdGEucmVjaXBpZW50c1swXS5hbW91bnRdLFxuICAgICAgICAgIGFiaTogY3VzdG9tVG9rZW5NaW50QWJpLFxuICAgICAgICB9KTtcbiAgICAgICAgdHhCdWlsZGVyLmFkZEZlZVBheWVyQWRkcmVzcyh0ZXN0RGF0YS5mZWVQYXllci5hZGRyZXNzKTtcbiAgICAgICAgdHhCdWlsZGVyLnNldElzU2ltdWxhdGVUeG4odHJ1ZSk7XG5cbiAgICAgICAgY29uc3QgdHggPSAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIEN1c3RvbVRyYW5zYWN0aW9uO1xuICAgICAgICBzaG91bGQuZXF1YWwodHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLkN1c3RvbVR4KTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKFxuICAgICAgICAgIHR4LmZ1bGxGdW5jdGlvbk5hbWUsXG4gICAgICAgICAgJzB4YTg1MTA3ZWUwZTM0NTk2OWQyYjc2ZTU3ZjZmNjdjNTUxYmExYjA2NmZjMTRkMjEzMzI4ZGRlZDYyNjE4YmYyZTo6c2FtcGxlX3Rva2VuOjptaW50J1xuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHR4QnVpbGRlci5pc1ZhbGlkUmF3VHJhbnNhY3Rpb24ocmF3VHgpLCB0cnVlKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGJ1aWxkIHRyYW5zYWN0aW9uIHdpdGggY3VzdG9tIHRva2VuIGJ1cm4gYXQgZGVwbG95ZWQgYWRkcmVzcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSBuZXcgQ3VzdG9tVHJhbnNhY3Rpb24oY29pbnMuZ2V0KCd0YXB0JykpO1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldEN1c3RvbVRyYW5zYWN0aW9uQnVpbGRlcih0cmFuc2FjdGlvbik7XG4gICAgICAgIHR4QnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyMi5hZGRyZXNzKTtcbiAgICAgICAgdHhCdWlsZGVyLmdhc0RhdGEoe1xuICAgICAgICAgIG1heEdhc0Ftb3VudDogMjAwMDAwLFxuICAgICAgICAgIGdhc1VuaXRQcmljZTogMTAwLFxuICAgICAgICB9KTtcbiAgICAgICAgdHhCdWlsZGVyLnNlcXVlbmNlTnVtYmVyKDE2KTtcbiAgICAgICAgdHhCdWlsZGVyLmV4cGlyYXRpb25UaW1lKDE3MzYyNDYxNTUpO1xuICAgICAgICB0eEJ1aWxkZXIuY3VzdG9tVHJhbnNhY3Rpb24oe1xuICAgICAgICAgIG1vZHVsZU5hbWU6ICcweGE4NTEwN2VlMGUzNDU5NjlkMmI3NmU1N2Y2ZjY3YzU1MWJhMWIwNjZmYzE0ZDIxMzMyOGRkZWQ2MjYxOGJmMmU6OnNhbXBsZV90b2tlbicsXG4gICAgICAgICAgZnVuY3Rpb25OYW1lOiAnYnVybicsXG4gICAgICAgICAgdHlwZUFyZ3VtZW50czogW10sXG4gICAgICAgICAgZnVuY3Rpb25Bcmd1bWVudHM6IFt0ZXN0RGF0YS5yZWNpcGllbnRzWzBdLmFtb3VudF0sXG4gICAgICAgICAgYWJpOiBjdXN0b21Ub2tlbkJ1cm5BYmksXG4gICAgICAgIH0pO1xuICAgICAgICB0eEJ1aWxkZXIuYWRkRmVlUGF5ZXJBZGRyZXNzKHRlc3REYXRhLmZlZVBheWVyLmFkZHJlc3MpO1xuICAgICAgICB0eEJ1aWxkZXIuc2V0SXNTaW11bGF0ZVR4bih0cnVlKTtcblxuICAgICAgICBjb25zdCB0eCA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgQ3VzdG9tVHJhbnNhY3Rpb247XG4gICAgICAgIHNob3VsZC5lcXVhbCh0eC50eXBlLCBUcmFuc2FjdGlvblR5cGUuQ3VzdG9tVHgpO1xuICAgICAgICBzaG91bGQuZXF1YWwoXG4gICAgICAgICAgdHguZnVsbEZ1bmN0aW9uTmFtZSxcbiAgICAgICAgICAnMHhhODUxMDdlZTBlMzQ1OTY5ZDJiNzZlNTdmNmY2N2M1NTFiYTFiMDY2ZmMxNGQyMTMzMjhkZGVkNjI2MThiZjJlOjpzYW1wbGVfdG9rZW46OmJ1cm4nXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgICBzaG91bGQuZXF1YWwodHhCdWlsZGVyLmlzVmFsaWRSYXdUcmFuc2FjdGlvbihyYXdUeCksIHRydWUpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgZmFpbCB3aXRoIHdyb25nIEFCSSBwYXJhbWV0ZXIgY291bnQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gbmV3IEN1c3RvbVRyYW5zYWN0aW9uKGNvaW5zLmdldCgndGFwdCcpKTtcbiAgICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRDdXN0b21UcmFuc2FjdGlvbkJ1aWxkZXIodHJhbnNhY3Rpb24pO1xuICAgICAgICB0eEJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlcjIuYWRkcmVzcyk7XG4gICAgICAgIHR4QnVpbGRlci5nYXNEYXRhKHtcbiAgICAgICAgICBtYXhHYXNBbW91bnQ6IDIwMDAwMCxcbiAgICAgICAgICBnYXNVbml0UHJpY2U6IDEwMCxcbiAgICAgICAgfSk7XG4gICAgICAgIHR4QnVpbGRlci5zZXF1ZW5jZU51bWJlcigxNCk7XG4gICAgICAgIHR4QnVpbGRlci5leHBpcmF0aW9uVGltZSgxNzM2MjQ2MTU1KTtcbiAgICAgICAgdHhCdWlsZGVyLmN1c3RvbVRyYW5zYWN0aW9uKHtcbiAgICAgICAgICBtb2R1bGVOYW1lOiAnMHgxOjphcHRvc19hY2NvdW50JyxcbiAgICAgICAgICBmdW5jdGlvbk5hbWU6ICd0cmFuc2Zlcl9jb2lucycsXG4gICAgICAgICAgdHlwZUFyZ3VtZW50czogWycweDE6OmFwdG9zX2NvaW46OkFwdG9zQ29pbiddLFxuICAgICAgICAgIGZ1bmN0aW9uQXJndW1lbnRzOiBbdGVzdERhdGEucmVjaXBpZW50c1swXS5hZGRyZXNzLCB0ZXN0RGF0YS5yZWNpcGllbnRzWzBdLmFtb3VudF0sXG4gICAgICAgICAgYWJpOiB0cmFuc2ZlckNvaW5zQWJpLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBQcm92aWRlIEFCSSB3aXRoIHdyb25nIHBhcmFtZXRlciBjb3VudCAoMyBpbnN0ZWFkIG9mIDIpXG4gICAgICAgIGNvbnN0IHdyb25nQWJpID0ge1xuICAgICAgICAgIHR5cGVQYXJhbWV0ZXJzOiBbeyBjb25zdHJhaW50czogW10gfV0sXG4gICAgICAgICAgcGFyYW1ldGVyczogW25ldyBUeXBlVGFnQWRkcmVzcygpLCBuZXcgVHlwZVRhZ1U2NCgpLCBuZXcgVHlwZVRhZ1UxMjgoKV0sXG4gICAgICAgIH07XG4gICAgICAgIHR4QnVpbGRlci5lbnRyeUZ1bmN0aW9uQWJpKHdyb25nQWJpKTtcbiAgICAgICAgdHhCdWlsZGVyLmFkZEZlZVBheWVyQWRkcmVzcyh0ZXN0RGF0YS5mZWVQYXllci5hZGRyZXNzKTtcbiAgICAgICAgdHhCdWlsZGVyLnNldElzU2ltdWxhdGVUeG4odHJ1ZSk7XG5cbiAgICAgICAgLy8gU2hvdWxkIGZhaWwgZHVlIHRvIHBhcmFtZXRlciBjb3VudCBtaXNtYXRjaFxuICAgICAgICBhd2FpdCBzaG91bGQodHhCdWlsZGVyLmJ1aWxkKCkpLmJlLnJlamVjdGVkV2l0aCgvVG9vIGZldyBhcmd1bWVudHMvKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHRlc3Qgd3JvbmcgQUJJIGJlaGF2aW9yJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IG5ldyBDdXN0b21UcmFuc2FjdGlvbihjb2lucy5nZXQoJ3RhcHQnKSk7XG4gICAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0Q3VzdG9tVHJhbnNhY3Rpb25CdWlsZGVyKHRyYW5zYWN0aW9uKTtcbiAgICAgICAgdHhCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIyLmFkZHJlc3MpO1xuICAgICAgICB0eEJ1aWxkZXIuZ2FzRGF0YSh7XG4gICAgICAgICAgbWF4R2FzQW1vdW50OiAyMDAwMDAsXG4gICAgICAgICAgZ2FzVW5pdFByaWNlOiAxMDAsXG4gICAgICAgIH0pO1xuICAgICAgICB0eEJ1aWxkZXIuc2VxdWVuY2VOdW1iZXIoMTYpO1xuICAgICAgICB0eEJ1aWxkZXIuZXhwaXJhdGlvblRpbWUoMTczNjI0NjE1NSk7XG5cbiAgICAgICAgLy8gUHJvdmlkZSBmdW5jdGlvbiB0aGF0IGV4cGVjdHMgMiBhcmdzIGJ1dCB3cm9uZyBBQkkgZXhwZWN0cyAzXG4gICAgICAgIHR4QnVpbGRlci5jdXN0b21UcmFuc2FjdGlvbih7XG4gICAgICAgICAgbW9kdWxlTmFtZTogJzB4MTo6YXB0b3NfYWNjb3VudCcsXG4gICAgICAgICAgZnVuY3Rpb25OYW1lOiAndHJhbnNmZXJfY29pbnMnLFxuICAgICAgICAgIHR5cGVBcmd1bWVudHM6IFsnMHgxOjphcHRvc19jb2luOjpBcHRvc0NvaW4nXSxcbiAgICAgICAgICBmdW5jdGlvbkFyZ3VtZW50czogW3Rlc3REYXRhLnJlY2lwaWVudHNbMF0uYWRkcmVzcywgdGVzdERhdGEucmVjaXBpZW50c1swXS5hbW91bnRdLCAvLyAyIGFyZ3NcbiAgICAgICAgICBhYmk6IHdyb25nQWJpLCAvLyBBQkkgZXhwZWN0cyAzIHBhcmFtZXRlcnMgYnV0IHdlIHByb3ZpZGUgMlxuICAgICAgICB9KTtcbiAgICAgICAgdHhCdWlsZGVyLmFkZEZlZVBheWVyQWRkcmVzcyh0ZXN0RGF0YS5mZWVQYXllci5hZGRyZXNzKTtcbiAgICAgICAgdHhCdWlsZGVyLnNldElzU2ltdWxhdGVUeG4odHJ1ZSk7XG5cbiAgICAgICAgLy8gU2hvdWxkIGZhaWwgZHVlIHRvIGFyZ3VtZW50IGNvdW50IG1pc21hdGNoXG4gICAgICAgIGF3YWl0IHNob3VsZCh0eEJ1aWxkZXIuYnVpbGQoKSkuYmUucmVqZWN0ZWRXaXRoKC9Ub28gZmV3IGFyZ3VtZW50cy8pO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgdGVzdCB3cm9uZyBBQkkgd2l0aCBtYXRjaGluZyBwYXJhbWV0ZXIgY291bnQgYnV0IHdyb25nIHR5cGVzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IG5ldyBDdXN0b21UcmFuc2FjdGlvbihjb2lucy5nZXQoJ3RhcHQnKSk7XG4gICAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0Q3VzdG9tVHJhbnNhY3Rpb25CdWlsZGVyKHRyYW5zYWN0aW9uKTtcbiAgICAgICAgdHhCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIyLmFkZHJlc3MpO1xuICAgICAgICB0eEJ1aWxkZXIuZ2FzRGF0YSh7XG4gICAgICAgICAgbWF4R2FzQW1vdW50OiAyMDAwMDAsXG4gICAgICAgICAgZ2FzVW5pdFByaWNlOiAxMDAsXG4gICAgICAgIH0pO1xuICAgICAgICB0eEJ1aWxkZXIuc2VxdWVuY2VOdW1iZXIoMTcpO1xuICAgICAgICB0eEJ1aWxkZXIuZXhwaXJhdGlvblRpbWUoMTczNjI0NjE1NSk7XG5cbiAgICAgICAgLy8gV3JvbmcgQUJJIHdpdGggY29ycmVjdCBwYXJhbWV0ZXIgY291bnQgYnV0IHdyb25nIHR5cGVzXG4gICAgICAgIGNvbnN0IHdyb25nVHlwZXNBYmkgPSB7XG4gICAgICAgICAgdHlwZVBhcmFtZXRlcnM6IFt7IGNvbnN0cmFpbnRzOiBbXSB9XSxcbiAgICAgICAgICBwYXJhbWV0ZXJzOiBbbmV3IFR5cGVUYWdVNjQoKSwgbmV3IFR5cGVUYWdVNjQoKV0sIC8vIEJvdGggdTY0IGluc3RlYWQgb2YgQWRkcmVzcyArIHU2NFxuICAgICAgICB9O1xuXG4gICAgICAgIHR4QnVpbGRlci5jdXN0b21UcmFuc2FjdGlvbih7XG4gICAgICAgICAgbW9kdWxlTmFtZTogJzB4MTo6YXB0b3NfYWNjb3VudCcsXG4gICAgICAgICAgZnVuY3Rpb25OYW1lOiAndHJhbnNmZXJfY29pbnMnLFxuICAgICAgICAgIHR5cGVBcmd1bWVudHM6IFsnMHgxOjphcHRvc19jb2luOjpBcHRvc0NvaW4nXSxcbiAgICAgICAgICBmdW5jdGlvbkFyZ3VtZW50czogW3Rlc3REYXRhLnJlY2lwaWVudHNbMF0uYWRkcmVzcywgdGVzdERhdGEucmVjaXBpZW50c1swXS5hbW91bnRdLCAvLyBBZGRyZXNzICsgdTY0XG4gICAgICAgICAgYWJpOiB3cm9uZ1R5cGVzQWJpLFxuICAgICAgICB9KTtcbiAgICAgICAgdHhCdWlsZGVyLmFkZEZlZVBheWVyQWRkcmVzcyh0ZXN0RGF0YS5mZWVQYXllci5hZGRyZXNzKTtcbiAgICAgICAgdHhCdWlsZGVyLnNldElzU2ltdWxhdGVUeG4odHJ1ZSk7XG5cbiAgICAgICAgLy8gU2hvdWxkIGZhaWwgZHVlIHRvIHR5cGUgbWlzbWF0Y2ggYmV0d2VlbiBBQkkgYW5kIGFjdHVhbCBhcmd1bWVudHNcbiAgICAgICAgYXdhaXQgc2hvdWxkKHR4QnVpbGRlci5idWlsZCgpKS5iZS5yZWplY3RlZCgpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgYnVpbGQgcmVndWxhdGVkIHRva2VuIGluaXRpYWxpemUgd2l0aCBjb3JyZWN0IEFCSScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgcmVndWxhdGVkVG9rZW5Jbml0aWFsaXplQWJpID0ge1xuICAgICAgICAgIHR5cGVQYXJhbWV0ZXJzOiBbXSxcbiAgICAgICAgICBwYXJhbWV0ZXJzOiBbXG4gICAgICAgICAgICBuZXcgVHlwZVRhZ1ZlY3RvcihuZXcgVHlwZVRhZ1U4KCkpLFxuICAgICAgICAgICAgbmV3IFR5cGVUYWdWZWN0b3IobmV3IFR5cGVUYWdVOCgpKSxcbiAgICAgICAgICAgIG5ldyBUeXBlVGFnVTgoKSxcbiAgICAgICAgICAgIG5ldyBUeXBlVGFnVmVjdG9yKG5ldyBUeXBlVGFnVTgoKSksXG4gICAgICAgICAgICBuZXcgVHlwZVRhZ1ZlY3RvcihuZXcgVHlwZVRhZ1U4KCkpLFxuICAgICAgICAgIF0sXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSBuZXcgQ3VzdG9tVHJhbnNhY3Rpb24oY29pbnMuZ2V0KCd0YXB0JykpO1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldEN1c3RvbVRyYW5zYWN0aW9uQnVpbGRlcih0cmFuc2FjdGlvbik7XG4gICAgICAgIHR4QnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyMi5hZGRyZXNzKTtcbiAgICAgICAgdHhCdWlsZGVyLmdhc0RhdGEoe1xuICAgICAgICAgIG1heEdhc0Ftb3VudDogMjAwMDAwLFxuICAgICAgICAgIGdhc1VuaXRQcmljZTogMTAwLFxuICAgICAgICB9KTtcbiAgICAgICAgdHhCdWlsZGVyLnNlcXVlbmNlTnVtYmVyKDE4KTtcbiAgICAgICAgdHhCdWlsZGVyLmV4cGlyYXRpb25UaW1lKDE3MzYyNDYxNTUpO1xuICAgICAgICB0eEJ1aWxkZXIuY3VzdG9tVHJhbnNhY3Rpb24oe1xuICAgICAgICAgIG1vZHVsZU5hbWU6ICcweDRhMjgwOTQyZmQ0YWE3MjE4YWFmOWJlZWQ2NzU2ZGJjN2Y0ZDA1YjdmMTNiOGE0YzU1NjRkZDRhMzRiOTIxOTI6OnJlZ3VsYXRlZF90b2tlbicsXG4gICAgICAgICAgZnVuY3Rpb25OYW1lOiAnaW5pdGlhbGl6ZScsXG4gICAgICAgICAgdHlwZUFyZ3VtZW50czogW10sXG4gICAgICAgICAgZnVuY3Rpb25Bcmd1bWVudHM6IFsnUmVndWxhdGVkIFRva2VuJywgJ1JUJywgNiwgJ2h0dHBzOi8vZXhhbXBsZS5jb20vaWNvbi5wbmcnLCAnUmVndWxhdGVkIFRva2VuIFByb2plY3QnXSxcbiAgICAgICAgICBhYmk6IHJlZ3VsYXRlZFRva2VuSW5pdGlhbGl6ZUFiaSxcbiAgICAgICAgfSk7XG4gICAgICAgIHR4QnVpbGRlci5hZGRGZWVQYXllckFkZHJlc3ModGVzdERhdGEuZmVlUGF5ZXIuYWRkcmVzcyk7XG4gICAgICAgIHR4QnVpbGRlci5zZXRJc1NpbXVsYXRlVHhuKHRydWUpO1xuXG4gICAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBDdXN0b21UcmFuc2FjdGlvbjtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5DdXN0b21UeCk7XG4gICAgICAgIHNob3VsZC5lcXVhbChcbiAgICAgICAgICB0eC5mdWxsRnVuY3Rpb25OYW1lLFxuICAgICAgICAgICcweDRhMjgwOTQyZmQ0YWE3MjE4YWFmOWJlZWQ2NzU2ZGJjN2Y0ZDA1YjdmMTNiOGE0YzU1NjRkZDRhMzRiOTIxOTI6OnJlZ3VsYXRlZF90b2tlbjo6aW5pdGlhbGl6ZSdcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGZhaWwgcmVndWxhdGVkIHRva2VuIGluaXRpYWxpemUgd2l0aCB3cm9uZyBBQkknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHdyb25nUmVndWxhdGVkVG9rZW5BYmkgPSB7XG4gICAgICAgICAgdHlwZVBhcmFtZXRlcnM6IFtdLFxuICAgICAgICAgIHBhcmFtZXRlcnM6IFtcbiAgICAgICAgICAgIG5ldyBUeXBlVGFnVTY0KCksXG4gICAgICAgICAgICBuZXcgVHlwZVRhZ1U2NCgpLFxuICAgICAgICAgICAgbmV3IFR5cGVUYWdVMTI4KCksXG4gICAgICAgICAgICBuZXcgVHlwZVRhZ1ZlY3RvcihuZXcgVHlwZVRhZ1U4KCkpLFxuICAgICAgICAgICAgbmV3IFR5cGVUYWdWZWN0b3IobmV3IFR5cGVUYWdVOCgpKSxcbiAgICAgICAgICBdLFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gbmV3IEN1c3RvbVRyYW5zYWN0aW9uKGNvaW5zLmdldCgndGFwdCcpKTtcbiAgICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRDdXN0b21UcmFuc2FjdGlvbkJ1aWxkZXIodHJhbnNhY3Rpb24pO1xuICAgICAgICB0eEJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlcjIuYWRkcmVzcyk7XG4gICAgICAgIHR4QnVpbGRlci5nYXNEYXRhKHtcbiAgICAgICAgICBtYXhHYXNBbW91bnQ6IDIwMDAwMCxcbiAgICAgICAgICBnYXNVbml0UHJpY2U6IDEwMCxcbiAgICAgICAgfSk7XG4gICAgICAgIHR4QnVpbGRlci5zZXF1ZW5jZU51bWJlcigxOSk7XG4gICAgICAgIHR4QnVpbGRlci5leHBpcmF0aW9uVGltZSgxNzM2MjQ2MTU1KTtcbiAgICAgICAgdHhCdWlsZGVyLmN1c3RvbVRyYW5zYWN0aW9uKHtcbiAgICAgICAgICBtb2R1bGVOYW1lOiAnMHg0YTI4MDk0MmZkNGFhNzIxOGFhZjliZWVkNjc1NmRiYzdmNGQwNWI3ZjEzYjhhNGM1NTY0ZGQ0YTM0YjkyMTkyOjpyZWd1bGF0ZWRfdG9rZW4nLFxuICAgICAgICAgIGZ1bmN0aW9uTmFtZTogJ2luaXRpYWxpemUnLFxuICAgICAgICAgIHR5cGVBcmd1bWVudHM6IFtdLFxuICAgICAgICAgIGZ1bmN0aW9uQXJndW1lbnRzOiBbJ1JlZ3VsYXRlZCBUb2tlbicsICdSVCcsIDYsICdodHRwczovL2V4YW1wbGUuY29tL2ljb24ucG5nJywgJ1JlZ3VsYXRlZCBUb2tlbiBQcm9qZWN0J10sXG4gICAgICAgICAgYWJpOiB3cm9uZ1JlZ3VsYXRlZFRva2VuQWJpLFxuICAgICAgICB9KTtcbiAgICAgICAgdHhCdWlsZGVyLmFkZEZlZVBheWVyQWRkcmVzcyh0ZXN0RGF0YS5mZWVQYXllci5hZGRyZXNzKTtcbiAgICAgICAgdHhCdWlsZGVyLnNldElzU2ltdWxhdGVUeG4odHJ1ZSk7XG5cbiAgICAgICAgLy8gU2hvdWxkIGZhaWwgZHVlIHRvIHR5cGUgbWlzbWF0Y2ggZHVyaW5nIHNlcmlhbGl6YXRpb25cbiAgICAgICAgYXdhaXQgc2hvdWxkKHR4QnVpbGRlci5idWlsZCgpKS5iZS5yZWplY3RlZCgpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgYnVpbGQgbWFuYWdlZCB0cmFkaW5nIHBsYWNlX29yZGVyX3YzIHdpdGggY29ycmVjdCBBQkknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHBsYWNlT3JkZXJWM0FiaSA9IHtcbiAgICAgICAgICB0eXBlUGFyYW1ldGVyczogW3sgY29uc3RyYWludHM6IFtdIH0sIHsgY29uc3RyYWludHM6IFtdIH1dLFxuICAgICAgICAgIHBhcmFtZXRlcnM6IFtcbiAgICAgICAgICAgIG5ldyBUeXBlVGFnQWRkcmVzcygpLFxuICAgICAgICAgICAgbmV3IFR5cGVUYWdVNjQoKSxcbiAgICAgICAgICAgIG5ldyBUeXBlVGFnVTY0KCksXG4gICAgICAgICAgICBuZXcgVHlwZVRhZ1U2NCgpLFxuICAgICAgICAgICAgbmV3IFR5cGVUYWdCb29sKCksXG4gICAgICAgICAgICBuZXcgVHlwZVRhZ0Jvb2woKSxcbiAgICAgICAgICAgIG5ldyBUeXBlVGFnQm9vbCgpLFxuICAgICAgICAgICAgbmV3IFR5cGVUYWdVNjQoKSxcbiAgICAgICAgICAgIG5ldyBUeXBlVGFnVTY0KCksXG4gICAgICAgICAgICBuZXcgVHlwZVRhZ0Jvb2woKSxcbiAgICAgICAgICAgIG5ldyBUeXBlVGFnQWRkcmVzcygpLFxuICAgICAgICAgIF0sXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSBuZXcgQ3VzdG9tVHJhbnNhY3Rpb24oY29pbnMuZ2V0KCd0YXB0JykpO1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldEN1c3RvbVRyYW5zYWN0aW9uQnVpbGRlcih0cmFuc2FjdGlvbik7XG4gICAgICAgIHR4QnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyMi5hZGRyZXNzKTtcbiAgICAgICAgdHhCdWlsZGVyLmdhc0RhdGEoe1xuICAgICAgICAgIG1heEdhc0Ftb3VudDogMjAwMDAwLFxuICAgICAgICAgIGdhc1VuaXRQcmljZTogMTAwLFxuICAgICAgICB9KTtcbiAgICAgICAgdHhCdWlsZGVyLnNlcXVlbmNlTnVtYmVyKDIwKTtcbiAgICAgICAgdHhCdWlsZGVyLmV4cGlyYXRpb25UaW1lKDE3MzYyNDYxNTUpO1xuICAgICAgICB0eEJ1aWxkZXIuY3VzdG9tVHJhbnNhY3Rpb24oe1xuICAgICAgICAgIG1vZHVsZU5hbWU6ICcweDMzYTg2OTM3NThkMWQyOGE5MzA1OTQ2Yzc3NThiNzU0OGEwNDczNmMzNTkyOWVhYzIyZWIwZGUyYTg2NTI3NWQ6Om1hbmFnZWRfdHJhZGluZycsXG4gICAgICAgICAgZnVuY3Rpb25OYW1lOiAncGxhY2Vfb3JkZXJfdjMnLFxuICAgICAgICAgIHR5cGVBcmd1bWVudHM6IFtcbiAgICAgICAgICAgICcweDMzYTg2OTM3NThkMWQyOGE5MzA1OTQ2Yzc3NThiNzU0OGEwNDczNmMzNTkyOWVhYzIyZWIwZGUyYTg2NTI3NWQ6OnBhaXJfdHlwZXM6OlRSVU1QX1VTRCcsXG4gICAgICAgICAgICAnMHgzM2E4NjkzNzU4ZDFkMjhhOTMwNTk0NmM3NzU4Yjc1NDhhMDQ3MzZjMzU5MjllYWMyMmViMGRlMmE4NjUyNzVkOjpmYV9ib3g6OldfVVNEQycsXG4gICAgICAgICAgXSxcbiAgICAgICAgICBmdW5jdGlvbkFyZ3VtZW50czogW1xuICAgICAgICAgICAgJzB4NmE4ZDEwNmRjYzBmNjNjYjhiMzVkMGU3ZDMzYzlmZjM4ZjM5MmQ5NjM1OTUzNjhjZDIzMGM0NmY2YjczOTdhNScsXG4gICAgICAgICAgICAnODAwMDAwMDAwJyxcbiAgICAgICAgICAgICcwJyxcbiAgICAgICAgICAgICcxODQ0Njc0NDA3MzcwOTU1MTYxNScsXG4gICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgJzEnLFxuICAgICAgICAgICAgJzE4NDQ2NzQ0MDczNzA5NTUxNjE1JyxcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgJzB4MCcsXG4gICAgICAgICAgXSxcbiAgICAgICAgICBhYmk6IHBsYWNlT3JkZXJWM0FiaSxcbiAgICAgICAgfSk7XG4gICAgICAgIHR4QnVpbGRlci5hZGRGZWVQYXllckFkZHJlc3ModGVzdERhdGEuZmVlUGF5ZXIuYWRkcmVzcyk7XG4gICAgICAgIHR4QnVpbGRlci5zZXRJc1NpbXVsYXRlVHhuKHRydWUpO1xuXG4gICAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBDdXN0b21UcmFuc2FjdGlvbjtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5DdXN0b21UeCk7XG4gICAgICAgIHNob3VsZC5lcXVhbChcbiAgICAgICAgICB0eC5mdWxsRnVuY3Rpb25OYW1lLFxuICAgICAgICAgICcweDMzYTg2OTM3NThkMWQyOGE5MzA1OTQ2Yzc3NThiNzU0OGEwNDczNmMzNTkyOWVhYzIyZWIwZGUyYTg2NTI3NWQ6Om1hbmFnZWRfdHJhZGluZzo6cGxhY2Vfb3JkZXJfdjMnXG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBmYWlsIG1hbmFnZWQgdHJhZGluZyBwbGFjZV9vcmRlcl92MyB3aXRoIHdyb25nIEFCSSBwYXJhbWV0ZXIgY291bnQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHdyb25nUGxhY2VPcmRlckFiaSA9IHtcbiAgICAgICAgICB0eXBlUGFyYW1ldGVyczogW3sgY29uc3RyYWludHM6IFtdIH0sIHsgY29uc3RyYWludHM6IFtdIH1dLFxuICAgICAgICAgIHBhcmFtZXRlcnM6IFtcbiAgICAgICAgICAgIG5ldyBUeXBlVGFnQWRkcmVzcygpLCAvLyB0YXJnZXRfY29uZmlnXG4gICAgICAgICAgICBuZXcgVHlwZVRhZ1U2NCgpLCAvLyBtYXhfYmFzZVxuICAgICAgICAgICAgbmV3IFR5cGVUYWdVNjQoKSwgLy8gbWF4X3F1b3RlXG4gICAgICAgICAgICAvLyBNaXNzaW5nIDggbW9yZSBwYXJhbWV0ZXJzIC0gb25seSAzIGluc3RlYWQgb2YgMTFcbiAgICAgICAgICBdLFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gbmV3IEN1c3RvbVRyYW5zYWN0aW9uKGNvaW5zLmdldCgndGFwdCcpKTtcbiAgICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRDdXN0b21UcmFuc2FjdGlvbkJ1aWxkZXIodHJhbnNhY3Rpb24pO1xuICAgICAgICB0eEJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlcjIuYWRkcmVzcyk7XG4gICAgICAgIHR4QnVpbGRlci5nYXNEYXRhKHtcbiAgICAgICAgICBtYXhHYXNBbW91bnQ6IDIwMDAwMCxcbiAgICAgICAgICBnYXNVbml0UHJpY2U6IDEwMCxcbiAgICAgICAgfSk7XG4gICAgICAgIHR4QnVpbGRlci5zZXF1ZW5jZU51bWJlcigyMSk7XG4gICAgICAgIHR4QnVpbGRlci5leHBpcmF0aW9uVGltZSgxNzM2MjQ2MTU1KTtcbiAgICAgICAgdHhCdWlsZGVyLmN1c3RvbVRyYW5zYWN0aW9uKHtcbiAgICAgICAgICBtb2R1bGVOYW1lOiAnMHgzM2E4NjkzNzU4ZDFkMjhhOTMwNTk0NmM3NzU4Yjc1NDhhMDQ3MzZjMzU5MjllYWMyMmViMGRlMmE4NjUyNzVkOjptYW5hZ2VkX3RyYWRpbmcnLFxuICAgICAgICAgIGZ1bmN0aW9uTmFtZTogJ3BsYWNlX29yZGVyX3YzJyxcbiAgICAgICAgICB0eXBlQXJndW1lbnRzOiBbXG4gICAgICAgICAgICAnMHgzM2E4NjkzNzU4ZDFkMjhhOTMwNTk0NmM3NzU4Yjc1NDhhMDQ3MzZjMzU5MjllYWMyMmViMGRlMmE4NjUyNzVkOjpwYWlyX3R5cGVzOjpUUlVNUF9VU0QnLFxuICAgICAgICAgICAgJzB4MzNhODY5Mzc1OGQxZDI4YTkzMDU5NDZjNzc1OGI3NTQ4YTA0NzM2YzM1OTI5ZWFjMjJlYjBkZTJhODY1Mjc1ZDo6ZmFfYm94OjpXX1VTREMnLFxuICAgICAgICAgIF0sXG4gICAgICAgICAgZnVuY3Rpb25Bcmd1bWVudHM6IFtcbiAgICAgICAgICAgICcweDZhOGQxMDZkY2MwZjYzY2I4YjM1ZDBlN2QzM2M5ZmYzOGYzOTJkOTYzNTk1MzY4Y2QyMzBjNDZmNmI3Mzk3YTUnLFxuICAgICAgICAgICAgJzgwMDAwMDAwMCcsXG4gICAgICAgICAgICAnMCcsXG4gICAgICAgICAgICAnMTg0NDY3NDQwNzM3MDk1NTE2MTUnLFxuICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgICcxJyxcbiAgICAgICAgICAgICcxODQ0Njc0NDA3MzcwOTU1MTYxNScsXG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgICcweDAnLFxuICAgICAgICAgIF0sXG4gICAgICAgICAgYWJpOiB3cm9uZ1BsYWNlT3JkZXJBYmksXG4gICAgICAgIH0pO1xuICAgICAgICB0eEJ1aWxkZXIuYWRkRmVlUGF5ZXJBZGRyZXNzKHRlc3REYXRhLmZlZVBheWVyLmFkZHJlc3MpO1xuICAgICAgICB0eEJ1aWxkZXIuc2V0SXNTaW11bGF0ZVR4bih0cnVlKTtcblxuICAgICAgICAvLyBTaG91bGQgZmFpbCBkdWUgdG8gcGFyYW1ldGVyIGNvdW50IG1pc21hdGNoIChleHBlY3RzIDMsIGdvdCAxMSlcbiAgICAgICAgYXdhaXQgc2hvdWxkKHR4QnVpbGRlci5idWlsZCgpKS5iZS5yZWplY3RlZFdpdGgoL1RvbyBtYW55IGFyZ3VtZW50cy4qZXhwZWN0ZWQgMy8pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
|