@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.
Files changed (145) hide show
  1. package/dist/src/apt.d.ts +9 -2
  2. package/dist/src/apt.d.ts.map +1 -1
  3. package/dist/src/apt.js +37 -11
  4. package/dist/src/aptNFTCollection.d.ts +18 -0
  5. package/dist/src/aptNFTCollection.d.ts.map +1 -0
  6. package/dist/src/aptNFTCollection.js +52 -0
  7. package/dist/src/aptToken.d.ts +19 -0
  8. package/dist/src/aptToken.d.ts.map +1 -0
  9. package/dist/src/aptToken.js +52 -0
  10. package/dist/src/index.d.ts +2 -0
  11. package/dist/src/index.d.ts.map +1 -1
  12. package/dist/src/index.js +3 -1
  13. package/dist/src/lib/constants.d.ts +16 -0
  14. package/dist/src/lib/constants.d.ts.map +1 -1
  15. package/dist/src/lib/constants.js +18 -2
  16. package/dist/src/lib/iface.d.ts +99 -2
  17. package/dist/src/lib/iface.d.ts.map +1 -1
  18. package/dist/src/lib/iface.js +1 -1
  19. package/dist/src/lib/index.d.ts +18 -4
  20. package/dist/src/lib/index.d.ts.map +1 -1
  21. package/dist/src/lib/index.js +35 -7
  22. package/dist/src/lib/transaction/abstractDelegationPoolAmountBasedTransaction.d.ts +21 -0
  23. package/dist/src/lib/transaction/abstractDelegationPoolAmountBasedTransaction.d.ts.map +1 -0
  24. package/dist/src/lib/transaction/abstractDelegationPoolAmountBasedTransaction.js +61 -0
  25. package/dist/src/lib/transaction/abstractDelegationPoolTransaction.d.ts +13 -0
  26. package/dist/src/lib/transaction/abstractDelegationPoolTransaction.d.ts.map +1 -0
  27. package/dist/src/lib/transaction/abstractDelegationPoolTransaction.js +23 -0
  28. package/dist/src/lib/transaction/abstractTransferTransaction.d.ts +10 -0
  29. package/dist/src/lib/transaction/abstractTransferTransaction.d.ts.map +1 -0
  30. package/dist/src/lib/transaction/abstractTransferTransaction.js +39 -0
  31. package/dist/src/lib/transaction/customTransaction.d.ts +89 -0
  32. package/dist/src/lib/transaction/customTransaction.d.ts.map +1 -0
  33. package/dist/src/lib/transaction/customTransaction.js +278 -0
  34. package/dist/src/lib/transaction/delegationPoolAddStakeTransaction.d.ts +10 -0
  35. package/dist/src/lib/transaction/delegationPoolAddStakeTransaction.d.ts.map +1 -0
  36. package/dist/src/lib/transaction/delegationPoolAddStakeTransaction.js +48 -0
  37. package/dist/src/lib/transaction/delegationPoolUnlockTransaction.d.ts +10 -0
  38. package/dist/src/lib/transaction/delegationPoolUnlockTransaction.d.ts.map +1 -0
  39. package/dist/src/lib/transaction/delegationPoolUnlockTransaction.js +24 -0
  40. package/dist/src/lib/transaction/delegationPoolWithdrawTransaction.d.ts +10 -0
  41. package/dist/src/lib/transaction/delegationPoolWithdrawTransaction.d.ts.map +1 -0
  42. package/dist/src/lib/transaction/delegationPoolWithdrawTransaction.js +43 -0
  43. package/dist/src/lib/transaction/digitalAssetTransfer.d.ts +10 -0
  44. package/dist/src/lib/transaction/digitalAssetTransfer.d.ts.map +1 -0
  45. package/dist/src/lib/transaction/digitalAssetTransfer.js +45 -0
  46. package/dist/src/lib/transaction/fungibleAssetTransfer.d.ts +12 -0
  47. package/dist/src/lib/transaction/fungibleAssetTransfer.d.ts.map +1 -0
  48. package/dist/src/lib/transaction/fungibleAssetTransfer.js +73 -0
  49. package/dist/src/lib/transaction/transaction.d.ts +45 -7
  50. package/dist/src/lib/transaction/transaction.d.ts.map +1 -1
  51. package/dist/src/lib/transaction/transaction.js +175 -61
  52. package/dist/src/lib/transaction/transferTransaction.d.ts +10 -8
  53. package/dist/src/lib/transaction/transferTransaction.d.ts.map +1 -1
  54. package/dist/src/lib/transaction/transferTransaction.js +48 -40
  55. package/dist/src/lib/transactionBuilder/customTransactionBuilder.d.ts +64 -0
  56. package/dist/src/lib/transactionBuilder/customTransactionBuilder.d.ts.map +1 -0
  57. package/dist/src/lib/transactionBuilder/customTransactionBuilder.js +127 -0
  58. package/dist/src/lib/transactionBuilder/delegationPoolAddStakeTransactionBuilder.d.ts +15 -0
  59. package/dist/src/lib/transactionBuilder/delegationPoolAddStakeTransactionBuilder.d.ts.map +1 -0
  60. package/dist/src/lib/transactionBuilder/delegationPoolAddStakeTransactionBuilder.js +50 -0
  61. package/dist/src/lib/transactionBuilder/delegationPoolUnlockTransactionBuilder.d.ts +15 -0
  62. package/dist/src/lib/transactionBuilder/delegationPoolUnlockTransactionBuilder.d.ts.map +1 -0
  63. package/dist/src/lib/transactionBuilder/delegationPoolUnlockTransactionBuilder.js +50 -0
  64. package/dist/src/lib/transactionBuilder/delegationPoolWithdrawTransactionBuilder.d.ts +15 -0
  65. package/dist/src/lib/transactionBuilder/delegationPoolWithdrawTransactionBuilder.d.ts.map +1 -0
  66. package/dist/src/lib/transactionBuilder/delegationPoolWithdrawTransactionBuilder.js +50 -0
  67. package/dist/src/lib/transactionBuilder/digitalAssetTransferBuilder.d.ts +14 -0
  68. package/dist/src/lib/transactionBuilder/digitalAssetTransferBuilder.d.ts.map +1 -0
  69. package/dist/src/lib/transactionBuilder/digitalAssetTransferBuilder.js +55 -0
  70. package/dist/src/lib/transactionBuilder/fungibleAssetTransferBuilder.d.ts +15 -0
  71. package/dist/src/lib/transactionBuilder/fungibleAssetTransferBuilder.d.ts.map +1 -0
  72. package/dist/src/lib/transactionBuilder/fungibleAssetTransferBuilder.js +61 -0
  73. package/dist/src/lib/{transactionBuilder.d.ts → transactionBuilder/transactionBuilder.d.ts} +25 -11
  74. package/dist/src/lib/transactionBuilder/transactionBuilder.d.ts.map +1 -0
  75. package/dist/src/lib/transactionBuilder/transactionBuilder.js +169 -0
  76. package/dist/src/lib/{transferBuilder.d.ts → transactionBuilder/transferBuilder.d.ts} +5 -7
  77. package/dist/src/lib/transactionBuilder/transferBuilder.d.ts.map +1 -0
  78. package/dist/src/lib/transactionBuilder/transferBuilder.js +56 -0
  79. package/dist/src/lib/transactionBuilderFactory.d.ts +26 -10
  80. package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
  81. package/dist/src/lib/transactionBuilderFactory.js +82 -18
  82. package/dist/src/lib/utils/validation.d.ts +32 -0
  83. package/dist/src/lib/utils/validation.d.ts.map +1 -0
  84. package/dist/src/lib/utils/validation.js +99 -0
  85. package/dist/src/lib/utils.d.ts +29 -5
  86. package/dist/src/lib/utils.d.ts.map +1 -1
  87. package/dist/src/lib/utils.js +111 -28
  88. package/dist/src/register.d.ts.map +1 -1
  89. package/dist/src/register.js +9 -1
  90. package/dist/test/integration/index.d.ts +1 -0
  91. package/dist/test/integration/index.d.ts.map +1 -0
  92. package/dist/test/integration/index.js +1 -0
  93. package/dist/test/resources/apt.d.ts +56 -0
  94. package/dist/test/resources/apt.d.ts.map +1 -0
  95. package/dist/test/resources/apt.js +115 -0
  96. package/dist/test/unit/apt.d.ts +2 -0
  97. package/dist/test/unit/apt.d.ts.map +1 -0
  98. package/dist/test/unit/apt.js +375 -0
  99. package/dist/test/unit/aptToken.d.ts +2 -0
  100. package/dist/test/unit/aptToken.d.ts.map +1 -0
  101. package/dist/test/unit/aptToken.js +92 -0
  102. package/dist/test/unit/customTransaction.test.d.ts +2 -0
  103. package/dist/test/unit/customTransaction.test.d.ts.map +1 -0
  104. package/dist/test/unit/customTransaction.test.js +264 -0
  105. package/dist/test/unit/getBuilderFactory.d.ts +3 -0
  106. package/dist/test/unit/getBuilderFactory.d.ts.map +1 -0
  107. package/dist/test/unit/getBuilderFactory.js +10 -0
  108. package/dist/test/unit/keyPair.d.ts +2 -0
  109. package/dist/test/unit/keyPair.d.ts.map +1 -0
  110. package/dist/test/unit/keyPair.js +71 -0
  111. package/dist/test/unit/transactionBuilder/customTransactionBuilder.d.ts +2 -0
  112. package/dist/test/unit/transactionBuilder/customTransactionBuilder.d.ts.map +1 -0
  113. package/dist/test/unit/transactionBuilder/customTransactionBuilder.js +743 -0
  114. package/dist/test/unit/transactionBuilder/delegationPoolAddStakeTransactionBuilder.d.ts +2 -0
  115. package/dist/test/unit/transactionBuilder/delegationPoolAddStakeTransactionBuilder.d.ts.map +1 -0
  116. package/dist/test/unit/transactionBuilder/delegationPoolAddStakeTransactionBuilder.js +172 -0
  117. package/dist/test/unit/transactionBuilder/delegationPoolUnlockTransactionBuilder.d.ts +2 -0
  118. package/dist/test/unit/transactionBuilder/delegationPoolUnlockTransactionBuilder.d.ts.map +1 -0
  119. package/dist/test/unit/transactionBuilder/delegationPoolUnlockTransactionBuilder.js +148 -0
  120. package/dist/test/unit/transactionBuilder/delegationPoolWithdrawTransactionBuilder.d.ts +2 -0
  121. package/dist/test/unit/transactionBuilder/delegationPoolWithdrawTransactionBuilder.d.ts.map +1 -0
  122. package/dist/test/unit/transactionBuilder/delegationPoolWithdrawTransactionBuilder.js +172 -0
  123. package/dist/test/unit/transactionBuilder/digitalAssetTransferBuilder.d.ts +2 -0
  124. package/dist/test/unit/transactionBuilder/digitalAssetTransferBuilder.d.ts.map +1 -0
  125. package/dist/test/unit/transactionBuilder/digitalAssetTransferBuilder.js +276 -0
  126. package/dist/test/unit/transactionBuilder/fungibleAssetTransferBuilder.d.ts +2 -0
  127. package/dist/test/unit/transactionBuilder/fungibleAssetTransferBuilder.d.ts.map +1 -0
  128. package/dist/test/unit/transactionBuilder/fungibleAssetTransferBuilder.js +449 -0
  129. package/dist/test/unit/transactionBuilder/transferBuilder.d.ts +2 -0
  130. package/dist/test/unit/transactionBuilder/transferBuilder.d.ts.map +1 -0
  131. package/dist/test/unit/transactionBuilder/transferBuilder.js +529 -0
  132. package/dist/test/unit/utils.d.ts +2 -0
  133. package/dist/test/unit/utils.d.ts.map +1 -0
  134. package/dist/test/unit/utils.js +108 -0
  135. package/dist/tsconfig.tsbuildinfo +1 -0
  136. package/package.json +14 -11
  137. package/.eslintignore +0 -4
  138. package/.gitignore +0 -3
  139. package/.mocharc.yml +0 -8
  140. package/.prettierignore +0 -2
  141. package/CHANGELOG.md +0 -72
  142. package/dist/src/lib/transactionBuilder.d.ts.map +0 -1
  143. package/dist/src/lib/transactionBuilder.js +0 -118
  144. package/dist/src/lib/transferBuilder.d.ts.map +0 -1
  145. 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tVHJhbnNhY3Rpb25CdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC91bml0L3RyYW5zYWN0aW9uQnVpbGRlci9jdXN0b21UcmFuc2FjdGlvbkJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxpREFBNEM7QUFDNUMsc0NBQTRFO0FBQzVFLDhEQUFnRDtBQUNoRCxtREFBdUQ7QUFDdkQsb0RBQTRCO0FBQzVCLCtDQUFvSDtBQUVwSCxRQUFRLENBQUMsZ0NBQWdDLEVBQUUsR0FBRyxFQUFFO0lBQzlDLE1BQU0sT0FBTyxHQUFHLElBQUksK0JBQXlCLENBQUMsZUFBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBRWpFLGdDQUFnQztJQUNoQyxNQUFNLGdCQUFnQixHQUFHO1FBQ3ZCLGNBQWMsRUFBRSxDQUFDLEVBQUUsV0FBVyxFQUFFLEVBQUUsRUFBRSxDQUFDO1FBQ3JDLFVBQVUsRUFBRSxDQUFDLElBQUksdUJBQWMsRUFBRSxFQUFFLElBQUksbUJBQVUsRUFBRSxDQUFDO0tBQ3JELENBQUM7SUFFRixNQUFNLE9BQU8sR0FBRztRQUNkLGNBQWMsRUFBRSxDQUFDLEVBQUUsV0FBVyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsdUNBQXVDO1FBQzlFLFVBQVUsRUFBRSxDQUFDLElBQUksdUJBQWMsRUFBRSxFQUFFLElBQUksbUJBQVUsRUFBRSxDQUFDO0tBQ3JELENBQUM7SUFFRixNQUFNLE9BQU8sR0FBRztRQUNkLGNBQWMsRUFBRSxDQUFDLEVBQUUsV0FBVyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsdUNBQXVDO1FBQzlFLFVBQVUsRUFBRSxDQUFDLElBQUksbUJBQVUsRUFBRSxDQUFDO0tBQy9CLENBQUM7SUFFRixNQUFNLFFBQVEsR0FBRztRQUNmLGNBQWMsRUFBRSxFQUFFO1FBQ2xC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WCxHQUFHO3dCQUNILHNCQUFzQjt3QkFDdEIsSUFBSTt3QkFDSixLQUFLO3dCQUNMLElBQUk7d0JBQ0osR0FBRzt3QkFDSCxzQkFBc0I7d0JBQ3RCLEtBQUs7d0JBQ0wsS0FBSztxQkFDTjtvQkFDRCxHQUFHLEVBQUUsa0JBQWtCO2lCQUN4QixDQUFDLENBQUM7Z0JBQ0gsU0FBUyxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ3hELFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFFakMsa0VBQWtFO2dCQUNsRSxNQUFNLElBQUEsZ0JBQU0sRUFBQyxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLGdDQUFnQyxDQUFDLENBQUM7WUFDcEYsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjb2lucyB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeSwgQ3VzdG9tVHJhbnNhY3Rpb24gfSBmcm9tICcuLi8uLi8uLi9zcmMnO1xuaW1wb3J0ICogYXMgdGVzdERhdGEgZnJvbSAnLi4vLi4vcmVzb3VyY2VzL2FwdCc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvblR5cGUgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgc2hvdWxkIGZyb20gJ3Nob3VsZCc7XG5pbXBvcnQgeyBUeXBlVGFnQWRkcmVzcywgVHlwZVRhZ1U2NCwgVHlwZVRhZ1UxMjgsIFR5cGVUYWdWZWN0b3IsIFR5cGVUYWdVOCwgVHlwZVRhZ0Jvb2wgfSBmcm9tICdAYXB0b3MtbGFicy90cy1zZGsnO1xuXG5kZXNjcmliZSgnQXB0IEN1c3RvbSBUcmFuc2FjdGlvbiBCdWlsZGVyJywgKCkgPT4ge1xuICBjb25zdCBmYWN0b3J5ID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0YXB0JykpO1xuXG4gIC8vIENvbW1vbiBBQkkgcGF0dGVybnMgZm9yIHRlc3RzXG4gIGNvbnN0IHRyYW5zZmVyQ29pbnNBYmkgPSB7XG4gICAgdHlwZVBhcmFtZXRlcnM6IFt7IGNvbnN0cmFpbnRzOiBbXSB9XSxcbiAgICBwYXJhbWV0ZXJzOiBbbmV3IFR5cGVUYWdBZGRyZXNzKCksIG5ldyBUeXBlVGFnVTY0KCldLFxuICB9O1xuXG4gIGNvbnN0IG1pbnRBYmkgPSB7XG4gICAgdHlwZVBhcmFtZXRlcnM6IFt7IGNvbnN0cmFpbnRzOiBbXSB9XSwgLy8gRXhwZWN0cyAxIHR5cGUgcGFyYW1ldGVyIGZvciBDb2luPFQ+XG4gICAgcGFyYW1ldGVyczogW25ldyBUeXBlVGFnQWRkcmVzcygpLCBuZXcgVHlwZVRhZ1U2NCgpXSxcbiAgfTtcblxuICBjb25zdCBidXJuQWJpID0ge1xuICAgIHR5cGVQYXJhbWV0ZXJzOiBbeyBjb25zdHJhaW50czogW10gfV0sIC8vIEV4cGVjdHMgMSB0eXBlIHBhcmFtZXRlciBmb3IgQ29pbjxUPlxuICAgIHBhcmFtZXRlcnM6IFtuZXcgVHlwZVRhZ1U2NCgpXSxcbiAgfTtcblxuICBjb25zdCBiYXNpY0FiaSA9IHtcbiAgICB0eXBlUGFyYW1ldGVyczogW10sXG4gICAgcGFyYW1ldGVyczogW10sXG4gIH07XG5cbiAgLy8gQUJJIGZvciBjdXN0b20gdG9rZW4gZnVuY3Rpb25zIHRoYXQgZG9uJ3QgdXNlIHR5cGUgcGFyYW1ldGVyc1xuICBjb25zdCBjdXN0b21Ub2tlbk1pbnRBYmkgPSB7XG4gICAgdHlwZVBhcmFtZXRlcnM6IFtdLCAvLyBObyB0eXBlIHBhcmFtZXRlcnMgZm9yIGN1c3RvbSB0b2tlblxuICAgIHBhcmFtZXRlcnM6IFtuZXcgVHlwZVRhZ0FkZHJlc3MoKSwgbmV3IFR5cGVUYWdVNjQoKV0sXG4gIH07XG5cbiAgY29uc3QgY3VzdG9tVG9rZW5CdXJuQWJpID0ge1xuICAgIHR5cGVQYXJhbWV0ZXJzOiBbXSwgLy8gTm8gdHlwZSBwYXJhbWV0ZXJzIGZvciBjdXN0b20gdG9rZW5cbiAgICBwYXJhbWV0ZXJzOiBbbmV3IFR5cGVUYWdVNjQoKV0sXG4gIH07XG5cbiAgLy8gV3JvbmcgQUJJIGZvciB0ZXN0aW5nIC0gaGFzIHdyb25nIHBhcmFtZXRlciBjb3VudCBidXQgY29ycmVjdCB0eXBlIHBhcmFtZXRlciBjb3VudFxuICBjb25zdCB3cm9uZ0FiaSA9IHtcbiAgICB0eXBlUGFyYW1ldGVyczogW3sgY29uc3RyYWludHM6IFtdIH1dLFxuICAgIHBhcmFtZXRlcnM6IFtuZXcgVHlwZVRhZ0FkZHJlc3MoKSwgbmV3IFR5cGVUYWdVNjQoKSwgbmV3IFR5cGVUYWdBZGRyZXNzKCldLCAvLyBXcm9uZyAtIDMgcGFyYW1zIGluc3RlYWQgb2YgMlxuICB9O1xuXG4gIGRlc2NyaWJlKCdDdXN0b20gRW50cnkgRnVuY3Rpb24gQ2FsbCcsICgpID0+IHtcbiAgICBkZXNjcmliZSgnU3VjY2VlZCcsICgpID0+IHtcbiAgICAgIGl0KCdzaG91bGQgYnVpbGQgYSBjdXN0b20gdHJhbnNhY3Rpb24gd2l0aCB0cmFuc2Zlcl9jb2lucyBmdW5jdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSBuZXcgQ3VzdG9tVHJhbnNhY3Rpb24oY29pbnMuZ2V0KCd0YXB0JykpO1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldEN1c3RvbVRyYW5zYWN0aW9uQnVpbGRlcih0cmFuc2FjdGlvbik7XG4gICAgICAgIHR4QnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyMi5hZGRyZXNzKTtcbiAgICAgICAgdHhCdWlsZGVyLmdhc0RhdGEoe1xuICAgICAgICAgIG1heEdhc0Ftb3VudDogMjAwMDAwLFxuICAgICAgICAgIGdhc1VuaXRQcmljZTogMTAwLFxuICAgICAgICB9KTtcbiAgICAgICAgdHhCdWlsZGVyLnNlcXVlbmNlTnVtYmVyKDE0KTtcbiAgICAgICAgdHhCdWlsZGVyLmV4cGlyYXRpb25UaW1lKDE3MzYyNDYxNTUpO1xuICAgICAgICB0eEJ1aWxkZXIuY3VzdG9tVHJhbnNhY3Rpb24oe1xuICAgICAgICAgIG1vZHVsZU5hbWU6ICcweDE6OmFwdG9zX2FjY291bnQnLFxuICAgICAgICAgIGZ1bmN0aW9uTmFtZTogJ3RyYW5zZmVyX2NvaW5zJyxcbiAgICAgICAgICB0eXBlQXJndW1lbnRzOiBbJzB4MTo6YXB0b3NfY29pbjo6QXB0b3NDb2luJ10sXG4gICAgICAgICAgZnVuY3Rpb25Bcmd1bWVudHM6IFt0ZXN0RGF0YS5yZWNpcGllbnRzWzBdLmFkZHJlc3MsIHRlc3REYXRhLnJlY2lwaWVudHNbMF0uYW1vdW50XSxcbiAgICAgICAgICBhYmk6IHRyYW5zZmVyQ29pbnNBYmksXG4gICAgICAgIH0pO1xuICAgICAgICB0eEJ1aWxkZXIuYWRkRmVlUGF5ZXJBZGRyZXNzKHRlc3REYXRhLmZlZVBheWVyLmFkZHJlc3MpO1xuICAgICAgICB0eEJ1aWxkZXIuc2V0SXNTaW11bGF0ZVR4bih0cnVlKTtcblxuICAgICAgICBjb25zdCB0eCA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgQ3VzdG9tVHJhbnNhY3Rpb247XG4gICAgICAgIHNob3VsZC5lcXVhbCh0eC5zZW5kZXIsIHRlc3REYXRhLnNlbmRlcjIuYWRkcmVzcyk7XG4gICAgICAgIHNob3VsZC5lcXVhbCh0eC5tYXhHYXNBbW91bnQsIDIwMDAwMCk7XG4gICAgICAgIHNob3VsZC5lcXVhbCh0eC5nYXNVbml0UHJpY2UsIDEwMCk7XG4gICAgICAgIHNob3VsZC5lcXVhbCh0eC5zZXF1ZW5jZU51bWJlciwgMTQpO1xuICAgICAgICBzaG91bGQuZXF1YWwodHguZXhwaXJhdGlvblRpbWUsIDE3MzYyNDYxNTUpO1xuICAgICAgICBzaG91bGQuZXF1YWwodHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLkN1c3RvbVR4KTtcblxuICAgICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICAgIHNob3VsZC5lcXVhbCh0eEJ1aWxkZXIuaXNWYWxpZFJhd1RyYW5zYWN0aW9uKHJhd1R4KSwgdHJ1ZSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBzdWNjZWVkIHRvIHZhbGlkYXRlIGEgdmFsaWQgc2lnbmFibGVQYXlsb2FkJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IG5ldyBDdXN0b21UcmFuc2FjdGlvbihjb2lucy5nZXQoJ3RhcHQnKSk7XG4gICAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0Q3VzdG9tVHJhbnNhY3Rpb25CdWlsZGVyKHRyYW5zYWN0aW9uKTtcbiAgICAgICAgdHhCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIyLmFkZHJlc3MpO1xuICAgICAgICB0eEJ1aWxkZXIuZ2FzRGF0YSh7XG4gICAgICAgICAgbWF4R2FzQW1vdW50OiAyMDAwMDAsXG4gICAgICAgICAgZ2FzVW5pdFByaWNlOiAxMDAsXG4gICAgICAgIH0pO1xuICAgICAgICB0eEJ1aWxkZXIuc2VxdWVuY2VOdW1iZXIoMTQpO1xuICAgICAgICB0eEJ1aWxkZXIuZXhwaXJhdGlvblRpbWUoMTczNjI0NjE1NSk7XG4gICAgICAgIHR4QnVpbGRlci5jdXN0b21UcmFuc2FjdGlvbih7XG4gICAgICAgICAgbW9kdWxlTmFtZTogJzB4MTo6YXB0b3NfYWNjb3VudCcsXG4gICAgICAgICAgZnVuY3Rpb25OYW1lOiAndHJhbnNmZXJfY29pbnMnLFxuICAgICAgICAgIHR5cGVBcmd1bWVudHM6IFsnMHgxOjphcHRvc19jb2luOjpBcHRvc0NvaW4nXSxcbiAgICAgICAgICBmdW5jdGlvbkFyZ3VtZW50czogW3Rlc3REYXRhLnJlY2lwaWVudHNbMF0uYWRkcmVzcywgdGVzdERhdGEucmVjaXBpZW50c1swXS5hbW91bnRdLFxuICAgICAgICAgIGFiaTogdHJhbnNmZXJDb2luc0FiaSxcbiAgICAgICAgfSk7XG4gICAgICAgIHR4QnVpbGRlci5hZGRGZWVQYXllckFkZHJlc3ModGVzdERhdGEuZmVlUGF5ZXIuYWRkcmVzcyk7XG5cbiAgICAgICAgY29uc3QgdHggPSAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIEN1c3RvbVRyYW5zYWN0aW9uO1xuICAgICAgICBjb25zdCBzaWduYWJsZVBheWxvYWQgPSB0eC5zaWduYWJsZVBheWxvYWQ7XG4gICAgICAgIHNob3VsZC5leGlzdChzaWduYWJsZVBheWxvYWQpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgYnVpbGQgYSB1bnNpZ25lZCB0eCBhbmQgdmFsaWRhdGUgYmFzaWMgcHJvcGVydGllcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSBuZXcgQ3VzdG9tVHJhbnNhY3Rpb24oY29pbnMuZ2V0KCd0YXB0JykpO1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldEN1c3RvbVRyYW5zYWN0aW9uQnVpbGRlcih0cmFuc2FjdGlvbik7XG4gICAgICAgIHR4QnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyMi5hZGRyZXNzKTtcbiAgICAgICAgdHhCdWlsZGVyLmdhc0RhdGEoe1xuICAgICAgICAgIG1heEdhc0Ftb3VudDogMjAwMDAwLFxuICAgICAgICAgIGdhc1VuaXRQcmljZTogMTAwLFxuICAgICAgICB9KTtcbiAgICAgICAgdHhCdWlsZGVyLnNlcXVlbmNlTnVtYmVyKDE0KTtcbiAgICAgICAgdHhCdWlsZGVyLmV4cGlyYXRpb25UaW1lKDE3MzYyNDYxNTUpO1xuICAgICAgICB0eEJ1aWxkZXIuY3VzdG9tVHJhbnNhY3Rpb24oe1xuICAgICAgICAgIG1vZHVsZU5hbWU6ICcweDE6OmFwdG9zX2FjY291bnQnLFxuICAgICAgICAgIGZ1bmN0aW9uTmFtZTogJ3RyYW5zZmVyX2NvaW5zJyxcbiAgICAgICAgICB0eXBlQXJndW1lbnRzOiBbJzB4MTo6YXB0b3NfY29pbjo6QXB0b3NDb2luJ10sXG4gICAgICAgICAgZnVuY3Rpb25Bcmd1bWVudHM6IFt0ZXN0RGF0YS5yZWNpcGllbnRzWzBdLmFkZHJlc3MsIHRlc3REYXRhLnJlY2lwaWVudHNbMF0uYW1vdW50XSxcbiAgICAgICAgICBhYmk6IHRyYW5zZmVyQ29pbnNBYmksXG4gICAgICAgIH0pO1xuICAgICAgICB0eEJ1aWxkZXIuYWRkRmVlUGF5ZXJBZGRyZXNzKHRlc3REYXRhLmZlZVBheWVyLmFkZHJlc3MpO1xuXG4gICAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBDdXN0b21UcmFuc2FjdGlvbjtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHR4LnNlbmRlciwgdGVzdERhdGEuc2VuZGVyMi5hZGRyZXNzKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHR4LnNlcXVlbmNlTnVtYmVyLCAxNCk7XG4gICAgICAgIHNob3VsZC5lcXVhbCh0eC5tYXhHYXNBbW91bnQsIDIwMDAwMCk7XG4gICAgICAgIHNob3VsZC5lcXVhbCh0eC5nYXNVbml0UHJpY2UsIDEwMCk7XG4gICAgICAgIHNob3VsZC5lcXVhbCh0eC5leHBpcmF0aW9uVGltZSwgMTczNjI0NjE1NSk7XG4gICAgICAgIHNob3VsZC5lcXVhbCh0eC5mZWVQYXllckFkZHJlc3MsIHRlc3REYXRhLmZlZVBheWVyLmFkZHJlc3MpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgYnVpbGQgYSBjdXN0b20gdHJhbnNhY3Rpb24gd2l0aCB0b2tlbiBtaW50IGZ1bmN0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IG5ldyBDdXN0b21UcmFuc2FjdGlvbihjb2lucy5nZXQoJ3RhcHQnKSk7XG4gICAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0Q3VzdG9tVHJhbnNhY3Rpb25CdWlsZGVyKHRyYW5zYWN0aW9uKTtcbiAgICAgICAgdHhCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIyLmFkZHJlc3MpO1xuICAgICAgICB0eEJ1aWxkZXIuZ2FzRGF0YSh7XG4gICAgICAgICAgbWF4R2FzQW1vdW50OiAyMDAwMDAsXG4gICAgICAgICAgZ2FzVW5pdFByaWNlOiAxMDAsXG4gICAgICAgIH0pO1xuICAgICAgICB0eEJ1aWxkZXIuc2VxdWVuY2VOdW1iZXIoMTUpO1xuICAgICAgICB0eEJ1aWxkZXIuZXhwaXJhdGlvblRpbWUoMTczNjI0NjE1NSk7XG4gICAgICAgIHR4QnVpbGRlci5jdXN0b21UcmFuc2FjdGlvbih7XG4gICAgICAgICAgbW9kdWxlTmFtZTogJzB4MTo6bWFuYWdlZF9jb2luJyxcbiAgICAgICAgICBmdW5jdGlvbk5hbWU6ICdtaW50JyxcbiAgICAgICAgICB0eXBlQXJndW1lbnRzOiBbJzB4MTo6YXB0b3NfY29pbjo6QXB0b3NDb2luJ10sXG4gICAgICAgICAgZnVuY3Rpb25Bcmd1bWVudHM6IFt0ZXN0RGF0YS5yZWNpcGllbnRzWzBdLmFkZHJlc3MsIHRlc3REYXRhLnJlY2lwaWVudHNbMF0uYW1vdW50XSxcbiAgICAgICAgICBhYmk6IG1pbnRBYmksXG4gICAgICAgIH0pO1xuICAgICAgICB0eEJ1aWxkZXIuYWRkRmVlUGF5ZXJBZGRyZXNzKHRlc3REYXRhLmZlZVBheWVyLmFkZHJlc3MpO1xuICAgICAgICB0eEJ1aWxkZXIuc2V0SXNTaW11bGF0ZVR4bih0cnVlKTtcblxuICAgICAgICBjb25zdCB0eCA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgQ3VzdG9tVHJhbnNhY3Rpb247XG4gICAgICAgIHNob3VsZC5lcXVhbCh0eC5zZW5kZXIsIHRlc3REYXRhLnNlbmRlcjIuYWRkcmVzcyk7XG4gICAgICAgIHNob3VsZC5lcXVhbCh0eC5tYXhHYXNBbW91bnQsIDIwMDAwMCk7XG4gICAgICAgIHNob3VsZC5lcXVhbCh0eC5nYXNVbml0UHJpY2UsIDEwMCk7XG4gICAgICAgIHNob3VsZC5lcXVhbCh0eC5zZXF1ZW5jZU51bWJlciwgMTUpO1xuICAgICAgICBzaG91bGQuZXF1YWwodHguZXhwaXJhdGlvblRpbWUsIDE3MzYyNDYxNTUpO1xuICAgICAgICBzaG91bGQuZXF1YWwodHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLkN1c3RvbVR4KTtcblxuICAgICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICAgIHNob3VsZC5lcXVhbCh0eEJ1aWxkZXIuaXNWYWxpZFJhd1RyYW5zYWN0aW9uKHJhd1R4KSwgdHJ1ZSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBidWlsZCBhIGN1c3RvbSB0cmFuc2FjdGlvbiB3aXRoIHRva2VuIGJ1cm4gZnVuY3Rpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gbmV3IEN1c3RvbVRyYW5zYWN0aW9uKGNvaW5zLmdldCgndGFwdCcpKTtcbiAgICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRDdXN0b21UcmFuc2FjdGlvbkJ1aWxkZXIodHJhbnNhY3Rpb24pO1xuICAgICAgICB0eEJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlcjIuYWRkcmVzcyk7XG4gICAgICAgIHR4QnVpbGRlci5nYXNEYXRhKHtcbiAgICAgICAgICBtYXhHYXNBbW91bnQ6IDIwMDAwMCxcbiAgICAgICAgICBnYXNVbml0UHJpY2U6IDEwMCxcbiAgICAgICAgfSk7XG4gICAgICAgIHR4QnVpbGRlci5zZXF1ZW5jZU51bWJlcigxNik7XG4gICAgICAgIHR4QnVpbGRlci5leHBpcmF0aW9uVGltZSgxNzM2MjQ2MTU1KTtcbiAgICAgICAgdHhCdWlsZGVyLmN1c3RvbVRyYW5zYWN0aW9uKHtcbiAgICAgICAgICBtb2R1bGVOYW1lOiAnMHgxOjptYW5hZ2VkX2NvaW4nLFxuICAgICAgICAgIGZ1bmN0aW9uTmFtZTogJ2J1cm4nLFxuICAgICAgICAgIHR5cGVBcmd1bWVudHM6IFsnMHgxOjphcHRvc19jb2luOjpBcHRvc0NvaW4nXSxcbiAgICAgICAgICBmdW5jdGlvbkFyZ3VtZW50czogW1xuICAgICAgICAgICAgdGVzdERhdGEucmVjaXBpZW50c1swXS5hbW91bnQsIC8vIGFtb3VudFxuICAgICAgICAgIF0sXG4gICAgICAgICAgYWJpOiBidXJuQWJpLFxuICAgICAgICB9KTtcbiAgICAgICAgdHhCdWlsZGVyLmFkZEZlZVBheWVyQWRkcmVzcyh0ZXN0RGF0YS5mZWVQYXllci5hZGRyZXNzKTtcbiAgICAgICAgdHhCdWlsZGVyLnNldElzU2ltdWxhdGVUeG4odHJ1ZSk7XG5cbiAgICAgICAgY29uc3QgdHggPSAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIEN1c3RvbVRyYW5zYWN0aW9uO1xuICAgICAgICBzaG91bGQuZXF1YWwodHguc2VuZGVyLCB0ZXN0RGF0YS5zZW5kZXIyLmFkZHJlc3MpO1xuICAgICAgICBzaG91bGQuZXF1YWwodHgubWF4R2FzQW1vdW50LCAyMDAwMDApO1xuICAgICAgICBzaG91bGQuZXF1YWwodHguZ2FzVW5pdFByaWNlLCAxMDApO1xuICAgICAgICBzaG91bGQuZXF1YWwodHguc2VxdWVuY2VOdW1iZXIsIDE2KTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHR4LmV4cGlyYXRpb25UaW1lLCAxNzM2MjQ2MTU1KTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5DdXN0b21UeCk7XG5cbiAgICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgICBzaG91bGQuZXF1YWwodHhCdWlsZGVyLmlzVmFsaWRSYXdUcmFuc2FjdGlvbihyYXdUeCksIHRydWUpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgYnVpbGQgYW5kIHJlYnVpbGQgY3VzdG9tIHRyYW5zYWN0aW9uIHdpdGggY29ycmVjdCBVNjQgYW1vdW50IHBhcnNpbmcnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIFVzZSB0aGUgcHJvdmlkZWQgc2VyaWFsaXplZCBoZXggd2l0aCBhbW91bnQgMTAwMFxuICAgICAgICBjb25zdCBzZXJpYWxpemVkSGV4ID1cbiAgICAgICAgICAnMHhmMjJmYTAwOWI2NDczY2RjNTM5ZWNiZDU3MGQwMGQwNTg1NjgyZjU5MzlmZmUyNTZhOTBkZGVlMGQ2MTYyOTJmMDAwMDAwMDAwMDAwMDAwMDAyMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTA0NjM2ZjY5NmUwODc0NzI2MTZlNzM2NjY1NzIwMTA3MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTBhNjE3MDc0NmY3MzVmNjM2ZjY5NmUwOTQxNzA3NDZmNzM0MzZmNjk2ZTAwMDIyMGRhMjJiZGMxOWY4NzNmZDZjZTQ4YzMyOTEyOTY1YzhhOWRkZTU3OGIyYTNjZjRmYWUzZGQ4NWRmYWFjNzg0YzkwOGU4MDMwMDAwMDAwMDAwMDBhODYxMDAwMDAwMDAwMDAwNjQwMDAwMDAwMDAwMDAwMDkwMWNkZDY4MDAwMDAwMDAwMjAzMDAyMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA0MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMGFkYmE0NGI0NjcyMmI4ZGExNzk3NjQ1ZjcxZGRjZGFiMjg2MjZjMDZhY2QzNmI4OGQ1MTk4YTY4NDk2NjMwNmMwMDIwNDUzZWQ1YWE3NWIwMWYzZWIwM2FiMWQzMDMwYmUxMDk5NjIwNmU1YTA3M2E3NDk4M2VhM2ZjZDAxM2ZmZTFlYTQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnO1xuXG4gICAgICAgIGNvbnN0IHRyYW5zZmVyQ29pbnNBYmkgPSB7XG4gICAgICAgICAgdHlwZVBhcmFtZXRlcnM6IFt7IGNvbnN0cmFpbnRzOiBbXSB9XSxcbiAgICAgICAgICBwYXJhbWV0ZXJzOiBbbmV3IFR5cGVUYWdBZGRyZXNzKCksIG5ldyBUeXBlVGFnVTY0KCldLFxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIEJ1aWxkIHRyYW5zYWN0aW9uIGZyb20gc2VyaWFsaXplZCBoZXhcbiAgICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5mcm9tKHNlcmlhbGl6ZWRIZXgsIHRyYW5zZmVyQ29pbnNBYmkpO1xuICAgICAgICBjb25zdCB0eCA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgQ3VzdG9tVHJhbnNhY3Rpb247XG5cbiAgICAgICAgLy8gVmFsaWRhdGUgdGhlIHRyYW5zYWN0aW9uIHdhcyBwYXJzZWQgY29ycmVjdGx5XG4gICAgICAgIHNob3VsZC5lcXVhbCh0eC50eXBlLCBUcmFuc2FjdGlvblR5cGUuQ3VzdG9tVHgpO1xuICAgICAgICBzaG91bGQuZXhpc3QodHguZnVsbEZ1bmN0aW9uTmFtZSk7XG4gICAgICAgIHNob3VsZC5lcXVhbCh0eC5mdWxsRnVuY3Rpb25OYW1lLCAnMHgxOjpjb2luOjp0cmFuc2ZlcicpO1xuXG4gICAgICAgIC8vIEdldCB0aGUgY3VzdG9tIHRyYW5zYWN0aW9uIHBhcmFtZXRlcnNcbiAgICAgICAgY29uc3QgY3VzdG9tUGFyYW1zID0gdHguZ2V0Q3VzdG9tVHJhbnNhY3Rpb25QYXJhbXMoKTtcbiAgICAgICAgc2hvdWxkLmV4aXN0KGN1c3RvbVBhcmFtcyk7XG4gICAgICAgIHNob3VsZC5lcXVhbChjdXN0b21QYXJhbXMubW9kdWxlTmFtZSwgJzB4MTo6Y29pbicpO1xuICAgICAgICBzaG91bGQuZXF1YWwoY3VzdG9tUGFyYW1zLmZ1bmN0aW9uTmFtZSwgJ3RyYW5zZmVyJyk7XG4gICAgICAgIHNob3VsZC5leGlzdChjdXN0b21QYXJhbXMuZnVuY3Rpb25Bcmd1bWVudHMpO1xuICAgICAgICBzaG91bGQuZXF1YWwoY3VzdG9tUGFyYW1zLmZ1bmN0aW9uQXJndW1lbnRzIS5sZW5ndGgsIDIpO1xuXG4gICAgICAgIC8vIFZhbGlkYXRlIHRoZSBhbW91bnQgYXJndW1lbnQgd2FzIHBhcnNlZCBjb3JyZWN0bHkgYXMgMTAwMFxuICAgICAgICBjb25zdCBwYXJzZWRBbW91bnQgPSBjdXN0b21QYXJhbXMuZnVuY3Rpb25Bcmd1bWVudHMhWzFdO1xuICAgICAgICBzaG91bGQuZXF1YWwocGFyc2VkQW1vdW50LCAnMTAwMCcsICdBbW91bnQgc2hvdWxkIGJlIGNvcnJlY3RseSBwYXJzZWQgYXMgMTAwMCBmcm9tIFU2NCBieXRlcycpO1xuXG4gICAgICAgIC8vIFZhbGlkYXRlIHRoZSBhZGRyZXNzIGFyZ3VtZW50IChmaXJzdCBhcmd1bWVudClcbiAgICAgICAgY29uc3QgcGFyc2VkQWRkcmVzcyA9IGN1c3RvbVBhcmFtcy5mdW5jdGlvbkFyZ3VtZW50cyFbMF07XG4gICAgICAgIHNob3VsZC5leGlzdChwYXJzZWRBZGRyZXNzKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHR5cGVvZiBwYXJzZWRBZGRyZXNzLCAnc3RyaW5nJywgJ0FkZHJlc3Mgc2hvdWxkIGJlIGEgc3RyaW5nJyk7XG4gICAgICAgIChwYXJzZWRBZGRyZXNzIGFzIHN0cmluZykuc2hvdWxkLm1hdGNoKC9eMHhbYS1mQS1GMC05XSskLywgJ0FkZHJlc3Mgc2hvdWxkIGJlIHZhbGlkIGhleCBmb3JtYXQnKTtcblxuICAgICAgICAvLyBFbnN1cmUgdGhlIHRyYW5zYWN0aW9uIGNhbiBiZSByZWJ1aWx0IChyb3VuZC10cmlwIHRlc3QpXG4gICAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHR4QnVpbGRlci5pc1ZhbGlkUmF3VHJhbnNhY3Rpb24ocmF3VHgpLCB0cnVlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ0ZhaWwnLCAoKSA9PiB7XG4gICAgICBpdCgnc2hvdWxkIGZhaWwgZm9yIGludmFsaWQgc2VuZGVyJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IG5ldyBDdXN0b21UcmFuc2FjdGlvbihjb2lucy5nZXQoJ3RhcHQnKSk7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmdldEN1c3RvbVRyYW5zYWN0aW9uQnVpbGRlcih0cmFuc2FjdGlvbik7XG4gICAgICAgIHNob3VsZCgoKSA9PiBidWlsZGVyLnNlbmRlcigncmFuZG9tU3RyaW5nJykpLnRocm93RXJyb3IoJ0ludmFsaWQgYWRkcmVzcyByYW5kb21TdHJpbmcnKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGZhaWwgZm9yIG1pc3NpbmcgbW9kdWxlIG5hbWUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmdldEN1c3RvbVRyYW5zYWN0aW9uQnVpbGRlcigpO1xuICAgICAgICBzaG91bGQoKCkgPT5cbiAgICAgICAgICBidWlsZGVyLmN1c3RvbVRyYW5zYWN0aW9uKHtcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICcnLFxuICAgICAgICAgICAgZnVuY3Rpb25OYW1lOiAncmVnaXN0ZXJfZG9tYWluJyxcbiAgICAgICAgICAgIHR5cGVBcmd1bWVudHM6IFtdLFxuICAgICAgICAgICAgZnVuY3Rpb25Bcmd1bWVudHM6IFtdLFxuICAgICAgICAgICAgYWJpOiBiYXNpY0FiaSxcbiAgICAgICAgICB9KVxuICAgICAgICApLnRocm93RXJyb3IoJ01pc3NpbmcgbW9kdWxlIG5hbWUnKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGZhaWwgZm9yIG1pc3NpbmcgZnVuY3Rpb24gbmFtZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0Q3VzdG9tVHJhbnNhY3Rpb25CdWlsZGVyKCk7XG4gICAgICAgIHNob3VsZCgoKSA9PlxuICAgICAgICAgIGJ1aWxkZXIuY3VzdG9tVHJhbnNhY3Rpb24oe1xuICAgICAgICAgICAgbW9kdWxlTmFtZTogJzB4MTo6YXB0b3NfYWNjb3VudCcsXG4gICAgICAgICAgICBmdW5jdGlvbk5hbWU6ICcnLFxuICAgICAgICAgICAgdHlwZUFyZ3VtZW50czogW10sXG4gICAgICAgICAgICBmdW5jdGlvbkFyZ3VtZW50czogW10sXG4gICAgICAgICAgICBhYmk6IGJhc2ljQWJpLFxuICAgICAgICAgIH0pXG4gICAgICAgICkudGhyb3dFcnJvcignTWlzc2luZyBmdW5jdGlvbiBuYW1lJyk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBmYWlsIGZvciBpbnZhbGlkIG1vZHVsZSBuYW1lIGZvcm1hdCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0Q3VzdG9tVHJhbnNhY3Rpb25CdWlsZGVyKCk7XG4gICAgICAgIHNob3VsZCgoKSA9PlxuICAgICAgICAgIGJ1aWxkZXIuY3VzdG9tVHJhbnNhY3Rpb24oe1xuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ2ludmFsaWRfZm9ybWF0JyxcbiAgICAgICAgICAgIGZ1bmN0aW9uTmFtZTogJ3RyYW5zZmVyJyxcbiAgICAgICAgICAgIHR5cGVBcmd1bWVudHM6IFtdLFxuICAgICAgICAgICAgZnVuY3Rpb25Bcmd1bWVudHM6IFtdLFxuICAgICAgICAgICAgYWJpOiBiYXNpY0FiaSxcbiAgICAgICAgICB9KVxuICAgICAgICApLnRocm93RXJyb3IoL0ludmFsaWQgbW9kdWxlIG5hbWUgZm9ybWF0Lyk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBmYWlsIGZvciBpbnZhbGlkIGZ1bmN0aW9uIG5hbWUgZm9ybWF0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5nZXRDdXN0b21UcmFuc2FjdGlvbkJ1aWxkZXIoKTtcbiAgICAgICAgc2hvdWxkKCgpID0+XG4gICAgICAgICAgYnVpbGRlci5jdXN0b21UcmFuc2FjdGlvbih7XG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnMHgxOjphcHRvc19hY2NvdW50JyxcbiAgICAgICAgICAgIGZ1bmN0aW9uTmFtZTogJzEyM2ludmFsaWQnLFxuICAgICAgICAgICAgdHlwZUFyZ3VtZW50czogW10sXG4gICAgICAgICAgICBmdW5jdGlvbkFyZ3VtZW50czogW10sXG4gICAgICAgICAgICBhYmk6IGJhc2ljQWJpLFxuICAgICAgICAgIH0pXG4gICAgICAgICkudGhyb3dFcnJvcigvSW52YWxpZCBmdW5jdGlvbiBuYW1lIGZvcm1hdC8pO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgYWNjZXB0IHZhbGlkIFNIT1JUIGFkZHJlc3MgZm9ybWF0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5nZXRDdXN0b21UcmFuc2FjdGlvbkJ1aWxkZXIoKTtcbiAgICAgICAgc2hvdWxkKCgpID0+XG4gICAgICAgICAgYnVpbGRlci5jdXN0b21UcmFuc2FjdGlvbih7XG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnMHgxOjphcHRvc19hY2NvdW50JyxcbiAgICAgICAgICAgIGZ1bmN0aW9uTmFtZTogJ3RyYW5zZmVyX2NvaW5zJyxcbiAgICAgICAgICAgIHR5cGVBcmd1bWVudHM6IFtdLFxuICAgICAgICAgICAgZnVuY3Rpb25Bcmd1bWVudHM6IFtdLFxuICAgICAgICAgICAgYWJpOiBiYXNpY0FiaSxcbiAgICAgICAgICB9KVxuICAgICAgICApLm5vdC50aHJvdygpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgYWNjZXB0IHZhbGlkIExPTkcgYWRkcmVzcyBmb3JtYXQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmdldEN1c3RvbVRyYW5zYWN0aW9uQnVpbGRlcigpO1xuICAgICAgICBzaG91bGQoKCkgPT5cbiAgICAgICAgICBidWlsZGVyLmN1c3RvbVRyYW5zYWN0aW9uKHtcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICcweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDE6OmFwdG9zX2FjY291bnQnLFxuICAgICAgICAgICAgZnVuY3Rpb25OYW1lOiAndHJhbnNmZXJfY29pbnMnLFxuICAgICAgICAgICAgdHlwZUFyZ3VtZW50czogW10sXG4gICAgICAgICAgICBmdW5jdGlvbkFyZ3VtZW50czogW10sXG4gICAgICAgICAgICBhYmk6IGJhc2ljQWJpLFxuICAgICAgICAgIH0pXG4gICAgICAgICkubm90LnRocm93KCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCByZWplY3QgbmFtZWQgYWRkcmVzc2VzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5nZXRDdXN0b21UcmFuc2FjdGlvbkJ1aWxkZXIoKTtcbiAgICAgICAgc2hvdWxkKCgpID0+XG4gICAgICAgICAgYnVpbGRlci5jdXN0b21UcmFuc2FjdGlvbih7XG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnYXB0b3NfZnJhbWV3b3JrOjphcHRvc19hY2NvdW50JyxcbiAgICAgICAgICAgIGZ1bmN0aW9uTmFtZTogJ3RyYW5zZmVyX2NvaW5zJyxcbiAgICAgICAgICAgIHR5cGVBcmd1bWVudHM6IFtdLFxuICAgICAgICAgICAgZnVuY3Rpb25Bcmd1bWVudHM6IFtdLFxuICAgICAgICAgICAgYWJpOiBiYXNpY0FiaSxcbiAgICAgICAgICB9KVxuICAgICAgICApLnRocm93RXJyb3IoL0ludmFsaWQgbW9kdWxlIG5hbWUgZm9ybWF0LipoZXggYWRkcmVzc2VzIG9ubHkvKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIHRyYW5zYWN0aW9uIHBheWxvYWRzIHByb3Blcmx5JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IG5ldyBDdXN0b21UcmFuc2FjdGlvbihjb2lucy5nZXQoJ3RhcHQnKSk7XG4gICAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0Q3VzdG9tVHJhbnNhY3Rpb25CdWlsZGVyKHRyYW5zYWN0aW9uKTtcblxuICAgICAgICAvLyBWYWxpZCBwYXlsb2FkIHNob3VsZCBwYXNzIHZhbGlkYXRpb25cbiAgICAgICAgdHhCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIyLmFkZHJlc3MpO1xuICAgICAgICB0eEJ1aWxkZXIuZ2FzRGF0YSh7XG4gICAgICAgICAgbWF4R2FzQW1vdW50OiAyMDAwMDAsXG4gICAgICAgICAgZ2FzVW5pdFByaWNlOiAxMDAsXG4gICAgICAgIH0pO1xuICAgICAgICB0eEJ1aWxkZXIuc2VxdWVuY2VOdW1iZXIoMTQpO1xuICAgICAgICB0eEJ1aWxkZXIuZXhwaXJhdGlvblRpbWUoMTczNjI0NjE1NSk7XG4gICAgICAgIHR4QnVpbGRlci5jdXN0b21UcmFuc2FjdGlvbih7XG4gICAgICAgICAgbW9kdWxlTmFtZTogJzB4MTo6bWFuYWdlZF9jb2luJyxcbiAgICAgICAgICBmdW5jdGlvbk5hbWU6ICdtaW50JyxcbiAgICAgICAgICB0eXBlQXJndW1lbnRzOiBbJzB4MTo6YXB0b3NfY29pbjo6QXB0b3NDb2luJ10sXG4gICAgICAgICAgZnVuY3Rpb25Bcmd1bWVudHM6IFt0ZXN0RGF0YS5yZWNpcGllbnRzWzBdLmFkZHJlc3MsIHRlc3REYXRhLnJlY2lwaWVudHNbMF0uYW1vdW50XSxcbiAgICAgICAgICBhYmk6IG1pbnRBYmksXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICAgIHNob3VsZC5leGlzdCh0eCk7XG4gICAgICAgIHNob3VsZC5lcXVhbCh0eC50eXBlLCBUcmFuc2FjdGlvblR5cGUuQ3VzdG9tVHgpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgZmFpbCBmb3IgaW52YWxpZCBnYXMgYW1vdW50JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5nZXRDdXN0b21UcmFuc2FjdGlvbkJ1aWxkZXIoKTtcbiAgICAgICAgc2hvdWxkKCgpID0+IGJ1aWxkZXIuZ2FzRGF0YSh7IG1heEdhc0Ftb3VudDogLTEsIGdhc1VuaXRQcmljZTogMTAwIH0pKS50aHJvd0Vycm9yKFxuICAgICAgICAgICdWYWx1ZSBjYW5ub3QgYmUgbGVzcyB0aGFuIHplcm8nXG4gICAgICAgICk7XG4gICAgICAgIHNob3VsZCgoKSA9PiBidWlsZGVyLmdhc0RhdGEoeyBtYXhHYXNBbW91bnQ6IDIwMDAwMCwgZ2FzVW5pdFByaWNlOiAtMSB9KSkudGhyb3dFcnJvcihcbiAgICAgICAgICAnVmFsdWUgY2Fubm90IGJlIGxlc3MgdGhhbiB6ZXJvJ1xuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgZmFpbCB0byBidWlsZCB3aXRob3V0IHJlcXVpcmVkIHBhcmFtZXRlcnMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gbmV3IEN1c3RvbVRyYW5zYWN0aW9uKGNvaW5zLmdldCgndGFwdCcpKTtcbiAgICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRDdXN0b21UcmFuc2FjdGlvbkJ1aWxkZXIodHJhbnNhY3Rpb24pO1xuICAgICAgICB0eEJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlcjIuYWRkcmVzcyk7XG4gICAgICAgIHR4QnVpbGRlci5nYXNEYXRhKHtcbiAgICAgICAgICBtYXhHYXNBbW91bnQ6IDIwMDAwMCxcbiAgICAgICAgICBnYXNVbml0UHJpY2U6IDEwMCxcbiAgICAgICAgfSk7XG4gICAgICAgIHR4QnVpbGRlci5zZXF1ZW5jZU51bWJlcigxNCk7XG4gICAgICAgIHR4QnVpbGRlci5leHBpcmF0aW9uVGltZSgxNzM2MjQ2MTU1KTtcblxuICAgICAgICBhd2FpdCBzaG91bGQodHhCdWlsZGVyLmJ1aWxkKCkpLmJlLnJlamVjdGVkV2l0aCgnTWlzc2luZyByZXF1aXJlZCBtb2R1bGUgb3IgZnVuY3Rpb24gbmFtZScpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnQUJJIEJlaGF2aW9yIFRlc3RzJywgKCkgPT4ge1xuICAgICAgaXQoJ3Nob3VsZCBzdWNjZWVkIHdoZW4gQUJJIGlzIG5vdCBwcm92aWRlZCAodW5kZWZpbmVkKScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSBuZXcgQ3VzdG9tVHJhbnNhY3Rpb24oY29pbnMuZ2V0KCd0YXB0JykpO1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldEN1c3RvbVRyYW5zYWN0aW9uQnVpbGRlcih0cmFuc2FjdGlvbik7XG4gICAgICAgIHR4QnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyMi5hZGRyZXNzKTtcbiAgICAgICAgdHhCdWlsZGVyLmdhc0RhdGEoe1xuICAgICAgICAgIG1heEdhc0Ftb3VudDogMjAwMDAwLFxuICAgICAgICAgIGdhc1VuaXRQcmljZTogMTAwLFxuICAgICAgICB9KTtcbiAgICAgICAgdHhCdWlsZGVyLnNlcXVlbmNlTnVtYmVyKDE0KTtcbiAgICAgICAgdHhCdWlsZGVyLmV4cGlyYXRpb25UaW1lKDE3MzYyNDYxNTUpO1xuICAgICAgICB0eEJ1aWxkZXIuY3VzdG9tVHJhbnNhY3Rpb24oe1xuICAgICAgICAgIG1vZHVsZU5hbWU6ICcweDE6OmFwdG9zX2FjY291bnQnLFxuICAgICAgICAgIGZ1bmN0aW9uTmFtZTogJ3RyYW5zZmVyX2NvaW5zJyxcbiAgICAgICAgICB0eXBlQXJndW1lbnRzOiBbJzB4MTo6YXB0b3NfY29pbjo6QXB0b3NDb2luJ10sXG4gICAgICAgICAgZnVuY3Rpb25Bcmd1bWVudHM6IFt0ZXN0RGF0YS5yZWNpcGllbnRzWzBdLmFkZHJlc3MsIHRlc3REYXRhLnJlY2lwaWVudHNbMF0uYW1vdW50XSxcbiAgICAgICAgICBhYmk6IHRyYW5zZmVyQ29pbnNBYmksIC8vIEFCSSBpcyBub3cgcmVxdWlyZWRcbiAgICAgICAgfSk7XG4gICAgICAgIHR4QnVpbGRlci5hZGRGZWVQYXllckFkZHJlc3ModGVzdERhdGEuZmVlUGF5ZXIuYWRkcmVzcyk7XG4gICAgICAgIHR4QnVpbGRlci5zZXRJc1NpbXVsYXRlVHhuKHRydWUpO1xuXG4gICAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBDdXN0b21UcmFuc2FjdGlvbjtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5DdXN0b21UeCk7XG5cbiAgICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgICBzaG91bGQuZXF1YWwodHhCdWlsZGVyLmlzVmFsaWRSYXdUcmFuc2FjdGlvbihyYXdUeCksIHRydWUpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgZmFpbCB3aXRoIGludmFsaWQgQUJJIHN0cmluZycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSBuZXcgQ3VzdG9tVHJhbnNhY3Rpb24oY29pbnMuZ2V0KCd0YXB0JykpO1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldEN1c3RvbVRyYW5zYWN0aW9uQnVpbGRlcih0cmFuc2FjdGlvbik7XG4gICAgICAgIHR4QnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyMi5hZGRyZXNzKTtcbiAgICAgICAgdHhCdWlsZGVyLmdhc0RhdGEoe1xuICAgICAgICAgIG1heEdhc0Ftb3VudDogMjAwMDAwLFxuICAgICAgICAgIGdhc1VuaXRQcmljZTogMTAwLFxuICAgICAgICB9KTtcbiAgICAgICAgdHhCdWlsZGVyLnNlcXVlbmNlTnVtYmVyKDE0KTtcbiAgICAgICAgdHhCdWlsZGVyLmV4cGlyYXRpb25UaW1lKDE3MzYyNDYxNTUpO1xuICAgICAgICB0eEJ1aWxkZXIuY3VzdG9tVHJhbnNhY3Rpb24oe1xuICAgICAgICAgIG1vZHVsZU5hbWU6ICcweDE6OmFwdG9zX2FjY291bnQnLFxuICAgICAgICAgIGZ1bmN0aW9uTmFtZTogJ3RyYW5zZmVyX2NvaW5zJyxcbiAgICAgICAgICB0eXBlQXJndW1lbnRzOiBbJzB4MTo6YXB0b3NfY29pbjo6QXB0b3NDb2luJ10sXG4gICAgICAgICAgZnVuY3Rpb25Bcmd1bWVudHM6IFt0ZXN0RGF0YS5yZWNpcGllbnRzWzBdLmFkZHJlc3MsIHRlc3REYXRhLnJlY2lwaWVudHNbMF0uYW1vdW50XSxcbiAgICAgICAgICBhYmk6IHRyYW5zZmVyQ29pbnNBYmksXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFBhc3MgaW52YWxpZCBBQkkgYnkgYnlwYXNzaW5nIFR5cGVTY3JpcHQgKGNhc3QgYXMgYW55KVxuICAgICAgICB0eEJ1aWxkZXIuZW50cnlGdW5jdGlvbkFiaSgncmFuZG9tX2ludmFsaWRfYWJpJyBhcyBhbnkpO1xuICAgICAgICB0eEJ1aWxkZXIuYWRkRmVlUGF5ZXJBZGRyZXNzKHRlc3REYXRhLmZlZVBheWVyLmFkZHJlc3MpO1xuICAgICAgICB0eEJ1aWxkZXIuc2V0SXNTaW11bGF0ZVR4bih0cnVlKTtcblxuICAgICAgICAvLyBTaG91bGQgZmFpbCBkdWUgdG8gaW52YWxpZCBBQkkgZHVyaW5nIGJ1aWxkXG4gICAgICAgIGF3YWl0IHNob3VsZCh0eEJ1aWxkZXIuYnVpbGQoKSkuYmUucmVqZWN0ZWQoKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHdvcmsgd2l0aCBjb3JyZWN0IEFCSSBmb3IgdHJhbnNmZXJfY29pbnMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHsgVHlwZVRhZ0FkZHJlc3MsIFR5cGVUYWdVNjQgfSA9IGF3YWl0IGltcG9ydCgnQGFwdG9zLWxhYnMvdHMtc2RrJyk7XG5cbiAgICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSBuZXcgQ3VzdG9tVHJhbnNhY3Rpb24oY29pbnMuZ2V0KCd0YXB0JykpO1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldEN1c3RvbVRyYW5zYWN0aW9uQnVpbGRlcih0cmFuc2FjdGlvbik7XG4gICAgICAgIHR4QnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyMi5hZGRyZXNzKTtcbiAgICAgICAgdHhCdWlsZGVyLmdhc0RhdGEoe1xuICAgICAgICAgIG1heEdhc0Ftb3VudDogMjAwMDAwLFxuICAgICAgICAgIGdhc1VuaXRQcmljZTogMTAwLFxuICAgICAgICB9KTtcbiAgICAgICAgdHhCdWlsZGVyLnNlcXVlbmNlTnVtYmVyKDE0KTtcbiAgICAgICAgdHhCdWlsZGVyLmV4cGlyYXRpb25UaW1lKDE3MzYyNDYxNTUpO1xuICAgICAgICB0eEJ1aWxkZXIuY3VzdG9tVHJhbnNhY3Rpb24oe1xuICAgICAgICAgIG1vZHVsZU5hbWU6ICcweDE6OmFwdG9zX2FjY291bnQnLFxuICAgICAgICAgIGZ1bmN0aW9uTmFtZTogJ3RyYW5zZmVyX2NvaW5zJyxcbiAgICAgICAgICB0eXBlQXJndW1lbnRzOiBbJzB4MTo6YXB0b3NfY29pbjo6QXB0b3NDb2luJ10sXG4gICAgICAgICAgZnVuY3Rpb25Bcmd1bWVudHM6IFt0ZXN0RGF0YS5yZWNpcGllbnRzWzBdLmFkZHJlc3MsIHRlc3REYXRhLnJlY2lwaWVudHNbMF0uYW1vdW50XSxcbiAgICAgICAgICBhYmk6IHRyYW5zZmVyQ29pbnNBYmksXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFByb3ZpZGUgY29ycmVjdCBBQkkgKHNhbWUgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbiB1c2VzKVxuICAgICAgICBjb25zdCBjb3JyZWN0QWJpID0ge1xuICAgICAgICAgIHR5cGVQYXJhbWV0ZXJzOiBbeyBjb25zdHJhaW50czogW10gfV0sXG4gICAgICAgICAgcGFyYW1ldGVyczogW25ldyBUeXBlVGFnQWRkcmVzcygpLCBuZXcgVHlwZVRhZ1U2NCgpXSxcbiAgICAgICAgfTtcbiAgICAgICAgdHhCdWlsZGVyLmVudHJ5RnVuY3Rpb25BYmkoY29ycmVjdEFiaSk7XG4gICAgICAgIHR4QnVpbGRlci5hZGRGZWVQYXllckFkZHJlc3ModGVzdERhdGEuZmVlUGF5ZXIuYWRkcmVzcyk7XG4gICAgICAgIHR4QnVpbGRlci5zZXRJc1NpbXVsYXRlVHhuKHRydWUpO1xuXG4gICAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBDdXN0b21UcmFuc2FjdGlvbjtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5DdXN0b21UeCk7XG5cbiAgICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgICBzaG91bGQuZXF1YWwodHhCdWlsZGVyLmlzVmFsaWRSYXdUcmFuc2FjdGlvbihyYXdUeCksIHRydWUpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgYnVpbGQgdHJhbnNhY3Rpb24gd2l0aCBjdXN0b20gdG9rZW4gbWludCBhdCBkZXBsb3llZCBhZGRyZXNzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IG5ldyBDdXN0b21UcmFuc2FjdGlvbihjb2lucy5nZXQoJ3RhcHQnKSk7XG4gICAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0Q3VzdG9tVHJhbnNhY3Rpb25CdWlsZGVyKHRyYW5zYWN0aW9uKTtcbiAgICAgICAgdHhCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIyLmFkZHJlc3MpO1xuICAgICAgICB0eEJ1aWxkZXIuZ2FzRGF0YSh7XG4gICAgICAgICAgbWF4R2FzQW1vdW50OiAyMDAwMDAsXG4gICAgICAgICAgZ2FzVW5pdFByaWNlOiAxMDAsXG4gICAgICAgIH0pO1xuICAgICAgICB0eEJ1aWxkZXIuc2VxdWVuY2VOdW1iZXIoMTUpO1xuICAgICAgICB0eEJ1aWxkZXIuZXhwaXJhdGlvblRpbWUoMTczNjI0NjE1NSk7XG4gICAgICAgIHR4QnVpbGRlci5jdXN0b21UcmFuc2FjdGlvbih7XG4gICAgICAgICAgbW9kdWxlTmFtZTogJzB4YTg1MTA3ZWUwZTM0NTk2OWQyYjc2ZTU3ZjZmNjdjNTUxYmExYjA2NmZjMTRkMjEzMzI4ZGRlZDYyNjE4YmYyZTo6c2FtcGxlX3Rva2VuJyxcbiAgICAgICAgICBmdW5jdGlvbk5hbWU6ICdtaW50JyxcbiAgICAgICAgICB0eXBlQXJndW1lbnRzOiBbXSxcbiAgICAgICAgICBmdW5jdGlvbkFyZ3VtZW50czogW3Rlc3REYXRhLnJlY2lwaWVudHNbMF0uYWRkcmVzcywgdGVzdERhdGEucmVjaXBpZW50c1swXS5hbW91bnRdLFxuICAgICAgICAgIGFiaTogY3VzdG9tVG9rZW5NaW50QWJpLFxuICAgICAgICB9KTtcbiAgICAgICAgdHhCdWlsZGVyLmFkZEZlZVBheWVyQWRkcmVzcyh0ZXN0RGF0YS5mZWVQYXllci5hZGRyZXNzKTtcbiAgICAgICAgdHhCdWlsZGVyLnNldElzU2ltdWxhdGVUeG4odHJ1ZSk7XG5cbiAgICAgICAgY29uc3QgdHggPSAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIEN1c3RvbVRyYW5zYWN0aW9uO1xuICAgICAgICBzaG91bGQuZXF1YWwodHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLkN1c3RvbVR4KTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKFxuICAgICAgICAgIHR4LmZ1bGxGdW5jdGlvbk5hbWUsXG4gICAgICAgICAgJzB4YTg1MTA3ZWUwZTM0NTk2OWQyYjc2ZTU3ZjZmNjdjNTUxYmExYjA2NmZjMTRkMjEzMzI4ZGRlZDYyNjE4YmYyZTo6c2FtcGxlX3Rva2VuOjptaW50J1xuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHR4QnVpbGRlci5pc1ZhbGlkUmF3VHJhbnNhY3Rpb24ocmF3VHgpLCB0cnVlKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGJ1aWxkIHRyYW5zYWN0aW9uIHdpdGggY3VzdG9tIHRva2VuIGJ1cm4gYXQgZGVwbG95ZWQgYWRkcmVzcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSBuZXcgQ3VzdG9tVHJhbnNhY3Rpb24oY29pbnMuZ2V0KCd0YXB0JykpO1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldEN1c3RvbVRyYW5zYWN0aW9uQnVpbGRlcih0cmFuc2FjdGlvbik7XG4gICAgICAgIHR4QnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyMi5hZGRyZXNzKTtcbiAgICAgICAgdHhCdWlsZGVyLmdhc0RhdGEoe1xuICAgICAgICAgIG1heEdhc0Ftb3VudDogMjAwMDAwLFxuICAgICAgICAgIGdhc1VuaXRQcmljZTogMTAwLFxuICAgICAgICB9KTtcbiAgICAgICAgdHhCdWlsZGVyLnNlcXVlbmNlTnVtYmVyKDE2KTtcbiAgICAgICAgdHhCdWlsZGVyLmV4cGlyYXRpb25UaW1lKDE3MzYyNDYxNTUpO1xuICAgICAgICB0eEJ1aWxkZXIuY3VzdG9tVHJhbnNhY3Rpb24oe1xuICAgICAgICAgIG1vZHVsZU5hbWU6ICcweGE4NTEwN2VlMGUzNDU5NjlkMmI3NmU1N2Y2ZjY3YzU1MWJhMWIwNjZmYzE0ZDIxMzMyOGRkZWQ2MjYxOGJmMmU6OnNhbXBsZV90b2tlbicsXG4gICAgICAgICAgZnVuY3Rpb25OYW1lOiAnYnVybicsXG4gICAgICAgICAgdHlwZUFyZ3VtZW50czogW10sXG4gICAgICAgICAgZnVuY3Rpb25Bcmd1bWVudHM6IFt0ZXN0RGF0YS5yZWNpcGllbnRzWzBdLmFtb3VudF0sXG4gICAgICAgICAgYWJpOiBjdXN0b21Ub2tlbkJ1cm5BYmksXG4gICAgICAgIH0pO1xuICAgICAgICB0eEJ1aWxkZXIuYWRkRmVlUGF5ZXJBZGRyZXNzKHRlc3REYXRhLmZlZVBheWVyLmFkZHJlc3MpO1xuICAgICAgICB0eEJ1aWxkZXIuc2V0SXNTaW11bGF0ZVR4bih0cnVlKTtcblxuICAgICAgICBjb25zdCB0eCA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgQ3VzdG9tVHJhbnNhY3Rpb247XG4gICAgICAgIHNob3VsZC5lcXVhbCh0eC50eXBlLCBUcmFuc2FjdGlvblR5cGUuQ3VzdG9tVHgpO1xuICAgICAgICBzaG91bGQuZXF1YWwoXG4gICAgICAgICAgdHguZnVsbEZ1bmN0aW9uTmFtZSxcbiAgICAgICAgICAnMHhhODUxMDdlZTBlMzQ1OTY5ZDJiNzZlNTdmNmY2N2M1NTFiYTFiMDY2ZmMxNGQyMTMzMjhkZGVkNjI2MThiZjJlOjpzYW1wbGVfdG9rZW46OmJ1cm4nXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgICBzaG91bGQuZXF1YWwodHhCdWlsZGVyLmlzVmFsaWRSYXdUcmFuc2FjdGlvbihyYXdUeCksIHRydWUpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgZmFpbCB3aXRoIHdyb25nIEFCSSBwYXJhbWV0ZXIgY291bnQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gbmV3IEN1c3RvbVRyYW5zYWN0aW9uKGNvaW5zLmdldCgndGFwdCcpKTtcbiAgICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRDdXN0b21UcmFuc2FjdGlvbkJ1aWxkZXIodHJhbnNhY3Rpb24pO1xuICAgICAgICB0eEJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlcjIuYWRkcmVzcyk7XG4gICAgICAgIHR4QnVpbGRlci5nYXNEYXRhKHtcbiAgICAgICAgICBtYXhHYXNBbW91bnQ6IDIwMDAwMCxcbiAgICAgICAgICBnYXNVbml0UHJpY2U6IDEwMCxcbiAgICAgICAgfSk7XG4gICAgICAgIHR4QnVpbGRlci5zZXF1ZW5jZU51bWJlcigxNCk7XG4gICAgICAgIHR4QnVpbGRlci5leHBpcmF0aW9uVGltZSgxNzM2MjQ2MTU1KTtcbiAgICAgICAgdHhCdWlsZGVyLmN1c3RvbVRyYW5zYWN0aW9uKHtcbiAgICAgICAgICBtb2R1bGVOYW1lOiAnMHgxOjphcHRvc19hY2NvdW50JyxcbiAgICAgICAgICBmdW5jdGlvbk5hbWU6ICd0cmFuc2Zlcl9jb2lucycsXG4gICAgICAgICAgdHlwZUFyZ3VtZW50czogWycweDE6OmFwdG9zX2NvaW46OkFwdG9zQ29pbiddLFxuICAgICAgICAgIGZ1bmN0aW9uQXJndW1lbnRzOiBbdGVzdERhdGEucmVjaXBpZW50c1swXS5hZGRyZXNzLCB0ZXN0RGF0YS5yZWNpcGllbnRzWzBdLmFtb3VudF0sXG4gICAgICAgICAgYWJpOiB0cmFuc2ZlckNvaW5zQWJpLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBQcm92aWRlIEFCSSB3aXRoIHdyb25nIHBhcmFtZXRlciBjb3VudCAoMyBpbnN0ZWFkIG9mIDIpXG4gICAgICAgIGNvbnN0IHdyb25nQWJpID0ge1xuICAgICAgICAgIHR5cGVQYXJhbWV0ZXJzOiBbeyBjb25zdHJhaW50czogW10gfV0sXG4gICAgICAgICAgcGFyYW1ldGVyczogW25ldyBUeXBlVGFnQWRkcmVzcygpLCBuZXcgVHlwZVRhZ1U2NCgpLCBuZXcgVHlwZVRhZ1UxMjgoKV0sXG4gICAgICAgIH07XG4gICAgICAgIHR4QnVpbGRlci5lbnRyeUZ1bmN0aW9uQWJpKHdyb25nQWJpKTtcbiAgICAgICAgdHhCdWlsZGVyLmFkZEZlZVBheWVyQWRkcmVzcyh0ZXN0RGF0YS5mZWVQYXllci5hZGRyZXNzKTtcbiAgICAgICAgdHhCdWlsZGVyLnNldElzU2ltdWxhdGVUeG4odHJ1ZSk7XG5cbiAgICAgICAgLy8gU2hvdWxkIGZhaWwgZHVlIHRvIHBhcmFtZXRlciBjb3VudCBtaXNtYXRjaFxuICAgICAgICBhd2FpdCBzaG91bGQodHhCdWlsZGVyLmJ1aWxkKCkpLmJlLnJlamVjdGVkV2l0aCgvVG9vIGZldyBhcmd1bWVudHMvKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHRlc3Qgd3JvbmcgQUJJIGJlaGF2aW9yJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IG5ldyBDdXN0b21UcmFuc2FjdGlvbihjb2lucy5nZXQoJ3RhcHQnKSk7XG4gICAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0Q3VzdG9tVHJhbnNhY3Rpb25CdWlsZGVyKHRyYW5zYWN0aW9uKTtcbiAgICAgICAgdHhCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIyLmFkZHJlc3MpO1xuICAgICAgICB0eEJ1aWxkZXIuZ2FzRGF0YSh7XG4gICAgICAgICAgbWF4R2FzQW1vdW50OiAyMDAwMDAsXG4gICAgICAgICAgZ2FzVW5pdFByaWNlOiAxMDAsXG4gICAgICAgIH0pO1xuICAgICAgICB0eEJ1aWxkZXIuc2VxdWVuY2VOdW1iZXIoMTYpO1xuICAgICAgICB0eEJ1aWxkZXIuZXhwaXJhdGlvblRpbWUoMTczNjI0NjE1NSk7XG5cbiAgICAgICAgLy8gUHJvdmlkZSBmdW5jdGlvbiB0aGF0IGV4cGVjdHMgMiBhcmdzIGJ1dCB3cm9uZyBBQkkgZXhwZWN0cyAzXG4gICAgICAgIHR4QnVpbGRlci5jdXN0b21UcmFuc2FjdGlvbih7XG4gICAgICAgICAgbW9kdWxlTmFtZTogJzB4MTo6YXB0b3NfYWNjb3VudCcsXG4gICAgICAgICAgZnVuY3Rpb25OYW1lOiAndHJhbnNmZXJfY29pbnMnLFxuICAgICAgICAgIHR5cGVBcmd1bWVudHM6IFsnMHgxOjphcHRvc19jb2luOjpBcHRvc0NvaW4nXSxcbiAgICAgICAgICBmdW5jdGlvbkFyZ3VtZW50czogW3Rlc3REYXRhLnJlY2lwaWVudHNbMF0uYWRkcmVzcywgdGVzdERhdGEucmVjaXBpZW50c1swXS5hbW91bnRdLCAvLyAyIGFyZ3NcbiAgICAgICAgICBhYmk6IHdyb25nQWJpLCAvLyBBQkkgZXhwZWN0cyAzIHBhcmFtZXRlcnMgYnV0IHdlIHByb3ZpZGUgMlxuICAgICAgICB9KTtcbiAgICAgICAgdHhCdWlsZGVyLmFkZEZlZVBheWVyQWRkcmVzcyh0ZXN0RGF0YS5mZWVQYXllci5hZGRyZXNzKTtcbiAgICAgICAgdHhCdWlsZGVyLnNldElzU2ltdWxhdGVUeG4odHJ1ZSk7XG5cbiAgICAgICAgLy8gU2hvdWxkIGZhaWwgZHVlIHRvIGFyZ3VtZW50IGNvdW50IG1pc21hdGNoXG4gICAgICAgIGF3YWl0IHNob3VsZCh0eEJ1aWxkZXIuYnVpbGQoKSkuYmUucmVqZWN0ZWRXaXRoKC9Ub28gZmV3IGFyZ3VtZW50cy8pO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgdGVzdCB3cm9uZyBBQkkgd2l0aCBtYXRjaGluZyBwYXJhbWV0ZXIgY291bnQgYnV0IHdyb25nIHR5cGVzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IG5ldyBDdXN0b21UcmFuc2FjdGlvbihjb2lucy5nZXQoJ3RhcHQnKSk7XG4gICAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0Q3VzdG9tVHJhbnNhY3Rpb25CdWlsZGVyKHRyYW5zYWN0aW9uKTtcbiAgICAgICAgdHhCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIyLmFkZHJlc3MpO1xuICAgICAgICB0eEJ1aWxkZXIuZ2FzRGF0YSh7XG4gICAgICAgICAgbWF4R2FzQW1vdW50OiAyMDAwMDAsXG4gICAgICAgICAgZ2FzVW5pdFByaWNlOiAxMDAsXG4gICAgICAgIH0pO1xuICAgICAgICB0eEJ1aWxkZXIuc2VxdWVuY2VOdW1iZXIoMTcpO1xuICAgICAgICB0eEJ1aWxkZXIuZXhwaXJhdGlvblRpbWUoMTczNjI0NjE1NSk7XG5cbiAgICAgICAgLy8gV3JvbmcgQUJJIHdpdGggY29ycmVjdCBwYXJhbWV0ZXIgY291bnQgYnV0IHdyb25nIHR5cGVzXG4gICAgICAgIGNvbnN0IHdyb25nVHlwZXNBYmkgPSB7XG4gICAgICAgICAgdHlwZVBhcmFtZXRlcnM6IFt7IGNvbnN0cmFpbnRzOiBbXSB9XSxcbiAgICAgICAgICBwYXJhbWV0ZXJzOiBbbmV3IFR5cGVUYWdVNjQoKSwgbmV3IFR5cGVUYWdVNjQoKV0sIC8vIEJvdGggdTY0IGluc3RlYWQgb2YgQWRkcmVzcyArIHU2NFxuICAgICAgICB9O1xuXG4gICAgICAgIHR4QnVpbGRlci5jdXN0b21UcmFuc2FjdGlvbih7XG4gICAgICAgICAgbW9kdWxlTmFtZTogJzB4MTo6YXB0b3NfYWNjb3VudCcsXG4gICAgICAgICAgZnVuY3Rpb25OYW1lOiAndHJhbnNmZXJfY29pbnMnLFxuICAgICAgICAgIHR5cGVBcmd1bWVudHM6IFsnMHgxOjphcHRvc19jb2luOjpBcHRvc0NvaW4nXSxcbiAgICAgICAgICBmdW5jdGlvbkFyZ3VtZW50czogW3Rlc3REYXRhLnJlY2lwaWVudHNbMF0uYWRkcmVzcywgdGVzdERhdGEucmVjaXBpZW50c1swXS5hbW91bnRdLCAvLyBBZGRyZXNzICsgdTY0XG4gICAgICAgICAgYWJpOiB3cm9uZ1R5cGVzQWJpLFxuICAgICAgICB9KTtcbiAgICAgICAgdHhCdWlsZGVyLmFkZEZlZVBheWVyQWRkcmVzcyh0ZXN0RGF0YS5mZWVQYXllci5hZGRyZXNzKTtcbiAgICAgICAgdHhCdWlsZGVyLnNldElzU2ltdWxhdGVUeG4odHJ1ZSk7XG5cbiAgICAgICAgLy8gU2hvdWxkIGZhaWwgZHVlIHRvIHR5cGUgbWlzbWF0Y2ggYmV0d2VlbiBBQkkgYW5kIGFjdHVhbCBhcmd1bWVudHNcbiAgICAgICAgYXdhaXQgc2hvdWxkKHR4QnVpbGRlci5idWlsZCgpKS5iZS5yZWplY3RlZCgpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgYnVpbGQgcmVndWxhdGVkIHRva2VuIGluaXRpYWxpemUgd2l0aCBjb3JyZWN0IEFCSScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgcmVndWxhdGVkVG9rZW5Jbml0aWFsaXplQWJpID0ge1xuICAgICAgICAgIHR5cGVQYXJhbWV0ZXJzOiBbXSxcbiAgICAgICAgICBwYXJhbWV0ZXJzOiBbXG4gICAgICAgICAgICBuZXcgVHlwZVRhZ1ZlY3RvcihuZXcgVHlwZVRhZ1U4KCkpLFxuICAgICAgICAgICAgbmV3IFR5cGVUYWdWZWN0b3IobmV3IFR5cGVUYWdVOCgpKSxcbiAgICAgICAgICAgIG5ldyBUeXBlVGFnVTgoKSxcbiAgICAgICAgICAgIG5ldyBUeXBlVGFnVmVjdG9yKG5ldyBUeXBlVGFnVTgoKSksXG4gICAgICAgICAgICBuZXcgVHlwZVRhZ1ZlY3RvcihuZXcgVHlwZVRhZ1U4KCkpLFxuICAgICAgICAgIF0sXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSBuZXcgQ3VzdG9tVHJhbnNhY3Rpb24oY29pbnMuZ2V0KCd0YXB0JykpO1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldEN1c3RvbVRyYW5zYWN0aW9uQnVpbGRlcih0cmFuc2FjdGlvbik7XG4gICAgICAgIHR4QnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyMi5hZGRyZXNzKTtcbiAgICAgICAgdHhCdWlsZGVyLmdhc0RhdGEoe1xuICAgICAgICAgIG1heEdhc0Ftb3VudDogMjAwMDAwLFxuICAgICAgICAgIGdhc1VuaXRQcmljZTogMTAwLFxuICAgICAgICB9KTtcbiAgICAgICAgdHhCdWlsZGVyLnNlcXVlbmNlTnVtYmVyKDE4KTtcbiAgICAgICAgdHhCdWlsZGVyLmV4cGlyYXRpb25UaW1lKDE3MzYyNDYxNTUpO1xuICAgICAgICB0eEJ1aWxkZXIuY3VzdG9tVHJhbnNhY3Rpb24oe1xuICAgICAgICAgIG1vZHVsZU5hbWU6ICcweDRhMjgwOTQyZmQ0YWE3MjE4YWFmOWJlZWQ2NzU2ZGJjN2Y0ZDA1YjdmMTNiOGE0YzU1NjRkZDRhMzRiOTIxOTI6OnJlZ3VsYXRlZF90b2tlbicsXG4gICAgICAgICAgZnVuY3Rpb25OYW1lOiAnaW5pdGlhbGl6ZScsXG4gICAgICAgICAgdHlwZUFyZ3VtZW50czogW10sXG4gICAgICAgICAgZnVuY3Rpb25Bcmd1bWVudHM6IFsnUmVndWxhdGVkIFRva2VuJywgJ1JUJywgNiwgJ2h0dHBzOi8vZXhhbXBsZS5jb20vaWNvbi5wbmcnLCAnUmVndWxhdGVkIFRva2VuIFByb2plY3QnXSxcbiAgICAgICAgICBhYmk6IHJlZ3VsYXRlZFRva2VuSW5pdGlhbGl6ZUFiaSxcbiAgICAgICAgfSk7XG4gICAgICAgIHR4QnVpbGRlci5hZGRGZWVQYXllckFkZHJlc3ModGVzdERhdGEuZmVlUGF5ZXIuYWRkcmVzcyk7XG4gICAgICAgIHR4QnVpbGRlci5zZXRJc1NpbXVsYXRlVHhuKHRydWUpO1xuXG4gICAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBDdXN0b21UcmFuc2FjdGlvbjtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5DdXN0b21UeCk7XG4gICAgICAgIHNob3VsZC5lcXVhbChcbiAgICAgICAgICB0eC5mdWxsRnVuY3Rpb25OYW1lLFxuICAgICAgICAgICcweDRhMjgwOTQyZmQ0YWE3MjE4YWFmOWJlZWQ2NzU2ZGJjN2Y0ZDA1YjdmMTNiOGE0YzU1NjRkZDRhMzRiOTIxOTI6OnJlZ3VsYXRlZF90b2tlbjo6aW5pdGlhbGl6ZSdcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGZhaWwgcmVndWxhdGVkIHRva2VuIGluaXRpYWxpemUgd2l0aCB3cm9uZyBBQkknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHdyb25nUmVndWxhdGVkVG9rZW5BYmkgPSB7XG4gICAgICAgICAgdHlwZVBhcmFtZXRlcnM6IFtdLFxuICAgICAgICAgIHBhcmFtZXRlcnM6IFtcbiAgICAgICAgICAgIG5ldyBUeXBlVGFnVTY0KCksXG4gICAgICAgICAgICBuZXcgVHlwZVRhZ1U2NCgpLFxuICAgICAgICAgICAgbmV3IFR5cGVUYWdVMTI4KCksXG4gICAgICAgICAgICBuZXcgVHlwZVRhZ1ZlY3RvcihuZXcgVHlwZVRhZ1U4KCkpLFxuICAgICAgICAgICAgbmV3IFR5cGVUYWdWZWN0b3IobmV3IFR5cGVUYWdVOCgpKSxcbiAgICAgICAgICBdLFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gbmV3IEN1c3RvbVRyYW5zYWN0aW9uKGNvaW5zLmdldCgndGFwdCcpKTtcbiAgICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRDdXN0b21UcmFuc2FjdGlvbkJ1aWxkZXIodHJhbnNhY3Rpb24pO1xuICAgICAgICB0eEJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlcjIuYWRkcmVzcyk7XG4gICAgICAgIHR4QnVpbGRlci5nYXNEYXRhKHtcbiAgICAgICAgICBtYXhHYXNBbW91bnQ6IDIwMDAwMCxcbiAgICAgICAgICBnYXNVbml0UHJpY2U6IDEwMCxcbiAgICAgICAgfSk7XG4gICAgICAgIHR4QnVpbGRlci5zZXF1ZW5jZU51bWJlcigxOSk7XG4gICAgICAgIHR4QnVpbGRlci5leHBpcmF0aW9uVGltZSgxNzM2MjQ2MTU1KTtcbiAgICAgICAgdHhCdWlsZGVyLmN1c3RvbVRyYW5zYWN0aW9uKHtcbiAgICAgICAgICBtb2R1bGVOYW1lOiAnMHg0YTI4MDk0MmZkNGFhNzIxOGFhZjliZWVkNjc1NmRiYzdmNGQwNWI3ZjEzYjhhNGM1NTY0ZGQ0YTM0YjkyMTkyOjpyZWd1bGF0ZWRfdG9rZW4nLFxuICAgICAgICAgIGZ1bmN0aW9uTmFtZTogJ2luaXRpYWxpemUnLFxuICAgICAgICAgIHR5cGVBcmd1bWVudHM6IFtdLFxuICAgICAgICAgIGZ1bmN0aW9uQXJndW1lbnRzOiBbJ1JlZ3VsYXRlZCBUb2tlbicsICdSVCcsIDYsICdodHRwczovL2V4YW1wbGUuY29tL2ljb24ucG5nJywgJ1JlZ3VsYXRlZCBUb2tlbiBQcm9qZWN0J10sXG4gICAgICAgICAgYWJpOiB3cm9uZ1JlZ3VsYXRlZFRva2VuQWJpLFxuICAgICAgICB9KTtcbiAgICAgICAgdHhCdWlsZGVyLmFkZEZlZVBheWVyQWRkcmVzcyh0ZXN0RGF0YS5mZWVQYXllci5hZGRyZXNzKTtcbiAgICAgICAgdHhCdWlsZGVyLnNldElzU2ltdWxhdGVUeG4odHJ1ZSk7XG5cbiAgICAgICAgLy8gU2hvdWxkIGZhaWwgZHVlIHRvIHR5cGUgbWlzbWF0Y2ggZHVyaW5nIHNlcmlhbGl6YXRpb25cbiAgICAgICAgYXdhaXQgc2hvdWxkKHR4QnVpbGRlci5idWlsZCgpKS5iZS5yZWplY3RlZCgpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgYnVpbGQgbWFuYWdlZCB0cmFkaW5nIHBsYWNlX29yZGVyX3YzIHdpdGggY29ycmVjdCBBQkknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHBsYWNlT3JkZXJWM0FiaSA9IHtcbiAgICAgICAgICB0eXBlUGFyYW1ldGVyczogW3sgY29uc3RyYWludHM6IFtdIH0sIHsgY29uc3RyYWludHM6IFtdIH1dLFxuICAgICAgICAgIHBhcmFtZXRlcnM6IFtcbiAgICAgICAgICAgIG5ldyBUeXBlVGFnQWRkcmVzcygpLFxuICAgICAgICAgICAgbmV3IFR5cGVUYWdVNjQoKSxcbiAgICAgICAgICAgIG5ldyBUeXBlVGFnVTY0KCksXG4gICAgICAgICAgICBuZXcgVHlwZVRhZ1U2NCgpLFxuICAgICAgICAgICAgbmV3IFR5cGVUYWdCb29sKCksXG4gICAgICAgICAgICBuZXcgVHlwZVRhZ0Jvb2woKSxcbiAgICAgICAgICAgIG5ldyBUeXBlVGFnQm9vbCgpLFxuICAgICAgICAgICAgbmV3IFR5cGVUYWdVNjQoKSxcbiAgICAgICAgICAgIG5ldyBUeXBlVGFnVTY0KCksXG4gICAgICAgICAgICBuZXcgVHlwZVRhZ0Jvb2woKSxcbiAgICAgICAgICAgIG5ldyBUeXBlVGFnQWRkcmVzcygpLFxuICAgICAgICAgIF0sXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSBuZXcgQ3VzdG9tVHJhbnNhY3Rpb24oY29pbnMuZ2V0KCd0YXB0JykpO1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldEN1c3RvbVRyYW5zYWN0aW9uQnVpbGRlcih0cmFuc2FjdGlvbik7XG4gICAgICAgIHR4QnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyMi5hZGRyZXNzKTtcbiAgICAgICAgdHhCdWlsZGVyLmdhc0RhdGEoe1xuICAgICAgICAgIG1heEdhc0Ftb3VudDogMjAwMDAwLFxuICAgICAgICAgIGdhc1VuaXRQcmljZTogMTAwLFxuICAgICAgICB9KTtcbiAgICAgICAgdHhCdWlsZGVyLnNlcXVlbmNlTnVtYmVyKDIwKTtcbiAgICAgICAgdHhCdWlsZGVyLmV4cGlyYXRpb25UaW1lKDE3MzYyNDYxNTUpO1xuICAgICAgICB0eEJ1aWxkZXIuY3VzdG9tVHJhbnNhY3Rpb24oe1xuICAgICAgICAgIG1vZHVsZU5hbWU6ICcweDMzYTg2OTM3NThkMWQyOGE5MzA1OTQ2Yzc3NThiNzU0OGEwNDczNmMzNTkyOWVhYzIyZWIwZGUyYTg2NTI3NWQ6Om1hbmFnZWRfdHJhZGluZycsXG4gICAgICAgICAgZnVuY3Rpb25OYW1lOiAncGxhY2Vfb3JkZXJfdjMnLFxuICAgICAgICAgIHR5cGVBcmd1bWVudHM6IFtcbiAgICAgICAgICAgICcweDMzYTg2OTM3NThkMWQyOGE5MzA1OTQ2Yzc3NThiNzU0OGEwNDczNmMzNTkyOWVhYzIyZWIwZGUyYTg2NTI3NWQ6OnBhaXJfdHlwZXM6OlRSVU1QX1VTRCcsXG4gICAgICAgICAgICAnMHgzM2E4NjkzNzU4ZDFkMjhhOTMwNTk0NmM3NzU4Yjc1NDhhMDQ3MzZjMzU5MjllYWMyMmViMGRlMmE4NjUyNzVkOjpmYV9ib3g6OldfVVNEQycsXG4gICAgICAgICAgXSxcbiAgICAgICAgICBmdW5jdGlvbkFyZ3VtZW50czogW1xuICAgICAgICAgICAgJzB4NmE4ZDEwNmRjYzBmNjNjYjhiMzVkMGU3ZDMzYzlmZjM4ZjM5MmQ5NjM1OTUzNjhjZDIzMGM0NmY2YjczOTdhNScsXG4gICAgICAgICAgICAnODAwMDAwMDAwJyxcbiAgICAgICAgICAgICcwJyxcbiAgICAgICAgICAgICcxODQ0Njc0NDA3MzcwOTU1MTYxNScsXG4gICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgJzEnLFxuICAgICAgICAgICAgJzE4NDQ2NzQ0MDczNzA5NTUxNjE1JyxcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgJzB4MCcsXG4gICAgICAgICAgXSxcbiAgICAgICAgICBhYmk6IHBsYWNlT3JkZXJWM0FiaSxcbiAgICAgICAgfSk7XG4gICAgICAgIHR4QnVpbGRlci5hZGRGZWVQYXllckFkZHJlc3ModGVzdERhdGEuZmVlUGF5ZXIuYWRkcmVzcyk7XG4gICAgICAgIHR4QnVpbGRlci5zZXRJc1NpbXVsYXRlVHhuKHRydWUpO1xuXG4gICAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBDdXN0b21UcmFuc2FjdGlvbjtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5DdXN0b21UeCk7XG4gICAgICAgIHNob3VsZC5lcXVhbChcbiAgICAgICAgICB0eC5mdWxsRnVuY3Rpb25OYW1lLFxuICAgICAgICAgICcweDMzYTg2OTM3NThkMWQyOGE5MzA1OTQ2Yzc3NThiNzU0OGEwNDczNmMzNTkyOWVhYzIyZWIwZGUyYTg2NTI3NWQ6Om1hbmFnZWRfdHJhZGluZzo6cGxhY2Vfb3JkZXJfdjMnXG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBmYWlsIG1hbmFnZWQgdHJhZGluZyBwbGFjZV9vcmRlcl92MyB3aXRoIHdyb25nIEFCSSBwYXJhbWV0ZXIgY291bnQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHdyb25nUGxhY2VPcmRlckFiaSA9IHtcbiAgICAgICAgICB0eXBlUGFyYW1ldGVyczogW3sgY29uc3RyYWludHM6IFtdIH0sIHsgY29uc3RyYWludHM6IFtdIH1dLFxuICAgICAgICAgIHBhcmFtZXRlcnM6IFtcbiAgICAgICAgICAgIG5ldyBUeXBlVGFnQWRkcmVzcygpLCAvLyB0YXJnZXRfY29uZmlnXG4gICAgICAgICAgICBuZXcgVHlwZVRhZ1U2NCgpLCAvLyBtYXhfYmFzZVxuICAgICAgICAgICAgbmV3IFR5cGVUYWdVNjQoKSwgLy8gbWF4X3F1b3RlXG4gICAgICAgICAgICAvLyBNaXNzaW5nIDggbW9yZSBwYXJhbWV0ZXJzIC0gb25seSAzIGluc3RlYWQgb2YgMTFcbiAgICAgICAgICBdLFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gbmV3IEN1c3RvbVRyYW5zYWN0aW9uKGNvaW5zLmdldCgndGFwdCcpKTtcbiAgICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRDdXN0b21UcmFuc2FjdGlvbkJ1aWxkZXIodHJhbnNhY3Rpb24pO1xuICAgICAgICB0eEJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlcjIuYWRkcmVzcyk7XG4gICAgICAgIHR4QnVpbGRlci5nYXNEYXRhKHtcbiAgICAgICAgICBtYXhHYXNBbW91bnQ6IDIwMDAwMCxcbiAgICAgICAgICBnYXNVbml0UHJpY2U6IDEwMCxcbiAgICAgICAgfSk7XG4gICAgICAgIHR4QnVpbGRlci5zZXF1ZW5jZU51bWJlcigyMSk7XG4gICAgICAgIHR4QnVpbGRlci5leHBpcmF0aW9uVGltZSgxNzM2MjQ2MTU1KTtcbiAgICAgICAgdHhCdWlsZGVyLmN1c3RvbVRyYW5zYWN0aW9uKHtcbiAgICAgICAgICBtb2R1bGVOYW1lOiAnMHgzM2E4NjkzNzU4ZDFkMjhhOTMwNTk0NmM3NzU4Yjc1NDhhMDQ3MzZjMzU5MjllYWMyMmViMGRlMmE4NjUyNzVkOjptYW5hZ2VkX3RyYWRpbmcnLFxuICAgICAgICAgIGZ1bmN0aW9uTmFtZTogJ3BsYWNlX29yZGVyX3YzJyxcbiAgICAgICAgICB0eXBlQXJndW1lbnRzOiBbXG4gICAgICAgICAgICAnMHgzM2E4NjkzNzU4ZDFkMjhhOTMwNTk0NmM3NzU4Yjc1NDhhMDQ3MzZjMzU5MjllYWMyMmViMGRlMmE4NjUyNzVkOjpwYWlyX3R5cGVzOjpUUlVNUF9VU0QnLFxuICAgICAgICAgICAgJzB4MzNhODY5Mzc1OGQxZDI4YTkzMDU5NDZjNzc1OGI3NTQ4YTA0NzM2YzM1OTI5ZWFjMjJlYjBkZTJhODY1Mjc1ZDo6ZmFfYm94OjpXX1VTREMnLFxuICAgICAgICAgIF0sXG4gICAgICAgICAgZnVuY3Rpb25Bcmd1bWVudHM6IFtcbiAgICAgICAgICAgICcweDZhOGQxMDZkY2MwZjYzY2I4YjM1ZDBlN2QzM2M5ZmYzOGYzOTJkOTYzNTk1MzY4Y2QyMzBjNDZmNmI3Mzk3YTUnLFxuICAgICAgICAgICAgJzgwMDAwMDAwMCcsXG4gICAgICAgICAgICAnMCcsXG4gICAgICAgICAgICAnMTg0NDY3NDQwNzM3MDk1NTE2MTUnLFxuICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgICcxJyxcbiAgICAgICAgICAgICcxODQ0Njc0NDA3MzcwOTU1MTYxNScsXG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgICcweDAnLFxuICAgICAgICAgIF0sXG4gICAgICAgICAgYWJpOiB3cm9uZ1BsYWNlT3JkZXJBYmksXG4gICAgICAgIH0pO1xuICAgICAgICB0eEJ1aWxkZXIuYWRkRmVlUGF5ZXJBZGRyZXNzKHRlc3REYXRhLmZlZVBheWVyLmFkZHJlc3MpO1xuICAgICAgICB0eEJ1aWxkZXIuc2V0SXNTaW11bGF0ZVR4bih0cnVlKTtcblxuICAgICAgICAvLyBTaG91bGQgZmFpbCBkdWUgdG8gcGFyYW1ldGVyIGNvdW50IG1pc21hdGNoIChleHBlY3RzIDMsIGdvdCAxMSlcbiAgICAgICAgYXdhaXQgc2hvdWxkKHR4QnVpbGRlci5idWlsZCgpKS5iZS5yZWplY3RlZFdpdGgoL1RvbyBtYW55IGFyZ3VtZW50cy4qZXhwZWN0ZWQgMy8pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=