@bitgo-beta/sdk-coin-sol 2.4.3-beta.99 → 2.4.3-beta.991

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 (69) hide show
  1. package/CHANGELOG.md +968 -0
  2. package/dist/src/index.js +6 -2
  3. package/dist/src/lib/ataInitializationBuilder.d.ts.map +1 -1
  4. package/dist/src/lib/ataInitializationBuilder.js +60 -22
  5. package/dist/src/lib/closeAtaBuilder.d.ts +19 -0
  6. package/dist/src/lib/closeAtaBuilder.d.ts.map +1 -0
  7. package/dist/src/lib/closeAtaBuilder.js +69 -0
  8. package/dist/src/lib/constants.d.ts +35 -8
  9. package/dist/src/lib/constants.d.ts.map +1 -1
  10. package/dist/src/lib/constants.js +39 -10
  11. package/dist/src/lib/iface.d.ts +45 -4
  12. package/dist/src/lib/iface.d.ts.map +1 -1
  13. package/dist/src/lib/iface.js +1 -1
  14. package/dist/src/lib/index.d.ts +12 -9
  15. package/dist/src/lib/index.d.ts.map +1 -1
  16. package/dist/src/lib/index.js +46 -26
  17. package/dist/src/lib/instructionParamsFactory.d.ts +1 -1
  18. package/dist/src/lib/instructionParamsFactory.d.ts.map +1 -1
  19. package/dist/src/lib/instructionParamsFactory.js +287 -60
  20. package/dist/src/lib/keyPair.js +5 -5
  21. package/dist/src/lib/messages/index.d.ts +2 -0
  22. package/dist/src/lib/messages/index.d.ts.map +1 -0
  23. package/dist/src/lib/messages/index.js +18 -0
  24. package/dist/src/lib/messages/messageBuilderFactory.d.ts +7 -0
  25. package/dist/src/lib/messages/messageBuilderFactory.d.ts.map +1 -0
  26. package/dist/src/lib/messages/messageBuilderFactory.js +19 -0
  27. package/dist/src/lib/solInstructionFactory.d.ts.map +1 -1
  28. package/dist/src/lib/solInstructionFactory.js +146 -53
  29. package/dist/src/lib/stakingActivateBuilder.d.ts +9 -2
  30. package/dist/src/lib/stakingActivateBuilder.d.ts.map +1 -1
  31. package/dist/src/lib/stakingActivateBuilder.js +23 -10
  32. package/dist/src/lib/stakingAuthorizeBuilder.js +7 -7
  33. package/dist/src/lib/stakingDeactivateBuilder.d.ts +26 -1
  34. package/dist/src/lib/stakingDeactivateBuilder.d.ts.map +1 -1
  35. package/dist/src/lib/stakingDeactivateBuilder.js +106 -25
  36. package/dist/src/lib/stakingDelegateBuilder.d.ts +42 -0
  37. package/dist/src/lib/stakingDelegateBuilder.d.ts.map +1 -0
  38. package/dist/src/lib/stakingDelegateBuilder.js +120 -0
  39. package/dist/src/lib/stakingRawMsgAuthorizeBuilder.d.ts.map +1 -1
  40. package/dist/src/lib/stakingRawMsgAuthorizeBuilder.js +9 -5
  41. package/dist/src/lib/stakingWithdrawBuilder.js +6 -6
  42. package/dist/src/lib/tokenTransferBuilder.d.ts +4 -1
  43. package/dist/src/lib/tokenTransferBuilder.d.ts.map +1 -1
  44. package/dist/src/lib/tokenTransferBuilder.js +87 -23
  45. package/dist/src/lib/transaction.d.ts +12 -3
  46. package/dist/src/lib/transaction.d.ts.map +1 -1
  47. package/dist/src/lib/transaction.js +61 -26
  48. package/dist/src/lib/transactionBuilder.d.ts +2 -1
  49. package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
  50. package/dist/src/lib/transactionBuilder.js +30 -19
  51. package/dist/src/lib/transactionBuilderFactory.d.ts +22 -9
  52. package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
  53. package/dist/src/lib/transactionBuilderFactory.js +32 -10
  54. package/dist/src/lib/transferBuilder.js +4 -4
  55. package/dist/src/lib/transferBuilderV2.d.ts +14 -1
  56. package/dist/src/lib/transferBuilderV2.d.ts.map +1 -1
  57. package/dist/src/lib/transferBuilderV2.js +114 -11
  58. package/dist/src/lib/utils.d.ts +16 -6
  59. package/dist/src/lib/utils.d.ts.map +1 -1
  60. package/dist/src/lib/utils.js +145 -53
  61. package/dist/src/lib/walletInitializationBuilder.js +6 -6
  62. package/dist/src/sol.d.ts +71 -25
  63. package/dist/src/sol.d.ts.map +1 -1
  64. package/dist/src/sol.js +615 -81
  65. package/dist/src/solToken.d.ts +2 -1
  66. package/dist/src/solToken.d.ts.map +1 -1
  67. package/dist/src/solToken.js +6 -3
  68. package/dist/src/tsol.js +1 -1
  69. package/package.json +10 -9
@@ -3,14 +3,14 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.instructionParamsFactory = void 0;
7
- const web3_js_1 = require("@solana/web3.js");
6
+ exports.instructionParamsFactory = instructionParamsFactory;
8
7
  const spl_token_1 = require("@solana/spl-token");
8
+ const web3_js_1 = require("@solana/web3.js");
9
9
  const sdk_core_1 = require("@bitgo-beta/sdk-core");
10
+ const statics_1 = require("@bitgo-beta/statics");
11
+ const assert_1 = __importDefault(require("assert"));
10
12
  const constants_1 = require("./constants");
11
13
  const utils_1 = require("./utils");
12
- const assert_1 = __importDefault(require("assert"));
13
- const statics_1 = require("@bitgo-beta/statics");
14
14
  /**
15
15
  * Construct instructions params from Solana instructions
16
16
  *
@@ -18,29 +18,32 @@ const statics_1 = require("@bitgo-beta/statics");
18
18
  * @param {TransactionInstruction[]} instructions - solana instructions
19
19
  * @returns {InstructionParams[]} An array containing instruction params
20
20
  */
21
- function instructionParamsFactory(type, instructions) {
21
+ function instructionParamsFactory(type, instructions, coinName, instructionMetadata, _useTokenAddressTokenName) {
22
22
  switch (type) {
23
23
  case sdk_core_1.TransactionType.WalletInitialization:
24
24
  return parseWalletInitInstructions(instructions);
25
25
  case sdk_core_1.TransactionType.Send:
26
- return parseSendInstructions(instructions);
26
+ return parseSendInstructions(instructions, instructionMetadata, _useTokenAddressTokenName);
27
27
  case sdk_core_1.TransactionType.StakingActivate:
28
28
  return parseStakingActivateInstructions(instructions);
29
29
  case sdk_core_1.TransactionType.StakingDeactivate:
30
- return parseStakingDeactivateInstructions(instructions);
30
+ return parseStakingDeactivateInstructions(instructions, coinName);
31
31
  case sdk_core_1.TransactionType.StakingWithdraw:
32
32
  return parseStakingWithdrawInstructions(instructions);
33
33
  case sdk_core_1.TransactionType.AssociatedTokenAccountInitialization:
34
- return parseAtaInitInstructions(instructions);
34
+ return parseAtaInitInstructions(instructions, instructionMetadata, _useTokenAddressTokenName);
35
+ case sdk_core_1.TransactionType.CloseAssociatedTokenAccount:
36
+ return parseAtaCloseInstructions(instructions);
35
37
  case sdk_core_1.TransactionType.StakingAuthorize:
36
38
  return parseStakingAuthorizeInstructions(instructions);
37
39
  case sdk_core_1.TransactionType.StakingAuthorizeRaw:
38
40
  return parseStakingAuthorizeRawInstructions(instructions);
41
+ case sdk_core_1.TransactionType.StakingDelegate:
42
+ return parseStakingDelegateInstructions(instructions);
39
43
  default:
40
44
  throw new sdk_core_1.NotSupported('Invalid transaction, transaction type not supported: ' + type);
41
45
  }
42
46
  }
43
- exports.instructionParamsFactory = instructionParamsFactory;
44
47
  /**
45
48
  * Parses Solana instructions to Wallet initialization tx instructions params
46
49
  *
@@ -74,10 +77,10 @@ function parseWalletInitInstructions(instructions) {
74
77
  * @param {TransactionInstruction[]} instructions - an array of supported Solana instructions
75
78
  * @returns {InstructionParams[]} An array containing instruction params for Send tx
76
79
  */
77
- function parseSendInstructions(instructions) {
80
+ function parseSendInstructions(instructions, instructionMetadata, _useTokenAddressTokenName) {
78
81
  const instructionData = [];
79
82
  for (const instruction of instructions) {
80
- const type = utils_1.getInstructionType(instruction);
83
+ const type = (0, utils_1.getInstructionType)(instruction);
81
84
  switch (type) {
82
85
  case constants_1.ValidInstructionTypesEnum.Memo:
83
86
  const memo = { type: constants_1.InstructionBuilderTypes.Memo, params: { memo: instruction.data.toString() } };
@@ -107,8 +110,19 @@ function parseSendInstructions(instructions) {
107
110
  instructionData.push(transfer);
108
111
  break;
109
112
  case constants_1.ValidInstructionTypesEnum.TokenTransfer:
110
- const tokenTransferInstruction = spl_token_1.decodeTransferCheckedInstruction(instruction);
111
- const tokenName = findTokenName(tokenTransferInstruction.keys.mint.pubkey.toString());
113
+ let tokenTransferInstruction;
114
+ if (instruction.programId.toString() !== spl_token_1.TOKEN_2022_PROGRAM_ID.toString()) {
115
+ tokenTransferInstruction = (0, spl_token_1.decodeTransferCheckedInstruction)(instruction);
116
+ }
117
+ else {
118
+ tokenTransferInstruction = (0, spl_token_1.decodeTransferCheckedInstruction)(instruction, spl_token_1.TOKEN_2022_PROGRAM_ID);
119
+ }
120
+ const tokenAddress = tokenTransferInstruction.keys.mint.pubkey.toString();
121
+ const tokenName = findTokenName(tokenAddress, instructionMetadata, _useTokenAddressTokenName);
122
+ let programIDForTokenTransfer;
123
+ if (instruction.programId) {
124
+ programIDForTokenTransfer = instruction.programId.toString();
125
+ }
112
126
  const tokenTransfer = {
113
127
  type: constants_1.InstructionBuilderTypes.TokenTransfer,
114
128
  params: {
@@ -117,13 +131,20 @@ function parseSendInstructions(instructions) {
117
131
  amount: tokenTransferInstruction.data.amount.toString(),
118
132
  tokenName,
119
133
  sourceAddress: tokenTransferInstruction.keys.source.pubkey.toString(),
134
+ tokenAddress: tokenAddress,
135
+ programId: programIDForTokenTransfer,
136
+ decimalPlaces: tokenTransferInstruction.data.decimals,
120
137
  },
121
138
  };
122
139
  instructionData.push(tokenTransfer);
123
140
  break;
124
141
  case constants_1.ValidInstructionTypesEnum.InitializeAssociatedTokenAccount:
125
142
  const mintAddress = instruction.keys[ataInitInstructionKeysIndexes.MintAddress].pubkey.toString();
126
- const mintTokenName = findTokenName(mintAddress);
143
+ const mintTokenName = findTokenName(mintAddress, instructionMetadata, _useTokenAddressTokenName);
144
+ let programID;
145
+ if (instruction.programId) {
146
+ programID = instruction.programId.toString();
147
+ }
127
148
  const ataInit = {
128
149
  type: constants_1.InstructionBuilderTypes.CreateAssociatedTokenAccount,
129
150
  params: {
@@ -132,12 +153,37 @@ function parseSendInstructions(instructions) {
132
153
  ownerAddress: instruction.keys[ataInitInstructionKeysIndexes.OwnerAddress].pubkey.toString(),
133
154
  payerAddress: instruction.keys[ataInitInstructionKeysIndexes.PayerAddress].pubkey.toString(),
134
155
  tokenName: mintTokenName,
156
+ programId: programID,
135
157
  },
136
158
  };
137
159
  instructionData.push(ataInit);
138
160
  break;
161
+ case constants_1.ValidInstructionTypesEnum.CloseAssociatedTokenAccount:
162
+ const accountAddress = instruction.keys[closeAtaInstructionKeysIndexes.AccountAddress].pubkey.toString();
163
+ const destinationAddress = instruction.keys[closeAtaInstructionKeysIndexes.DestinationAddress].pubkey.toString();
164
+ const authorityAddress = instruction.keys[closeAtaInstructionKeysIndexes.AuthorityAddress].pubkey.toString();
165
+ const ataClose = {
166
+ type: constants_1.InstructionBuilderTypes.CloseAssociatedTokenAccount,
167
+ params: {
168
+ accountAddress,
169
+ destinationAddress,
170
+ authorityAddress,
171
+ },
172
+ };
173
+ instructionData.push(ataClose);
174
+ break;
175
+ case constants_1.ValidInstructionTypesEnum.SetPriorityFee:
176
+ const setComputeUnitPriceParams = web3_js_1.ComputeBudgetInstruction.decodeSetComputeUnitPrice(instruction);
177
+ const setPriorityFee = {
178
+ type: constants_1.InstructionBuilderTypes.SetPriorityFee,
179
+ params: {
180
+ fee: setComputeUnitPriceParams.microLamports,
181
+ },
182
+ };
183
+ instructionData.push(setPriorityFee);
184
+ break;
139
185
  default:
140
- throw new sdk_core_1.NotSupported('Invalid transaction, instruction type not supported: ' + utils_1.getInstructionType(instruction));
186
+ throw new sdk_core_1.NotSupported('Invalid transaction, instruction type not supported: ' + (0, utils_1.getInstructionType)(instruction));
141
187
  }
142
188
  }
143
189
  return instructionData;
@@ -150,11 +196,10 @@ function parseSendInstructions(instructions) {
150
196
  * @returns {InstructionParams[]} An array containing instruction params for staking activate tx
151
197
  */
152
198
  function parseStakingActivateInstructions(instructions) {
153
- var _a, _b, _c, _d;
154
199
  const instructionData = [];
155
200
  const stakingInstructions = {};
156
201
  for (const instruction of instructions) {
157
- const type = utils_1.getInstructionType(instruction);
202
+ const type = (0, utils_1.getInstructionType)(instruction);
158
203
  switch (type) {
159
204
  case constants_1.ValidInstructionTypesEnum.AdvanceNonceAccount:
160
205
  const advanceNonceInstruction = web3_js_1.SystemInstruction.decodeNonceAdvance(instruction);
@@ -186,24 +231,70 @@ function parseStakingActivateInstructions(instructions) {
186
231
  const stakingActivate = {
187
232
  type: constants_1.InstructionBuilderTypes.StakingActivate,
188
233
  params: {
189
- fromAddress: ((_a = stakingInstructions.create) === null || _a === void 0 ? void 0 : _a.fromPubkey.toString()) || '',
190
- stakingAddress: ((_b = stakingInstructions.initialize) === null || _b === void 0 ? void 0 : _b.stakePubkey.toString()) || '',
191
- amount: ((_c = stakingInstructions.create) === null || _c === void 0 ? void 0 : _c.lamports.toString()) || '',
192
- validator: ((_d = stakingInstructions.delegate) === null || _d === void 0 ? void 0 : _d.votePubkey.toString()) || '',
234
+ fromAddress: stakingInstructions.create?.fromPubkey.toString() || '',
235
+ stakingAddress: stakingInstructions.initialize?.stakePubkey.toString() || '',
236
+ amount: stakingInstructions.create?.lamports.toString() || '',
237
+ validator: stakingInstructions.delegate?.votePubkey.toString() ||
238
+ stakingInstructions.initialize?.authorized.staker.toString() ||
239
+ '',
240
+ isMarinade: stakingInstructions.delegate === undefined,
193
241
  },
194
242
  };
195
243
  instructionData.push(stakingActivate);
196
244
  return instructionData;
197
245
  }
246
+ /**
247
+ * Parses Solana instructions to create delegate tx
248
+ * Only supports Nonce, StakingDelegate
249
+ *
250
+ * @param {TransactionInstruction[]} instructions - an array of supported Solana instructions
251
+ * @returns {InstructionParams[]} An array containing instruction params for staking delegate tx
252
+ */
253
+ function parseStakingDelegateInstructions(instructions) {
254
+ const instructionData = [];
255
+ for (const instruction of instructions) {
256
+ const type = (0, utils_1.getInstructionType)(instruction);
257
+ switch (type) {
258
+ case constants_1.ValidInstructionTypesEnum.AdvanceNonceAccount:
259
+ const advanceNonceInstruction = web3_js_1.SystemInstruction.decodeNonceAdvance(instruction);
260
+ const nonce = {
261
+ type: constants_1.InstructionBuilderTypes.NonceAdvance,
262
+ params: {
263
+ walletNonceAddress: advanceNonceInstruction.noncePubkey.toString(),
264
+ authWalletAddress: advanceNonceInstruction.authorizedPubkey.toString(),
265
+ },
266
+ };
267
+ instructionData.push(nonce);
268
+ break;
269
+ case constants_1.ValidInstructionTypesEnum.StakingDelegate:
270
+ const stakingDelegateParams = web3_js_1.StakeInstruction.decodeDelegate(instruction);
271
+ const stakingDelegate = {
272
+ type: constants_1.InstructionBuilderTypes.StakingDelegate,
273
+ params: {
274
+ fromAddress: stakingDelegateParams.authorizedPubkey.toString() || '',
275
+ stakingAddress: stakingDelegateParams.stakePubkey.toString() || '',
276
+ validator: stakingDelegateParams.votePubkey.toString() || '',
277
+ },
278
+ };
279
+ instructionData.push(stakingDelegate);
280
+ break;
281
+ }
282
+ }
283
+ return instructionData;
284
+ }
198
285
  function validateStakingInstructions(stakingInstructions) {
199
286
  if (!stakingInstructions.create) {
200
287
  throw new sdk_core_1.NotSupported('Invalid staking activate transaction, missing create stake account instruction');
201
288
  }
202
- else if (!stakingInstructions.initialize) {
203
- throw new sdk_core_1.NotSupported('Invalid staking activate transaction, missing initialize stake account instruction');
289
+ if (!stakingInstructions.initialize && stakingInstructions.delegate) {
290
+ return;
204
291
  }
205
- else if (!stakingInstructions.delegate) {
206
- throw new sdk_core_1.NotSupported('Invalid staking activate transaction, missing delegate instruction');
292
+ else if (!stakingInstructions.delegate && stakingInstructions.initialize) {
293
+ return;
294
+ }
295
+ else if (!stakingInstructions.delegate && !stakingInstructions.initialize) {
296
+ // If both are missing something is wrong
297
+ throw new sdk_core_1.NotSupported('Invalid staking activate transaction, missing initialize stake account/delegate instruction');
207
298
  }
208
299
  }
209
300
  /**
@@ -220,12 +311,11 @@ function validateStakingInstructions(stakingInstructions) {
220
311
  * @param {TransactionInstruction[]} instructions - an array of supported Solana instructions
221
312
  * @returns {InstructionParams[]} An array containing instruction params for staking deactivate tx
222
313
  */
223
- function parseStakingDeactivateInstructions(instructions) {
224
- var _a, _b, _c, _d, _e;
314
+ function parseStakingDeactivateInstructions(instructions, coinName) {
225
315
  const instructionData = [];
226
- const unstakingInstructions = {};
316
+ const unstakingInstructions = [];
227
317
  for (const instruction of instructions) {
228
- const type = utils_1.getInstructionType(instruction);
318
+ const type = (0, utils_1.getInstructionType)(instruction);
229
319
  switch (type) {
230
320
  case constants_1.ValidInstructionTypesEnum.AdvanceNonceAccount:
231
321
  const advanceNonceInstruction = web3_js_1.SystemInstruction.decodeNonceAdvance(instruction);
@@ -246,39 +336,105 @@ function parseStakingDeactivateInstructions(instructions) {
246
336
  instructionData.push(memo);
247
337
  break;
248
338
  case constants_1.ValidInstructionTypesEnum.Allocate:
249
- unstakingInstructions.allocate = web3_js_1.SystemInstruction.decodeAllocate(instruction);
339
+ if (unstakingInstructions.length > 0 &&
340
+ unstakingInstructions[unstakingInstructions.length - 1].allocate === undefined) {
341
+ unstakingInstructions[unstakingInstructions.length - 1].allocate =
342
+ web3_js_1.SystemInstruction.decodeAllocate(instruction);
343
+ }
344
+ else {
345
+ unstakingInstructions.push({
346
+ allocate: web3_js_1.SystemInstruction.decodeAllocate(instruction),
347
+ });
348
+ }
250
349
  break;
251
350
  case constants_1.ValidInstructionTypesEnum.Assign:
252
- unstakingInstructions.assign = web3_js_1.SystemInstruction.decodeAssign(instruction);
351
+ if (unstakingInstructions.length > 0 &&
352
+ unstakingInstructions[unstakingInstructions.length - 1].assign === undefined) {
353
+ unstakingInstructions[unstakingInstructions.length - 1].assign = web3_js_1.SystemInstruction.decodeAssign(instruction);
354
+ }
355
+ else {
356
+ unstakingInstructions.push({
357
+ assign: web3_js_1.SystemInstruction.decodeAssign(instruction),
358
+ });
359
+ }
253
360
  break;
254
361
  case constants_1.ValidInstructionTypesEnum.Split:
255
- unstakingInstructions.split = web3_js_1.StakeInstruction.decodeSplit(instruction);
362
+ if (unstakingInstructions.length > 0 &&
363
+ unstakingInstructions[unstakingInstructions.length - 1].split === undefined) {
364
+ unstakingInstructions[unstakingInstructions.length - 1].split = web3_js_1.StakeInstruction.decodeSplit(instruction);
365
+ }
366
+ else {
367
+ unstakingInstructions.push({
368
+ split: web3_js_1.StakeInstruction.decodeSplit(instruction),
369
+ });
370
+ }
256
371
  break;
257
372
  case constants_1.ValidInstructionTypesEnum.StakingDeactivate:
258
- unstakingInstructions.deactivate = web3_js_1.StakeInstruction.decodeDeactivate(instruction);
373
+ if (unstakingInstructions.length > 0 &&
374
+ unstakingInstructions[unstakingInstructions.length - 1].deactivate === undefined) {
375
+ unstakingInstructions[unstakingInstructions.length - 1].deactivate =
376
+ web3_js_1.StakeInstruction.decodeDeactivate(instruction);
377
+ }
378
+ else {
379
+ unstakingInstructions.push({
380
+ deactivate: web3_js_1.StakeInstruction.decodeDeactivate(instruction),
381
+ });
382
+ }
383
+ break;
384
+ case constants_1.ValidInstructionTypesEnum.Transfer:
385
+ if (unstakingInstructions.length > 0 &&
386
+ unstakingInstructions[unstakingInstructions.length - 1].transfer === undefined) {
387
+ unstakingInstructions[unstakingInstructions.length - 1].transfer =
388
+ web3_js_1.SystemInstruction.decodeTransfer(instruction);
389
+ }
390
+ else {
391
+ unstakingInstructions.push({
392
+ transfer: web3_js_1.SystemInstruction.decodeTransfer(instruction),
393
+ });
394
+ }
259
395
  break;
260
396
  }
261
397
  }
262
- validateUnstakingInstructions(unstakingInstructions);
263
- const stakingDeactivate = {
264
- type: constants_1.InstructionBuilderTypes.StakingDeactivate,
265
- params: {
266
- fromAddress: ((_a = unstakingInstructions.deactivate) === null || _a === void 0 ? void 0 : _a.authorizedPubkey.toString()) || '',
267
- stakingAddress: ((_b = unstakingInstructions.split) === null || _b === void 0 ? void 0 : _b.stakePubkey.toString()) ||
268
- ((_c = unstakingInstructions.deactivate) === null || _c === void 0 ? void 0 : _c.stakePubkey.toString()) ||
269
- '',
270
- amount: (_d = unstakingInstructions.split) === null || _d === void 0 ? void 0 : _d.lamports.toString(),
271
- unstakingAddress: (_e = unstakingInstructions.split) === null || _e === void 0 ? void 0 : _e.splitStakePubkey.toString(),
272
- },
273
- };
274
- instructionData.push(stakingDeactivate);
398
+ for (const unstakingInstruction of unstakingInstructions) {
399
+ validateUnstakingInstructions(unstakingInstruction);
400
+ const stakingDeactivate = {
401
+ type: constants_1.InstructionBuilderTypes.StakingDeactivate,
402
+ params: {
403
+ fromAddress: unstakingInstruction.deactivate?.authorizedPubkey.toString() || '',
404
+ stakingAddress: unstakingInstruction.split?.stakePubkey.toString() ||
405
+ unstakingInstruction.deactivate?.stakePubkey.toString() ||
406
+ '',
407
+ amount: unstakingInstruction.split?.lamports.toString(),
408
+ unstakingAddress: unstakingInstruction.split?.splitStakePubkey.toString(),
409
+ isMarinade: unstakingInstruction.deactivate === undefined,
410
+ recipients: unstakingInstruction.deactivate === undefined
411
+ ? [
412
+ {
413
+ address: unstakingInstruction.transfer?.toPubkey.toString() || '',
414
+ amount: unstakingInstruction.transfer?.lamports.toString() || '',
415
+ },
416
+ ]
417
+ : undefined,
418
+ },
419
+ };
420
+ instructionData.push(stakingDeactivate);
421
+ }
275
422
  return instructionData;
276
423
  }
277
424
  function validateUnstakingInstructions(unstakingInstructions) {
278
425
  if (!unstakingInstructions.deactivate) {
426
+ if (unstakingInstructions.transfer &&
427
+ !unstakingInstructions.allocate &&
428
+ !unstakingInstructions.assign &&
429
+ !unstakingInstructions.split) {
430
+ return;
431
+ }
279
432
  throw new sdk_core_1.NotSupported('Invalid deactivate stake transaction, missing deactivate stake account instruction');
280
433
  }
281
- else if (unstakingInstructions.allocate || unstakingInstructions.assign || unstakingInstructions.split) {
434
+ else if (unstakingInstructions.allocate ||
435
+ unstakingInstructions.assign ||
436
+ unstakingInstructions.split ||
437
+ unstakingInstructions.transfer) {
282
438
  if (!unstakingInstructions.allocate) {
283
439
  throw new sdk_core_1.NotSupported('Invalid partial deactivate stake transaction, missing allocate unstake account instruction');
284
440
  }
@@ -304,6 +460,9 @@ function validateUnstakingInstructions(unstakingInstructions) {
304
460
  else if (unstakingInstructions.split.stakePubkey.toString() === unstakingInstructions.split.splitStakePubkey.toString()) {
305
461
  throw new sdk_core_1.NotSupported('Invalid partial deactivate stake transaction, the unstaking account must be different from the Stake Account');
306
462
  }
463
+ else if (!unstakingInstructions.transfer) {
464
+ throw new sdk_core_1.NotSupported('Invalid partial deactivate stake transaction, missing funding of unstake address instruction');
465
+ }
307
466
  }
308
467
  }
309
468
  /**
@@ -316,7 +475,7 @@ function validateUnstakingInstructions(unstakingInstructions) {
316
475
  function parseStakingWithdrawInstructions(instructions) {
317
476
  const instructionData = [];
318
477
  for (const instruction of instructions) {
319
- const type = utils_1.getInstructionType(instruction);
478
+ const type = (0, utils_1.getInstructionType)(instruction);
320
479
  switch (type) {
321
480
  case constants_1.ValidInstructionTypesEnum.AdvanceNonceAccount:
322
481
  const advanceNonceInstruction = web3_js_1.SystemInstruction.decodeNonceAdvance(instruction);
@@ -374,17 +533,22 @@ const ataInitInstructionKeysIndexes = {
374
533
  OwnerAddress: 2,
375
534
  MintAddress: 3,
376
535
  };
536
+ const closeAtaInstructionKeysIndexes = {
537
+ AccountAddress: 0,
538
+ DestinationAddress: 1,
539
+ AuthorityAddress: 2,
540
+ };
377
541
  /**
378
542
  * Parses Solana instructions to initialize associated token account tx instructions params
379
543
  *
380
544
  * @param {TransactionInstruction[]} instructions - an array of supported Solana instructions
381
545
  * @returns {InstructionParams[]} An array containing instruction params for Send tx
382
546
  */
383
- function parseAtaInitInstructions(instructions) {
547
+ function parseAtaInitInstructions(instructions, instructionMetadata, _useTokenAddressTokenName) {
384
548
  const instructionData = [];
385
549
  let memo;
386
550
  for (const instruction of instructions) {
387
- const type = utils_1.getInstructionType(instruction);
551
+ const type = (0, utils_1.getInstructionType)(instruction);
388
552
  switch (type) {
389
553
  case constants_1.ValidInstructionTypesEnum.Memo:
390
554
  memo = { type: constants_1.InstructionBuilderTypes.Memo, params: { memo: instruction.data.toString() } };
@@ -402,7 +566,11 @@ function parseAtaInitInstructions(instructions) {
402
566
  break;
403
567
  case constants_1.ValidInstructionTypesEnum.InitializeAssociatedTokenAccount:
404
568
  const mintAddress = instruction.keys[ataInitInstructionKeysIndexes.MintAddress].pubkey.toString();
405
- const tokenName = findTokenName(mintAddress);
569
+ const tokenName = findTokenName(mintAddress, instructionMetadata, _useTokenAddressTokenName);
570
+ let programID;
571
+ if (instruction.programId) {
572
+ programID = instruction.programId.toString();
573
+ }
406
574
  const ataInit = {
407
575
  type: constants_1.InstructionBuilderTypes.CreateAssociatedTokenAccount,
408
576
  params: {
@@ -411,12 +579,13 @@ function parseAtaInitInstructions(instructions) {
411
579
  ownerAddress: instruction.keys[ataInitInstructionKeysIndexes.OwnerAddress].pubkey.toString(),
412
580
  payerAddress: instruction.keys[ataInitInstructionKeysIndexes.PayerAddress].pubkey.toString(),
413
581
  tokenName,
582
+ programId: programID,
414
583
  },
415
584
  };
416
585
  instructionData.push(ataInit);
417
586
  break;
418
587
  default:
419
- throw new sdk_core_1.NotSupported('Invalid transaction, instruction type not supported: ' + utils_1.getInstructionType(instruction));
588
+ throw new sdk_core_1.NotSupported('Invalid transaction, instruction type not supported: ' + (0, utils_1.getInstructionType)(instruction));
420
589
  }
421
590
  }
422
591
  if (memo) {
@@ -424,6 +593,50 @@ function parseAtaInitInstructions(instructions) {
424
593
  }
425
594
  return instructionData;
426
595
  }
596
+ const ataCloseInstructionKeysIndexes = {
597
+ AccountAddress: 0,
598
+ DestinationAddress: 1,
599
+ AuthorityAddress: 2,
600
+ };
601
+ /**
602
+ * Parses Solana instructions to close associated token account tx instructions params
603
+ *
604
+ * @param {TransactionInstruction[]} instructions - an array of supported Solana instructions
605
+ * @returns {InstructionParams[]} An array containing instruction params for Send tx
606
+ */
607
+ function parseAtaCloseInstructions(instructions) {
608
+ const instructionData = [];
609
+ for (const instruction of instructions) {
610
+ const type = (0, utils_1.getInstructionType)(instruction);
611
+ switch (type) {
612
+ case constants_1.ValidInstructionTypesEnum.AdvanceNonceAccount:
613
+ const advanceNonceInstruction = web3_js_1.SystemInstruction.decodeNonceAdvance(instruction);
614
+ const nonce = {
615
+ type: constants_1.InstructionBuilderTypes.NonceAdvance,
616
+ params: {
617
+ walletNonceAddress: advanceNonceInstruction.noncePubkey.toString(),
618
+ authWalletAddress: advanceNonceInstruction.authorizedPubkey.toString(),
619
+ },
620
+ };
621
+ instructionData.push(nonce);
622
+ break;
623
+ case constants_1.ValidInstructionTypesEnum.CloseAssociatedTokenAccount:
624
+ const ataClose = {
625
+ type: constants_1.InstructionBuilderTypes.CloseAssociatedTokenAccount,
626
+ params: {
627
+ accountAddress: instruction.keys[ataCloseInstructionKeysIndexes.AccountAddress].pubkey.toString(),
628
+ destinationAddress: instruction.keys[ataCloseInstructionKeysIndexes.DestinationAddress].pubkey.toString(),
629
+ authorityAddress: instruction.keys[ataCloseInstructionKeysIndexes.AuthorityAddress].pubkey.toString(),
630
+ },
631
+ };
632
+ instructionData.push(ataClose);
633
+ break;
634
+ default:
635
+ throw new sdk_core_1.NotSupported('Invalid transaction, instruction type not supported: ' + (0, utils_1.getInstructionType)(instruction));
636
+ }
637
+ }
638
+ return instructionData;
639
+ }
427
640
  /**
428
641
  * Parses Solana instructions to authorized staking account params
429
642
  * Only supports Nonce, Authorize instructions
@@ -432,10 +645,9 @@ function parseAtaInitInstructions(instructions) {
432
645
  * @returns {InstructionParams[]} An array containing instruction params for staking authorize tx
433
646
  */
434
647
  function parseStakingAuthorizeInstructions(instructions) {
435
- var _a;
436
648
  const instructionData = [];
437
649
  for (const instruction of instructions) {
438
- const type = utils_1.getInstructionType(instruction);
650
+ const type = (0, utils_1.getInstructionType)(instruction);
439
651
  switch (type) {
440
652
  case constants_1.ValidInstructionTypesEnum.AdvanceNonceAccount:
441
653
  const advanceNonceInstruction = web3_js_1.SystemInstruction.decodeNonceAdvance(instruction);
@@ -460,7 +672,7 @@ function parseStakingAuthorizeInstructions(instructions) {
460
672
  stakingAddress: authorize.stakePubkey.toString(),
461
673
  oldAuthorizeAddress: authorize.authorizedPubkey.toString(),
462
674
  newAuthorizeAddress: authorize.newAuthorizedPubkey.toString(),
463
- newWithdrawAddress: ((_a = authorize.custodianPubkey) === null || _a === void 0 ? void 0 : _a.toString()) || '',
675
+ newWithdrawAddress: authorize.custodianPubkey?.toString() || '',
464
676
  },
465
677
  });
466
678
  break;
@@ -477,7 +689,7 @@ function parseStakingAuthorizeInstructions(instructions) {
477
689
  */
478
690
  function parseStakingAuthorizeRawInstructions(instructions) {
479
691
  const instructionData = [];
480
- assert_1.default(instructions.length === 2, 'Invalid number of instructions');
692
+ (0, assert_1.default)(instructions.length === 2, 'Invalid number of instructions');
481
693
  const advanceNonceInstruction = web3_js_1.SystemInstruction.decodeNonceAdvance(instructions[0]);
482
694
  const nonce = {
483
695
  type: constants_1.InstructionBuilderTypes.NonceAdvance,
@@ -488,7 +700,7 @@ function parseStakingAuthorizeRawInstructions(instructions) {
488
700
  };
489
701
  instructionData.push(nonce);
490
702
  const authorize = instructions[1];
491
- assert_1.default(authorize.keys.length === 5, 'Invalid number of keys in authorize instruction');
703
+ (0, assert_1.default)(authorize.keys.length === 5, 'Invalid number of keys in authorize instruction');
492
704
  instructionData.push({
493
705
  type: constants_1.InstructionBuilderTypes.StakingAuthorize,
494
706
  params: {
@@ -500,14 +712,29 @@ function parseStakingAuthorizeRawInstructions(instructions) {
500
712
  });
501
713
  return instructionData;
502
714
  }
503
- function findTokenName(mintAddress) {
715
+ function findTokenName(mintAddress, instructionMetadata, _useTokenAddressTokenName) {
504
716
  let token;
505
717
  statics_1.coins.forEach((value, key) => {
506
718
  if (value instanceof statics_1.SolCoin && value.tokenAddress === mintAddress) {
507
719
  token = value.name;
508
720
  }
509
721
  });
510
- assert_1.default(token);
722
+ if (!token && instructionMetadata) {
723
+ instructionMetadata.forEach((instruction) => {
724
+ if (instruction.type === constants_1.InstructionBuilderTypes.CreateAssociatedTokenAccount &&
725
+ instruction.params.mintAddress === mintAddress) {
726
+ token = instruction.params.tokenName;
727
+ }
728
+ else if (instruction.type === constants_1.InstructionBuilderTypes.TokenTransfer &&
729
+ instruction.params.tokenAddress === mintAddress) {
730
+ token = instruction.params.tokenName;
731
+ }
732
+ });
733
+ }
734
+ if (!token && _useTokenAddressTokenName) {
735
+ token = mintAddress;
736
+ }
737
+ (0, assert_1.default)(token);
511
738
  return token;
512
739
  }
513
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdHJ1Y3Rpb25QYXJhbXNGYWN0b3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9pbnN0cnVjdGlvblBhcmFtc0ZhY3RvcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsNkNBYXlCO0FBQ3pCLGlEQUFxRTtBQUVyRSxtREFBcUU7QUFDckUsMkNBQStHO0FBYy9HLG1DQUE2QztBQUM3QyxvREFBNEI7QUFDNUIsaURBQXFEO0FBRXJEOzs7Ozs7R0FNRztBQUNILFNBQWdCLHdCQUF3QixDQUN0QyxJQUFxQixFQUNyQixZQUFzQztJQUV0QyxRQUFRLElBQUksRUFBRTtRQUNaLEtBQUssMEJBQWUsQ0FBQyxvQkFBb0I7WUFDdkMsT0FBTywyQkFBMkIsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNuRCxLQUFLLDBCQUFlLENBQUMsSUFBSTtZQUN2QixPQUFPLHFCQUFxQixDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzdDLEtBQUssMEJBQWUsQ0FBQyxlQUFlO1lBQ2xDLE9BQU8sZ0NBQWdDLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDeEQsS0FBSywwQkFBZSxDQUFDLGlCQUFpQjtZQUNwQyxPQUFPLGtDQUFrQyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzFELEtBQUssMEJBQWUsQ0FBQyxlQUFlO1lBQ2xDLE9BQU8sZ0NBQWdDLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDeEQsS0FBSywwQkFBZSxDQUFDLG9DQUFvQztZQUN2RCxPQUFPLHdCQUF3QixDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ2hELEtBQUssMEJBQWUsQ0FBQyxnQkFBZ0I7WUFDbkMsT0FBTyxpQ0FBaUMsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN6RCxLQUFLLDBCQUFlLENBQUMsbUJBQW1CO1lBQ3RDLE9BQU8sb0NBQW9DLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDNUQ7WUFDRSxNQUFNLElBQUksdUJBQVksQ0FBQyx1REFBdUQsR0FBRyxJQUFJ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QUssQ0FBQyxZQUFZLEtBQUssV0FBVyxFQUFFO1lBQ2xFLEtBQUssR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDO1NBQ3BCO0lBQ0gsQ0FBQyxDQUFDLENBQUM7SUFFSCxnQkFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRWQsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWxsb2NhdGVQYXJhbXMsXG4gIEFzc2lnblBhcmFtcyxcbiAgQXV0aG9yaXplU3Rha2VQYXJhbXMsXG4gIENyZWF0ZUFjY291bnRQYXJhbXMsXG4gIERlYWN0aXZhdGVTdGFrZVBhcmFtcyxcbiAgRGVsZWdhdGVTdGFrZVBhcmFtcyxcbiAgSW5pdGlhbGl6ZVN0YWtlUGFyYW1zLFxuICBTcGxpdFN0YWtlUGFyYW1zLFxuICBTdGFrZUluc3RydWN0aW9uLFxuICBTdGFrZVByb2dyYW0sXG4gIFN5c3RlbUluc3RydWN0aW9uLFxuICBUcmFuc2FjdGlvbkluc3RydWN0aW9uLFxufSBmcm9tICdAc29sYW5hL3dlYjMuanMnO1xuaW1wb3J0IHsgZGVjb2RlVHJhbnNmZXJDaGVja2VkSW5zdHJ1Y3Rpb24gfSBmcm9tICdAc29sYW5hL3NwbC10b2tlbic7XG5cbmltcG9ydCB7IFRyYW5zYWN0aW9uVHlwZSwgTm90U3VwcG9ydGVkIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMsIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0sIHdhbGxldEluaXRJbnN0cnVjdGlvbkluZGV4ZXMgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQge1xuICBBdGFJbml0LFxuICBJbnN0cnVjdGlvblBhcmFtcyxcbiAgV2FsbGV0SW5pdCxcbiAgVHJhbnNmZXIsXG4gIE5vbmNlLFxuICBNZW1vLFxuICBTdGFraW5nQWN0aXZhdGUsXG4gIFN0YWtpbmdEZWFjdGl2YXRlLFxuICBTdGFraW5nV2l0aGRyYXcsXG4gIFRva2VuVHJhbnNmZXIsXG4gIFN0YWtpbmdBdXRob3JpemUsXG59IGZyb20gJy4vaWZhY2UnO1xuaW1wb3J0IHsgZ2V0SW5zdHJ1Y3Rpb25UeXBlIH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgeyBjb2lucywgU29sQ29pbiB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuXG4vKipcbiAqIENvbnN0cnVjdCBpbnN0cnVjdGlvbnMgcGFyYW1zIGZyb20gU29sYW5hIGluc3RydWN0aW9uc1xuICpcbiAqIEBwYXJhbSB7VHJhbnNhY3Rpb25UeXBlfSB0eXBlIC0gdGhlIHRyYW5zYWN0aW9uIHR5cGVcbiAqIEBwYXJhbSB7VHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdfSBpbnN0cnVjdGlvbnMgLSBzb2xhbmEgaW5zdHJ1Y3Rpb25zXG4gKiBAcmV0dXJucyB7SW5zdHJ1Y3Rpb25QYXJhbXNbXX0gQW4gYXJyYXkgY29udGFpbmluZyBpbnN0cnVjdGlvbiBwYXJhbXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluc3RydWN0aW9uUGFyYW1zRmFjdG9yeShcbiAgdHlwZTogVHJhbnNhY3Rpb25UeXBlLFxuICBpbnN0cnVjdGlvbnM6IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXVxuKTogSW5zdHJ1Y3Rpb25QYXJhbXNbXSB7XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLldhbGxldEluaXRpYWxpemF0aW9uOlxuICAgICAgcmV0dXJuIHBhcnNlV2FsbGV0SW5pdEluc3RydWN0aW9ucyhpbnN0cnVjdGlvbnMpO1xuICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLlNlbmQ6XG4gICAgICByZXR1cm4gcGFyc2VTZW5kSW5zdHJ1Y3Rpb25zKGluc3RydWN0aW9ucyk7XG4gICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0FjdGl2YXRlOlxuICAgICAgcmV0dXJuIHBhcnNlU3Rha2luZ0FjdGl2YXRlSW5zdHJ1Y3Rpb25zKGluc3RydWN0aW9ucyk7XG4gICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0RlYWN0aXZhdGU6XG4gICAgICByZXR1cm4gcGFyc2VTdGFraW5nRGVhY3RpdmF0ZUluc3RydWN0aW9ucyhpbnN0cnVjdGlvbnMpO1xuICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdXaXRoZHJhdzpcbiAgICAgIHJldHVybiBwYXJzZVN0YWtpbmdXaXRoZHJhd0luc3RydWN0aW9ucyhpbnN0cnVjdGlvbnMpO1xuICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLkFzc29jaWF0ZWRUb2tlbkFjY291bnRJbml0aWFsaXphdGlvbjpcbiAgICAgIHJldHVybiBwYXJzZUF0YUluaXRJbnN0cnVjdGlvbnMoaW5zdHJ1Y3Rpb25zKTtcbiAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nQXV0aG9yaXplOlxuICAgICAgcmV0dXJuIHBhcnNlU3Rha2luZ0F1dGhvcml6ZUluc3RydWN0aW9ucyhpbnN0cnVjdGlvbnMpO1xuICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdBdXRob3JpemVSYXc6XG4gICAgICByZXR1cm4gcGFyc2VTdGFraW5nQXV0aG9yaXplUmF3SW5zdHJ1Y3Rpb25zKGluc3RydWN0aW9ucyk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWQoJ0ludmFsaWQgdHJhbnNhY3Rpb24sIHRyYW5zYWN0aW9uIHR5cGUgbm90IHN1cHBvcnRlZDogJyArIHR5cGUpO1xuICB9XG59XG5cbi8qKlxuICogUGFyc2VzIFNvbGFuYSBpbnN0cnVjdGlvbnMgdG8gV2FsbGV0IGluaXRpYWxpemF0aW9uIHR4IGluc3RydWN0aW9ucyBwYXJhbXNcbiAqXG4gKiBAcGFyYW0ge1RyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXX0gaW5zdHJ1Y3Rpb25zIC0gY29udGFpbmluZyBjcmVhdGUgYW5kIGluaXRpYWxpemUgbm9uY2Ugc29sYW5hIGluc3RydWN0aW9uc1xuICogQHJldHVybnMge0luc3RydWN0aW9uUGFyYW1zW119IEFuIGFycmF5IGNvbnRhaW5pbmcgaW5zdHJ1Y3Rpb24gcGFyYW1zIGZvciBXYWxsZXQgaW5pdGlhbGl6YXRpb24gdHhcbiAqL1xuZnVuY3Rpb24gcGFyc2VXYWxsZXRJbml0SW5zdHJ1Y3Rpb25zKGluc3RydWN0aW9uczogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdKTogQXJyYXk8V2FsbGV0SW5pdCB8IE1lbW8+IHtcbiAgY29uc3QgaW5zdHJ1Y3Rpb25EYXRhOiBBcnJheTxXYWxsZXRJbml0IHwgTWVtbz4gPSBbXTtcbiAgY29uc3QgY3JlYXRlSW5zdHJ1Y3Rpb24gPSBTeXN0ZW1JbnN0cnVjdGlvbi5kZWNvZGVDcmVhdGVBY2NvdW50KGluc3RydWN0aW9uc1t3YWxsZXRJbml0SW5zdHJ1Y3Rpb25JbmRleGVzLkNyZWF0ZV0pO1xuICBjb25zdCBub25jZUluaXRJbnN0cnVjdGlvbiA9IFN5c3RlbUluc3RydWN0aW9uLmRlY29kZU5vbmNlSW5pdGlhbGl6ZShcbiAgICBpbnN0cnVjdGlvbnNbd2FsbGV0SW5pdEluc3RydWN0aW9uSW5kZXhlcy5Jbml0aWFsaXplTm9uY2VBY2NvdW50XVxuICApO1xuXG4gIGNvbnN0IHdhbGxldEluaXQ6IFdhbGxldEluaXQgPSB7XG4gICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuQ3JlYXRlTm9uY2VBY2NvdW50LFxuICAgIHBhcmFtczoge1xuICAgICAgZnJvbUFkZHJlc3M6IGNyZWF0ZUluc3RydWN0aW9uLmZyb21QdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgIG5vbmNlQWRkcmVzczogbm9uY2VJbml0SW5zdHJ1Y3Rpb24ubm9uY2VQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgIGF1dGhBZGRyZXNzOiBub25jZUluaXRJbnN0cnVjdGlvbi5hdXRob3JpemVkUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICBhbW91bnQ6IGNyZWF0ZUluc3RydWN0aW9uLmxhbXBvcnRzLnRvU3RyaW5nKCksXG4gICAgfSxcbiAgfTtcbiAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2god2FsbGV0SW5pdCk7XG5cbiAgY29uc3QgbWVtbyA9IGdldE1lbW8oaW5zdHJ1Y3Rpb25zLCB3YWxsZXRJbml0SW5zdHJ1Y3Rpb25JbmRleGVzKTtcbiAgaWYgKG1lbW8pIHtcbiAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChtZW1vKTtcbiAgfVxuXG4gIHJldHVybiBpbnN0cnVjdGlvbkRhdGE7XG59XG5cbi8qKlxuICogUGFyc2VzIFNvbGFuYSBpbnN0cnVjdGlvbnMgdG8gU2VuZCB0eCBpbnN0cnVjdGlvbnMgcGFyYW1zXG4gKiBPbmx5IHN1cHBvcnRzIE1lbW8sIFRyYW5zZmVyIGFuZCBBZHZhbmNlIE5vbmNlIFNvbGFuYSBpbnN0cnVjdGlvbnNcbiAqXG4gKiBAcGFyYW0ge1RyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXX0gaW5zdHJ1Y3Rpb25zIC0gYW4gYXJyYXkgb2Ygc3VwcG9ydGVkIFNvbGFuYSBpbnN0cnVjdGlvbnNcbiAqIEByZXR1cm5zIHtJbnN0cnVjdGlvblBhcmFtc1tdfSBBbiBhcnJheSBjb250YWluaW5nIGluc3RydWN0aW9uIHBhcmFtcyBmb3IgU2VuZCB0eFxuICovXG5mdW5jdGlvbiBwYXJzZVNlbmRJbnN0cnVjdGlvbnMoXG4gIGluc3RydWN0aW9uczogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdXG4pOiBBcnJheTxOb25jZSB8IE1lbW8gfCBUcmFuc2ZlciB8IFRva2VuVHJhbnNmZXIgfCBBdGFJbml0PiB7XG4gIGNvbnN0IGluc3RydWN0aW9uRGF0YTogQXJyYXk8Tm9uY2UgfCBNZW1vIHwgVHJhbnNmZXIgfCBUb2tlblRyYW5zZmVyIHwgQXRhSW5pdD4gPSBbXTtcbiAgZm9yIChjb25zdCBpbnN0cnVjdGlvbiBvZiBpbnN0cnVjdGlvbnMpIHtcbiAgICBjb25zdCB0eXBlID0gZ2V0SW5zdHJ1Y3Rpb25UeXBlKGluc3RydWN0aW9uKTtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5NZW1vOlxuICAgICAgICBjb25zdCBtZW1vOiBNZW1vID0geyB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5NZW1vLCBwYXJhbXM6IHsgbWVtbzogaW5zdHJ1Y3Rpb24uZGF0YS50b1N0cmluZygpIH0gfTtcbiAgICAgICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2gobWVtbyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLkFkdmFuY2VOb25jZUFjY291bnQ6XG4gICAgICAgIGNvbnN0IGFkdmFuY2VOb25jZUluc3RydWN0aW9uID0gU3lzdGVtSW5zdHJ1Y3Rpb24uZGVjb2RlTm9uY2VBZHZhbmNlKGluc3RydWN0aW9uKTtcbiAgICAgICAgY29uc3Qgbm9uY2U6IE5vbmNlID0ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLk5vbmNlQWR2YW5jZSxcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIHdhbGxldE5vbmNlQWRkcmVzczogYWR2YW5jZU5vbmNlSW5zdHJ1Y3Rpb24ubm9uY2VQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGF1dGhXYWxsZXRBZGRyZXNzOiBhZHZhbmNlTm9uY2VJbnN0cnVjdGlvbi5hdXRob3JpemVkUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2gobm9uY2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5UcmFuc2ZlcjpcbiAgICAgICAgY29uc3QgdHJhbnNmZXJJbnN0cnVjdGlvbiA9IFN5c3RlbUluc3RydWN0aW9uLmRlY29kZVRyYW5zZmVyKGluc3RydWN0aW9uKTtcbiAgICAgICAgY29uc3QgdHJhbnNmZXI6IFRyYW5zZmVyID0ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlRyYW5zZmVyLFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgZnJvbUFkZHJlc3M6IHRyYW5zZmVySW5zdHJ1Y3Rpb24uZnJvbVB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgdG9BZGRyZXNzOiB0cmFuc2Zlckluc3RydWN0aW9uLnRvUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBhbW91bnQ6IHRyYW5zZmVySW5zdHJ1Y3Rpb24ubGFtcG9ydHMudG9TdHJpbmcoKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaCh0cmFuc2Zlcik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLlRva2VuVHJhbnNmZXI6XG4gICAgICAgIGNvbnN0IHRva2VuVHJhbnNmZXJJbnN0cnVjdGlvbiA9IGRlY29kZVRyYW5zZmVyQ2hlY2tlZEluc3RydWN0aW9uKGluc3RydWN0aW9uKTtcbiAgICAgICAgY29uc3QgdG9rZW5OYW1lID0gZmluZFRva2VuTmFtZSh0b2tlblRyYW5zZmVySW5zdHJ1Y3Rpb24ua2V5cy5taW50LnB1YmtleS50b1N0cmluZygpKTtcbiAgICAgICAgY29uc3QgdG9rZW5UcmFuc2ZlcjogVG9rZW5UcmFuc2ZlciA9IHtcbiAgICAgICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5Ub2tlblRyYW5zZmVyLFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgZnJvbUFkZHJlc3M6IHRva2VuVHJhbnNmZXJJbnN0cnVjdGlvbi5rZXlzLm93bmVyLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgdG9BZGRyZXNzOiB0b2tlblRyYW5zZmVySW5zdHJ1Y3Rpb24ua2V5cy5kZXN0aW5hdGlvbi5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGFtb3VudDogdG9rZW5UcmFuc2Zlckluc3RydWN0aW9uLmRhdGEuYW1vdW50LnRvU3RyaW5nKCksXG4gICAgICAgICAgICB0b2tlbk5hbWUsXG4gICAgICAgICAgICBzb3VyY2VBZGRyZXNzOiB0b2tlblRyYW5zZmVySW5zdHJ1Y3Rpb24ua2V5cy5zb3VyY2UucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2godG9rZW5UcmFuc2Zlcik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLkluaXRpYWxpemVBc3NvY2lhdGVkVG9rZW5BY2NvdW50OlxuICAgICAgICBjb25zdCBtaW50QWRkcmVzcyA9IGluc3RydWN0aW9uLmtleXNbYXRhSW5pdEluc3RydWN0aW9uS2V5c0luZGV4ZXMuTWludEFkZHJlc3NdLnB1YmtleS50b1N0cmluZygpO1xuICAgICAgICBjb25zdCBtaW50VG9rZW5OYW1lID0gZmluZFRva2VuTmFtZShtaW50QWRkcmVzcyk7XG5cbiAgICAgICAgY29uc3QgYXRhSW5pdDogQXRhSW5pdCA9IHtcbiAgICAgICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5DcmVhdGVBc3NvY2lhdGVkVG9rZW5BY2NvdW50LFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgbWludEFkZHJlc3MsXG4gICAgICAgICAgICBhdGFBZGRyZXNzOiBpbnN0cnVjdGlvbi5rZXlzW2F0YUluaXRJbnN0cnVjdGlvbktleXNJbmRleGVzLkFUQUFkZHJlc3NdLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgb3duZXJBZGRyZXNzOiBpbnN0cnVjdGlvbi5rZXlzW2F0YUluaXRJbnN0cnVjdGlvbktleXNJbmRleGVzLk93bmVyQWRkcmVzc10ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBwYXllckFkZHJlc3M6IGluc3RydWN0aW9uLmtleXNbYXRhSW5pdEluc3RydWN0aW9uS2V5c0luZGV4ZXMuUGF5ZXJBZGRyZXNzXS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIHRva2VuTmFtZTogbWludFRva2VuTmFtZSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChhdGFJbml0KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkKFxuICAgICAgICAgICdJbnZhbGlkIHRyYW5zYWN0aW9uLCBpbnN0cnVjdGlvbiB0eXBlIG5vdCBzdXBwb3J0ZWQ6ICcgKyBnZXRJbnN0cnVjdGlvblR5cGUoaW5zdHJ1Y3Rpb24pXG4gICAgICAgICk7XG4gICAgfVxuICB9XG4gIHJldHVybiBpbnN0cnVjdGlvbkRhdGE7XG59XG5cbi8qKlxuICogUGFyc2VzIFNvbGFuYSBpbnN0cnVjdGlvbnMgdG8gY3JlYXRlIHN0YWtpbmcgdHggYW5kIGRlbGVnYXRlIHR4IGluc3RydWN0aW9ucyBwYXJhbXNcbiAqIE9ubHkgc3VwcG9ydHMgTm9uY2UsIFN0YWtpbmdBY3RpdmF0ZSBhbmQgTWVtbyBTb2xhbmEgaW5zdHJ1Y3Rpb25zXG4gKlxuICogQHBhcmFtIHtUcmFuc2FjdGlvbkluc3RydWN0aW9uW119IGluc3RydWN0aW9ucyAtIGFuIGFycmF5IG9mIHN1cHBvcnRlZCBTb2xhbmEgaW5zdHJ1Y3Rpb25zXG4gKiBAcmV0dXJucyB7SW5zdHJ1Y3Rpb25QYXJhbXNbXX0gQW4gYXJyYXkgY29udGFpbmluZyBpbnN0cnVjdGlvbiBwYXJhbXMgZm9yIHN0YWtpbmcgYWN0aXZhdGUgdHhcbiAqL1xuZnVuY3Rpb24gcGFyc2VTdGFraW5nQWN0aXZhdGVJbnN0cnVjdGlvbnMoXG4gIGluc3RydWN0aW9uczogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdXG4pOiBBcnJheTxOb25jZSB8IFN0YWtpbmdBY3RpdmF0ZSB8IE1lbW8+IHtcbiAgY29uc3QgaW5zdHJ1Y3Rpb25EYXRhOiBBcnJheTxOb25jZSB8IFN0YWtpbmdBY3RpdmF0ZSB8IE1lbW8+ID0gW107XG4gIGNvbnN0IHN0YWtpbmdJbnN0cnVjdGlvbnMgPSB7fSBhcyBTdGFraW5nSW5zdHJ1Y3Rpb25zO1xuICBmb3IgKGNvbnN0IGluc3RydWN0aW9uIG9mIGluc3RydWN0aW9ucykge1xuICAgIGNvbnN0IHR5cGUgPSBnZXRJbnN0cnVjdGlvblR5cGUoaW5zdHJ1Y3Rpb24pO1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLkFkdmFuY2VOb25jZUFjY291bnQ6XG4gICAgICAgIGNvbnN0IGFkdmFuY2VOb25jZUluc3RydWN0aW9uID0gU3lzdGVtSW5zdHJ1Y3Rpb24uZGVjb2RlTm9uY2VBZHZhbmNlKGluc3RydWN0aW9uKTtcbiAgICAgICAgY29uc3Qgbm9uY2U6IE5vbmNlID0ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLk5vbmNlQWR2YW5jZSxcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIHdhbGxldE5vbmNlQWRkcmVzczogYWR2YW5jZU5vbmNlSW5zdHJ1Y3Rpb24ubm9uY2VQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGF1dGhXYWxsZXRBZGRyZXNzOiBhZHZhbmNlTm9uY2VJbnN0cnVjdGlvbi5hdXRob3JpemVkUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2gobm9uY2UpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLk1lbW86XG4gICAgICAgIGNvbnN0IG1lbW86IE1lbW8gPSB7IHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLk1lbW8sIHBhcmFtczogeyBtZW1vOiBpbnN0cnVjdGlvbi5kYXRhLnRvU3RyaW5nKCkgfSB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChtZW1vKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5DcmVhdGU6XG4gICAgICAgIHN0YWtpbmdJbnN0cnVjdGlvbnMuY3JlYXRlID0gU3lzdGVtSW5zdHJ1Y3Rpb24uZGVjb2RlQ3JlYXRlQWNjb3VudChpbnN0cnVjdGlvbik7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uU3Rha2luZ0luaXRpYWxpemU6XG4gICAgICAgIHN0YWtpbmdJbnN0cnVjdGlvbnMuaW5pdGlhbGl6ZSA9IFN0YWtlSW5zdHJ1Y3Rpb24uZGVjb2RlSW5pdGlhbGl6ZShpbnN0cnVjdGlvbik7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uU3Rha2luZ0RlbGVnYXRlOlxuICAgICAgICBzdGFraW5nSW5zdHJ1Y3Rpb25zLmRlbGVnYXRlID0gU3Rha2VJbnN0cnVjdGlvbi5kZWNvZGVEZWxlZ2F0ZShpbnN0cnVjdGlvbik7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHZhbGlkYXRlU3Rha2luZ0luc3RydWN0aW9ucyhzdGFraW5nSW5zdHJ1Y3Rpb25zKTtcbiAgY29uc3Qgc3Rha2luZ0FjdGl2YXRlOiBTdGFraW5nQWN0aXZhdGUgPSB7XG4gICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuU3Rha2luZ0FjdGl2YXRlLFxuICAgIHBhcmFtczoge1xuICAgICAgZnJvbUFkZHJlc3M6IHN0YWtpbmdJbnN0cnVjdGlvbnMuY3JlYXRlPy5mcm9tUHVia2V5LnRvU3RyaW5nKCkgfHwgJycsXG4gICAgICBzdGFraW5nQWRkcmVzczogc3Rha2luZ0luc3RydWN0aW9ucy5pbml0aWFsaXplPy5zdGFrZVB1YmtleS50b1N0cmluZygpIHx8ICcnLFxuICAgICAgYW1vdW50OiBzdGFraW5nSW5zdHJ1Y3Rpb25zLmNyZWF0ZT8ubGFtcG9ydHMudG9TdHJpbmcoKSB8fCAnJyxcbiAgICAgIHZhbGlkYXRvcjogc3Rha2luZ0luc3RydWN0aW9ucy5kZWxlZ2F0ZT8udm90ZVB1YmtleS50b1N0cmluZygpIHx8ICcnLFxuICAgIH0sXG4gIH07XG4gIGluc3RydWN0aW9uRGF0YS5wdXNoKHN0YWtpbmdBY3RpdmF0ZSk7XG5cbiAgcmV0dXJuIGluc3RydWN0aW9uRGF0YTtcbn1cblxuaW50ZXJmYWNlIFN0YWtpbmdJbnN0cnVjdGlvbnMge1xuICBjcmVhdGU/OiBDcmVhdGVBY2NvdW50UGFyYW1zO1xuICBpbml0aWFsaXplPzogSW5pdGlhbGl6ZVN0YWtlUGFyYW1zO1xuICBkZWxlZ2F0ZT86IERlbGVnYXRlU3Rha2VQYXJhbXM7XG4gIGF1dGhvcml6ZT86IEF1dGhvcml6ZVN0YWtlUGFyYW1zW107XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlU3Rha2luZ0luc3RydWN0aW9ucyhzdGFraW5nSW5zdHJ1Y3Rpb25zOiBTdGFraW5nSW5zdHJ1Y3Rpb25zKSB7XG4gIGlmICghc3Rha2luZ0luc3RydWN0aW9ucy5jcmVhdGUpIHtcbiAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkKCdJbnZhbGlkIHN0YWtpbmcgYWN0aXZhdGUgdHJhbnNhY3Rpb24sIG1pc3NpbmcgY3JlYXRlIHN0YWtlIGFjY291bnQgaW5zdHJ1Y3Rpb24nKTtcbiAgfSBlbHNlIGlmICghc3Rha2luZ0luc3RydWN0aW9ucy5pbml0aWFsaXplKSB7XG4gICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZCgnSW52YWxpZCBzdGFraW5nIGFjdGl2YXRlIHRyYW5zYWN0aW9uLCBtaXNzaW5nIGluaXRpYWxpemUgc3Rha2UgYWNjb3VudCBpbnN0cnVjdGlvbicpO1xuICB9IGVsc2UgaWYgKCFzdGFraW5nSW5zdHJ1Y3Rpb25zLmRlbGVnYXRlKSB7XG4gICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZCgnSW52YWxpZCBzdGFraW5nIGFjdGl2YXRlIHRyYW5zYWN0aW9uLCBtaXNzaW5nIGRlbGVnYXRlIGluc3RydWN0aW9uJyk7XG4gIH1cbn1cblxuLyoqXG4gKiBQYXJzZXMgU29sYW5hIGluc3RydWN0aW9ucyB0byBjcmVhdGUgZGVhY3RpdmF0ZSBzdGFrZSB0eCBpbnN0cnVjdGlvbnMgcGFyYW1zLiBTdXBwb3J0cyBmdWxsIHN0YWtlXG4gKiBhY2NvdW50IGRlYWN0aXZhdGlvbiBhbmQgcGFydGlhbCBzdGFrZSBhY2NvdW50IGRlYWN0aXZhdGlvbi5cbiAqXG4gKiBXaGVuIHBhcnRpYWxseSBkZWFjdGl2YXRpbmcgYSBzdGFrZSBhY2NvdW50IHRoaXMgbWV0aG9kIGV4cGVjdHMgdGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnM6IEFsbG9jYXRlLFxuICogdG8gYWxsb2NhdGUgYSBuZXcgc3Rha2luZyBhY2NvdW50LCBBc3NpZ24sIHRvIGFzc2lnbiB0aGUgbmV3bHkgY3JlYXRlZCBzdGFraW5nIGFjY291bnQgdG8gdGhlXG4gKiBTdGFrZSBQcm9ncmFtLCBTcGxpdCwgdG8gc3BsaXQgdGhlIGN1cnJlbnQgc3Rha2UgYWNjb3VudCwgYW5kIFN0YWtpbmdEZWFjdGl2YXRlIHRvIGRlYWN0aXZhdGUgdGhlXG4gKiBuZXdseSBjcmVhdGVkIHN0YWtlIGFjY291bnQuXG4gKlxuICogU3VwcG9ydHMgTm9uY2UsIFN0YWtpbmdEZWFjdGl2YXRlLCBNZW1vLCBBbGxvY2F0ZSwgQXNzaWduLCBhbmQgU3BsaXQgU29sYW5hIGluc3RydWN0aW9ucy5cbiAqXG4gKiBAcGFyYW0ge1RyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXX0gaW5zdHJ1Y3Rpb25zIC0gYW4gYXJyYXkgb2Ygc3VwcG9ydGVkIFNvbGFuYSBpbnN0cnVjdGlvbnNcbiAqIEByZXR1cm5zIHtJbnN0cnVjdGlvblBhcmFtc1tdfSBBbiBhcnJheSBjb250YWluaW5nIGluc3RydWN0aW9uIHBhcmFtcyBmb3Igc3Rha2luZyBkZWFjdGl2YXRlIHR4XG4gKi9cbmZ1bmN0aW9uIHBhcnNlU3Rha2luZ0RlYWN0aXZhdGVJbnN0cnVjdGlvbnMoXG4gIGluc3RydWN0aW9uczogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdXG4pOiBBcnJheTxOb25jZSB8IFN0YWtpbmdEZWFjdGl2YXRlIHwgTWVtbz4ge1xuICBjb25zdCBpbnN0cnVjdGlvbkRhdGE6IEFycmF5PE5vbmNlIHwgU3Rha2luZ0RlYWN0aXZhdGUgfCBNZW1vPiA9IFtdO1xuICBjb25zdCB1bnN0YWtpbmdJbnN0cnVjdGlvbnMgPSB7fSBhcyBVbnN0YWtpbmdJbnN0cnVjdGlvbnM7XG4gIGZvciAoY29uc3QgaW5zdHJ1Y3Rpb24gb2YgaW5zdHJ1Y3Rpb25zKSB7XG4gICAgY29uc3QgdHlwZSA9IGdldEluc3RydWN0aW9uVHlwZShpbnN0cnVjdGlvbik7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uQWR2YW5jZU5vbmNlQWNjb3VudDpcbiAgICAgICAgY29uc3QgYWR2YW5jZU5vbmNlSW5zdHJ1Y3Rpb24gPSBTeXN0ZW1JbnN0cnVjdGlvbi5kZWNvZGVOb25jZUFkdmFuY2UoaW5zdHJ1Y3Rpb24pO1xuICAgICAgICBjb25zdCBub25jZTogTm9uY2UgPSB7XG4gICAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuTm9uY2VBZHZhbmNlLFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgd2FsbGV0Tm9uY2VBZGRyZXNzOiBhZHZhbmNlTm9uY2VJbnN0cnVjdGlvbi5ub25jZVB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgYXV0aFdhbGxldEFkZHJlc3M6IGFkdmFuY2VOb25jZUluc3RydWN0aW9uLmF1dGhvcml6ZWRQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChub25jZSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uTWVtbzpcbiAgICAgICAgY29uc3QgbWVtbzogTWVtbyA9IHtcbiAgICAgICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5NZW1vLFxuICAgICAgICAgIHBhcmFtczogeyBtZW1vOiBpbnN0cnVjdGlvbi5kYXRhLnRvU3RyaW5nKCkgfSxcbiAgICAgICAgfTtcbiAgICAgICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2gobWVtbyk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uQWxsb2NhdGU6XG4gICAgICAgIHVuc3Rha2luZ0luc3RydWN0aW9ucy5hbGxvY2F0ZSA9IFN5c3RlbUluc3RydWN0aW9uLmRlY29kZUFsbG9jYXRlKGluc3RydWN0aW9uKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5Bc3NpZ246XG4gICAgICAgIHVuc3Rha2luZ0luc3RydWN0aW9ucy5hc3NpZ24gPSBTeXN0ZW1JbnN0cnVjdGlvbi5kZWNvZGVBc3NpZ24oaW5zdHJ1Y3Rpb24pO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLlNwbGl0OlxuICAgICAgICB1bnN0YWtpbmdJbnN0cnVjdGlvbnMuc3BsaXQgPSBTdGFrZUluc3RydWN0aW9uLmRlY29kZVNwbGl0KGluc3RydWN0aW9uKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5TdGFraW5nRGVhY3RpdmF0ZTpcbiAgICAgICAgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmRlYWN0aXZhdGUgPSBTdGFrZUluc3RydWN0aW9uLmRlY29kZURlYWN0aXZhdGUoaW5zdHJ1Y3Rpb24pO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICB2YWxpZGF0ZVVuc3Rha2luZ0luc3RydWN0aW9ucyh1bnN0YWtpbmdJbnN0cnVjdGlvbnMpO1xuICBjb25zdCBzdGFraW5nRGVhY3RpdmF0ZTogU3Rha2luZ0RlYWN0aXZhdGUgPSB7XG4gICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuU3Rha2luZ0RlYWN0aXZhdGUsXG4gICAgcGFyYW1zOiB7XG4gICAgICBmcm9tQWRkcmVzczogdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmRlYWN0aXZhdGU/LmF1dGhvcml6ZWRQdWJrZXkudG9TdHJpbmcoKSB8fCAnJyxcbiAgICAgIHN0YWtpbmdBZGRyZXNzOlxuICAgICAgICB1bnN0YWtpbmdJbnN0cnVjdGlvbnMuc3BsaXQ/LnN0YWtlUHVia2V5LnRvU3RyaW5nKCkgfHxcbiAgICAgICAgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmRlYWN0aXZhdGU/LnN0YWtlUHVia2V5LnRvU3RyaW5nKCkgfHxcbiAgICAgICAgJycsXG4gICAgICBhbW91bnQ6IHVuc3Rha2luZ0luc3RydWN0aW9ucy5zcGxpdD8ubGFtcG9ydHMudG9TdHJpbmcoKSxcbiAgICAgIHVuc3Rha2luZ0FkZHJlc3M6IHVuc3Rha2luZ0luc3RydWN0aW9ucy5zcGxpdD8uc3BsaXRTdGFrZVB1YmtleS50b1N0cmluZygpLFxuICAgIH0sXG4gIH07XG4gIGluc3RydWN0aW9uRGF0YS5wdXNoKHN0YWtpbmdEZWFjdGl2YXRlKTtcblxuICByZXR1cm4gaW5zdHJ1Y3Rpb25EYXRhO1xufVxuXG5pbnRlcmZhY2UgVW5zdGFraW5nSW5zdHJ1Y3Rpb25zIHtcbiAgYWxsb2NhdGU/OiBBbGxvY2F0ZVBhcmFtcztcbiAgYXNzaWduPzogQXNzaWduUGFyYW1zO1xuICBzcGxpdD86IFNwbGl0U3Rha2VQYXJhbXM7XG4gIGRlYWN0aXZhdGU/OiBEZWFjdGl2YXRlU3Rha2VQYXJhbXM7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlVW5zdGFraW5nSW5zdHJ1Y3Rpb25zKHVuc3Rha2luZ0luc3RydWN0aW9uczogVW5zdGFraW5nSW5zdHJ1Y3Rpb25zKSB7XG4gIGlmICghdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmRlYWN0aXZhdGUpIHtcbiAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkKCdJbnZhbGlkIGRlYWN0aXZhdGUgc3Rha2UgdHJhbnNhY3Rpb24sIG1pc3NpbmcgZGVhY3RpdmF0ZSBzdGFrZSBhY2NvdW50IGluc3RydWN0aW9uJyk7XG4gIH0gZWxzZSBpZiAodW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmFsbG9jYXRlIHx8IHVuc3Rha2luZ0luc3RydWN0aW9ucy5hc3NpZ24gfHwgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLnNwbGl0KSB7XG4gICAgaWYgKCF1bnN0YWtpbmdJbnN0cnVjdGlvbnMuYWxsb2NhdGUpIHtcbiAgICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWQoXG4gICAgICAgICdJbnZhbGlkIHBhcnRpYWwgZGVhY3RpdmF0ZSBzdGFrZSB0cmFuc2FjdGlvbiwgbWlzc2luZyBhbGxvY2F0ZSB1bnN0YWtlIGFjY291bnQgaW5zdHJ1Y3Rpb24nXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAoIXVuc3Rha2luZ0luc3RydWN0aW9ucy5hc3NpZ24pIHtcbiAgICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWQoXG4gICAgICAgICdJbnZhbGlkIHBhcnRpYWwgZGVhY3RpdmF0ZSBzdGFrZSB0cmFuc2FjdGlvbiwgbWlzc2luZyBhc3NpZ24gdW5zdGFrZSBhY2NvdW50IGluc3RydWN0aW9uJ1xuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKCF1bnN0YWtpbmdJbnN0cnVjdGlvbnMuc3BsaXQpIHtcbiAgICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWQoJ0ludmFsaWQgcGFydGlhbCBkZWFjdGl2YXRlIHN0YWtlIHRyYW5zYWN0aW9uLCBtaXNzaW5nIHNwbGl0IHN0YWtlIGFjY291bnQgaW5zdHJ1Y3Rpb24nKTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmFsbG9jYXRlLmFjY291bnRQdWJrZXkudG9TdHJpbmcoKSAhPT0gdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmFzc2lnbi5hY2NvdW50UHVia2V5LnRvU3RyaW5nKClcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWQoXG4gICAgICAgICdJbnZhbGlkIHBhcnRpYWwgZGVhY3RpdmF0ZSBzdGFrZSB0cmFuc2FjdGlvbiwgbXVzdCBhbGxvY2F0ZSBhbmQgYXNzaWduIHRoZSBzYW1lIHB1YmxpYyBrZXknXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAodW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmFsbG9jYXRlLnNwYWNlICE9PSBTdGFrZVByb2dyYW0uc3BhY2UpIHtcbiAgICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWQoXG4gICAgICAgIGBJbnZhbGlkIHBhcnRpYWwgZGVhY3RpdmF0ZSBzdGFrZSB0cmFuc2FjdGlvbiwgdW5zdGFraW5nIGFjY291bnQgbXVzdCBhbGxvY2F0ZSAke1N0YWtlUHJvZ3JhbS5zcGFjZX0gYnl0ZXNgXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAodW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmFzc2lnbi5wcm9ncmFtSWQudG9TdHJpbmcoKSAhPT0gU3Rha2VQcm9ncmFtLnByb2dyYW1JZC50b1N0cmluZygpKSB7XG4gICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkKFxuICAgICAgICAnSW52YWxpZCBwYXJ0aWFsIGRlYWN0aXZhdGUgc3Rha2UgdHJhbnNhY3Rpb24sIHRoZSB1bnN0YWtlIGFjY291bnQgbXVzdCBiZSBhc3NpZ25lZCB0byB0aGUgU3Rha2UgUHJvZ3JhbSdcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHVuc3Rha2luZ0luc3RydWN0aW9ucy5hbGxvY2F0ZS5hY2NvdW50UHVia2V5LnRvU3RyaW5nKCkgIT09XG4gICAgICB1bnN0YWtpbmdJbnN0cnVjdGlvbnMuc3BsaXQuc3BsaXRTdGFrZVB1YmtleS50b1N0cmluZygpXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkKCdJbnZhbGlkIHBhcnRpYWwgZGVhY3RpdmF0ZSBzdGFrZSB0cmFuc2FjdGlvbiwgbXVzdCBhbGxvY2F0ZSB0aGUgdW5zdGFraW5nIGFjY291bnQnKTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLnNwbGl0LnN0YWtlUHVia2V5LnRvU3RyaW5nKCkgPT09IHVuc3Rha2luZ0luc3RydWN0aW9ucy5zcGxpdC5zcGxpdFN0YWtlUHVia2V5LnRvU3RyaW5nKClcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWQoXG4gICAgICAgICdJbnZhbGlkIHBhcnRpYWwgZGVhY3RpdmF0ZSBzdGFrZSB0cmFuc2FjdGlvbiwgdGhlIHVuc3Rha2luZyBhY2NvdW50IG11c3QgYmUgZGlmZmVyZW50IGZyb20gdGhlIFN0YWtlIEFjY291bnQnXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFBhcnNlcyBTb2xhbmEgaW5zdHJ1Y3Rpb25zIHRvIGNyZWF0ZSBzdGFraW5nICB3aXRoZHJhdyB0eCBpbnN0cnVjdGlvbnMgcGFyYW1zXG4gKiBPbmx5IHN1cHBvcnRzIE5vbmNlLCBTdGFraW5nV2l0aGRyYXcsIGFuZCBNZW1vIFNvbGFuYSBpbnN0cnVjdGlvbnNcbiAqXG4gKiBAcGFyYW0ge1RyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXX0gaW5zdHJ1Y3Rpb25zIC0gYW4gYXJyYXkgb2Ygc3VwcG9ydGVkIFNvbGFuYSBpbnN0cnVjdGlvbnNcbiAqIEByZXR1cm5zIHtJbnN0cnVjdGlvblBhcmFtc1tdfSBBbiBhcnJheSBjb250YWluaW5nIGluc3RydWN0aW9uIHBhcmFtcyBmb3Igc3Rha2luZyB3aXRoZHJhdyB0eFxuICovXG5mdW5jdGlvbiBwYXJzZVN0YWtpbmdXaXRoZHJhd0luc3RydWN0aW9ucyhcbiAgaW5zdHJ1Y3Rpb25zOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uW11cbik6IEFycmF5PE5vbmNlIHwgU3Rha2luZ1dpdGhkcmF3IHwgTWVtbz4ge1xuICBjb25zdCBpbnN0cnVjdGlvbkRhdGE6IEFycmF5PE5vbmNlIHwgU3Rha2luZ1dpdGhkcmF3IHwgTWVtbz4gPSBbXTtcbiAgZm9yIChjb25zdCBpbnN0cnVjdGlvbiBvZiBpbnN0cnVjdGlvbnMpIHtcbiAgICBjb25zdCB0eXBlID0gZ2V0SW5zdHJ1Y3Rpb25UeXBlKGluc3RydWN0aW9uKTtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5BZHZhbmNlTm9uY2VBY2NvdW50OlxuICAgICAgICBjb25zdCBhZHZhbmNlTm9uY2VJbnN0cnVjdGlvbiA9IFN5c3RlbUluc3RydWN0aW9uLmRlY29kZU5vbmNlQWR2YW5jZShpbnN0cnVjdGlvbik7XG4gICAgICAgIGNvbnN0IG5vbmNlOiBOb25jZSA9IHtcbiAgICAgICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5Ob25jZUFkdmFuY2UsXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICB3YWxsZXROb25jZUFkZHJlc3M6IGFkdmFuY2VOb25jZUluc3RydWN0aW9uLm5vbmNlUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBhdXRoV2FsbGV0QWRkcmVzczogYWR2YW5jZU5vbmNlSW5zdHJ1Y3Rpb24uYXV0aG9yaXplZFB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKG5vbmNlKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5NZW1vOlxuICAgICAgICBjb25zdCBtZW1vOiBNZW1vID0ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLk1lbW8sXG4gICAgICAgICAgcGFyYW1zOiB7IG1lbW86IGluc3RydWN0aW9uLmRhdGEudG9TdHJpbmcoKSB9LFxuICAgICAgICB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChtZW1vKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5TdGFraW5nV2l0aGRyYXc6XG4gICAgICAgIGNvbnN0IHdpdGhkcmF3SW5zdHJ1Y3Rpb24gPSBTdGFrZUluc3RydWN0aW9uLmRlY29kZVdpdGhkcmF3KGluc3RydWN0aW9uKTtcbiAgICAgICAgY29uc3Qgc3Rha2luZ1dpdGhkcmF3OiBTdGFraW5nV2l0aGRyYXcgPSB7XG4gICAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuU3Rha2luZ1dpdGhkcmF3LFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgZnJvbUFkZHJlc3M6IHdpdGhkcmF3SW5zdHJ1Y3Rpb24uYXV0aG9yaXplZFB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgc3Rha2luZ0FkZHJlc3M6IHdpdGhkcmF3SW5zdHJ1Y3Rpb24uc3Rha2VQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGFtb3VudDogd2l0aGRyYXdJbnN0cnVjdGlvbi5sYW1wb3J0cy50b1N0cmluZygpLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKHN0YWtpbmdXaXRoZHJhdyk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBpbnN0cnVjdGlvbkRhdGE7XG59XG5cbi8qKlxuICogR2V0IHRoZSBtZW1vIG9iamVjdCBmcm9tIGluc3RydWN0aW9ucyBpZiBpdCBleGlzdHNcbiAqXG4gKiBAcGFyYW0ge1RyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXX0gaW5zdHJ1Y3Rpb25zIC0gdGhlIGFycmF5IG9mIHN1cHBvcnRlZCBTb2xhbmEgaW5zdHJ1Y3Rpb25zIHRvIGJlIHBhcnNlZFxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBudW1iZXI+fSBpbnN0cnVjdGlvbkluZGV4ZXMgLSB0aGUgaW5zdHJ1Y3Rpb25zIGluZGV4ZXMgb2YgdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb25cbiAqIEByZXR1cm5zIHtNZW1vIHwgdW5kZWZpbmVkfSAtIG1lbW8gb2JqZWN0IG9yIHVuZGVmaW5lZFxuICovXG5mdW5jdGlvbiBnZXRNZW1vKGluc3RydWN0aW9uczogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdLCBpbnN0cnVjdGlvbkluZGV4ZXM6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4pOiBNZW1vIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgaW5zdHJ1Y3Rpb25zTGVuZ3RoID0gT2JqZWN0LmtleXMoaW5zdHJ1Y3Rpb25JbmRleGVzKS5sZW5ndGg7XG4gIGlmIChpbnN0cnVjdGlvbnMubGVuZ3RoID09PSBpbnN0cnVjdGlvbnNMZW5ndGggJiYgaW5zdHJ1Y3Rpb25zW2luc3RydWN0aW9uSW5kZXhlcy5NZW1vXSkge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5NZW1vLFxuICAgICAgcGFyYW1zOiB7IG1lbW86IGluc3RydWN0aW9uc1tpbnN0cnVjdGlvbkluZGV4ZXMuTWVtb10uZGF0YS50b1N0cmluZygpIH0sXG4gICAgfTtcbiAgfVxufVxuXG5jb25zdCBhdGFJbml0SW5zdHJ1Y3Rpb25LZXlzSW5kZXhlcyA9IHtcbiAgUGF5ZXJBZGRyZXNzOiAwLFxuICBBVEFBZGRyZXNzOiAxLFxuICBPd25lckFkZHJlc3M6IDIsXG4gIE1pbnRBZGRyZXNzOiAzLFxufTtcblxuLyoqXG4gKiBQYXJzZXMgU29sYW5hIGluc3RydWN0aW9ucyB0byBpbml0aWFsaXplIGFzc29jaWF0ZWQgdG9rZW4gYWNjb3VudCB0eCBpbnN0cnVjdGlvbnMgcGFyYW1zXG4gKlxuICogQHBhcmFtIHtUcmFuc2FjdGlvbkluc3RydWN0aW9uW119IGluc3RydWN0aW9ucyAtIGFuIGFycmF5IG9mIHN1cHBvcnRlZCBTb2xhbmEgaW5zdHJ1Y3Rpb25zXG4gKiBAcmV0dXJucyB7SW5zdHJ1Y3Rpb25QYXJhbXNbXX0gQW4gYXJyYXkgY29udGFpbmluZyBpbnN0cnVjdGlvbiBwYXJhbXMgZm9yIFNlbmQgdHhcbiAqL1xuZnVuY3Rpb24gcGFyc2VBdGFJbml0SW5zdHJ1Y3Rpb25zKGluc3RydWN0aW9uczogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdKTogQXJyYXk8QXRhSW5pdCB8IE1lbW8gfCBOb25jZT4ge1xuICBjb25zdCBpbnN0cnVjdGlvbkRhdGE6IEFycmF5PEF0YUluaXQgfCBNZW1vIHwgTm9uY2U+ID0gW107XG4gIGxldCBtZW1vOiBNZW1vIHwgdW5kZWZpbmVkO1xuXG4gIGZvciAoY29uc3QgaW5zdHJ1Y3Rpb24gb2YgaW5zdHJ1Y3Rpb25zKSB7XG4gICAgY29uc3QgdHlwZSA9IGdldEluc3RydWN0aW9uVHlwZShpbnN0cnVjdGlvbik7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uTWVtbzpcbiAgICAgICAgbWVtbyA9IHsgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuTWVtbywgcGFyYW1zOiB7IG1lbW86IGluc3RydWN0aW9uLmRhdGEudG9TdHJpbmcoKSB9IH07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLkFkdmFuY2VOb25jZUFjY291bnQ6XG4gICAgICAgIGNvbnN0IGFkdmFuY2VOb25jZUluc3RydWN0aW9uID0gU3lzdGVtSW5zdHJ1Y3Rpb24uZGVjb2RlTm9uY2VBZHZhbmNlKGluc3RydWN0aW9uKTtcbiAgICAgICAgY29uc3Qgbm9uY2U6IE5vbmNlID0ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLk5vbmNlQWR2YW5jZSxcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIHdhbGxldE5vbmNlQWRkcmVzczogYWR2YW5jZU5vbmNlSW5zdHJ1Y3Rpb24ubm9uY2VQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGF1dGhXYWxsZXRBZGRyZXNzOiBhZHZhbmNlTm9uY2VJbnN0cnVjdGlvbi5hdXRob3JpemVkUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2gobm9uY2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5Jbml0aWFsaXplQXNzb2NpYXRlZFRva2VuQWNjb3VudDpcbiAgICAgICAgY29uc3QgbWludEFkZHJlc3MgPSBpbnN0cnVjdGlvbi5rZXlzW2F0YUluaXRJbnN0cnVjdGlvbktleXNJbmRleGVzLk1pbnRBZGRyZXNzXS5wdWJrZXkudG9TdHJpbmcoKTtcbiAgICAgICAgY29uc3QgdG9rZW5OYW1lID0gZmluZFRva2VuTmFtZShtaW50QWRkcmVzcyk7XG5cbiAgICAgICAgY29uc3QgYXRhSW5pdDogQXRhSW5pdCA9IHtcbiAgICAgICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5DcmVhdGVBc3NvY2lhdGVkVG9rZW5BY2NvdW50LFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgbWludEFkZHJlc3MsXG4gICAgICAgICAgICBhdGFBZGRyZXNzOiBpbnN0cnVjdGlvbi5rZXlzW2F0YUluaXRJbnN0cnVjdGlvbktleXNJbmRleGVzLkFUQUFkZHJlc3NdLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgb3duZXJBZGRyZXNzOiBpbnN0cnVjdGlvbi5rZXlzW2F0YUluaXRJbnN0cnVjdGlvbktleXNJbmRleGVzLk93bmVyQWRkcmVzc10ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBwYXllckFkZHJlc3M6IGluc3RydWN0aW9uLmtleXNbYXRhSW5pdEluc3RydWN0aW9uS2V5c0luZGV4ZXMuUGF5ZXJBZGRyZXNzXS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIHRva2VuTmFtZSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChhdGFJbml0KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkKFxuICAgICAgICAgICdJbnZhbGlkIHRyYW5zYWN0aW9uLCBpbnN0cnVjdGlvbiB0eXBlIG5vdCBzdXBwb3J0ZWQ6ICcgKyBnZXRJbnN0cnVjdGlvblR5cGUoaW5zdHJ1Y3Rpb24pXG4gICAgICAgICk7XG4gICAgfVxuICB9XG4gIGlmIChtZW1vKSB7XG4gICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2gobWVtbyk7XG4gIH1cbiAgcmV0dXJuIGluc3RydWN0aW9uRGF0YTtcbn1cblxuLyoqXG4gKiBQYXJzZXMgU29sYW5hIGluc3RydWN0aW9ucyB0byBhdXRob3JpemVkIHN0YWtpbmcgYWNjb3VudCBwYXJhbXNcbiAqIE9ubHkgc3VwcG9ydHMgTm9uY2UsIEF1dGhvcml6ZSBpbnN0cnVjdGlvbnNcbiAqXG4gKiBAcGFyYW0ge1RyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXX0gaW5zdHJ1Y3Rpb25zIC0gYW4gYXJyYXkgb2Ygc3VwcG9ydGVkIFNvbGFuYSBpbnN0cnVjdGlvbnNcbiAqIEByZXR1cm5zIHtJbnN0cnVjdGlvblBhcmFtc1tdfSBBbiBhcnJheSBjb250YWluaW5nIGluc3RydWN0aW9uIHBhcmFtcyBmb3Igc3Rha2luZyBhdXRob3JpemUgdHhcbiAqL1xuZnVuY3Rpb24gcGFyc2VTdGFraW5nQXV0aG9yaXplSW5zdHJ1Y3Rpb25zKFxuICBpbnN0cnVjdGlvbnM6IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXVxuKTogQXJyYXk8Tm9uY2UgfCBTdGFraW5nQXV0aG9yaXplIHwgTWVtbz4ge1xuICBjb25zdCBpbnN0cnVjdGlvbkRhdGE6IEFycmF5PE5vbmNlIHwgU3Rha2luZ0F1dGhvcml6ZSB8IE1lbW8+ID0gW107XG4gIGZvciAoY29uc3QgaW5zdHJ1Y3Rpb24gb2YgaW5zdHJ1Y3Rpb25zKSB7XG4gICAgY29uc3QgdHlwZSA9IGdldEluc3RydWN0aW9uVHlwZShpbnN0cnVjdGlvbik7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uQWR2YW5jZU5vbmNlQWNjb3VudDpcbiAgICAgICAgY29uc3QgYWR2YW5jZU5vbmNlSW5zdHJ1Y3Rpb24gPSBTeXN0ZW1JbnN0cnVjdGlvbi5kZWNvZGVOb25jZUFkdmFuY2UoaW5zdHJ1Y3Rpb24pO1xuICAgICAgICBjb25zdCBub25jZTogTm9uY2UgPSB7XG4gICAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuTm9uY2VBZHZhbmNlLFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgd2FsbGV0Tm9uY2VBZGRyZXNzOiBhZHZhbmNlTm9uY2VJbnN0cnVjdGlvbi5ub25jZVB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgYXV0aFdhbGxldEFkZHJlc3M6IGFkdmFuY2VOb25jZUluc3RydWN0aW9uLmF1dGhvcml6ZWRQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChub25jZSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uTWVtbzpcbiAgICAgICAgY29uc3QgbWVtbzogTWVtbyA9IHsgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuTWVtbywgcGFyYW1zOiB7IG1lbW86IGluc3RydWN0aW9uLmRhdGEudG9TdHJpbmcoKSB9IH07XG4gICAgICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKG1lbW8pO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLkF1dGhvcml6ZTpcbiAgICAgICAgY29uc3QgYXV0aG9yaXplID0gU3Rha2VJbnN0cnVjdGlvbi5kZWNvZGVBdXRob3JpemUoaW5zdHJ1Y3Rpb24pO1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaCh7XG4gICAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuU3Rha2luZ0F1dGhvcml6ZSxcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIHN0YWtpbmdBZGRyZXNzOiBhdXRob3JpemUuc3Rha2VQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIG9sZEF1dGhvcml6ZUFkZHJlc3M6IGF1dGhvcml6ZS5hdXRob3JpemVkUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBuZXdBdXRob3JpemVBZGRyZXNzOiBhdXRob3JpemUubmV3QXV0aG9yaXplZFB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgbmV3V2l0aGRyYXdBZGRyZXNzOiBhdXRob3JpemUuY3VzdG9kaWFuUHVia2V5Py50b1N0cmluZygpIHx8ICcnLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaW5zdHJ1Y3Rpb25EYXRhO1xufVxuXG4vKipcbiAqIFBhcnNlcyBTb2xhbmEgaW5zdHJ1Y3Rpb25zIHRvIGF1dGhvcml6ZWQgc3Rha2luZyBhY2NvdW50IHBhcmFtc1xuICogT25seSBzdXBwb3J0cyBOb25jZSwgQXV0aG9yaXplIGluc3RydWN0aW9uc1xuICpcbiAqIEBwYXJhbSB7VHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdfSBpbnN0cnVjdGlvbnMgLSBhbiBhcnJheSBvZiBzdXBwb3J0ZWQgU29sYW5hIGluc3RydWN0aW9uc1xuICogQHJldHVybnMge0luc3RydWN0aW9uUGFyYW1zW119IEFuIGFycmF5IGNvbnRhaW5pbmcgaW5zdHJ1Y3Rpb24gcGFyYW1zIGZvciBzdGFraW5nIGF1dGhvcml6ZSB0eFxuICovXG5mdW5jdGlvbiBwYXJzZVN0YWtpbmdBdXRob3JpemVSYXdJbnN0cnVjdGlvbnMoaW5zdHJ1Y3Rpb25zOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uW10pOiBBcnJheTxOb25jZSB8IFN0YWtpbmdBdXRob3JpemU+IHtcbiAgY29uc3QgaW5zdHJ1Y3Rpb25EYXRhOiBBcnJheTxOb25jZSB8IFN0YWtpbmdBdXRob3JpemU+ID0gW107XG4gIGFzc2VydChpbnN0cnVjdGlvbnMubGVuZ3RoID09PSAyLCAnSW52YWxpZCBudW1iZXIgb2YgaW5zdHJ1Y3Rpb25zJyk7XG4gIGNvbnN0IGFkdmFuY2VOb25jZUluc3RydWN0aW9uID0gU3lzdGVtSW5zdHJ1Y3Rpb24uZGVjb2RlTm9uY2VBZHZhbmNlKGluc3RydWN0aW9uc1swXSk7XG4gIGNvbnN0IG5vbmNlOiBOb25jZSA9IHtcbiAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5Ob25jZUFkdmFuY2UsXG4gICAgcGFyYW1zOiB7XG4gICAgICB3YWxsZXROb25jZUFkZHJlc3M6IGFkdmFuY2VOb25jZUluc3RydWN0aW9uLm5vbmNlUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICBhdXRoV2FsbGV0QWRkcmVzczogYWR2YW5jZU5vbmNlSW5zdHJ1Y3Rpb24uYXV0aG9yaXplZFB1YmtleS50b1N0cmluZygpLFxuICAgIH0sXG4gIH07XG4gIGluc3RydWN0aW9uRGF0YS5wdXNoKG5vbmNlKTtcbiAgY29uc3QgYXV0aG9yaXplID0gaW5zdHJ1Y3Rpb25zWzFdO1xuICBhc3NlcnQoYXV0aG9yaXplLmtleXMubGVuZ3RoID09PSA1LCAnSW52YWxpZCBudW1iZXIgb2Yga2V5cyBpbiBhdXRob3JpemUgaW5zdHJ1Y3Rpb24nKTtcbiAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2goe1xuICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlN0YWtpbmdBdXRob3JpemUsXG4gICAgcGFyYW1zOiB7XG4gICAgICBzdGFraW5nQWRkcmVzczogYXV0aG9yaXplLmtleXNbMF0ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICBvbGRBdXRob3JpemVBZGRyZXNzOiBhdXRob3JpemUua2V5c1syXS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgIG5ld0F1dGhvcml6ZUFkZHJlc3M6IGF1dGhvcml6ZS5rZXlzWzNdLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgY3VzdG9kaWFuQWRkcmVzczogYXV0aG9yaXplLmtleXNbNF0ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgfSxcbiAgfSk7XG4gIHJldHVybiBpbnN0cnVjdGlvbkRhdGE7XG59XG5cbmZ1bmN0aW9uIGZpbmRUb2tlbk5hbWUobWludEFkZHJlc3M6IHN0cmluZyk6IHN0cmluZyB7XG4gIGxldCB0b2tlbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIGNvaW5zLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBTb2xDb2luICYmIHZhbHVlLnRva2VuQWRkcmVzcyA9PT0gbWludEFkZHJlc3MpIHtcbiAgICAgIHRva2VuID0gdmFsdWUubmFtZTtcbiAgICB9XG4gIH0pO1xuXG4gIGFzc2VydCh0b2tlbik7XG5cbiAgcmV0dXJuIHRva2VuO1xufVxuIl19
740
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdHJ1Y3Rpb25QYXJhbXNGYWN0b3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9pbnN0cnVjdGlvblBhcmFtc0ZhY3RvcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFtREEsNERBK0JDO0FBbEZELGlEQUkyQjtBQUMzQiw2Q0FleUI7QUFFekIsbURBQXFFO0FBQ3JFLGlEQUFxRDtBQUNyRCxvREFBNEI7QUFDNUIsMkNBQStHO0FBaUIvRyxtQ0FBNkM7QUFFN0M7Ozs7OztHQU1HO0FBQ0gsU0FBZ0Isd0JBQXdCLENBQ3RDLElBQXFCLEVBQ3JCLFlBQXNDLEVBQ3RDLFFBQWlCLEVBQ2pCLG1CQUF5QyxFQUN6Qyx5QkFBbUM7SUFFbkMsUUFBUSxJQUFJLEVBQUUsQ0FBQztRQUNiLEtBQUssMEJBQWUsQ0FBQyxvQkFBb0I7WUFDdkMsT0FBTywyQkFBMkIsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNuRCxLQUFLLDBCQUFlLENBQUMsSUFBSTtZQUN2QixPQUFPLHFCQUFxQixDQUFDLFlBQVksRUFBRSxtQkFBbUIsRUFBRSx5QkFBeUIsQ0FBQyxDQUFDO1FBQzdGLEtBQUssMEJBQWUsQ0FBQyxlQUFlO1lBQ2xDLE9BQU8sZ0NBQWdDLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDeEQsS0FBSywwQkFBZSxDQUFDLGlCQUFpQjtZQUNwQyxPQUFPLGtDQUFrQyxDQUFDLFlBQVksRUFBRSxRQUFRLENBQUMsQ0FBQztRQUNwRSxLQUFLLDBCQUFlLENBQUMsZUFBZTtZQUNsQyxPQUFPLGdDQUFnQyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3hELEtBQUssMEJBQWUsQ0FBQyxvQ0FBb0M7WUFDdkQsT0FBTyx3QkFBd0IsQ0FBQyxZQUFZLEVBQUUsbUJBQW1CLEVBQUUseUJBQXlCLENBQUMsQ0FBQztRQUNoRyxLQUFLLDBCQUFlLENBQUMsMkJBQTJCO1lBQzlDLE9BQU8seUJBQXlCLENBQUMsWUFBWSxDQUFDLENBQUM7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VyxDQUFDLE1BQU0sQ0FBQyxZQUFZLEtBQUssV0FBVyxFQUMvQyxDQUFDO2dCQUNELEtBQUssR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQztZQUN2QyxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsSUFBSSxDQUFDLEtBQUssSUFBSSx5QkFBeUIsRUFBRSxDQUFDO1FBQ3hDLEtBQUssR0FBRyxXQUFXLENBQUM7SUFDdEIsQ0FBQztJQUVELElBQUEsZ0JBQU0sRUFBQyxLQUFLLENBQUMsQ0FBQztJQUVkLE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIERlY29kZWRUcmFuc2ZlckNoZWNrZWRJbnN0cnVjdGlvbixcbiAgZGVjb2RlVHJhbnNmZXJDaGVja2VkSW5zdHJ1Y3Rpb24sXG4gIFRPS0VOXzIwMjJfUFJPR1JBTV9JRCxcbn0gZnJvbSAnQHNvbGFuYS9zcGwtdG9rZW4nO1xuaW1wb3J0IHtcbiAgQWxsb2NhdGVQYXJhbXMsXG4gIEFzc2lnblBhcmFtcyxcbiAgQXV0aG9yaXplU3Rha2VQYXJhbXMsXG4gIENyZWF0ZUFjY291bnRQYXJhbXMsXG4gIERlYWN0aXZhdGVTdGFrZVBhcmFtcyxcbiAgRGVjb2RlZFRyYW5zZmVySW5zdHJ1Y3Rpb24sXG4gIERlbGVnYXRlU3Rha2VQYXJhbXMsXG4gIEluaXRpYWxpemVTdGFrZVBhcmFtcyxcbiAgU3BsaXRTdGFrZVBhcmFtcyxcbiAgU3Rha2VJbnN0cnVjdGlvbixcbiAgU3Rha2VQcm9ncmFtLFxuICBTeXN0ZW1JbnN0cnVjdGlvbixcbiAgVHJhbnNhY3Rpb25JbnN0cnVjdGlvbixcbiAgQ29tcHV0ZUJ1ZGdldEluc3RydWN0aW9uLFxufSBmcm9tICdAc29sYW5hL3dlYjMuanMnO1xuXG5pbXBvcnQgeyBOb3RTdXBwb3J0ZWQsIFRyYW5zYWN0aW9uVHlwZSB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IGNvaW5zLCBTb2xDb2luIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgeyBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcywgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bSwgd2FsbGV0SW5pdEluc3RydWN0aW9uSW5kZXhlcyB9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7XG4gIEF0YUNsb3NlLFxuICBBdGFJbml0LFxuICBJbnN0cnVjdGlvblBhcmFtcyxcbiAgTWVtbyxcbiAgTm9uY2UsXG4gIFN0YWtpbmdBY3RpdmF0ZSxcbiAgU3Rha2luZ0F1dGhvcml6ZSxcbiAgU3Rha2luZ0RlYWN0aXZhdGUsXG4gIFN0YWtpbmdEZWxlZ2F0ZSxcbiAgU3Rha2luZ1dpdGhkcmF3LFxuICBUb2tlblRyYW5zZmVyLFxuICBUcmFuc2ZlcixcbiAgV2FsbGV0SW5pdCxcbiAgU2V0UHJpb3JpdHlGZWUsXG59IGZyb20gJy4vaWZhY2UnO1xuaW1wb3J0IHsgZ2V0SW5zdHJ1Y3Rpb25UeXBlIH0gZnJvbSAnLi91dGlscyc7XG5cbi8qKlxuICogQ29uc3RydWN0IGluc3RydWN0aW9ucyBwYXJhbXMgZnJvbSBTb2xhbmEgaW5zdHJ1Y3Rpb25zXG4gKlxuICogQHBhcmFtIHtUcmFuc2FjdGlvblR5cGV9IHR5cGUgLSB0aGUgdHJhbnNhY3Rpb24gdHlwZVxuICogQHBhcmFtIHtUcmFuc2FjdGlvbkluc3RydWN0aW9uW119IGluc3RydWN0aW9ucyAtIHNvbGFuYSBpbnN0cnVjdGlvbnNcbiAqIEByZXR1cm5zIHtJbnN0cnVjdGlvblBhcmFtc1tdfSBBbiBhcnJheSBjb250YWluaW5nIGluc3RydWN0aW9uIHBhcmFtc1xuICovXG5leHBvcnQgZnVuY3Rpb24gaW5zdHJ1Y3Rpb25QYXJhbXNGYWN0b3J5KFxuICB0eXBlOiBUcmFuc2FjdGlvblR5cGUsXG4gIGluc3RydWN0aW9uczogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdLFxuICBjb2luTmFtZT86IHN0cmluZyxcbiAgaW5zdHJ1Y3Rpb25NZXRhZGF0YT86IEluc3RydWN0aW9uUGFyYW1zW10sXG4gIF91c2VUb2tlbkFkZHJlc3NUb2tlbk5hbWU/OiBib29sZWFuXG4pOiBJbnN0cnVjdGlvblBhcmFtc1tdIHtcbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuV2FsbGV0SW5pdGlhbGl6YXRpb246XG4gICAgICByZXR1cm4gcGFyc2VXYWxsZXRJbml0SW5zdHJ1Y3Rpb25zKGluc3RydWN0aW9ucyk7XG4gICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuU2VuZDpcbiAgICAgIHJldHVybiBwYXJzZVNlbmRJbnN0cnVjdGlvbnMoaW5zdHJ1Y3Rpb25zLCBpbnN0cnVjdGlvbk1ldGFkYXRhLCBfdXNlVG9rZW5BZGRyZXNzVG9rZW5OYW1lKTtcbiAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nQWN0aXZhdGU6XG4gICAgICByZXR1cm4gcGFyc2VTdGFraW5nQWN0aXZhdGVJbnN0cnVjdGlvbnMoaW5zdHJ1Y3Rpb25zKTtcbiAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nRGVhY3RpdmF0ZTpcbiAgICAgIHJldHVybiBwYXJzZVN0YWtpbmdEZWFjdGl2YXRlSW5zdHJ1Y3Rpb25zKGluc3RydWN0aW9ucywgY29pbk5hbWUpO1xuICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdXaXRoZHJhdzpcbiAgICAgIHJldHVybiBwYXJzZVN0YWtpbmdXaXRoZHJhd0luc3RydWN0aW9ucyhpbnN0cnVjdGlvbnMpO1xuICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLkFzc29jaWF0ZWRUb2tlbkFjY291bnRJbml0aWFsaXphdGlvbjpcbiAgICAgIHJldHVybiBwYXJzZUF0YUluaXRJbnN0cnVjdGlvbnMoaW5zdHJ1Y3Rpb25zLCBpbnN0cnVjdGlvbk1ldGFkYXRhLCBfdXNlVG9rZW5BZGRyZXNzVG9rZW5OYW1lKTtcbiAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5DbG9zZUFzc29jaWF0ZWRUb2tlbkFjY291bnQ6XG4gICAgICByZXR1cm4gcGFyc2VBdGFDbG9zZUluc3RydWN0aW9ucyhpbnN0cnVjdGlvbnMpO1xuICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdBdXRob3JpemU6XG4gICAgICByZXR1cm4gcGFyc2VTdGFraW5nQXV0aG9yaXplSW5zdHJ1Y3Rpb25zKGluc3RydWN0aW9ucyk7XG4gICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0F1dGhvcml6ZVJhdzpcbiAgICAgIHJldHVybiBwYXJzZVN0YWtpbmdBdXRob3JpemVSYXdJbnN0cnVjdGlvbnMoaW5zdHJ1Y3Rpb25zKTtcbiAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nRGVsZWdhdGU6XG4gICAgICByZXR1cm4gcGFyc2VTdGFraW5nRGVsZWdhdGVJbnN0cnVjdGlvbnMoaW5zdHJ1Y3Rpb25zKTtcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZCgnSW52YWxpZCB0cmFuc2FjdGlvbiwgdHJhbnNhY3Rpb24gdHlwZSBub3Qgc3VwcG9ydGVkOiAnICsgdHlwZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBQYXJzZXMgU29sYW5hIGluc3RydWN0aW9ucyB0byBXYWxsZXQgaW5pdGlhbGl6YXRpb24gdHggaW5zdHJ1Y3Rpb25zIHBhcmFtc1xuICpcbiAqIEBwYXJhbSB7VHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdfSBpbnN0cnVjdGlvbnMgLSBjb250YWluaW5nIGNyZWF0ZSBhbmQgaW5pdGlhbGl6ZSBub25jZSBzb2xhbmEgaW5zdHJ1Y3Rpb25zXG4gKiBAcmV0dXJucyB7SW5zdHJ1Y3Rpb25QYXJhbXNbXX0gQW4gYXJyYXkgY29udGFpbmluZyBpbnN0cnVjdGlvbiBwYXJhbXMgZm9yIFdhbGxldCBpbml0aWFsaXphdGlvbiB0eFxuICovXG5mdW5jdGlvbiBwYXJzZVdhbGxldEluaXRJbnN0cnVjdGlvbnMoaW5zdHJ1Y3Rpb25zOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uW10pOiBBcnJheTxXYWxsZXRJbml0IHwgTWVtbz4ge1xuICBjb25zdCBpbnN0cnVjdGlvbkRhdGE6IEFycmF5PFdhbGxldEluaXQgfCBNZW1vPiA9IFtdO1xuICBjb25zdCBjcmVhdGVJbnN0cnVjdGlvbiA9IFN5c3RlbUluc3RydWN0aW9uLmRlY29kZUNyZWF0ZUFjY291bnQoaW5zdHJ1Y3Rpb25zW3dhbGxldEluaXRJbnN0cnVjdGlvbkluZGV4ZXMuQ3JlYXRlXSk7XG4gIGNvbnN0IG5vbmNlSW5pdEluc3RydWN0aW9uID0gU3lzdGVtSW5zdHJ1Y3Rpb24uZGVjb2RlTm9uY2VJbml0aWFsaXplKFxuICAgIGluc3RydWN0aW9uc1t3YWxsZXRJbml0SW5zdHJ1Y3Rpb25JbmRleGVzLkluaXRpYWxpemVOb25jZUFjY291bnRdXG4gICk7XG5cbiAgY29uc3Qgd2FsbGV0SW5pdDogV2FsbGV0SW5pdCA9IHtcbiAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5DcmVhdGVOb25jZUFjY291bnQsXG4gICAgcGFyYW1zOiB7XG4gICAgICBmcm9tQWRkcmVzczogY3JlYXRlSW5zdHJ1Y3Rpb24uZnJvbVB1YmtleS50b1N0cmluZygpLFxuICAgICAgbm9uY2VBZGRyZXNzOiBub25jZUluaXRJbnN0cnVjdGlvbi5ub25jZVB1YmtleS50b1N0cmluZygpLFxuICAgICAgYXV0aEFkZHJlc3M6IG5vbmNlSW5pdEluc3RydWN0aW9uLmF1dGhvcml6ZWRQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgIGFtb3VudDogY3JlYXRlSW5zdHJ1Y3Rpb24ubGFtcG9ydHMudG9TdHJpbmcoKSxcbiAgICB9LFxuICB9O1xuICBpbnN0cnVjdGlvbkRhdGEucHVzaCh3YWxsZXRJbml0KTtcblxuICBjb25zdCBtZW1vID0gZ2V0TWVtbyhpbnN0cnVjdGlvbnMsIHdhbGxldEluaXRJbnN0cnVjdGlvbkluZGV4ZXMpO1xuICBpZiAobWVtbykge1xuICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKG1lbW8pO1xuICB9XG5cbiAgcmV0dXJuIGluc3RydWN0aW9uRGF0YTtcbn1cblxuLyoqXG4gKiBQYXJzZXMgU29sYW5hIGluc3RydWN0aW9ucyB0byBTZW5kIHR4IGluc3RydWN0aW9ucyBwYXJhbXNcbiAqIE9ubHkgc3VwcG9ydHMgTWVtbywgVHJhbnNmZXIgYW5kIEFkdmFuY2UgTm9uY2UgU29sYW5hIGluc3RydWN0aW9uc1xuICpcbiAqIEBwYXJhbSB7VHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdfSBpbnN0cnVjdGlvbnMgLSBhbiBhcnJheSBvZiBzdXBwb3J0ZWQgU29sYW5hIGluc3RydWN0aW9uc1xuICogQHJldHVybnMge0luc3RydWN0aW9uUGFyYW1zW119IEFuIGFycmF5IGNvbnRhaW5pbmcgaW5zdHJ1Y3Rpb24gcGFyYW1zIGZvciBTZW5kIHR4XG4gKi9cbmZ1bmN0aW9uIHBhcnNlU2VuZEluc3RydWN0aW9ucyhcbiAgaW5zdHJ1Y3Rpb25zOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uW10sXG4gIGluc3RydWN0aW9uTWV0YWRhdGE/OiBJbnN0cnVjdGlvblBhcmFtc1tdLFxuICBfdXNlVG9rZW5BZGRyZXNzVG9rZW5OYW1lPzogYm9vbGVhblxuKTogQXJyYXk8Tm9uY2UgfCBNZW1vIHwgVHJhbnNmZXIgfCBUb2tlblRyYW5zZmVyIHwgQXRhSW5pdCB8IEF0YUNsb3NlIHwgU2V0UHJpb3JpdHlGZWU+IHtcbiAgY29uc3QgaW5zdHJ1Y3Rpb25EYXRhOiBBcnJheTxOb25jZSB8IE1lbW8gfCBUcmFuc2ZlciB8IFRva2VuVHJhbnNmZXIgfCBBdGFJbml0IHwgQXRhQ2xvc2UgfCBTZXRQcmlvcml0eUZlZT4gPSBbXTtcbiAgZm9yIChjb25zdCBpbnN0cnVjdGlvbiBvZiBpbnN0cnVjdGlvbnMpIHtcbiAgICBjb25zdCB0eXBlID0gZ2V0SW5zdHJ1Y3Rpb25UeXBlKGluc3RydWN0aW9uKTtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5NZW1vOlxuICAgICAgICBjb25zdCBtZW1vOiBNZW1vID0geyB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5NZW1vLCBwYXJhbXM6IHsgbWVtbzogaW5zdHJ1Y3Rpb24uZGF0YS50b1N0cmluZygpIH0gfTtcbiAgICAgICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2gobWVtbyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLkFkdmFuY2VOb25jZUFjY291bnQ6XG4gICAgICAgIGNvbnN0IGFkdmFuY2VOb25jZUluc3RydWN0aW9uID0gU3lzdGVtSW5zdHJ1Y3Rpb24uZGVjb2RlTm9uY2VBZHZhbmNlKGluc3RydWN0aW9uKTtcbiAgICAgICAgY29uc3Qgbm9uY2U6IE5vbmNlID0ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLk5vbmNlQWR2YW5jZSxcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIHdhbGxldE5vbmNlQWRkcmVzczogYWR2YW5jZU5vbmNlSW5zdHJ1Y3Rpb24ubm9uY2VQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGF1dGhXYWxsZXRBZGRyZXNzOiBhZHZhbmNlTm9uY2VJbnN0cnVjdGlvbi5hdXRob3JpemVkUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2gobm9uY2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5UcmFuc2ZlcjpcbiAgICAgICAgY29uc3QgdHJhbnNmZXJJbnN0cnVjdGlvbiA9IFN5c3RlbUluc3RydWN0aW9uLmRlY29kZVRyYW5zZmVyKGluc3RydWN0aW9uKTtcbiAgICAgICAgY29uc3QgdHJhbnNmZXI6IFRyYW5zZmVyID0ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlRyYW5zZmVyLFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgZnJvbUFkZHJlc3M6IHRyYW5zZmVySW5zdHJ1Y3Rpb24uZnJvbVB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgdG9BZGRyZXNzOiB0cmFuc2Zlckluc3RydWN0aW9uLnRvUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBhbW91bnQ6IHRyYW5zZmVySW5zdHJ1Y3Rpb24ubGFtcG9ydHMudG9TdHJpbmcoKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaCh0cmFuc2Zlcik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLlRva2VuVHJhbnNmZXI6XG4gICAgICAgIGxldCB0b2tlblRyYW5zZmVySW5zdHJ1Y3Rpb246IERlY29kZWRUcmFuc2ZlckNoZWNrZWRJbnN0cnVjdGlvbjtcbiAgICAgICAgaWYgKGluc3RydWN0aW9uLnByb2dyYW1JZC50b1N0cmluZygpICE9PSBUT0tFTl8yMDIyX1BST0dSQU1fSUQudG9TdHJpbmcoKSkge1xuICAgICAgICAgIHRva2VuVHJhbnNmZXJJbnN0cnVjdGlvbiA9IGRlY29kZVRyYW5zZmVyQ2hlY2tlZEluc3RydWN0aW9uKGluc3RydWN0aW9uKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0b2tlblRyYW5zZmVySW5zdHJ1Y3Rpb24gPSBkZWNvZGVUcmFuc2ZlckNoZWNrZWRJbnN0cnVjdGlvbihpbnN0cnVjdGlvbiwgVE9LRU5fMjAyMl9QUk9HUkFNX0lEKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0b2tlbkFkZHJlc3MgPSB0b2tlblRyYW5zZmVySW5zdHJ1Y3Rpb24ua2V5cy5taW50LnB1YmtleS50b1N0cmluZygpO1xuICAgICAgICBjb25zdCB0b2tlbk5hbWUgPSBmaW5kVG9rZW5OYW1lKHRva2VuQWRkcmVzcywgaW5zdHJ1Y3Rpb25NZXRhZGF0YSwgX3VzZVRva2VuQWRkcmVzc1Rva2VuTmFtZSk7XG4gICAgICAgIGxldCBwcm9ncmFtSURGb3JUb2tlblRyYW5zZmVyOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChpbnN0cnVjdGlvbi5wcm9ncmFtSWQpIHtcbiAgICAgICAgICBwcm9ncmFtSURGb3JUb2tlblRyYW5zZmVyID0gaW5zdHJ1Y3Rpb24ucHJvZ3JhbUlkLnRvU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdG9rZW5UcmFuc2ZlcjogVG9rZW5UcmFuc2ZlciA9IHtcbiAgICAgICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5Ub2tlblRyYW5zZmVyLFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgZnJvbUFkZHJlc3M6IHRva2VuVHJhbnNmZXJJbnN0cnVjdGlvbi5rZXlzLm93bmVyLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgdG9BZGRyZXNzOiB0b2tlblRyYW5zZmVySW5zdHJ1Y3Rpb24ua2V5cy5kZXN0aW5hdGlvbi5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGFtb3VudDogdG9rZW5UcmFuc2Zlckluc3RydWN0aW9uLmRhdGEuYW1vdW50LnRvU3RyaW5nKCksXG4gICAgICAgICAgICB0b2tlbk5hbWUsXG4gICAgICAgICAgICBzb3VyY2VBZGRyZXNzOiB0b2tlblRyYW5zZmVySW5zdHJ1Y3Rpb24ua2V5cy5zb3VyY2UucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICB0b2tlbkFkZHJlc3M6IHRva2VuQWRkcmVzcyxcbiAgICAgICAgICAgIHByb2dyYW1JZDogcHJvZ3JhbUlERm9yVG9rZW5UcmFuc2ZlcixcbiAgICAgICAgICAgIGRlY2ltYWxQbGFjZXM6IHRva2VuVHJhbnNmZXJJbnN0cnVjdGlvbi5kYXRhLmRlY2ltYWxzLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKHRva2VuVHJhbnNmZXIpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5Jbml0aWFsaXplQXNzb2NpYXRlZFRva2VuQWNjb3VudDpcbiAgICAgICAgY29uc3QgbWludEFkZHJlc3MgPSBpbnN0cnVjdGlvbi5rZXlzW2F0YUluaXRJbnN0cnVjdGlvbktleXNJbmRleGVzLk1pbnRBZGRyZXNzXS5wdWJrZXkudG9TdHJpbmcoKTtcbiAgICAgICAgY29uc3QgbWludFRva2VuTmFtZSA9IGZpbmRUb2tlbk5hbWUobWludEFkZHJlc3MsIGluc3RydWN0aW9uTWV0YWRhdGEsIF91c2VUb2tlbkFkZHJlc3NUb2tlbk5hbWUpO1xuICAgICAgICBsZXQgcHJvZ3JhbUlEOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChpbnN0cnVjdGlvbi5wcm9ncmFtSWQpIHtcbiAgICAgICAgICBwcm9ncmFtSUQgPSBpbnN0cnVjdGlvbi5wcm9ncmFtSWQudG9TdHJpbmcoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGF0YUluaXQ6IEF0YUluaXQgPSB7XG4gICAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuQ3JlYXRlQXNzb2NpYXRlZFRva2VuQWNjb3VudCxcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIG1pbnRBZGRyZXNzLFxuICAgICAgICAgICAgYXRhQWRkcmVzczogaW5zdHJ1Y3Rpb24ua2V5c1thdGFJbml0SW5zdHJ1Y3Rpb25LZXlzSW5kZXhlcy5BVEFBZGRyZXNzXS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIG93bmVyQWRkcmVzczogaW5zdHJ1Y3Rpb24ua2V5c1thdGFJbml0SW5zdHJ1Y3Rpb25LZXlzSW5kZXhlcy5Pd25lckFkZHJlc3NdLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgcGF5ZXJBZGRyZXNzOiBpbnN0cnVjdGlvbi5rZXlzW2F0YUluaXRJbnN0cnVjdGlvbktleXNJbmRleGVzLlBheWVyQWRkcmVzc10ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICB0b2tlbk5hbWU6IG1pbnRUb2tlbk5hbWUsXG4gICAgICAgICAgICBwcm9ncmFtSWQ6IHByb2dyYW1JRCxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChhdGFJbml0KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uQ2xvc2VBc3NvY2lhdGVkVG9rZW5BY2NvdW50OlxuICAgICAgICBjb25zdCBhY2NvdW50QWRkcmVzcyA9IGluc3RydWN0aW9uLmtleXNbY2xvc2VBdGFJbnN0cnVjdGlvbktleXNJbmRleGVzLkFjY291bnRBZGRyZXNzXS5wdWJrZXkudG9TdHJpbmcoKTtcbiAgICAgICAgY29uc3QgZGVzdGluYXRpb25BZGRyZXNzID1cbiAgICAgICAgICBpbnN0cnVjdGlvbi5rZXlzW2Nsb3NlQXRhSW5zdHJ1Y3Rpb25LZXlzSW5kZXhlcy5EZXN0aW5hdGlvbkFkZHJlc3NdLnB1YmtleS50b1N0cmluZygpO1xuICAgICAgICBjb25zdCBhdXRob3JpdHlBZGRyZXNzID0gaW5zdHJ1Y3Rpb24ua2V5c1tjbG9zZUF0YUluc3RydWN0aW9uS2V5c0luZGV4ZXMuQXV0aG9yaXR5QWRkcmVzc10ucHVia2V5LnRvU3RyaW5nKCk7XG5cbiAgICAgICAgY29uc3QgYXRhQ2xvc2U6IEF0YUNsb3NlID0ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLkNsb3NlQXNzb2NpYXRlZFRva2VuQWNjb3VudCxcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIGFjY291bnRBZGRyZXNzLFxuICAgICAgICAgICAgZGVzdGluYXRpb25BZGRyZXNzLFxuICAgICAgICAgICAgYXV0aG9yaXR5QWRkcmVzcyxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChhdGFDbG9zZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLlNldFByaW9yaXR5RmVlOlxuICAgICAgICBjb25zdCBzZXRDb21wdXRlVW5pdFByaWNlUGFyYW1zID0gQ29tcHV0ZUJ1ZGdldEluc3RydWN0aW9uLmRlY29kZVNldENvbXB1dGVVbml0UHJpY2UoaW5zdHJ1Y3Rpb24pO1xuICAgICAgICBjb25zdCBzZXRQcmlvcml0eUZlZTogU2V0UHJpb3JpdHlGZWUgPSB7XG4gICAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuU2V0UHJpb3JpdHlGZWUsXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICBmZWU6IHNldENvbXB1dGVVbml0UHJpY2VQYXJhbXMubWljcm9MYW1wb3J0cyxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChzZXRQcmlvcml0eUZlZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZChcbiAgICAgICAgICAnSW52YWxpZCB0cmFuc2FjdGlvbiwgaW5zdHJ1Y3Rpb24gdHlwZSBub3Qgc3VwcG9ydGVkOiAnICsgZ2V0SW5zdHJ1Y3Rpb25UeXBlKGluc3RydWN0aW9uKVxuICAgICAgICApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gaW5zdHJ1Y3Rpb25EYXRhO1xufVxuXG4vKipcbiAqIFBhcnNlcyBTb2xhbmEgaW5zdHJ1Y3Rpb25zIHRvIGNyZWF0ZSBzdGFraW5nIHR4IGFuZCBkZWxlZ2F0ZSB0eCBpbnN0cnVjdGlvbnMgcGFyYW1zXG4gKiBPbmx5IHN1cHBvcnRzIE5vbmNlLCBTdGFraW5nQWN0aXZhdGUgYW5kIE1lbW8gU29sYW5hIGluc3RydWN0aW9uc1xuICpcbiAqIEBwYXJhbSB7VHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdfSBpbnN0cnVjdGlvbnMgLSBhbiBhcnJheSBvZiBzdXBwb3J0ZWQgU29sYW5hIGluc3RydWN0aW9uc1xuICogQHJldHVybnMge0luc3RydWN0aW9uUGFyYW1zW119IEFuIGFycmF5IGNvbnRhaW5pbmcgaW5zdHJ1Y3Rpb24gcGFyYW1zIGZvciBzdGFraW5nIGFjdGl2YXRlIHR4XG4gKi9cbmZ1bmN0aW9uIHBhcnNlU3Rha2luZ0FjdGl2YXRlSW5zdHJ1Y3Rpb25zKFxuICBpbnN0cnVjdGlvbnM6IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXVxuKTogQXJyYXk8Tm9uY2UgfCBTdGFraW5nQWN0aXZhdGUgfCBNZW1vPiB7XG4gIGNvbnN0IGluc3RydWN0aW9uRGF0YTogQXJyYXk8Tm9uY2UgfCBTdGFraW5nQWN0aXZhdGUgfCBNZW1vPiA9IFtdO1xuICBjb25zdCBzdGFraW5nSW5zdHJ1Y3Rpb25zID0ge30gYXMgU3Rha2luZ0luc3RydWN0aW9ucztcbiAgZm9yIChjb25zdCBpbnN0cnVjdGlvbiBvZiBpbnN0cnVjdGlvbnMpIHtcbiAgICBjb25zdCB0eXBlID0gZ2V0SW5zdHJ1Y3Rpb25UeXBlKGluc3RydWN0aW9uKTtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5BZHZhbmNlTm9uY2VBY2NvdW50OlxuICAgICAgICBjb25zdCBhZHZhbmNlTm9uY2VJbnN0cnVjdGlvbiA9IFN5c3RlbUluc3RydWN0aW9uLmRlY29kZU5vbmNlQWR2YW5jZShpbnN0cnVjdGlvbik7XG4gICAgICAgIGNvbnN0IG5vbmNlOiBOb25jZSA9IHtcbiAgICAgICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5Ob25jZUFkdmFuY2UsXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICB3YWxsZXROb25jZUFkZHJlc3M6IGFkdmFuY2VOb25jZUluc3RydWN0aW9uLm5vbmNlUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBhdXRoV2FsbGV0QWRkcmVzczogYWR2YW5jZU5vbmNlSW5zdHJ1Y3Rpb24uYXV0aG9yaXplZFB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKG5vbmNlKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5NZW1vOlxuICAgICAgICBjb25zdCBtZW1vOiBNZW1vID0geyB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5NZW1vLCBwYXJhbXM6IHsgbWVtbzogaW5zdHJ1Y3Rpb24uZGF0YS50b1N0cmluZygpIH0gfTtcbiAgICAgICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2gobWVtbyk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uQ3JlYXRlOlxuICAgICAgICBzdGFraW5nSW5zdHJ1Y3Rpb25zLmNyZWF0ZSA9IFN5c3RlbUluc3RydWN0aW9uLmRlY29kZUNyZWF0ZUFjY291bnQoaW5zdHJ1Y3Rpb24pO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLlN0YWtpbmdJbml0aWFsaXplOlxuICAgICAgICBzdGFraW5nSW5zdHJ1Y3Rpb25zLmluaXRpYWxpemUgPSBTdGFrZUluc3RydWN0aW9uLmRlY29kZUluaXRpYWxpemUoaW5zdHJ1Y3Rpb24pO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLlN0YWtpbmdEZWxlZ2F0ZTpcbiAgICAgICAgc3Rha2luZ0luc3RydWN0aW9ucy5kZWxlZ2F0ZSA9IFN0YWtlSW5zdHJ1Y3Rpb24uZGVjb2RlRGVsZWdhdGUoaW5zdHJ1Y3Rpb24pO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICB2YWxpZGF0ZVN0YWtpbmdJbnN0cnVjdGlvbnMoc3Rha2luZ0luc3RydWN0aW9ucyk7XG4gIGNvbnN0IHN0YWtpbmdBY3RpdmF0ZTogU3Rha2luZ0FjdGl2YXRlID0ge1xuICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlN0YWtpbmdBY3RpdmF0ZSxcbiAgICBwYXJhbXM6IHtcbiAgICAgIGZyb21BZGRyZXNzOiBzdGFraW5nSW5zdHJ1Y3Rpb25zLmNyZWF0ZT8uZnJvbVB1YmtleS50b1N0cmluZygpIHx8ICcnLFxuICAgICAgc3Rha2luZ0FkZHJlc3M6IHN0YWtpbmdJbnN0cnVjdGlvbnMuaW5pdGlhbGl6ZT8uc3Rha2VQdWJrZXkudG9TdHJpbmcoKSB8fCAnJyxcbiAgICAgIGFtb3VudDogc3Rha2luZ0luc3RydWN0aW9ucy5jcmVhdGU/LmxhbXBvcnRzLnRvU3RyaW5nKCkgfHwgJycsXG4gICAgICB2YWxpZGF0b3I6XG4gICAgICAgIHN0YWtpbmdJbnN0cnVjdGlvbnMuZGVsZWdhdGU/LnZvdGVQdWJrZXkudG9TdHJpbmcoKSB8fFxuICAgICAgICBzdGFraW5nSW5zdHJ1Y3Rpb25zLmluaXRpYWxpemU/LmF1dGhvcml6ZWQuc3Rha2VyLnRvU3RyaW5nKCkgfHxcbiAgICAgICAgJycsXG4gICAgICBpc01hcmluYWRlOiBzdGFraW5nSW5zdHJ1Y3Rpb25zLmRlbGVnYXRlID09PSB1bmRlZmluZWQsXG4gICAgfSxcbiAgfTtcbiAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2goc3Rha2luZ0FjdGl2YXRlKTtcblxuICByZXR1cm4gaW5zdHJ1Y3Rpb25EYXRhO1xufVxuLyoqXG4gKiBQYXJzZXMgU29sYW5hIGluc3RydWN0aW9ucyB0byBjcmVhdGUgZGVsZWdhdGUgdHhcbiAqIE9ubHkgc3VwcG9ydHMgTm9uY2UsIFN0YWtpbmdEZWxlZ2F0ZVxuICpcbiAqIEBwYXJhbSB7VHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdfSBpbnN0cnVjdGlvbnMgLSBhbiBhcnJheSBvZiBzdXBwb3J0ZWQgU29sYW5hIGluc3RydWN0aW9uc1xuICogQHJldHVybnMge0luc3RydWN0aW9uUGFyYW1zW119IEFuIGFycmF5IGNvbnRhaW5pbmcgaW5zdHJ1Y3Rpb24gcGFyYW1zIGZvciBzdGFraW5nIGRlbGVnYXRlIHR4XG4gKi9cbmZ1bmN0aW9uIHBhcnNlU3Rha2luZ0RlbGVnYXRlSW5zdHJ1Y3Rpb25zKGluc3RydWN0aW9uczogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdKTogQXJyYXk8Tm9uY2UgfCBTdGFraW5nRGVsZWdhdGU+IHtcbiAgY29uc3QgaW5zdHJ1Y3Rpb25EYXRhOiBBcnJheTxOb25jZSB8IFN0YWtpbmdEZWxlZ2F0ZT4gPSBbXTtcbiAgZm9yIChjb25zdCBpbnN0cnVjdGlvbiBvZiBpbnN0cnVjdGlvbnMpIHtcbiAgICBjb25zdCB0eXBlID0gZ2V0SW5zdHJ1Y3Rpb25UeXBlKGluc3RydWN0aW9uKTtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5BZHZhbmNlTm9uY2VBY2NvdW50OlxuICAgICAgICBjb25zdCBhZHZhbmNlTm9uY2VJbnN0cnVjdGlvbiA9IFN5c3RlbUluc3RydWN0aW9uLmRlY29kZU5vbmNlQWR2YW5jZShpbnN0cnVjdGlvbik7XG4gICAgICAgIGNvbnN0IG5vbmNlOiBOb25jZSA9IHtcbiAgICAgICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5Ob25jZUFkdmFuY2UsXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICB3YWxsZXROb25jZUFkZHJlc3M6IGFkdmFuY2VOb25jZUluc3RydWN0aW9uLm5vbmNlUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBhdXRoV2FsbGV0QWRkcmVzczogYWR2YW5jZU5vbmNlSW5zdHJ1Y3Rpb24uYXV0aG9yaXplZFB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKG5vbmNlKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5TdGFraW5nRGVsZWdhdGU6XG4gICAgICAgIGNvbnN0IHN0YWtpbmdEZWxlZ2F0ZVBhcmFtcyA9IFN0YWtlSW5zdHJ1Y3Rpb24uZGVjb2RlRGVsZWdhdGUoaW5zdHJ1Y3Rpb24pO1xuICAgICAgICBjb25zdCBzdGFraW5nRGVsZWdhdGU6IFN0YWtpbmdEZWxlZ2F0ZSA9IHtcbiAgICAgICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5TdGFraW5nRGVsZWdhdGUsXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICBmcm9tQWRkcmVzczogc3Rha2luZ0RlbGVnYXRlUGFyYW1zLmF1dGhvcml6ZWRQdWJrZXkudG9TdHJpbmcoKSB8fCAnJyxcbiAgICAgICAgICAgIHN0YWtpbmdBZGRyZXNzOiBzdGFraW5nRGVsZWdhdGVQYXJhbXMuc3Rha2VQdWJrZXkudG9TdHJpbmcoKSB8fCAnJyxcbiAgICAgICAgICAgIHZhbGlkYXRvcjogc3Rha2luZ0RlbGVnYXRlUGFyYW1zLnZvdGVQdWJrZXkudG9TdHJpbmcoKSB8fCAnJyxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChzdGFraW5nRGVsZWdhdGUpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGluc3RydWN0aW9uRGF0YTtcbn1cblxuaW50ZXJmYWNlIFN0YWtpbmdJbnN0cnVjdGlvbnMge1xuICBjcmVhdGU/OiBDcmVhdGVBY2NvdW50UGFyYW1zO1xuICBpbml0aWFsaXplPzogSW5pdGlhbGl6ZVN0YWtlUGFyYW1zO1xuICBkZWxlZ2F0ZT86IERlbGVnYXRlU3Rha2VQYXJhbXM7XG4gIGF1dGhvcml6ZT86IEF1dGhvcml6ZVN0YWtlUGFyYW1zW107XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlU3Rha2luZ0luc3RydWN0aW9ucyhzdGFraW5nSW5zdHJ1Y3Rpb25zOiBTdGFraW5nSW5zdHJ1Y3Rpb25zKSB7XG4gIGlmICghc3Rha2luZ0luc3RydWN0aW9ucy5jcmVhdGUpIHtcbiAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkKCdJbnZhbGlkIHN0YWtpbmcgYWN0aXZhdGUgdHJhbnNhY3Rpb24sIG1pc3NpbmcgY3JlYXRlIHN0YWtlIGFjY291bnQgaW5zdHJ1Y3Rpb24nKTtcbiAgfVxuXG4gIGlmICghc3Rha2luZ0luc3RydWN0aW9ucy5pbml0aWFsaXplICYmIHN0YWtpbmdJbnN0cnVjdGlvbnMuZGVsZWdhdGUpIHtcbiAgICByZXR1cm47XG4gIH0gZWxzZSBpZiAoIXN0YWtpbmdJbnN0cnVjdGlvbnMuZGVsZWdhdGUgJiYgc3Rha2luZ0luc3RydWN0aW9ucy5pbml0aWFsaXplKSB7XG4gICAgcmV0dXJuO1xuICB9IGVsc2UgaWYgKCFzdGFraW5nSW5zdHJ1Y3Rpb25zLmRlbGVnYXRlICYmICFzdGFraW5nSW5zdHJ1Y3Rpb25zLmluaXRpYWxpemUpIHtcbiAgICAvLyBJZiBib3RoIGFyZSBtaXNzaW5nIHNvbWV0aGluZyBpcyB3cm9uZ1xuICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWQoXG4gICAgICAnSW52YWxpZCBzdGFraW5nIGFjdGl2YXRlIHRyYW5zYWN0aW9uLCBtaXNzaW5nIGluaXRpYWxpemUgc3Rha2UgYWNjb3VudC9kZWxlZ2F0ZSBpbnN0cnVjdGlvbidcbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogUGFyc2VzIFNvbGFuYSBpbnN0cnVjdGlvbnMgdG8gY3JlYXRlIGRlYWN0aXZhdGUgc3Rha2UgdHggaW5zdHJ1Y3Rpb25zIHBhcmFtcy4gU3VwcG9ydHMgZnVsbCBzdGFrZVxuICogYWNjb3VudCBkZWFjdGl2YXRpb24gYW5kIHBhcnRpYWwgc3Rha2UgYWNjb3VudCBkZWFjdGl2YXRpb24uXG4gKlxuICogV2hlbiBwYXJ0aWFsbHkgZGVhY3RpdmF0aW5nIGEgc3Rha2UgYWNjb3VudCB0aGlzIG1ldGhvZCBleHBlY3RzIHRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zOiBBbGxvY2F0ZSxcbiAqIHRvIGFsbG9jYXRlIGEgbmV3IHN0YWtpbmcgYWNjb3VudCwgQXNzaWduLCB0byBhc3NpZ24gdGhlIG5ld2x5IGNyZWF0ZWQgc3Rha2luZyBhY2NvdW50IHRvIHRoZVxuICogU3Rha2UgUHJvZ3JhbSwgU3BsaXQsIHRvIHNwbGl0IHRoZSBjdXJyZW50IHN0YWtlIGFjY291bnQsIGFuZCBTdGFraW5nRGVhY3RpdmF0ZSB0byBkZWFjdGl2YXRlIHRoZVxuICogbmV3bHkgY3JlYXRlZCBzdGFrZSBhY2NvdW50LlxuICpcbiAqIFN1cHBvcnRzIE5vbmNlLCBTdGFraW5nRGVhY3RpdmF0ZSwgTWVtbywgQWxsb2NhdGUsIEFzc2lnbiwgYW5kIFNwbGl0IFNvbGFuYSBpbnN0cnVjdGlvbnMuXG4gKlxuICogQHBhcmFtIHtUcmFuc2FjdGlvbkluc3RydWN0aW9uW119IGluc3RydWN0aW9ucyAtIGFuIGFycmF5IG9mIHN1cHBvcnRlZCBTb2xhbmEgaW5zdHJ1Y3Rpb25zXG4gKiBAcmV0dXJucyB7SW5zdHJ1Y3Rpb25QYXJhbXNbXX0gQW4gYXJyYXkgY29udGFpbmluZyBpbnN0cnVjdGlvbiBwYXJhbXMgZm9yIHN0YWtpbmcgZGVhY3RpdmF0ZSB0eFxuICovXG5mdW5jdGlvbiBwYXJzZVN0YWtpbmdEZWFjdGl2YXRlSW5zdHJ1Y3Rpb25zKFxuICBpbnN0cnVjdGlvbnM6IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXSxcbiAgY29pbk5hbWU/OiBzdHJpbmdcbik6IEFycmF5PE5vbmNlIHwgU3Rha2luZ0RlYWN0aXZhdGUgfCBNZW1vPiB7XG4gIGNvbnN0IGluc3RydWN0aW9uRGF0YTogQXJyYXk8Tm9uY2UgfCBTdGFraW5nRGVhY3RpdmF0ZSB8IE1lbW8+ID0gW107XG4gIGNvbnN0IHVuc3Rha2luZ0luc3RydWN0aW9uczogVW5zdGFraW5nSW5zdHJ1Y3Rpb25zW10gPSBbXTtcbiAgZm9yIChjb25zdCBpbnN0cnVjdGlvbiBvZiBpbnN0cnVjdGlvbnMpIHtcbiAgICBjb25zdCB0eXBlID0gZ2V0SW5zdHJ1Y3Rpb25UeXBlKGluc3RydWN0aW9uKTtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5BZHZhbmNlTm9uY2VBY2NvdW50OlxuICAgICAgICBjb25zdCBhZHZhbmNlTm9uY2VJbnN0cnVjdGlvbiA9IFN5c3RlbUluc3RydWN0aW9uLmRlY29kZU5vbmNlQWR2YW5jZShpbnN0cnVjdGlvbik7XG4gICAgICAgIGNvbnN0IG5vbmNlOiBOb25jZSA9IHtcbiAgICAgICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5Ob25jZUFkdmFuY2UsXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICB3YWxsZXROb25jZUFkZHJlc3M6IGFkdmFuY2VOb25jZUluc3RydWN0aW9uLm5vbmNlUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBhdXRoV2FsbGV0QWRkcmVzczogYWR2YW5jZU5vbmNlSW5zdHJ1Y3Rpb24uYXV0aG9yaXplZFB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKG5vbmNlKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5NZW1vOlxuICAgICAgICBjb25zdCBtZW1vOiBNZW1vID0ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLk1lbW8sXG4gICAgICAgICAgcGFyYW1zOiB7IG1lbW86IGluc3RydWN0aW9uLmRhdGEudG9TdHJpbmcoKSB9LFxuICAgICAgICB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChtZW1vKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5BbGxvY2F0ZTpcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHVuc3Rha2luZ0luc3RydWN0aW9ucy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zW3Vuc3Rha2luZ0luc3RydWN0aW9ucy5sZW5ndGggLSAxXS5hbGxvY2F0ZSA9PT0gdW5kZWZpbmVkXG4gICAgICAgICkge1xuICAgICAgICAgIHVuc3Rha2luZ0luc3RydWN0aW9uc1t1bnN0YWtpbmdJbnN0cnVjdGlvbnMubGVuZ3RoIC0gMV0uYWxsb2NhdGUgPVxuICAgICAgICAgICAgU3lzdGVtSW5zdHJ1Y3Rpb24uZGVjb2RlQWxsb2NhdGUoaW5zdHJ1Y3Rpb24pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHVuc3Rha2luZ0luc3RydWN0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgIGFsbG9jYXRlOiBTeXN0ZW1JbnN0cnVjdGlvbi5kZWNvZGVBbGxvY2F0ZShpbnN0cnVjdGlvbiksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5Bc3NpZ246XG4gICAgICAgIGlmIChcbiAgICAgICAgICB1bnN0YWtpbmdJbnN0cnVjdGlvbnMubGVuZ3RoID4gMCAmJlxuICAgICAgICAgIHVuc3Rha2luZ0luc3RydWN0aW9uc1t1bnN0YWtpbmdJbnN0cnVjdGlvbnMubGVuZ3RoIC0gMV0uYXNzaWduID09PSB1bmRlZmluZWRcbiAgICAgICAgKSB7XG4gICAgICAgICAgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zW3Vuc3Rha2luZ0luc3RydWN0aW9ucy5sZW5ndGggLSAxXS5hc3NpZ24gPSBTeXN0ZW1JbnN0cnVjdGlvbi5kZWNvZGVBc3NpZ24oaW5zdHJ1Y3Rpb24pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHVuc3Rha2luZ0luc3RydWN0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgIGFzc2lnbjogU3lzdGVtSW5zdHJ1Y3Rpb24uZGVjb2RlQXNzaWduKGluc3RydWN0aW9uKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLlNwbGl0OlxuICAgICAgICBpZiAoXG4gICAgICAgICAgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICB1bnN0YWtpbmdJbnN0cnVjdGlvbnNbdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmxlbmd0aCAtIDFdLnNwbGl0ID09PSB1bmRlZmluZWRcbiAgICAgICAgKSB7XG4gICAgICAgICAgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zW3Vuc3Rha2luZ0luc3RydWN0aW9ucy5sZW5ndGggLSAxXS5zcGxpdCA9IFN0YWtlSW5zdHJ1Y3Rpb24uZGVjb2RlU3BsaXQoaW5zdHJ1Y3Rpb24pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHVuc3Rha2luZ0luc3RydWN0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgIHNwbGl0OiBTdGFrZUluc3RydWN0aW9uLmRlY29kZVNwbGl0KGluc3RydWN0aW9uKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLlN0YWtpbmdEZWFjdGl2YXRlOlxuICAgICAgICBpZiAoXG4gICAgICAgICAgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICB1bnN0YWtpbmdJbnN0cnVjdGlvbnNbdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmxlbmd0aCAtIDFdLmRlYWN0aXZhdGUgPT09IHVuZGVmaW5lZFxuICAgICAgICApIHtcbiAgICAgICAgICB1bnN0YWtpbmdJbnN0cnVjdGlvbnNbdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmxlbmd0aCAtIDFdLmRlYWN0aXZhdGUgPVxuICAgICAgICAgICAgU3Rha2VJbnN0cnVjdGlvbi5kZWNvZGVEZWFjdGl2YXRlKGluc3RydWN0aW9uKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB1bnN0YWtpbmdJbnN0cnVjdGlvbnMucHVzaCh7XG4gICAgICAgICAgICBkZWFjdGl2YXRlOiBTdGFrZUluc3RydWN0aW9uLmRlY29kZURlYWN0aXZhdGUoaW5zdHJ1Y3Rpb24pLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uVHJhbnNmZXI6XG4gICAgICAgIGlmIChcbiAgICAgICAgICB1bnN0YWtpbmdJbnN0cnVjdGlvbnMubGVuZ3RoID4gMCAmJlxuICAgICAgICAgIHVuc3Rha2luZ0luc3RydWN0aW9uc1t1bnN0YWtpbmdJbnN0cnVjdGlvbnMubGVuZ3RoIC0gMV0udHJhbnNmZXIgPT09IHVuZGVmaW5lZFxuICAgICAgICApIHtcbiAgICAgICAgICB1bnN0YWtpbmdJbnN0cnVjdGlvbnNbdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmxlbmd0aCAtIDFdLnRyYW5zZmVyID1cbiAgICAgICAgICAgIFN5c3RlbUluc3RydWN0aW9uLmRlY29kZVRyYW5zZmVyKGluc3RydWN0aW9uKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB1bnN0YWtpbmdJbnN0cnVjdGlvbnMucHVzaCh7XG4gICAgICAgICAgICB0cmFuc2ZlcjogU3lzdGVtSW5zdHJ1Y3Rpb24uZGVjb2RlVHJhbnNmZXIoaW5zdHJ1Y3Rpb24pLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3QgdW5zdGFraW5nSW5zdHJ1Y3Rpb24gb2YgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zKSB7XG4gICAgdmFsaWRhdGVVbnN0YWtpbmdJbnN0cnVjdGlvbnModW5zdGFraW5nSW5zdHJ1Y3Rpb24pO1xuICAgIGNvbnN0IHN0YWtpbmdEZWFjdGl2YXRlOiBTdGFraW5nRGVhY3RpdmF0ZSA9IHtcbiAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlN0YWtpbmdEZWFjdGl2YXRlLFxuICAgICAgcGFyYW1zOiB7XG4gICAgICAgIGZyb21BZGRyZXNzOiB1bnN0YWtpbmdJbnN0cnVjdGlvbi5kZWFjdGl2YXRlPy5hdXRob3JpemVkUHVia2V5LnRvU3RyaW5nKCkgfHwgJycsXG4gICAgICAgIHN0YWtpbmdBZGRyZXNzOlxuICAgICAgICAgIHVuc3Rha2luZ0luc3RydWN0aW9uLnNwbGl0Py5zdGFrZVB1YmtleS50b1N0cmluZygpIHx8XG4gICAgICAgICAgdW5zdGFraW5nSW5zdHJ1Y3Rpb24uZGVhY3RpdmF0ZT8uc3Rha2VQdWJrZXkudG9TdHJpbmcoKSB8fFxuICAgICAgICAgICcnLFxuICAgICAgICBhbW91bnQ6IHVuc3Rha2luZ0luc3RydWN0aW9uLnNwbGl0Py5sYW1wb3J0cy50b1N0cmluZygpLFxuICAgICAgICB1bnN0YWtpbmdBZGRyZXNzOiB1bnN0YWtpbmdJbnN0cnVjdGlvbi5zcGxpdD8uc3BsaXRTdGFrZVB1YmtleS50b1N0cmluZygpLFxuICAgICAgICBpc01hcmluYWRlOiB1bnN0YWtpbmdJbnN0cnVjdGlvbi5kZWFjdGl2YXRlID09PSB1bmRlZmluZWQsXG4gICAgICAgIHJlY2lwaWVudHM6XG4gICAgICAgICAgdW5zdGFraW5nSW5zdHJ1Y3Rpb24uZGVhY3RpdmF0ZSA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBhZGRyZXNzOiB1bnN0YWtpbmdJbnN0cnVjdGlvbi50cmFuc2Zlcj8udG9QdWJrZXkudG9TdHJpbmcoKSB8fCAnJyxcbiAgICAgICAgICAgICAgICAgIGFtb3VudDogdW5zdGFraW5nSW5zdHJ1Y3Rpb24udHJhbnNmZXI/LmxhbXBvcnRzLnRvU3RyaW5nKCkgfHwgJycsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICB9LFxuICAgIH07XG4gICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2goc3Rha2luZ0RlYWN0aXZhdGUpO1xuICB9XG5cbiAgcmV0dXJuIGluc3RydWN0aW9uRGF0YTtcbn1cblxuaW50ZXJmYWNlIFVuc3Rha2luZ0luc3RydWN0aW9ucyB7XG4gIGFsbG9jYXRlPzogQWxsb2NhdGVQYXJhbXM7XG4gIGFzc2lnbj86IEFzc2lnblBhcmFtcztcbiAgc3BsaXQ/OiBTcGxpdFN0YWtlUGFyYW1zO1xuICBkZWFjdGl2YXRlPzogRGVhY3RpdmF0ZVN0YWtlUGFyYW1zO1xuICB0cmFuc2Zlcj86IERlY29kZWRUcmFuc2Zlckluc3RydWN0aW9uO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVVuc3Rha2luZ0luc3RydWN0aW9ucyh1bnN0YWtpbmdJbnN0cnVjdGlvbnM6IFVuc3Rha2luZ0luc3RydWN0aW9ucykge1xuICBpZiAoIXVuc3Rha2luZ0luc3RydWN0aW9ucy5kZWFjdGl2YXRlKSB7XG4gICAgaWYgKFxuICAgICAgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLnRyYW5zZmVyICYmXG4gICAgICAhdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmFsbG9jYXRlICYmXG4gICAgICAhdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmFzc2lnbiAmJlxuICAgICAgIXVuc3Rha2luZ0luc3RydWN0aW9ucy5zcGxpdFxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkKCdJbnZhbGlkIGRlYWN0aXZhdGUgc3Rha2UgdHJhbnNhY3Rpb24sIG1pc3NpbmcgZGVhY3RpdmF0ZSBzdGFrZSBhY2NvdW50IGluc3RydWN0aW9uJyk7XG4gIH0gZWxzZSBpZiAoXG4gICAgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmFsbG9jYXRlIHx8XG4gICAgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmFzc2lnbiB8fFxuICAgIHVuc3Rha2luZ0luc3RydWN0aW9ucy5zcGxpdCB8fFxuICAgIHVuc3Rha2luZ0luc3RydWN0aW9ucy50cmFuc2ZlclxuICApIHtcbiAgICBpZiAoIXVuc3Rha2luZ0luc3RydWN0aW9ucy5hbGxvY2F0ZSkge1xuICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZChcbiAgICAgICAgJ0ludmFsaWQgcGFydGlhbCBkZWFjdGl2YXRlIHN0YWtlIHRyYW5zYWN0aW9uLCBtaXNzaW5nIGFsbG9jYXRlIHVuc3Rha2UgYWNjb3VudCBpbnN0cnVjdGlvbidcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmICghdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmFzc2lnbikge1xuICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZChcbiAgICAgICAgJ0ludmFsaWQgcGFydGlhbCBkZWFjdGl2YXRlIHN0YWtlIHRyYW5zYWN0aW9uLCBtaXNzaW5nIGFzc2lnbiB1bnN0YWtlIGFjY291bnQgaW5zdHJ1Y3Rpb24nXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAoIXVuc3Rha2luZ0luc3RydWN0aW9ucy5zcGxpdCkge1xuICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZCgnSW52YWxpZCBwYXJ0aWFsIGRlYWN0aXZhdGUgc3Rha2UgdHJhbnNhY3Rpb24sIG1pc3Npbmcgc3BsaXQgc3Rha2UgYWNjb3VudCBpbnN0cnVjdGlvbicpO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICB1bnN0YWtpbmdJbnN0cnVjdGlvbnMuYWxsb2NhdGUuYWNjb3VudFB1YmtleS50b1N0cmluZygpICE9PSB1bnN0YWtpbmdJbnN0cnVjdGlvbnMuYXNzaWduLmFjY291bnRQdWJrZXkudG9TdHJpbmcoKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZChcbiAgICAgICAgJ0ludmFsaWQgcGFydGlhbCBkZWFjdGl2YXRlIHN0YWtlIHRyYW5zYWN0aW9uLCBtdXN0IGFsbG9jYXRlIGFuZCBhc3NpZ24gdGhlIHNhbWUgcHVibGljIGtleSdcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmICh1bnN0YWtpbmdJbnN0cnVjdGlvbnMuYWxsb2NhdGUuc3BhY2UgIT09IFN0YWtlUHJvZ3JhbS5zcGFjZSkge1xuICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZChcbiAgICAgICAgYEludmFsaWQgcGFydGlhbCBkZWFjdGl2YXRlIHN0YWtlIHRyYW5zYWN0aW9uLCB1bnN0YWtpbmcgYWNjb3VudCBtdXN0IGFsbG9jYXRlICR7U3Rha2VQcm9ncmFtLnNwYWNlfSBieXRlc2BcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmICh1bnN0YWtpbmdJbnN0cnVjdGlvbnMuYXNzaWduLnByb2dyYW1JZC50b1N0cmluZygpICE9PSBTdGFrZVByb2dyYW0ucHJvZ3JhbUlkLnRvU3RyaW5nKCkpIHtcbiAgICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWQoXG4gICAgICAgICdJbnZhbGlkIHBhcnRpYWwgZGVhY3RpdmF0ZSBzdGFrZSB0cmFuc2FjdGlvbiwgdGhlIHVuc3Rha2UgYWNjb3VudCBtdXN0IGJlIGFzc2lnbmVkIHRvIHRoZSBTdGFrZSBQcm9ncmFtJ1xuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmFsbG9jYXRlLmFjY291bnRQdWJrZXkudG9TdHJpbmcoKSAhPT1cbiAgICAgIHVuc3Rha2luZ0luc3RydWN0aW9ucy5zcGxpdC5zcGxpdFN0YWtlUHVia2V5LnRvU3RyaW5nKClcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWQoJ0ludmFsaWQgcGFydGlhbCBkZWFjdGl2YXRlIHN0YWtlIHRyYW5zYWN0aW9uLCBtdXN0IGFsbG9jYXRlIHRoZSB1bnN0YWtpbmcgYWNjb3VudCcpO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICB1bnN0YWtpbmdJbnN0cnVjdGlvbnMuc3BsaXQuc3Rha2VQdWJrZXkudG9TdHJpbmcoKSA9PT0gdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLnNwbGl0LnNwbGl0U3Rha2VQdWJrZXkudG9TdHJpbmcoKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZChcbiAgICAgICAgJ0ludmFsaWQgcGFydGlhbCBkZWFjdGl2YXRlIHN0YWtlIHRyYW5zYWN0aW9uLCB0aGUgdW5zdGFraW5nIGFjY291bnQgbXVzdCBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgU3Rha2UgQWNjb3VudCdcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmICghdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLnRyYW5zZmVyKSB7XG4gICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkKFxuICAgICAgICAnSW52YWxpZCBwYXJ0aWFsIGRlYWN0aXZhdGUgc3Rha2UgdHJhbnNhY3Rpb24sIG1pc3NpbmcgZnVuZGluZyBvZiB1bnN0YWtlIGFkZHJlc3MgaW5zdHJ1Y3Rpb24nXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFBhcnNlcyBTb2xhbmEgaW5zdHJ1Y3Rpb25zIHRvIGNyZWF0ZSBzdGFraW5nICB3aXRoZHJhdyB0eCBpbnN0cnVjdGlvbnMgcGFyYW1zXG4gKiBPbmx5IHN1cHBvcnRzIE5vbmNlLCBTdGFraW5nV2l0aGRyYXcsIGFuZCBNZW1vIFNvbGFuYSBpbnN0cnVjdGlvbnNcbiAqXG4gKiBAcGFyYW0ge1RyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXX0gaW5zdHJ1Y3Rpb25zIC0gYW4gYXJyYXkgb2Ygc3VwcG9ydGVkIFNvbGFuYSBpbnN0cnVjdGlvbnNcbiAqIEByZXR1cm5zIHtJbnN0cnVjdGlvblBhcmFtc1tdfSBBbiBhcnJheSBjb250YWluaW5nIGluc3RydWN0aW9uIHBhcmFtcyBmb3Igc3Rha2luZyB3aXRoZHJhdyB0eFxuICovXG5mdW5jdGlvbiBwYXJzZVN0YWtpbmdXaXRoZHJhd0luc3RydWN0aW9ucyhcbiAgaW5zdHJ1Y3Rpb25zOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uW11cbik6IEFycmF5PE5vbmNlIHwgU3Rha2luZ1dpdGhkcmF3IHwgTWVtbz4ge1xuICBjb25zdCBpbnN0cnVjdGlvbkRhdGE6IEFycmF5PE5vbmNlIHwgU3Rha2luZ1dpdGhkcmF3IHwgTWVtbz4gPSBbXTtcbiAgZm9yIChjb25zdCBpbnN0cnVjdGlvbiBvZiBpbnN0cnVjdGlvbnMpIHtcbiAgICBjb25zdCB0eXBlID0gZ2V0SW5zdHJ1Y3Rpb25UeXBlKGluc3RydWN0aW9uKTtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5BZHZhbmNlTm9uY2VBY2NvdW50OlxuICAgICAgICBjb25zdCBhZHZhbmNlTm9uY2VJbnN0cnVjdGlvbiA9IFN5c3RlbUluc3RydWN0aW9uLmRlY29kZU5vbmNlQWR2YW5jZShpbnN0cnVjdGlvbik7XG4gICAgICAgIGNvbnN0IG5vbmNlOiBOb25jZSA9IHtcbiAgICAgICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5Ob25jZUFkdmFuY2UsXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICB3YWxsZXROb25jZUFkZHJlc3M6IGFkdmFuY2VOb25jZUluc3RydWN0aW9uLm5vbmNlUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBhdXRoV2FsbGV0QWRkcmVzczogYWR2YW5jZU5vbmNlSW5zdHJ1Y3Rpb24uYXV0aG9yaXplZFB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKG5vbmNlKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5NZW1vOlxuICAgICAgICBjb25zdCBtZW1vOiBNZW1vID0ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLk1lbW8sXG4gICAgICAgICAgcGFyYW1zOiB7IG1lbW86IGluc3RydWN0aW9uLmRhdGEudG9TdHJpbmcoKSB9LFxuICAgICAgICB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChtZW1vKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5TdGFraW5nV2l0aGRyYXc6XG4gICAgICAgIGNvbnN0IHdpdGhkcmF3SW5zdHJ1Y3Rpb24gPSBTdGFrZUluc3RydWN0aW9uLmRlY29kZVdpdGhkcmF3KGluc3RydWN0aW9uKTtcbiAgICAgICAgY29uc3Qgc3Rha2luZ1dpdGhkcmF3OiBTdGFraW5nV2l0aGRyYXcgPSB7XG4gICAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuU3Rha2luZ1dpdGhkcmF3LFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgZnJvbUFkZHJlc3M6IHdpdGhkcmF3SW5zdHJ1Y3Rpb24uYXV0aG9yaXplZFB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgc3Rha2luZ0FkZHJlc3M6IHdpdGhkcmF3SW5zdHJ1Y3Rpb24uc3Rha2VQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGFtb3VudDogd2l0aGRyYXdJbnN0cnVjdGlvbi5sYW1wb3J0cy50b1N0cmluZygpLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKHN0YWtpbmdXaXRoZHJhdyk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBpbnN0cnVjdGlvbkRhdGE7XG59XG5cbi8qKlxuICogR2V0IHRoZSBtZW1vIG9iamVjdCBmcm9tIGluc3RydWN0aW9ucyBpZiBpdCBleGlzdHNcbiAqXG4gKiBAcGFyYW0ge1RyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXX0gaW5zdHJ1Y3Rpb25zIC0gdGhlIGFycmF5IG9mIHN1cHBvcnRlZCBTb2xhbmEgaW5zdHJ1Y3Rpb25zIHRvIGJlIHBhcnNlZFxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBudW1iZXI+fSBpbnN0cnVjdGlvbkluZGV4ZXMgLSB0aGUgaW5zdHJ1Y3Rpb25zIGluZGV4ZXMgb2YgdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb25cbiAqIEByZXR1cm5zIHtNZW1vIHwgdW5kZWZpbmVkfSAtIG1lbW8gb2JqZWN0IG9yIHVuZGVmaW5lZFxuICovXG5mdW5jdGlvbiBnZXRNZW1vKGluc3RydWN0aW9uczogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdLCBpbnN0cnVjdGlvbkluZGV4ZXM6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4pOiBNZW1vIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgaW5zdHJ1Y3Rpb25zTGVuZ3RoID0gT2JqZWN0LmtleXMoaW5zdHJ1Y3Rpb25JbmRleGVzKS5sZW5ndGg7XG4gIGlmIChpbnN0cnVjdGlvbnMubGVuZ3RoID09PSBpbnN0cnVjdGlvbnNMZW5ndGggJiYgaW5zdHJ1Y3Rpb25zW2luc3RydWN0aW9uSW5kZXhlcy5NZW1vXSkge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5NZW1vLFxuICAgICAgcGFyYW1zOiB7IG1lbW86IGluc3RydWN0aW9uc1tpbnN0cnVjdGlvbkluZGV4ZXMuTWVtb10uZGF0YS50b1N0cmluZygpIH0sXG4gICAgfTtcbiAgfVxufVxuXG5jb25zdCBhdGFJbml0SW5zdHJ1Y3Rpb25LZXlzSW5kZXhlcyA9IHtcbiAgUGF5ZXJBZGRyZXNzOiAwLFxuICBBVEFBZGRyZXNzOiAxLFxuICBPd25lckFkZHJlc3M6IDIsXG4gIE1pbnRBZGRyZXNzOiAzLFxufTtcblxuY29uc3QgY2xvc2VBdGFJbnN0cnVjdGlvbktleXNJbmRleGVzID0ge1xuICBBY2NvdW50QWRkcmVzczogMCxcbiAgRGVzdGluYXRpb25BZGRyZXNzOiAxLFxuICBBdXRob3JpdHlBZGRyZXNzOiAyLFxufTtcblxuLyoqXG4gKiBQYXJzZXMgU29sYW5hIGluc3RydWN0aW9ucyB0byBpbml0aWFsaXplIGFzc29jaWF0ZWQgdG9rZW4gYWNjb3VudCB0eCBpbnN0cnVjdGlvbnMgcGFyYW1zXG4gKlxuICogQHBhcmFtIHtUcmFuc2FjdGlvbkluc3RydWN0aW9uW119IGluc3RydWN0aW9ucyAtIGFuIGFycmF5IG9mIHN1cHBvcnRlZCBTb2xhbmEgaW5zdHJ1Y3Rpb25zXG4gKiBAcmV0dXJucyB7SW5zdHJ1Y3Rpb25QYXJhbXNbXX0gQW4gYXJyYXkgY29udGFpbmluZyBpbnN0cnVjdGlvbiBwYXJhbXMgZm9yIFNlbmQgdHhcbiAqL1xuZnVuY3Rpb24gcGFyc2VBdGFJbml0SW5zdHJ1Y3Rpb25zKFxuICBpbnN0cnVjdGlvbnM6IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXSxcbiAgaW5zdHJ1Y3Rpb25NZXRhZGF0YT86IEluc3RydWN0aW9uUGFyYW1zW10sXG4gIF91c2VUb2tlbkFkZHJlc3NUb2tlbk5hbWU/OiBib29sZWFuXG4pOiBBcnJheTxBdGFJbml0IHwgTWVtbyB8IE5vbmNlPiB7XG4gIGNvbnN0IGluc3RydWN0aW9uRGF0YTogQXJyYXk8QXRhSW5pdCB8IE1lbW8gfCBOb25jZT4gPSBbXTtcbiAgbGV0IG1lbW86IE1lbW8gfCB1bmRlZmluZWQ7XG5cbiAgZm9yIChjb25zdCBpbnN0cnVjdGlvbiBvZiBpbnN0cnVjdGlvbnMpIHtcbiAgICBjb25zdCB0eXBlID0gZ2V0SW5zdHJ1Y3Rpb25UeXBlKGluc3RydWN0aW9uKTtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5NZW1vOlxuICAgICAgICBtZW1vID0geyB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5NZW1vLCBwYXJhbXM6IHsgbWVtbzogaW5zdHJ1Y3Rpb24uZGF0YS50b1N0cmluZygpIH0gfTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uQWR2YW5jZU5vbmNlQWNjb3VudDpcbiAgICAgICAgY29uc3QgYWR2YW5jZU5vbmNlSW5zdHJ1Y3Rpb24gPSBTeXN0ZW1JbnN0cnVjdGlvbi5kZWNvZGVOb25jZUFkdmFuY2UoaW5zdHJ1Y3Rpb24pO1xuICAgICAgICBjb25zdCBub25jZTogTm9uY2UgPSB7XG4gICAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuTm9uY2VBZHZhbmNlLFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgd2FsbGV0Tm9uY2VBZGRyZXNzOiBhZHZhbmNlTm9uY2VJbnN0cnVjdGlvbi5ub25jZVB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgYXV0aFdhbGxldEFkZHJlc3M6IGFkdmFuY2VOb25jZUluc3RydWN0aW9uLmF1dGhvcml6ZWRQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChub25jZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLkluaXRpYWxpemVBc3NvY2lhdGVkVG9rZW5BY2NvdW50OlxuICAgICAgICBjb25zdCBtaW50QWRkcmVzcyA9IGluc3RydWN0aW9uLmtleXNbYXRhSW5pdEluc3RydWN0aW9uS2V5c0luZGV4ZXMuTWludEFkZHJlc3NdLnB1YmtleS50b1N0cmluZygpO1xuICAgICAgICBjb25zdCB0b2tlbk5hbWUgPSBmaW5kVG9rZW5OYW1lKG1pbnRBZGRyZXNzLCBpbnN0cnVjdGlvbk1ldGFkYXRhLCBfdXNlVG9rZW5BZGRyZXNzVG9rZW5OYW1lKTtcbiAgICAgICAgbGV0IHByb2dyYW1JRDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAoaW5zdHJ1Y3Rpb24ucHJvZ3JhbUlkKSB7XG4gICAgICAgICAgcHJvZ3JhbUlEID0gaW5zdHJ1Y3Rpb24ucHJvZ3JhbUlkLnRvU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXRhSW5pdDogQXRhSW5pdCA9IHtcbiAgICAgICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5DcmVhdGVBc3NvY2lhdGVkVG9rZW5BY2NvdW50LFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgbWludEFkZHJlc3MsXG4gICAgICAgICAgICBhdGFBZGRyZXNzOiBpbnN0cnVjdGlvbi5rZXlzW2F0YUluaXRJbnN0cnVjdGlvbktleXNJbmRleGVzLkFUQUFkZHJlc3NdLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgb3duZXJBZGRyZXNzOiBpbnN0cnVjdGlvbi5rZXlzW2F0YUluaXRJbnN0cnVjdGlvbktleXNJbmRleGVzLk93bmVyQWRkcmVzc10ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBwYXllckFkZHJlc3M6IGluc3RydWN0aW9uLmtleXNbYXRhSW5pdEluc3RydWN0aW9uS2V5c0luZGV4ZXMuUGF5ZXJBZGRyZXNzXS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIHRva2VuTmFtZSxcbiAgICAgICAgICAgIHByb2dyYW1JZDogcHJvZ3JhbUlELFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKGF0YUluaXQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWQoXG4gICAgICAgICAgJ0ludmFsaWQgdHJhbnNhY3Rpb24sIGluc3RydWN0aW9uIHR5cGUgbm90IHN1cHBvcnRlZDogJyArIGdldEluc3RydWN0aW9uVHlwZShpbnN0cnVjdGlvbilcbiAgICAgICAgKTtcbiAgICB9XG4gIH1cbiAgaWYgKG1lbW8pIHtcbiAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChtZW1vKTtcbiAgfVxuICByZXR1cm4gaW5zdHJ1Y3Rpb25EYXRhO1xufVxuXG5jb25zdCBhdGFDbG9zZUluc3RydWN0aW9uS2V5c0luZGV4ZXMgPSB7XG4gIEFjY291bnRBZGRyZXNzOiAwLFxuICBEZXN0aW5hdGlvbkFkZHJlc3M6IDEsXG4gIEF1dGhvcml0eUFkZHJlc3M6IDIsXG59O1xuXG4vKipcbiAqIFBhcnNlcyBTb2xhbmEgaW5zdHJ1Y3Rpb25zIHRvIGNsb3NlIGFzc29jaWF0ZWQgdG9rZW4gYWNjb3VudCB0eCBpbnN0cnVjdGlvbnMgcGFyYW1zXG4gKlxuICogQHBhcmFtIHtUcmFuc2FjdGlvbkluc3RydWN0aW9uW119IGluc3RydWN0aW9ucyAtIGFuIGFycmF5IG9mIHN1cHBvcnRlZCBTb2xhbmEgaW5zdHJ1Y3Rpb25zXG4gKiBAcmV0dXJucyB7SW5zdHJ1Y3Rpb25QYXJhbXNbXX0gQW4gYXJyYXkgY29udGFpbmluZyBpbnN0cnVjdGlvbiBwYXJhbXMgZm9yIFNlbmQgdHhcbiAqL1xuZnVuY3Rpb24gcGFyc2VBdGFDbG9zZUluc3RydWN0aW9ucyhpbnN0cnVjdGlvbnM6IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXSk6IEFycmF5PEF0YUNsb3NlIHwgTm9uY2U+IHtcbiAgY29uc3QgaW5zdHJ1Y3Rpb25EYXRhOiBBcnJheTxBdGFDbG9zZSB8IE5vbmNlPiA9IFtdO1xuICBmb3IgKGNvbnN0IGluc3RydWN0aW9uIG9mIGluc3RydWN0aW9ucykge1xuICAgIGNvbnN0IHR5cGUgPSBnZXRJbnN0cnVjdGlvblR5cGUoaW5zdHJ1Y3Rpb24pO1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLkFkdmFuY2VOb25jZUFjY291bnQ6XG4gICAgICAgIGNvbnN0IGFkdmFuY2VOb25jZUluc3RydWN0aW9uID0gU3lzdGVtSW5zdHJ1Y3Rpb24uZGVjb2RlTm9uY2VBZHZhbmNlKGluc3RydWN0aW9uKTtcbiAgICAgICAgY29uc3Qgbm9uY2U6IE5vbmNlID0ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLk5vbmNlQWR2YW5jZSxcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIHdhbGxldE5vbmNlQWRkcmVzczogYWR2YW5jZU5vbmNlSW5zdHJ1Y3Rpb24ubm9uY2VQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGF1dGhXYWxsZXRBZGRyZXNzOiBhZHZhbmNlTm9uY2VJbnN0cnVjdGlvbi5hdXRob3JpemVkUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2gobm9uY2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5DbG9zZUFzc29jaWF0ZWRUb2tlbkFjY291bnQ6XG4gICAgICAgIGNvbnN0IGF0YUNsb3NlOiBBdGFDbG9zZSA9IHtcbiAgICAgICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5DbG9zZUFzc29jaWF0ZWRUb2tlbkFjY291bnQsXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICBhY2NvdW50QWRkcmVzczogaW5zdHJ1Y3Rpb24ua2V5c1thdGFDbG9zZUluc3RydWN0aW9uS2V5c0luZGV4ZXMuQWNjb3VudEFkZHJlc3NdLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgZGVzdGluYXRpb25BZGRyZXNzOiBpbnN0cnVjdGlvbi5rZXlzW2F0YUNsb3NlSW5zdHJ1Y3Rpb25LZXlzSW5kZXhlcy5EZXN0aW5hdGlvbkFkZHJlc3NdLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgYXV0aG9yaXR5QWRkcmVzczogaW5zdHJ1Y3Rpb24ua2V5c1thdGFDbG9zZUluc3RydWN0aW9uS2V5c0luZGV4ZXMuQXV0aG9yaXR5QWRkcmVzc10ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2goYXRhQ2xvc2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWQoXG4gICAgICAgICAgJ0ludmFsaWQgdHJhbnNhY3Rpb24sIGluc3RydWN0aW9uIHR5cGUgbm90IHN1cHBvcnRlZDogJyArIGdldEluc3RydWN0aW9uVHlwZShpbnN0cnVjdGlvbilcbiAgICAgICAgKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGluc3RydWN0aW9uRGF0YTtcbn1cblxuLyoqXG4gKiBQYXJzZXMgU29sYW5hIGluc3RydWN0aW9ucyB0byBhdXRob3JpemVkIHN0YWtpbmcgYWNjb3VudCBwYXJhbXNcbiAqIE9ubHkgc3VwcG9ydHMgTm9uY2UsIEF1dGhvcml6ZSBpbnN0cnVjdGlvbnNcbiAqXG4gKiBAcGFyYW0ge1RyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXX0gaW5zdHJ1Y3Rpb25zIC0gYW4gYXJyYXkgb2Ygc3VwcG9ydGVkIFNvbGFuYSBpbnN0cnVjdGlvbnNcbiAqIEByZXR1cm5zIHtJbnN0cnVjdGlvblBhcmFtc1tdfSBBbiBhcnJheSBjb250YWluaW5nIGluc3RydWN0aW9uIHBhcmFtcyBmb3Igc3Rha2luZyBhdXRob3JpemUgdHhcbiAqL1xuZnVuY3Rpb24gcGFyc2VTdGFraW5nQXV0aG9yaXplSW5zdHJ1Y3Rpb25zKFxuICBpbnN0cnVjdGlvbnM6IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXVxuKTogQXJyYXk8Tm9uY2UgfCBTdGFraW5nQXV0aG9yaXplIHwgTWVtbz4ge1xuICBjb25zdCBpbnN0cnVjdGlvbkRhdGE6IEFycmF5PE5vbmNlIHwgU3Rha2luZ0F1dGhvcml6ZSB8IE1lbW8+ID0gW107XG4gIGZvciAoY29uc3QgaW5zdHJ1Y3Rpb24gb2YgaW5zdHJ1Y3Rpb25zKSB7XG4gICAgY29uc3QgdHlwZSA9IGdldEluc3RydWN0aW9uVHlwZShpbnN0cnVjdGlvbik7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uQWR2YW5jZU5vbmNlQWNjb3VudDpcbiAgICAgICAgY29uc3QgYWR2YW5jZU5vbmNlSW5zdHJ1Y3Rpb24gPSBTeXN0ZW1JbnN0cnVjdGlvbi5kZWNvZGVOb25jZUFkdmFuY2UoaW5zdHJ1Y3Rpb24pO1xuICAgICAgICBjb25zdCBub25jZTogTm9uY2UgPSB7XG4gICAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuTm9uY2VBZHZhbmNlLFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgd2FsbGV0Tm9uY2VBZGRyZXNzOiBhZHZhbmNlTm9uY2VJbnN0cnVjdGlvbi5ub25jZVB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgYXV0aFdhbGxldEFkZHJlc3M6IGFkdmFuY2VOb25jZUluc3RydWN0aW9uLmF1dGhvcml6ZWRQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChub25jZSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uTWVtbzpcbiAgICAgICAgY29uc3QgbWVtbzogTWVtbyA9IHsgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuTWVtbywgcGFyYW1zOiB7IG1lbW86IGluc3RydWN0aW9uLmRhdGEudG9TdHJpbmcoKSB9IH07XG4gICAgICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKG1lbW8pO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLkF1dGhvcml6ZTpcbiAgICAgICAgY29uc3QgYXV0aG9yaXplID0gU3Rha2VJbnN0cnVjdGlvbi5kZWNvZGVBdXRob3JpemUoaW5zdHJ1Y3Rpb24pO1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaCh7XG4gICAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuU3Rha2luZ0F1dGhvcml6ZSxcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIHN0YWtpbmdBZGRyZXNzOiBhdXRob3JpemUuc3Rha2VQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIG9sZEF1dGhvcml6ZUFkZHJlc3M6IGF1dGhvcml6ZS5hdXRob3JpemVkUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBuZXdBdXRob3JpemVBZGRyZXNzOiBhdXRob3JpemUubmV3QXV0aG9yaXplZFB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgbmV3V2l0aGRyYXdBZGRyZXNzOiBhdXRob3JpemUuY3VzdG9kaWFuUHVia2V5Py50b1N0cmluZygpIHx8ICcnLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaW5zdHJ1Y3Rpb25EYXRhO1xufVxuXG4vKipcbiAqIFBhcnNlcyBTb2xhbmEgaW5zdHJ1Y3Rpb25zIHRvIGF1dGhvcml6ZWQgc3Rha2luZyBhY2NvdW50IHBhcmFtc1xuICogT25seSBzdXBwb3J0cyBOb25jZSwgQXV0aG9yaXplIGluc3RydWN0aW9uc1xuICpcbiAqIEBwYXJhbSB7VHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdfSBpbnN0cnVjdGlvbnMgLSBhbiBhcnJheSBvZiBzdXBwb3J0ZWQgU29sYW5hIGluc3RydWN0aW9uc1xuICogQHJldHVybnMge0luc3RydWN0aW9uUGFyYW1zW119IEFuIGFycmF5IGNvbnRhaW5pbmcgaW5zdHJ1Y3Rpb24gcGFyYW1zIGZvciBzdGFraW5nIGF1dGhvcml6ZSB0eFxuICovXG5mdW5jdGlvbiBwYXJzZVN0YWtpbmdBdXRob3JpemVSYXdJbnN0cnVjdGlvbnMoaW5zdHJ1Y3Rpb25zOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uW10pOiBBcnJheTxOb25jZSB8IFN0YWtpbmdBdXRob3JpemU+IHtcbiAgY29uc3QgaW5zdHJ1Y3Rpb25EYXRhOiBBcnJheTxOb25jZSB8IFN0YWtpbmdBdXRob3JpemU+ID0gW107XG4gIGFzc2VydChpbnN0cnVjdGlvbnMubGVuZ3RoID09PSAyLCAnSW52YWxpZCBudW1iZXIgb2YgaW5zdHJ1Y3Rpb25zJyk7XG4gIGNvbnN0IGFkdmFuY2VOb25jZUluc3RydWN0aW9uID0gU3lzdGVtSW5zdHJ1Y3Rpb24uZGVjb2RlTm9uY2VBZHZhbmNlKGluc3RydWN0aW9uc1swXSk7XG4gIGNvbnN0IG5vbmNlOiBOb25jZSA9IHtcbiAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5Ob25jZUFkdmFuY2UsXG4gICAgcGFyYW1zOiB7XG4gICAgICB3YWxsZXROb25jZUFkZHJlc3M6IGFkdmFuY2VOb25jZUluc3RydWN0aW9uLm5vbmNlUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICBhdXRoV2FsbGV0QWRkcmVzczogYWR2YW5jZU5vbmNlSW5zdHJ1Y3Rpb24uYXV0aG9yaXplZFB1YmtleS50b1N0cmluZygpLFxuICAgIH0sXG4gIH07XG4gIGluc3RydWN0aW9uRGF0YS5wdXNoKG5vbmNlKTtcbiAgY29uc3QgYXV0aG9yaXplID0gaW5zdHJ1Y3Rpb25zWzFdO1xuICBhc3NlcnQoYXV0aG9yaXplLmtleXMubGVuZ3RoID09PSA1LCAnSW52YWxpZCBudW1iZXIgb2Yga2V5cyBpbiBhdXRob3JpemUgaW5zdHJ1Y3Rpb24nKTtcbiAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2goe1xuICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlN0YWtpbmdBdXRob3JpemUsXG4gICAgcGFyYW1zOiB7XG4gICAgICBzdGFraW5nQWRkcmVzczogYXV0aG9yaXplLmtleXNbMF0ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICBvbGRBdXRob3JpemVBZGRyZXNzOiBhdXRob3JpemUua2V5c1syXS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgIG5ld0F1dGhvcml6ZUFkZHJlc3M6IGF1dGhvcml6ZS5rZXlzWzNdLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgY3VzdG9kaWFuQWRkcmVzczogYXV0aG9yaXplLmtleXNbNF0ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgfSxcbiAgfSk7XG4gIHJldHVybiBpbnN0cnVjdGlvbkRhdGE7XG59XG5cbmZ1bmN0aW9uIGZpbmRUb2tlbk5hbWUoXG4gIG1pbnRBZGRyZXNzOiBzdHJpbmcsXG4gIGluc3RydWN0aW9uTWV0YWRhdGE/OiBJbnN0cnVjdGlvblBhcmFtc1tdLFxuICBfdXNlVG9rZW5BZGRyZXNzVG9rZW5OYW1lPzogYm9vbGVhblxuKTogc3RyaW5nIHtcbiAgbGV0IHRva2VuOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgY29pbnMuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFNvbENvaW4gJiYgdmFsdWUudG9rZW5BZGRyZXNzID09PSBtaW50QWRkcmVzcykge1xuICAgICAgdG9rZW4gPSB2YWx1ZS5uYW1lO1xuICAgIH1cbiAgfSk7XG5cbiAgaWYgKCF0b2tlbiAmJiBpbnN0cnVjdGlvbk1ldGFkYXRhKSB7XG4gICAgaW5zdHJ1Y3Rpb25NZXRhZGF0YS5mb3JFYWNoKChpbnN0cnVjdGlvbikgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICBpbnN0cnVjdGlvbi50eXBlID09PSBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5DcmVhdGVBc3NvY2lhdGVkVG9rZW5BY2NvdW50ICYmXG4gICAgICAgIGluc3RydWN0aW9uLnBhcmFtcy5taW50QWRkcmVzcyA9PT0gbWludEFkZHJlc3NcbiAgICAgICkge1xuICAgICAgICB0b2tlbiA9IGluc3RydWN0aW9uLnBhcmFtcy50b2tlbk5hbWU7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICBpbnN0cnVjdGlvbi50eXBlID09PSBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5Ub2tlblRyYW5zZmVyICYmXG4gICAgICAgIGluc3RydWN0aW9uLnBhcmFtcy50b2tlbkFkZHJlc3MgPT09IG1pbnRBZGRyZXNzXG4gICAgICApIHtcbiAgICAgICAgdG9rZW4gPSBpbnN0cnVjdGlvbi5wYXJhbXMudG9rZW5OYW1lO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgaWYgKCF0b2tlbiAmJiBfdXNlVG9rZW5BZGRyZXNzVG9rZW5OYW1lKSB7XG4gICAgdG9rZW4gPSBtaW50QWRkcmVzcztcbiAgfVxuXG4gIGFzc2VydCh0b2tlbik7XG5cbiAgcmV0dXJuIHRva2VuO1xufVxuIl19