@bitgo-beta/abstract-substrate 1.0.1-beta.43 → 1.0.1-beta.430

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 (54) hide show
  1. package/CHANGELOG.md +165 -0
  2. package/dist/src/abstractSubstrateCoin.d.ts +57 -23
  3. package/dist/src/abstractSubstrateCoin.d.ts.map +1 -1
  4. package/dist/src/abstractSubstrateCoin.js +335 -62
  5. package/dist/src/lib/constants.d.ts +2 -0
  6. package/dist/src/lib/constants.d.ts.map +1 -0
  7. package/dist/src/lib/constants.js +5 -0
  8. package/dist/src/lib/errors.d.ts +8 -0
  9. package/dist/src/lib/errors.d.ts.map +1 -0
  10. package/dist/src/lib/errors.js +19 -0
  11. package/dist/src/lib/iface.d.ts +83 -197
  12. package/dist/src/lib/iface.d.ts.map +1 -1
  13. package/dist/src/lib/iface.js +25 -73
  14. package/dist/src/lib/index.d.ts +9 -2
  15. package/dist/src/lib/index.d.ts.map +1 -1
  16. package/dist/src/lib/index.js +22 -4
  17. package/dist/src/lib/keyPair.d.ts +6 -13
  18. package/dist/src/lib/keyPair.d.ts.map +1 -1
  19. package/dist/src/lib/keyPair.js +12 -19
  20. package/dist/src/lib/nativeTransferBuilder.d.ts +61 -0
  21. package/dist/src/lib/nativeTransferBuilder.d.ts.map +1 -0
  22. package/dist/src/lib/nativeTransferBuilder.js +147 -0
  23. package/dist/src/lib/singletonRegistry.d.ts +8 -0
  24. package/dist/src/lib/singletonRegistry.d.ts.map +1 -0
  25. package/dist/src/lib/singletonRegistry.js +20 -0
  26. package/dist/src/lib/transaction.d.ts +74 -0
  27. package/dist/src/lib/transaction.d.ts.map +1 -0
  28. package/dist/src/lib/transaction.js +553 -0
  29. package/dist/src/lib/transactionBuilder.d.ts +121 -0
  30. package/dist/src/lib/transactionBuilder.d.ts.map +1 -0
  31. package/dist/src/lib/transactionBuilder.js +334 -0
  32. package/dist/src/lib/transferBuilder.d.ts +6 -0
  33. package/dist/src/lib/transferBuilder.d.ts.map +1 -0
  34. package/dist/src/lib/transferBuilder.js +11 -0
  35. package/dist/src/lib/txnSchema.d.ts +10 -0
  36. package/dist/src/lib/txnSchema.d.ts.map +1 -0
  37. package/dist/src/lib/txnSchema.js +57 -0
  38. package/dist/src/lib/utils.d.ts +14 -143
  39. package/dist/src/lib/utils.d.ts.map +1 -1
  40. package/dist/src/lib/utils.js +26 -243
  41. package/dist/tsconfig.tsbuildinfo +1 -1
  42. package/package.json +10 -5
  43. package/dist/src/lib/iface_utils.d.ts +0 -59
  44. package/dist/src/lib/iface_utils.d.ts.map +0 -1
  45. package/dist/src/lib/iface_utils.js +0 -92
  46. package/dist/src/resources/index.d.ts +0 -3
  47. package/dist/src/resources/index.d.ts.map +0 -1
  48. package/dist/src/resources/index.js +0 -19
  49. package/dist/src/resources/mainnet.d.ts +0 -2
  50. package/dist/src/resources/mainnet.d.ts.map +0 -1
  51. package/dist/src/resources/mainnet.js +0 -5
  52. package/dist/src/resources/westend.d.ts +0 -2
  53. package/dist/src/resources/westend.d.ts.map +0 -1
  54. package/dist/src/resources/westend.js +0 -5
@@ -1,9 +1,10 @@
1
- import { DotAssetTypes, BaseUtils, DotAddressFormat, Seed } from '@bitgo-beta/sdk-core';
1
+ import { BaseUtils, Seed } from '@bitgo-beta/sdk-core';
2
+ import { NetworkType } from '@bitgo-beta/statics';
2
3
  import { KeyringPair } from '@polkadot/keyring/types';
3
- import { Args, BaseTxInfo, OptionsWithMeta, UnsignedTransaction } from '@substrate/txwrapper-core';
4
+ import { UnsignedTransaction } from '@substrate/txwrapper-core';
4
5
  import { DecodedSignedTx, DecodedSigningPayload, TypeRegistry } from '@substrate/txwrapper-core/lib/types';
5
- import { AddProxyBatchCallArgs, BatchArgs, BatchCallObject, HexString, ProxyArgs, StakeArgs, StakeBatchCallArgs, StakeMoreArgs, StakeMoreCallArgs, TransferAllArgs, TransferArgs, TxMethod, UnstakeBatchCallArgs } from './iface';
6
6
  import { KeyPair } from '.';
7
+ import { HexString, Material, TransferAllArgs, TransferArgs, TxMethod, AddStakeArgs, RemoveStakeArgs, BondArgs, BondExtraArgs, NominateArgs, ChillArgs, UnbondArgs, WithdrawUnbondedArgs, BatchArgs } from './iface';
7
8
  export declare class Utils implements BaseUtils {
8
9
  /** @inheritdoc */
9
10
  isValidAddress(address: string): boolean;
@@ -33,24 +34,6 @@ export declare class Utils implements BaseUtils {
33
34
  * @returns {Seed} - the object Seed
34
35
  */
35
36
  decodeSeed(seed: string): Seed;
36
- /**
37
- * Helper function to capitalize the first letter of a string
38
- *
39
- * @param {string} val
40
- * @returns {string}
41
- */
42
- capitalizeFirstLetter(val: string): string;
43
- /**
44
- * Helper function to decode the internal method hex in case of a proxy transaction
45
- *
46
- * @param {string | UnsignedTransaction} tx
47
- * @param { metadataRpc: string; registry: TypeRegistry } options
48
- * @returns {TransferArgs}
49
- */
50
- decodeCallMethod(tx: string | UnsignedTransaction, options: {
51
- metadataRpc: string;
52
- registry: TypeRegistry;
53
- }): TransferArgs;
54
37
  /**
55
38
  * keyPairFromSeed generates an object with secretKey and publicKey using the substrate sdk
56
39
  * @param seed 32 bytes long seed
@@ -80,7 +63,7 @@ export declare class Utils implements BaseUtils {
80
63
  * @param registry Transaction registry
81
64
  * @returns string Serialized transaction
82
65
  */
83
- serializeSignedTransaction(transaction: any, signature: any, metadataRpc: `0x${string}`, registry: any): string;
66
+ serializeSignedTransaction(transaction: UnsignedTransaction, signature: HexString, metadataRpc: `0x${string}`, registry: TypeRegistry): string;
84
67
  /**
85
68
  * Decodes the substrate address from the given format
86
69
  *
@@ -105,93 +88,17 @@ export declare class Utils implements BaseUtils {
105
88
  */
106
89
  getTxHash(txHex: string): string;
107
90
  isSigningPayload(payload: DecodedSigningPayload | DecodedSignedTx): payload is DecodedSigningPayload;
108
- isProxyTransfer(arg: TxMethod['args']): arg is ProxyArgs;
109
91
  isTransfer(arg: TxMethod['args']): arg is TransferArgs;
110
92
  isTransferAll(arg: TxMethod['args']): arg is TransferAllArgs;
111
- /**
112
- * Returns true if arg is of type BatchArgs, false otherwise.
113
- *
114
- * @param arg The object to test.
115
- *
116
- * @return true if arg is of type BatchArgs, false otherwise.
117
- */
93
+ isAddStake(arg: TxMethod['args']): arg is AddStakeArgs;
94
+ isRemoveStake(arg: TxMethod['args']): arg is RemoveStakeArgs;
95
+ isBond(arg: TxMethod['args']): arg is BondArgs;
96
+ isBondExtra(arg: TxMethod['args']): arg is BondExtraArgs;
97
+ isNominate(arg: TxMethod['args']): arg is NominateArgs;
98
+ isChill(arg: TxMethod['args']): arg is ChillArgs;
99
+ isUnbond(arg: TxMethod['args']): arg is UnbondArgs;
100
+ isWithdrawUnbonded(arg: TxMethod['args']): arg is WithdrawUnbondedArgs;
118
101
  isBatch(arg: TxMethod['args']): arg is BatchArgs;
119
- /**
120
- * Returns true if arg is of type BatchArgs and the calls of the batch are staking calls: a stake
121
- * call (bond) followed by an add proxy call (addProxy), false otherwise.
122
- *
123
- * @param arg The object to test.
124
- *
125
- * @return true if arg is of type BatchArgs and the calls of the batch are staking calls: a stake
126
- * call (bond) followed by an add proxy call (addProxy), false otherwise.
127
- */
128
- isStakingBatch(arg: TxMethod['args']): arg is BatchArgs;
129
- /**
130
- * Returns true if arg is of type StakeBatchCallArgs, false otherwise.
131
- *
132
- * @param arg The object to test.
133
- *
134
- * @return true if arg is of type StakeBatchCallArgs, false otherwise.
135
- */
136
- isStakeBatchCallArgs(arg: BatchCallObject['args']): arg is StakeBatchCallArgs;
137
- /**
138
- * Returns true if arg is of type AddProxyBatchCallArgs, false otherwise.
139
- *
140
- * @param arg The object to test.
141
- *
142
- * @return true if arg is of type AddProxyBatchCallArgs, false otherwise.
143
- */
144
- isAddProxyBatchCallArgs(arg: BatchCallObject['args']): arg is AddProxyBatchCallArgs;
145
- /**
146
- * Returns true if arg is of type BatchArgs and the calls of the batch are unstaking calls: a remove
147
- * proxy call (removeProxy), followed by a chill call, and an unstake call (unbond), false otherwise.
148
- *
149
- * @param arg The object to test.
150
- *
151
- * @return true if arg is of type BatchArgs and the calls of the batch are unstaking calls: a remove
152
- * proxy call (removeProxy), followed by a chill call, and an unstake call (unbond), false otherwise.
153
- */
154
- isUnstakingBatch(arg: TxMethod['args']): arg is BatchArgs;
155
- /**
156
- * Returns true if arg is of type AddProxyBatchCallArgs, false otherwise.
157
- *
158
- * @param arg The object to test.
159
- *
160
- * @return true if arg is of type AddProxyBatchCallArgs, false otherwise.
161
- */
162
- isRemoveProxyBatchCallArgs(arg: BatchCallObject['args']): arg is AddProxyBatchCallArgs;
163
- /**
164
- * Returns true if arg is of type UnstakeBatchCallArgs, false otherwise.
165
- *
166
- * @param arg The object to test.
167
- *
168
- * @return true if arg is of type UnstakeBatchCallArgs, false otherwise.
169
- */
170
- isUnstakeBatchCallArgs(arg: BatchCallObject['args']): arg is UnstakeBatchCallArgs;
171
- /**
172
- * Returns true if arg is of type StakeArgs, false otherwise.
173
- *
174
- * @param arg The object to test.
175
- *
176
- * @return true if arg is of type StakeArgs, false otherwise.
177
- */
178
- isBond(arg: TxMethod['args']): arg is StakeArgs;
179
- /**
180
- * Returns true if arg is of type StakeMoreArgs, false otherwise.
181
- *
182
- * @param arg The object to test.
183
- *
184
- * @return true if arg is of type StakeMoreArgs, false otherwise.
185
- */
186
- isBondExtra(arg: TxMethod['args'] | BatchCallObject['args']): arg is StakeMoreArgs;
187
- /**
188
- * Returns true if arg is of type StakeMoreArgs, false otherwise.
189
- *
190
- * @param arg The object to test.
191
- *
192
- * @return true if arg is of type StakeMoreArgs, false otherwise.
193
- */
194
- isBondBatchExtra(arg: BatchCallObject['args']): arg is StakeMoreCallArgs;
195
102
  /**
196
103
  * extracts and returns the signature in hex format given a raw signed transaction
197
104
  *
@@ -215,43 +122,7 @@ export declare class Utils implements BaseUtils {
215
122
  * @param hexValue
216
123
  */
217
124
  isZeroHex(hexValue: string): boolean;
218
- /**
219
- * Takes an asset name and returns the respective address to format to
220
- * since substrate addresses differ depending on the network
221
- * @param networkCoinName
222
- */
223
- getAddressFormat(networkCoinName: DotAssetTypes): DotAddressFormat;
224
- /**
225
- * Creates a pure proxy extrinsic. Substrate has renamed anonymous proxies to pure proxies, but
226
- * the libraries we are using to build transactions have not been updated, as a stop gap we are
227
- * defining the pure proxy extrinsic here.
228
- *
229
- * @param args Arguments to the createPure extrinsic.
230
- * @param info Common information to all transactions.
231
- * @param options Chain registry and metadata.
232
- */
233
- pureProxy(args: PureProxyArgs, info: BaseTxInfo, options: OptionsWithMeta): UnsignedTransaction;
234
- /**
235
- * Removes '0x' from a given `string` if present.
236
- *
237
- * @param {string} str the string value.
238
- *
239
- * @return {string} a string without a '0x' prefix.
240
- */
241
- stripHexPrefix(str: string): string;
242
- /**
243
- * Returns true if a string starts with '0x', false otherwise.
244
- *
245
- * @param {string} str the string value.
246
- *
247
- * @return {boolean} true if a string starts with '0x', false otherwise.
248
- */
249
- isHexPrefixed(str: string): boolean;
250
- }
251
- interface PureProxyArgs extends Args {
252
- proxyType: string;
253
- delay: number;
254
- index: number;
125
+ getMaterial(networkType: NetworkType): Material;
255
126
  }
256
127
  declare const utils: Utils;
257
128
  export default utils;
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/lib/utils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/lib/utils.ts"],"names":[],"mappings":"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"}
@@ -1,37 +1,4 @@
1
1
  "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
2
  var __importDefault = (this && this.__importDefault) || function (mod) {
36
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
37
4
  };
@@ -40,23 +7,14 @@ exports.Utils = void 0;
40
7
  const sdk_core_1 = require("@bitgo-beta/sdk-core");
41
8
  const keyring_1 = require("@polkadot/keyring");
42
9
  const decode_1 = require("@polkadot/keyring/pair/decode");
43
- const types_1 = require("@polkadot/types");
44
10
  const Extrinsic_1 = require("@polkadot/types/extrinsic/v4/Extrinsic");
45
11
  const util_1 = require("@polkadot/util");
46
12
  const util_crypto_1 = require("@polkadot/util-crypto");
47
- const txwrapper_core_1 = require("@substrate/txwrapper-core");
48
13
  const txwrapper_polkadot_1 = require("@substrate/txwrapper-polkadot");
49
14
  const bs58_1 = __importDefault(require("bs58"));
50
15
  const hi_base32_1 = __importDefault(require("hi-base32"));
51
- const _ = __importStar(require("lodash"));
52
16
  const tweetnacl_1 = __importDefault(require("tweetnacl"));
53
17
  const _1 = require(".");
54
- const PROXY_METHOD_ARG = 2;
55
- // map to retrieve the address encoding format when the key is the asset name
56
- const coinToAddressMap = new Map([
57
- ['dot', sdk_core_1.DotAddressFormat.polkadot],
58
- ['tdot', sdk_core_1.DotAddressFormat.substrate],
59
- ]);
60
18
  class Utils {
61
19
  /** @inheritdoc */
62
20
  isValidAddress(address) {
@@ -127,46 +85,6 @@ class Utils {
127
85
  seed: Buffer.from(decoded),
128
86
  };
129
87
  }
130
- /**
131
- * Helper function to capitalize the first letter of a string
132
- *
133
- * @param {string} val
134
- * @returns {string}
135
- */
136
- capitalizeFirstLetter(val) {
137
- return val.charAt(0).toUpperCase() + val.slice(1);
138
- }
139
- /**
140
- * Helper function to decode the internal method hex in case of a proxy transaction
141
- *
142
- * @param {string | UnsignedTransaction} tx
143
- * @param { metadataRpc: string; registry: TypeRegistry } options
144
- * @returns {TransferArgs}
145
- */
146
- decodeCallMethod(tx, options) {
147
- const { registry } = options;
148
- let methodCall;
149
- if (typeof tx === 'string') {
150
- try {
151
- const payload = (0, types_1.createTypeUnsafe)(registry, 'ExtrinsicPayload', [
152
- tx,
153
- { version: Extrinsic_1.EXTRINSIC_VERSION },
154
- ]);
155
- methodCall = (0, types_1.createTypeUnsafe)(registry, 'Call', [payload.method]);
156
- }
157
- catch (e) {
158
- methodCall = registry.createType('Extrinsic', (0, util_1.hexToU8a)(tx), {
159
- isSigned: true,
160
- });
161
- }
162
- }
163
- else {
164
- methodCall = registry.createType('Call', tx.method);
165
- }
166
- const method = methodCall.args[PROXY_METHOD_ARG];
167
- const decodedArgs = method.toJSON();
168
- return decodedArgs.args;
169
- }
170
88
  /**
171
89
  * keyPairFromSeed generates an object with secretKey and publicKey using the substrate sdk
172
90
  * @param seed 32 bytes long seed
@@ -247,135 +165,44 @@ class Utils {
247
165
  isSigningPayload(payload) {
248
166
  return payload.blockHash !== undefined;
249
167
  }
250
- isProxyTransfer(arg) {
251
- return arg.real !== undefined;
252
- }
253
168
  isTransfer(arg) {
254
169
  return arg.dest?.id !== undefined && arg.value !== undefined;
255
170
  }
256
171
  isTransferAll(arg) {
257
172
  return arg.dest?.id !== undefined && arg.keepAlive !== undefined;
258
173
  }
259
- /**
260
- * Returns true if arg is of type BatchArgs, false otherwise.
261
- *
262
- * @param arg The object to test.
263
- *
264
- * @return true if arg is of type BatchArgs, false otherwise.
265
- */
266
- isBatch(arg) {
267
- return arg.calls !== undefined;
174
+ isAddStake(arg) {
175
+ return (arg.amountStaked !== undefined &&
176
+ arg.hotkey !== undefined &&
177
+ arg.netuid !== undefined);
268
178
  }
269
- /**
270
- * Returns true if arg is of type BatchArgs and the calls of the batch are staking calls: a stake
271
- * call (bond) followed by an add proxy call (addProxy), false otherwise.
272
- *
273
- * @param arg The object to test.
274
- *
275
- * @return true if arg is of type BatchArgs and the calls of the batch are staking calls: a stake
276
- * call (bond) followed by an add proxy call (addProxy), false otherwise.
277
- */
278
- isStakingBatch(arg) {
279
- const calls = arg.calls;
280
- if (calls !== undefined) {
281
- return (calls.length === 2 &&
282
- (this.isStakeBatchCallArgs(calls[0].args) || this.isBondBatchExtra(calls[0].args)) &&
283
- this.isAddProxyBatchCallArgs(calls[1].args));
284
- }
285
- return false;
179
+ isRemoveStake(arg) {
180
+ return (arg.amountUnstaked !== undefined &&
181
+ arg.hotkey !== undefined &&
182
+ arg.netuid !== undefined);
286
183
  }
287
- /**
288
- * Returns true if arg is of type StakeBatchCallArgs, false otherwise.
289
- *
290
- * @param arg The object to test.
291
- *
292
- * @return true if arg is of type StakeBatchCallArgs, false otherwise.
293
- */
294
- isStakeBatchCallArgs(arg) {
295
- return arg.value !== undefined && arg.payee !== undefined;
184
+ isBond(arg) {
185
+ return (arg.value !== undefined &&
186
+ arg.controller !== undefined &&
187
+ arg.payee !== undefined);
296
188
  }
297
- /**
298
- * Returns true if arg is of type AddProxyBatchCallArgs, false otherwise.
299
- *
300
- * @param arg The object to test.
301
- *
302
- * @return true if arg is of type AddProxyBatchCallArgs, false otherwise.
303
- */
304
- isAddProxyBatchCallArgs(arg) {
305
- return (arg.delegate !== undefined &&
306
- arg.proxy_type !== undefined &&
307
- arg.delay !== undefined);
189
+ isBondExtra(arg) {
190
+ return arg.maxAdditional !== undefined;
308
191
  }
309
- /**
310
- * Returns true if arg is of type BatchArgs and the calls of the batch are unstaking calls: a remove
311
- * proxy call (removeProxy), followed by a chill call, and an unstake call (unbond), false otherwise.
312
- *
313
- * @param arg The object to test.
314
- *
315
- * @return true if arg is of type BatchArgs and the calls of the batch are unstaking calls: a remove
316
- * proxy call (removeProxy), followed by a chill call, and an unstake call (unbond), false otherwise.
317
- */
318
- isUnstakingBatch(arg) {
319
- const calls = arg.calls;
320
- if (calls !== undefined) {
321
- return (calls.length === 3 &&
322
- this.isRemoveProxyBatchCallArgs(calls[0].args) &&
323
- _.isEmpty(calls[1].args) &&
324
- this.isUnstakeBatchCallArgs(calls[2].args));
325
- }
326
- return false;
192
+ isNominate(arg) {
193
+ return arg.targets !== undefined;
327
194
  }
328
- /**
329
- * Returns true if arg is of type AddProxyBatchCallArgs, false otherwise.
330
- *
331
- * @param arg The object to test.
332
- *
333
- * @return true if arg is of type AddProxyBatchCallArgs, false otherwise.
334
- */
335
- isRemoveProxyBatchCallArgs(arg) {
336
- return (arg.delegate !== undefined &&
337
- arg.proxy_type !== undefined &&
338
- arg.delay !== undefined);
195
+ isChill(arg) {
196
+ return true; // Chill has no arguments, so any object can be considered ChillArgs
339
197
  }
340
- /**
341
- * Returns true if arg is of type UnstakeBatchCallArgs, false otherwise.
342
- *
343
- * @param arg The object to test.
344
- *
345
- * @return true if arg is of type UnstakeBatchCallArgs, false otherwise.
346
- */
347
- isUnstakeBatchCallArgs(arg) {
198
+ isUnbond(arg) {
348
199
  return arg.value !== undefined;
349
200
  }
350
- /**
351
- * Returns true if arg is of type StakeArgs, false otherwise.
352
- *
353
- * @param arg The object to test.
354
- *
355
- * @return true if arg is of type StakeArgs, false otherwise.
356
- */
357
- isBond(arg) {
358
- return arg.value !== undefined && arg.payee !== undefined;
359
- }
360
- /**
361
- * Returns true if arg is of type StakeMoreArgs, false otherwise.
362
- *
363
- * @param arg The object to test.
364
- *
365
- * @return true if arg is of type StakeMoreArgs, false otherwise.
366
- */
367
- isBondExtra(arg) {
368
- return arg.maxAdditional !== undefined;
201
+ isWithdrawUnbonded(arg) {
202
+ return arg.numSlashingSpans !== undefined;
369
203
  }
370
- /**
371
- * Returns true if arg is of type StakeMoreArgs, false otherwise.
372
- *
373
- * @param arg The object to test.
374
- *
375
- * @return true if arg is of type StakeMoreArgs, false otherwise.
376
- */
377
- isBondBatchExtra(arg) {
378
- return arg.max_additional !== undefined;
204
+ isBatch(arg) {
205
+ return arg.calls !== undefined && Array.isArray(arg.calls);
379
206
  }
380
207
  /**
381
208
  * extracts and returns the signature in hex format given a raw signed transaction
@@ -413,55 +240,11 @@ class Utils {
413
240
  isZeroHex(hexValue) {
414
241
  return hexValue === '0x00';
415
242
  }
416
- /**
417
- * Takes an asset name and returns the respective address to format to
418
- * since substrate addresses differ depending on the network
419
- * @param networkCoinName
420
- */
421
- getAddressFormat(networkCoinName) {
422
- return coinToAddressMap.get(networkCoinName);
423
- }
424
- /**
425
- * Creates a pure proxy extrinsic. Substrate has renamed anonymous proxies to pure proxies, but
426
- * the libraries we are using to build transactions have not been updated, as a stop gap we are
427
- * defining the pure proxy extrinsic here.
428
- *
429
- * @param args Arguments to the createPure extrinsic.
430
- * @param info Common information to all transactions.
431
- * @param options Chain registry and metadata.
432
- */
433
- pureProxy(args, info, options) {
434
- return (0, txwrapper_core_1.defineMethod)({
435
- method: {
436
- args,
437
- name: 'createPure',
438
- pallet: 'proxy',
439
- },
440
- ...info,
441
- }, options);
442
- }
443
- /**
444
- * Removes '0x' from a given `string` if present.
445
- *
446
- * @param {string} str the string value.
447
- *
448
- * @return {string} a string without a '0x' prefix.
449
- */
450
- stripHexPrefix(str) {
451
- return this.isHexPrefixed(str) ? str.slice(2) : str;
452
- }
453
- /**
454
- * Returns true if a string starts with '0x', false otherwise.
455
- *
456
- * @param {string} str the string value.
457
- *
458
- * @return {boolean} true if a string starts with '0x', false otherwise.
459
- */
460
- isHexPrefixed(str) {
461
- return str.slice(0, 2) === '0x';
243
+ getMaterial(networkType) {
244
+ throw new Error('Method not implemented.');
462
245
  }
463
246
  }
464
247
  exports.Utils = Utils;
465
248
  const utils = new Utils();
466
249
  exports.default = utils;
467
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG1EQUEySDtBQUMzSCwrQ0FBMEU7QUFDMUUsMERBQTJEO0FBRTNELDJDQUEyRztBQUMzRyxzRUFBMkU7QUFDM0UseUNBQXFFO0FBQ3JFLHVEQUFzRTtBQUN0RSw4REFBaUg7QUFFakgsc0VBQTBEO0FBQzFELGdEQUF3QjtBQUN4QiwwREFBK0I7QUFDL0IsMENBQTRCO0FBQzVCLDBEQUE2QjtBQWlCN0Isd0JBQTRCO0FBRTVCLE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDO0FBQzNCLDZFQUE2RTtBQUM3RSxNQUFNLGdCQUFnQixHQUFHLElBQUksR0FBRyxDQUFrQztJQUNoRSxDQUFDLEtBQUssRUFBRSwyQkFBZ0IsQ0FBQyxRQUFRLENBQUM7SUFDbEMsQ0FBQyxNQUFNLEVBQUUsMkJBQWdCLENBQUMsU0FBUyxDQUFDO0NBQ3JDLENBQUMsQ0FBQztBQUVILE1BQWEsS0FBSztJQUNoQixrQkFBa0I7SUFDbEIsY0FBYyxDQUFDLE9BQWU7UUFDNUIsSUFBSSxDQUFDO1lBQ0gsSUFBQSx1QkFBYSxFQUFDLElBQUEsWUFBSyxFQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFBLGVBQVEsRUFBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBQSx1QkFBYSxFQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDM0UsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztJQUNILENBQUM7SUFFRCxrQkFBa0I7SUFDbEIsY0FBYyxDQUFDLElBQVk7UUFDekIsT0FBTyxJQUFBLFlBQUssRUFBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7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LCBEb3RBZGRyZXNzRm9ybWF0LCBpc0Jhc2U1OCwgaXNWYWxpZEVkMjU1MTlQdWJsaWNLZXksIFNlZWQgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgeyBkZWNvZGVBZGRyZXNzLCBlbmNvZGVBZGRyZXNzLCBLZXlyaW5nIH0gZnJvbSAnQHBvbGthZG90L2tleXJpbmcnO1xuaW1wb3J0IHsgZGVjb2RlUGFpciB9IGZyb20gJ0Bwb2xrYWRvdC9rZXlyaW5nL3BhaXIvZGVjb2RlJztcbmltcG9ydCB7IEtleXJpbmdQYWlyIH0gZnJvbSAnQHBvbGthZG90L2tleXJpbmcvdHlwZXMnO1xuaW1wb3J0IHsgY3JlYXRlVHlwZVVuc2FmZSwgR2VuZXJpY0NhbGwsIEdlbmVyaWNFeHRyaW5zaWMsIEdlbmVyaWNFeHRyaW5zaWNQYXlsb2FkIH0gZnJvbSAnQHBvbGthZG90L3R5cGVzJztcbmltcG9ydCB7IEVYVFJJTlNJQ19WRVJTSU9OIH0gZnJvbSAnQHBvbGthZG90L3R5cGVzL2V4dHJpbnNpYy92NC9FeHRyaW5zaWMnO1xuaW1wb3J0IHsgaGV4VG9VOGEsIGlzSGV4LCB1OGFUb0hleCwgdThhVG9VOGEgfSBmcm9tICdAcG9sa2Fkb3QvdXRpbCc7XG5pbXBvcnQgeyBiYXNlNjREZWNvZGUsIHNpZ25hdHVyZVZlcmlmeSB9IGZyb20gJ0Bwb2xrYWRvdC91dGlsLWNyeXB0byc7XG5pbXBvcnQgeyBBcmdzLCBCYXNlVHhJbmZvLCBkZWZpbmVNZXRob2QsIE9wdGlvbnNXaXRoTWV0YSwgVW5zaWduZWRUcmFuc2FjdGlvbiB9IGZyb20gJ0BzdWJzdHJhdGUvdHh3cmFwcGVyLWNvcmUnO1xuaW1wb3J0IHsgRGVjb2RlZFNpZ25lZFR4LCBEZWNvZGVkU2lnbmluZ1BheWxvYWQsIFR5cGVSZWdpc3RyeSB9IGZyb20gJ0BzdWJzdHJhdGUvdHh3cmFwcGVyLWNvcmUvbGliL3R5cGVzJztcbmltcG9ydCB7IGNvbnN0cnVjdCB9IGZyb20gJ0BzdWJzdHJhdGUvdHh3cmFwcGVyLXBvbGthZG90JztcbmltcG9ydCBiczU4IGZyb20gJ2JzNTgnO1xuaW1wb3J0IGJhc2UzMiBmcm9tICdoaS1iYXNlMzInO1xuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IG5hY2wgZnJvbSAndHdlZXRuYWNsJztcbmltcG9ydCB7XG4gIEFkZFByb3h5QmF0Y2hDYWxsQXJncyxcbiAgQmF0Y2hBcmdzLFxuICBCYXRjaENhbGxPYmplY3QsXG4gIEhleFN0cmluZyxcbiAgUHJveHlBcmdzLFxuICBQcm94eUNhbGxBcmdzLFxuICBTdGFrZUFyZ3MsXG4gIFN0YWtlQmF0Y2hDYWxsQXJncyxcbiAgU3Rha2VNb3JlQXJncyxcbiAgU3Rha2VNb3JlQ2FsbEFyZ3MsXG4gIFRyYW5zZmVyQWxsQXJncyxcbiAgVHJhbnNmZXJBcmdzLFxuICBUeE1ldGhvZCxcbiAgVW5zdGFrZUJhdGNoQ2FsbEFyZ3MsXG59IGZyb20gJy4vaWZhY2UnO1xuaW1wb3J0IHsgS2V5UGFpciB9IGZyb20gJy4nO1xuXG5jb25zdCBQUk9YWV9NRVRIT0RfQVJHID0gMjtcbi8vIG1hcCB0byByZXRyaWV2ZSB0aGUgYWRkcmVzcyBlbmNvZGluZyBmb3JtYXQgd2hlbiB0aGUga2V5IGlzIHRoZSBhc3NldCBuYW1lXG5jb25zdCBjb2luVG9BZGRyZXNzTWFwID0gbmV3IE1hcDxEb3RBc3NldFR5cGVzLCBEb3RBZGRyZXNzRm9ybWF0PihbXG4gIFsnZG90JywgRG90QWRkcmVzc0Zvcm1hdC5wb2xrYWRvdF0sXG4gIFsndGRvdCcsIERvdEFkZHJlc3NGb3JtYXQuc3Vic3RyYXRlXSxcbl0pO1xuXG5leHBvcnQgY2xhc3MgVXRpbHMgaW1wbGVtZW50cyBCYXNlVXRpbHMge1xuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgaXNWYWxpZEFkZHJlc3MoYWRkcmVzczogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIGVuY29kZUFkZHJlc3MoaXNIZXgoYWRkcmVzcykgPyBoZXhUb1U4YShhZGRyZXNzKSA6IGRlY29kZUFkZHJlc3MoYWRkcmVzcykpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgaXNWYWxpZEJsb2NrSWQoaGFzaDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzSGV4KGhhc2gsIDI1Nik7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgaXNWYWxpZFByaXZhdGVLZXkoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZGVjb2RlZFBydiA9IGhleFRvVThhKGtleSk7XG4gICAgICByZXR1cm4gZGVjb2RlZFBydi5sZW5ndGggPT09IG5hY2wuc2lnbi5zZWNyZXRLZXlMZW5ndGggLyAyO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgaXNWYWxpZFB1YmxpY0tleShrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGxldCBwdWJLZXkgPSBrZXk7XG5cbiAgICAvLyBjb252ZXJ0IGJhc2U1OCBwdWIga2V5IHRvIGhleCBmb3JtYXRcbiAgICAvLyB0c3MgY29tbW9uIHB1YiBpcyBpbiBiYXNlNTggZm9ybWF0IGFuZCBkZWNvZGVzIHRvIGxlbmd0aCBvZiAzMlxuICAgIGlmIChpc0Jhc2U1OChwdWJLZXksIDMyKSkge1xuICAgICAgY29uc3QgYmFzZTU4RGVjb2RlID0gYnM1OC5kZWNvZGUocHViS2V5KTtcbiAgICAgIHB1YktleSA9IGJhc2U1OERlY29kZS50b1N0cmluZygnaGV4Jyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGlzVmFsaWRFZDI1NTE5UHVibGljS2V5KHB1YktleSk7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgaXNWYWxpZFNpZ25hdHVyZShzaWduYXR1cmU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHNpZ25hdHVyZVU4YSA9IHU4YVRvVThhKHNpZ25hdHVyZSk7XG4gICAgcmV0dXJuIFs2NCwgNjUsIDY2XS5pbmNsdWRlcyhzaWduYXR1cmVVOGEubGVuZ3RoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyB0aGUgc2lnbmF0dXJlIG9uIGEgZ2l2ZW4gbWVzc2FnZVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2lnbmVkTWVzc2FnZSB0aGUgc2lnbmVkIG1lc3NhZ2UgZm9yIHRoZSBzaWduYXR1cmVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNpZ25hdHVyZSB0aGUgc2lnbmF0dXJlIHRvIHZlcmlmeVxuICAgKiBAcGFyYW0ge3N0cmluZ30gYWRkcmVzcyB0aGUgYWRkcmVzcyBvZiB0aGUgc2lnbmVyXG4gICAqIEByZXR1cm5zIHtib29sZWFufSB3aGV0aGVyIHRoZSBzaWduYXR1cmUgaXMgdmFsaWQgb3Igbm90XG4gICAqL1xuICB2ZXJpZnlTaWduYXR1cmUoc2lnbmVkTWVzc2FnZTogc3RyaW5nLCBzaWduYXR1cmU6IHN0cmluZywgYWRkcmVzczogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcHVibGljS2V5ID0gZGVjb2RlQWRkcmVzcyhhZGRyZXNzKTtcbiAgICBjb25zdCBoZXhQdWJsaWNLZXkgPSB1OGFUb0hleChwdWJsaWNLZXkpO1xuXG4gICAgcmV0dXJuIHNpZ25hdHVyZVZlcmlmeShzaWduZWRNZXNzYWdlLCBzaWduYXR1cmUsIGhleFB1YmxpY0tleSkuaXNWYWxpZDtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBpc1ZhbGlkVHJhbnNhY3Rpb25JZCh0eElkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaXNIZXgodHhJZCwgMjU2KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBkZWNvZGVTZWVkIGRlY29kZXMgYSBzdWJzdHJhdGUgc2VlZFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VlZCAtIHRoZSBzZWVkIHRvIGJlIHZhbGlkYXRlZC5cbiAgICogQHJldHVybnMge1NlZWR9IC0gdGhlIG9iamVjdCBTZWVkXG4gICAqL1xuICBkZWNvZGVTZWVkKHNlZWQ6IHN0cmluZyk6IFNlZWQge1xuICAgIGNvbnN0IGRlY29kZWQgPSBiYXNlMzIuZGVjb2RlLmFzQnl0ZXMoc2VlZCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNlZWQ6IEJ1ZmZlci5mcm9tKGRlY29kZWQpLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogSGVscGVyIGZ1bmN0aW9uIHRvIGNhcGl0YWxpemUgdGhlIGZpcnN0IGxldHRlciBvZiBhIHN0cmluZ1xuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBjYXBpdGFsaXplRmlyc3RMZXR0ZXIodmFsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB2YWwuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB2YWwuc2xpY2UoMSk7XG4gIH1cblxuICAvKipcbiAgICogSGVscGVyIGZ1bmN0aW9uIHRvIGRlY29kZSB0aGUgaW50ZXJuYWwgbWV0aG9kIGhleCBpbiBjYXNlIG9mIGEgcHJveHkgdHJhbnNhY3Rpb25cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBVbnNpZ25lZFRyYW5zYWN0aW9ufSB0eFxuICAgKiBAcGFyYW0geyBtZXRhZGF0YVJwYzogc3RyaW5nOyByZWdpc3RyeTogVHlwZVJlZ2lzdHJ5IH0gb3B0aW9uc1xuICAgKiBAcmV0dXJucyB7VHJhbnNmZXJBcmdzfVxuICAgKi9cbiAgZGVjb2RlQ2FsbE1ldGhvZChcbiAgICB0eDogc3RyaW5nIHwgVW5zaWduZWRUcmFuc2FjdGlvbixcbiAgICBvcHRpb25zOiB7IG1ldGFkYXRhUnBjOiBzdHJpbmc7IHJlZ2lzdHJ5OiBUeXBlUmVnaXN0cnkgfVxuICApOiBUcmFuc2ZlckFyZ3Mge1xuICAgIGNvbnN0IHsgcmVnaXN0cnkgfSA9IG9wdGlvbnM7XG4gICAgbGV0IG1ldGhvZENhbGw6IEdlbmVyaWNDYWxsIHwgR2VuZXJpY0V4dHJpbnNpYztcbiAgICBpZiAodHlwZW9mIHR4ID09PSAnc3RyaW5nJykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcGF5bG9hZDogR2VuZXJpY0V4dHJpbnNpY1BheWxvYWQgPSBjcmVhdGVUeXBlVW5zYWZlKHJlZ2lzdHJ5LCAnRXh0cmluc2ljUGF5bG9hZCcsIFtcbiAgICAgICAgICB0eCxcbiAgICAgICAgICB7IHZlcnNpb246IEVYVFJJTlNJQ19WRVJTSU9OIH0sXG4gICAgICAgIF0pO1xuICAgICAgICBtZXRob2RDYWxsID0gY3JlYXRlVHlwZVVuc2FmZShyZWdpc3RyeSwgJ0NhbGwnLCBbcGF5bG9hZC5tZXRob2RdKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbWV0aG9kQ2FsbCA9IHJlZ2lzdHJ5LmNyZWF0ZVR5cGUoJ0V4dHJpbnNpYycsIGhleFRvVThhKHR4KSwge1xuICAgICAgICAgIGlzU2lnbmVkOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbWV0aG9kQ2FsbCA9IHJlZ2lzdHJ5LmNyZWF0ZVR5cGUoJ0NhbGwnLCB0eC5tZXRob2QpO1xuICAgIH1cbiAgICBjb25zdCBtZXRob2QgPSBtZXRob2RDYWxsLmFyZ3NbUFJPWFlfTUVUSE9EX0FSR107XG4gICAgY29uc3QgZGVjb2RlZEFyZ3MgPSBtZXRob2QudG9KU09OKCkgYXMgdW5rbm93biBhcyBQcm94eUNhbGxBcmdzO1xuICAgIHJldHVybiBkZWNvZGVkQXJncy5hcmdzO1xuICB9XG5cbiAgLyoqXG4gICAqIGtleVBhaXJGcm9tU2VlZCBnZW5lcmF0ZXMgYW4gb2JqZWN0IHdpdGggc2VjcmV0S2V5IGFuZCBwdWJsaWNLZXkgdXNpbmcgdGhlIHN1YnN0cmF0ZSBzZGtcbiAgICogQHBhcmFtIHNlZWQgMzIgYnl0ZXMgbG9uZyBzZWVkXG4gICAqIEByZXR1cm5zIEtleVBhaXJcbiAgICovXG4gIGtleVBhaXJGcm9tU2VlZChzZWVkOiBVaW50OEFycmF5KTogS2V5UGFpciB7XG4gICAgY29uc3Qga2V5cmluZyA9IG5ldyBLZXlyaW5nKHsgdHlwZTogJ2VkMjU1MTknIH0pO1xuICAgIGNvbnN0IGtleXJpbmdQYWlyID0ga2V5cmluZy5hZGRGcm9tU2VlZChzZWVkKTtcbiAgICBjb25zdCBwYWlySnNvbiA9IGtleXJpbmdQYWlyLnRvSnNvbigpO1xuICAgIGNvbnN0IGRlY29kZWRLZXlQYWlyID0gZGVjb2RlUGFpcignJywgYmFzZTY0RGVjb2RlKHBhaXJKc29uLmVuY29kZWQpLCBwYWlySnNvbi5lbmNvZGluZy50eXBlKTtcbiAgICByZXR1cm4gbmV3IEtleVBhaXIoeyBwcnY6IEJ1ZmZlci5mcm9tKGRlY29kZWRLZXlQYWlyLnNlY3JldEtleSkudG9TdHJpbmcoJ2hleCcpIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ25pbmcgZnVuY3Rpb24uIEltcGxlbWVudCB0aGlzIG9uIHRoZSBPRkZMSU5FIHNpZ25pbmcgZGV2aWNlLlxuICAgKlxuICAgKiBAcGFyYW0ge0tleXJpbmdQYWlyfSBwYWlyIC0gVGhlIHNpZ25pbmcgcGFpci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHNpZ25pbmdQYXlsb2FkIC0gUGF5bG9hZCB0byBzaWduLlxuICAgKiBAcGFyYW0ge1Vuc2lnbmVkVHJhbnNhY3Rpb259IHRyYW5zYWN0aW9uIC0gcmF3IHRyYW5zYWN0aW9uIHRvIHNpZ25cbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICogQHBhcmFtIHtIZXhTdHJpbmd9IG9wdGlvbnMubWV0YWRhdGFScGMgLSBtZXRhZGF0YSB0aGF0IGlzIG5lZWRlZCBmb3Igc3Vic3RyYXRlIHRvIHNpZ25cbiAgICogQHBhcmFtIHtUeXBlUmVnaXN0cnl9IG9wdGlvbnMucmVnaXN0cnkgLSBtZXRhZGF0YSB0aGF0IGlzIG5lZWRlZCBmb3Igc3Vic3RyYXRlIHRvIHNpZ25cbiAgICovXG4gIGNyZWF0ZVNpZ25lZFR4KFxuICAgIHBhaXI6IEtleXJpbmdQYWlyLFxuICAgIHNpZ25pbmdQYXlsb2FkOiBzdHJpbmcsXG4gICAgdHJhbnNhY3Rpb246IFVuc2lnbmVkVHJhbnNhY3Rpb24sXG4gICAgb3B0aW9uczogeyBtZXRhZGF0YVJwYzogSGV4U3RyaW5nOyByZWdpc3RyeTogVHlwZVJlZ2lzdHJ5IH1cbiAgKTogc3RyaW5nIHtcbiAgICBjb25zdCB7IHJlZ2lzdHJ5LCBtZXRhZGF0YVJwYyB9ID0gb3B0aW9ucztcbiAgICBjb25zdCB7IHNpZ25hdHVyZSB9ID0gcmVnaXN0cnlcbiAgICAgIC5jcmVhdGVUeXBlKCdFeHRyaW5zaWNQYXlsb2FkJywgc2lnbmluZ1BheWxvYWQsIHtcbiAgICAgICAgdmVyc2lvbjogRVhUUklOU0lDX1ZFUlNJT04sXG4gICAgICB9KVxuICAgICAgLnNpZ24ocGFpcik7XG5cbiAgICAvLyBTZXJpYWxpemUgYSBzaWduZWQgdHJhbnNhY3Rpb24uXG4gICAgcmV0dXJuIHRoaXMuc2VyaWFsaXplU2lnbmVkVHJhbnNhY3Rpb24odHJhbnNhY3Rpb24sIHNpZ25hdHVyZSwgbWV0YWRhdGFScGMsIHJlZ2lzdHJ5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIHRoZSBzaWduZWQgdHJhbnNhY3Rpb25cbiAgICpcbiAgICogQHBhcmFtIHRyYW5zYWN0aW9uIFRyYW5zYWN0aW9uIHRvIHNlcmlhbGl6ZVxuICAgKiBAcGFyYW0gc2lnbmF0dXJlIFNpZ25hdHVyZSBvZiB0aGUgbWVzc2FnZVxuICAgKiBAcGFyYW0gbWV0YWRhdGFScGMgTmV0d29yayBtZXRhZGF0YVxuICAgKiBAcGFyYW0gcmVnaXN0cnkgVHJhbnNhY3Rpb24gcmVnaXN0cnlcbiAgICogQHJldHVybnMgc3RyaW5nIFNlcmlhbGl6ZWQgdHJhbnNhY3Rpb25cbiAgICovXG4gIHNlcmlhbGl6ZVNpZ25lZFRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uLCBzaWduYXR1cmUsIG1ldGFkYXRhUnBjOiBgMHgke3N0cmluZ31gLCByZWdpc3RyeSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGNvbnN0cnVjdC5zaWduZWRUeCh0cmFuc2FjdGlvbiwgc2lnbmF0dXJlLCB7XG4gICAgICBtZXRhZGF0YVJwYyxcbiAgICAgIHJlZ2lzdHJ5LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIERlY29kZXMgdGhlIHN1YnN0cmF0ZSBhZGRyZXNzIGZyb20gdGhlIGdpdmVuIGZvcm1hdFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYWRkcmVzc1xuICAgKiBAcGFyYW0ge251bWJlcn0gW3NzNThGb3JtYXRdXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBkZWNvZGVTdWJzdHJhdGVBZGRyZXNzKGFkZHJlc3M6IHN0cmluZywgc3M1OEZvcm1hdDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCBrZXlwYWlyID0gbmV3IEtleVBhaXIoeyBwdWI6IEJ1ZmZlci5mcm9tKGRlY29kZUFkZHJlc3MoYWRkcmVzcywgdW5kZWZpbmVkLCBzczU4Rm9ybWF0KSkudG9TdHJpbmcoJ2hleCcpIH0pO1xuICAgIHJldHVybiBrZXlwYWlyLmdldEFkZHJlc3Moc3M1OEZvcm1hdCk7XG4gIH1cblxuICAvKipcbiAgICogRGVjb2RlcyB0aGUgc3Vic3RyYXRlIGFkZHJlc3MgZnJvbSB0aGUgZ2l2ZW4gZm9ybWF0XG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhZGRyZXNzXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbc3M1OEZvcm1hdF1cbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGVuY29kZVN1YnN0cmF0ZUFkZHJlc3MoYWRkcmVzczogc3RyaW5nLCBzczU4Rm9ybWF0PzogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZW5jb2RlQWRkcmVzcyhhZGRyZXNzLCBzczU4Rm9ybWF0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgdGhlIHR4SGFzaCBvZiBhIHNpZ25lZCB0eEhleFxuICAgKlxuICAgKiBAcGFyYW0gdHhIZXggc2lnbmVkIHRyYW5zYWN0aW9uIGhleFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0VHhIYXNoKHR4SGV4OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBjb25zdHJ1Y3QudHhIYXNoKHR4SGV4KTtcbiAgfVxuXG4gIGlzU2lnbmluZ1BheWxvYWQocGF5bG9hZDogRGVjb2RlZFNpZ25pbmdQYXlsb2FkIHwgRGVjb2RlZFNpZ25lZFR4KTogcGF5bG9hZCBpcyBEZWNvZGVkU2lnbmluZ1BheWxvYWQge1xuICAgIHJldHVybiAocGF5bG9hZCBhcyBEZWNvZGVkU2lnbmluZ1BheWxvYWQpLmJsb2NrSGFzaCAhPT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgaXNQcm94eVRyYW5zZmVyKGFyZzogVHhNZXRob2RbJ2FyZ3MnXSk6IGFyZyBpcyBQcm94eUFyZ3Mge1xuICAgIHJldHVybiAoYXJnIGFzIFByb3h5QXJncykucmVhbCAhPT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgaXNUcmFuc2Zlcihhcmc6IFR4TWV0aG9kWydhcmdzJ10pOiBhcmcgaXMgVHJhbnNmZXJBcmdzIHtcbiAgICByZXR1cm4gKGFyZyBhcyBUcmFuc2ZlckFyZ3MpLmRlc3Q/LmlkICE9PSB1bmRlZmluZWQgJiYgKGFyZyBhcyBUcmFuc2ZlckFyZ3MpLnZhbHVlICE9PSB1bmRlZmluZWQ7XG4gIH1cblxuICBpc1RyYW5zZmVyQWxsKGFyZzogVHhNZXRob2RbJ2FyZ3MnXSk6IGFyZyBpcyBUcmFuc2ZlckFsbEFyZ3Mge1xuICAgIHJldHVybiAoYXJnIGFzIFRyYW5zZmVyQWxsQXJncykuZGVzdD8uaWQgIT09IHVuZGVmaW5lZCAmJiAoYXJnIGFzIFRyYW5zZmVyQWxsQXJncykua2VlcEFsaXZlICE9PSB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIGFyZyBpcyBvZiB0eXBlIEJhdGNoQXJncywgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKlxuICAgKiBAcGFyYW0gYXJnIFRoZSBvYmplY3QgdG8gdGVzdC5cbiAgICpcbiAgICogQHJldHVybiB0cnVlIGlmIGFyZyBpcyBvZiB0eXBlIEJhdGNoQXJncywgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKi9cbiAgaXNCYXRjaChhcmc6IFR4TWV0aG9kWydhcmdzJ10pOiBhcmcgaXMgQmF0Y2hBcmdzIHtcbiAgICByZXR1cm4gKGFyZyBhcyBCYXRjaEFyZ3MpLmNhbGxzICE9PSB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIGFyZyBpcyBvZiB0eXBlIEJhdGNoQXJncyBhbmQgdGhlIGNhbGxzIG9mIHRoZSBiYXRjaCBhcmUgc3Rha2luZyBjYWxsczogYSBzdGFrZVxuICAgKiBjYWxsIChib25kKSBmb2xsb3dlZCBieSBhbiBhZGQgcHJveHkgY2FsbCAoYWRkUHJveHkpLCBmYWxzZSBvdGhlcndpc2UuXG4gICAqXG4gICAqIEBwYXJhbSBhcmcgVGhlIG9iamVjdCB0byB0ZXN0LlxuICAgKlxuICAgKiBAcmV0dXJuIHRydWUgaWYgYXJnIGlzIG9mIHR5cGUgQmF0Y2hBcmdzIGFuZCB0aGUgY2FsbHMgb2YgdGhlIGJhdGNoIGFyZSBzdGFraW5nIGNhbGxzOiBhIHN0YWtlXG4gICAqIGNhbGwgKGJvbmQpIGZvbGxvd2VkIGJ5IGFuIGFkZCBwcm94eSBjYWxsIChhZGRQcm94eSksIGZhbHNlIG90aGVyd2lzZS5cbiAgICovXG4gIGlzU3Rha2luZ0JhdGNoKGFyZzogVHhNZXRob2RbJ2FyZ3MnXSk6IGFyZyBpcyBCYXRjaEFyZ3Mge1xuICAgIGNvbnN0IGNhbGxzID0gKGFyZyBhcyBCYXRjaEFyZ3MpLmNhbGxzO1xuICAgIGlmIChjYWxscyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBjYWxscy5sZW5ndGggPT09IDIgJiZcbiAgICAgICAgKHRoaXMuaXNTdGFrZUJhdGNoQ2FsbEFyZ3MoY2FsbHNbMF0uYXJncykgfHwgdGhpcy5pc0JvbmRCYXRjaEV4dHJhKGNhbGxzWzBdLmFyZ3MpKSAmJlxuICAgICAgICB0aGlzLmlzQWRkUHJveHlCYXRjaENhbGxBcmdzKGNhbGxzWzFdLmFyZ3MpXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIGFyZyBpcyBvZiB0eXBlIFN0YWtlQmF0Y2hDYWxsQXJncywgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKlxuICAgKiBAcGFyYW0gYXJnIFRoZSBvYmplY3QgdG8gdGVzdC5cbiAgICpcbiAgICogQHJldHVybiB0cnVlIGlmIGFyZyBpcyBvZiB0eXBlIFN0YWtlQmF0Y2hDYWxsQXJncywgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKi9cbiAgaXNTdGFrZUJhdGNoQ2FsbEFyZ3MoYXJnOiBCYXRjaENhbGxPYmplY3RbJ2FyZ3MnXSk6IGFyZyBpcyBTdGFrZUJhdGNoQ2FsbEFyZ3Mge1xuICAgIHJldHVybiAoYXJnIGFzIFN0YWtlQmF0Y2hDYWxsQXJncykudmFsdWUgIT09IHVuZGVmaW5lZCAmJiAoYXJnIGFzIFN0YWtlQmF0Y2hDYWxsQXJncykucGF5ZWUgIT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgYXJnIGlzIG9mIHR5cGUgQWRkUHJveHlCYXRjaENhbGxBcmdzLCBmYWxzZSBvdGhlcndpc2UuXG4gICAqXG4gICAqIEBwYXJhbSBhcmcgVGhlIG9iamVjdCB0byB0ZXN0LlxuICAgKlxuICAgKiBAcmV0dXJuIHRydWUgaWYgYXJnIGlzIG9mIHR5cGUgQWRkUHJveHlCYXRjaENhbGxBcmdzLCBmYWxzZSBvdGhlcndpc2UuXG4gICAqL1xuICBpc0FkZFByb3h5QmF0Y2hDYWxsQXJncyhhcmc6IEJhdGNoQ2FsbE9iamVjdFsnYXJncyddKTogYXJnIGlzIEFkZFByb3h5QmF0Y2hDYWxsQXJncyB7XG4gICAgcmV0dXJuIChcbiAgICAgIChhcmcgYXMgQWRkUHJveHlCYXRjaENhbGxBcmdzKS5kZWxlZ2F0ZSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAoYXJnIGFzIEFkZFByb3h5QmF0Y2hDYWxsQXJncykucHJveHlfdHlwZSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAoYXJnIGFzIEFkZFByb3h5QmF0Y2hDYWxsQXJncykuZGVsYXkgIT09IHVuZGVmaW5lZFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIGFyZyBpcyBvZiB0eXBlIEJhdGNoQXJncyBhbmQgdGhlIGNhbGxzIG9mIHRoZSBiYXRjaCBhcmUgdW5zdGFraW5nIGNhbGxzOiBhIHJlbW92ZVxuICAgKiBwcm94eSBjYWxsIChyZW1vdmVQcm94eSksIGZvbGxvd2VkIGJ5IGEgY2hpbGwgY2FsbCwgYW5kIGFuIHVuc3Rha2UgY2FsbCAodW5ib25kKSwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKlxuICAgKiBAcGFyYW0gYXJnIFRoZSBvYmplY3QgdG8gdGVzdC5cbiAgICpcbiAgICogQHJldHVybiB0cnVlIGlmIGFyZyBpcyBvZiB0eXBlIEJhdGNoQXJncyBhbmQgdGhlIGNhbGxzIG9mIHRoZSBiYXRjaCBhcmUgdW5zdGFraW5nIGNhbGxzOiBhIHJlbW92ZVxuICAgKiBwcm94eSBjYWxsIChyZW1vdmVQcm94eSksIGZvbGxvd2VkIGJ5IGEgY2hpbGwgY2FsbCwgYW5kIGFuIHVuc3Rha2UgY2FsbCAodW5ib25kKSwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKi9cbiAgaXNVbnN0YWtpbmdCYXRjaChhcmc6IFR4TWV0aG9kWydhcmdzJ10pOiBhcmcgaXMgQmF0Y2hBcmdzIHtcbiAgICBjb25zdCBjYWxscyA9IChhcmcgYXMgQmF0Y2hBcmdzKS5jYWxscztcbiAgICBpZiAoY2FsbHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgY2FsbHMubGVuZ3RoID09PSAzICYmXG4gICAgICAgIHRoaXMuaXNSZW1vdmVQcm94eUJhdGNoQ2FsbEFyZ3MoY2FsbHNbMF0uYXJncykgJiZcbiAgICAgICAgXy5pc0VtcHR5KGNhbGxzWzFdLmFyZ3MpICYmXG4gICAgICAgIHRoaXMuaXNVbnN0YWtlQmF0Y2hDYWxsQXJncyhjYWxsc1syXS5hcmdzKVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiBhcmcgaXMgb2YgdHlwZSBBZGRQcm94eUJhdGNoQ2FsbEFyZ3MsIGZhbHNlIG90aGVyd2lzZS5cbiAgICpcbiAgICogQHBhcmFtIGFyZyBUaGUgb2JqZWN0IHRvIHRlc3QuXG4gICAqXG4gICAqIEByZXR1cm4gdHJ1ZSBpZiBhcmcgaXMgb2YgdHlwZSBBZGRQcm94eUJhdGNoQ2FsbEFyZ3MsIGZhbHNlIG90aGVyd2lzZS5cbiAgICovXG4gIGlzUmVtb3ZlUHJveHlCYXRjaENhbGxBcmdzKGFyZzogQmF0Y2hDYWxsT2JqZWN0WydhcmdzJ10pOiBhcmcgaXMgQWRkUHJveHlCYXRjaENhbGxBcmdzIHtcbiAgICByZXR1cm4gKFxuICAgICAgKGFyZyBhcyBBZGRQcm94eUJhdGNoQ2FsbEFyZ3MpLmRlbGVnYXRlICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIChhcmcgYXMgQWRkUHJveHlCYXRjaENhbGxBcmdzKS5wcm94eV90eXBlICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIChhcmcgYXMgQWRkUHJveHlCYXRjaENhbGxBcmdzKS5kZWxheSAhPT0gdW5kZWZpbmVkXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgYXJnIGlzIG9mIHR5cGUgVW5zdGFrZUJhdGNoQ2FsbEFyZ3MsIGZhbHNlIG90aGVyd2lzZS5cbiAgICpcbiAgICogQHBhcmFtIGFyZyBUaGUgb2JqZWN0IHRvIHRlc3QuXG4gICAqXG4gICAqIEByZXR1cm4gdHJ1ZSBpZiBhcmcgaXMgb2YgdHlwZSBVbnN0YWtlQmF0Y2hDYWxsQXJncywgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKi9cbiAgaXNVbnN0YWtlQmF0Y2hDYWxsQXJncyhhcmc6IEJhdGNoQ2FsbE9iamVjdFsnYXJncyddKTogYXJnIGlzIFVuc3Rha2VCYXRjaENhbGxBcmdzIHtcbiAgICByZXR1cm4gKGFyZyBhcyBVbnN0YWtlQmF0Y2hDYWxsQXJncykudmFsdWUgIT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgYXJnIGlzIG9mIHR5cGUgU3Rha2VBcmdzLCBmYWxzZSBvdGhlcndpc2UuXG4gICAqXG4gICAqIEBwYXJhbSBhcmcgVGhlIG9iamVjdCB0byB0ZXN0LlxuICAgKlxuICAgKiBAcmV0dXJuIHRydWUgaWYgYXJnIGlzIG9mIHR5cGUgU3Rha2VBcmdzLCBmYWxzZSBvdGhlcndpc2UuXG4gICAqL1xuICBpc0JvbmQoYXJnOiBUeE1ldGhvZFsnYXJncyddKTogYXJnIGlzIFN0YWtlQXJncyB7XG4gICAgcmV0dXJuIChhcmcgYXMgU3Rha2VBcmdzKS52YWx1ZSAhPT0gdW5kZWZpbmVkICYmIChhcmcgYXMgU3Rha2VBcmdzKS5wYXllZSAhPT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiBhcmcgaXMgb2YgdHlwZSBTdGFrZU1vcmVBcmdzLCBmYWxzZSBvdGhlcndpc2UuXG4gICAqXG4gICAqIEBwYXJhbSBhcmcgVGhlIG9iamVjdCB0byB0ZXN0LlxuICAgKlxuICAgKiBAcmV0dXJuIHRydWUgaWYgYXJnIGlzIG9mIHR5cGUgU3Rha2VNb3JlQXJncywgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKi9cbiAgaXNCb25kRXh0cmEoYXJnOiBUeE1ldGhvZFsnYXJncyddIHwgQmF0Y2hDYWxsT2JqZWN0WydhcmdzJ10pOiBhcmcgaXMgU3Rha2VNb3JlQXJncyB7XG4gICAgcmV0dXJuIChhcmcgYXMgU3Rha2VNb3JlQXJncykubWF4QWRkaXRpb25hbCAhPT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiBhcmcgaXMgb2YgdHlwZSBTdGFrZU1vcmVBcmdzLCBmYWxzZSBvdGhlcndpc2UuXG4gICAqXG4gICAqIEBwYXJhbSBhcmcgVGhlIG9iamVjdCB0byB0ZXN0LlxuICAgKlxuICAgKiBAcmV0dXJuIHRydWUgaWYgYXJnIGlzIG9mIHR5cGUgU3Rha2VNb3JlQXJncywgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKi9cbiAgaXNCb25kQmF0Y2hFeHRyYShhcmc6IEJhdGNoQ2FsbE9iamVjdFsnYXJncyddKTogYXJnIGlzIFN0YWtlTW9yZUNhbGxBcmdzIHtcbiAgICByZXR1cm4gKGFyZyBhcyBTdGFrZU1vcmVDYWxsQXJncykubWF4X2FkZGl0aW9uYWwgIT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBleHRyYWN0cyBhbmQgcmV0dXJucyB0aGUgc2lnbmF0dXJlIGluIGhleCBmb3JtYXQgZ2l2ZW4gYSByYXcgc2lnbmVkIHRyYW5zYWN0aW9uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByYXdUeCBzaWduZWQgcmF3IHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSBvcHRpb25zIHJlZ2lzdHJ5IHN1YnN0cmF0ZSByZWdpc3RyeSB1c2VkIHRvIHJldHJpZXZlIHRoZSBzaWduYXR1cmVcbiAgICovXG4gIHJlY292ZXJTaWduYXR1cmVGcm9tUmF3VHgocmF3VHg6IHN0cmluZywgb3B0aW9uczogeyByZWdpc3RyeTogVHlwZVJlZ2lzdHJ5IH0pOiBzdHJpbmcge1xuICAgIGNvbnN0IHsgcmVnaXN0cnkgfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgbWV0aG9kQ2FsbCA9IHJlZ2lzdHJ5LmNyZWF0ZVR5cGUoJ0V4dHJpbnNpYycsIHJhd1R4LCB7XG4gICAgICBpc1NpZ25lZDogdHJ1ZSxcbiAgICB9KTtcbiAgICBsZXQgc2lnbmF0dXJlID0gdThhVG9IZXgobWV0aG9kQ2FsbC5zaWduYXR1cmUpIGFzIHN0cmluZztcblxuICAgIC8vIHJlbW92ZSAweCBmcm9tIHRoZSBzaWduYXR1cmUgc2luY2UgdGhpcyBpcyBob3cgaXQncyByZXR1cm5lZCBmcm9tIFRTUyBzaWduaW5nXG4gICAgaWYgKHNpZ25hdHVyZS5zdGFydHNXaXRoKCcweCcpKSB7XG4gICAgICBzaWduYXR1cmUgPSBzaWduYXR1cmUuc3Vic3RyKDIpO1xuICAgIH1cbiAgICByZXR1cm4gc2lnbmF0dXJlO1xuICB9XG5cbiAgLyoqXG4gICAqIERlY29kZXMgdGhlIGRvdCBhZGRyZXNzIGZyb20gdGhlIGdpdmVuIGZvcm1hdFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYWRkcmVzc1xuICAgKiBAcGFyYW0ge251bWJlcn0gW3NzNThGb3JtYXRdXG4gICAqIEByZXR1cm5zIHtLZXlQYWlyfVxuICAgKi9cbiAgZGVjb2RlU3Vic3RyYXRlQWRkcmVzc1RvS2V5UGFpcihhZGRyZXNzOiBzdHJpbmcsIHNzNThGb3JtYXQ/OiBudW1iZXIpOiBLZXlQYWlyIHtcbiAgICByZXR1cm4gbmV3IEtleVBhaXIoeyBwdWI6IEJ1ZmZlci5mcm9tKGRlY29kZUFkZHJlc3MoYWRkcmVzcywgdW5kZWZpbmVkLCBzczU4Rm9ybWF0KSkudG9TdHJpbmcoJ2hleCcpIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBpbnB1dCBpcyBhIGhleCBzdHJpbmcgd2l0aCB3aXRoIDAgdmFsdWVcbiAgICogdXNlZCB0byBjaGVjayB3aGV0aGVyIGEgZ2l2ZW4gdHJhbnNhY3Rpb24gaXMgaW1tb3J0YWwgb3IgbW9ydGFsXG4gICAqIEBwYXJhbSBoZXhWYWx1ZVxuICAgKi9cbiAgaXNaZXJvSGV4KGhleFZhbHVlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaGV4VmFsdWUgPT09ICcweDAwJztcbiAgfVxuXG4gIC8qKlxuICAgKiBUYWtlcyBhbiBhc3NldCBuYW1lIGFuZCByZXR1cm5zIHRoZSByZXNwZWN0aXZlIGFkZHJlc3MgdG8gZm9ybWF0IHRvXG4gICAqIHNpbmNlIHN1YnN0cmF0ZSBhZGRyZXNzZXMgZGlmZmVyIGRlcGVuZGluZyBvbiB0aGUgbmV0d29ya1xuICAgKiBAcGFyYW0gbmV0d29ya0NvaW5OYW1lXG4gICAqL1xuICBnZXRBZGRyZXNzRm9ybWF0KG5ldHdvcmtDb2luTmFtZTogRG90QXNzZXRUeXBlcyk6IERvdEFkZHJlc3NGb3JtYXQge1xuICAgIHJldHVybiBjb2luVG9BZGRyZXNzTWFwLmdldChuZXR3b3JrQ29pbk5hbWUpIGFzIERvdEFkZHJlc3NGb3JtYXQ7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHB1cmUgcHJveHkgZXh0cmluc2ljLiBTdWJzdHJhdGUgaGFzIHJlbmFtZWQgYW5vbnltb3VzIHByb3hpZXMgdG8gcHVyZSBwcm94aWVzLCBidXRcbiAgICogdGhlIGxpYnJhcmllcyB3ZSBhcmUgdXNpbmcgdG8gYnVpbGQgdHJhbnNhY3Rpb25zIGhhdmUgbm90IGJlZW4gdXBkYXRlZCwgYXMgYSBzdG9wIGdhcCB3ZSBhcmVcbiAgICogZGVmaW5pbmcgdGhlIHB1cmUgcHJveHkgZXh0cmluc2ljIGhlcmUuXG4gICAqXG4gICAqIEBwYXJhbSBhcmdzIEFyZ3VtZW50cyB0byB0aGUgY3JlYXRlUHVyZSBleHRyaW5zaWMuXG4gICAqIEBwYXJhbSBpbmZvIENvbW1vbiBpbmZvcm1hdGlvbiB0byBhbGwgdHJhbnNhY3Rpb25zLlxuICAgKiBAcGFyYW0gb3B0aW9ucyBDaGFpbiByZWdpc3RyeSBhbmQgbWV0YWRhdGEuXG4gICAqL1xuICBwdXJlUHJveHkoYXJnczogUHVyZVByb3h5QXJncywgaW5mbzogQmFzZVR4SW5mbywgb3B0aW9uczogT3B0aW9uc1dpdGhNZXRhKTogVW5zaWduZWRUcmFuc2FjdGlvbiB7XG4gICAgcmV0dXJuIGRlZmluZU1ldGhvZChcbiAgICAgIHtcbiAgICAgICAgbWV0aG9kOiB7XG4gICAgICAgICAgYXJncyxcbiAgICAgICAgICBuYW1lOiAnY3JlYXRlUHVyZScsXG4gICAgICAgICAgcGFsbGV0OiAncHJveHknLFxuICAgICAgICB9LFxuICAgICAgICAuLi5pbmZvLFxuICAgICAgfSxcbiAgICAgIG9wdGlvbnNcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgJzB4JyBmcm9tIGEgZ2l2ZW4gYHN0cmluZ2AgaWYgcHJlc2VudC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0ciB0aGUgc3RyaW5nIHZhbHVlLlxuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IGEgc3RyaW5nIHdpdGhvdXQgYSAnMHgnIHByZWZpeC5cbiAgICovXG4gIHN0cmlwSGV4UHJlZml4KHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pc0hleFByZWZpeGVkKHN0cikgPyBzdHIuc2xpY2UoMikgOiBzdHI7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIGEgc3RyaW5nIHN0YXJ0cyB3aXRoICcweCcsIGZhbHNlIG90aGVyd2lzZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0ciB0aGUgc3RyaW5nIHZhbHVlLlxuICAgKlxuICAgKiBAcmV0dXJuIHtib29sZWFufSB0cnVlIGlmIGEgc3RyaW5nIHN0YXJ0cyB3aXRoICcweCcsIGZhbHNlIG90aGVyd2lzZS5cbiAgICovXG4gIGlzSGV4UHJlZml4ZWQoc3RyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gc3RyLnNsaWNlKDAsIDIpID09PSAnMHgnO1xuICB9XG59XG5cbmludGVyZmFjZSBQdXJlUHJveHlBcmdzIGV4dGVuZHMgQXJncyB7XG4gIHByb3h5VHlwZTogc3RyaW5nO1xuICBkZWxheTogbnVtYmVyO1xuICBpbmRleDogbnVtYmVyO1xufVxuXG5jb25zdCB1dGlscyA9IG5ldyBVdGlscygpO1xuXG5leHBvcnQgZGVmYXVsdCB1dGlscztcbiJdfQ==
250
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLG1EQUEwRjtBQUUxRiwrQ0FBMEU7QUFDMUUsMERBQTJEO0FBRTNELHNFQUEyRTtBQUMzRSx5Q0FBcUU7QUFDckUsdURBQXNFO0FBR3RFLHNFQUEwRDtBQUMxRCxnREFBd0I7QUFDeEIsMERBQStCO0FBQy9CLDBEQUE2QjtBQUM3Qix3QkFBNEI7QUFrQjVCLE1BQWEsS0FBSztJQUNoQixrQkFBa0I7SUFDbEIsY0FBYyxDQUFDLE9BQWU7UUFDNUIsSUFBSSxDQUFDO1lBQ0gsSUFBQSx1QkFBYSxFQUFDLElBQUEsWUFBSyxFQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFBLGVBQVEsRUFBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBQSx1QkFBYSxFQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDM0UsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztJQUNILENBQUM7SUFFRCxrQkFBa0I7SUFDbEIsY0FBYyxDQUFDLElBQVk7UUFDekIsT0FBTyxJQUFBLFlBQUssRUFBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDMUIsQ0FBQztJQUVELGtCQUFrQjtJQUNsQixpQkFBaUIsQ0FBQyxHQUFXO1FBQzNCLElBQUksQ0FBQztZQUNILE1BQU0sVUFBVSxHQUFHLElBQUEsZUFBUSxFQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2pDLE9BQU8sVUFBVSxDQUFDLE1BQU0sS0FBSyxtQkFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEdBQUcsQ0FBQyxDQUFDO1FBQzdELENBQUM7UUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ1gsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO0lBQ0gsQ0FB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RjtBQXBSRCxzQkFvUkM7QUFFRCxNQUFNLEtBQUssR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDO0FBRTFCLGtCQUFlLEtBQUssQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJhc2VVdGlscywgaXNCYXNlNTgsIGlzVmFsaWRFZDI1NTE5UHVibGljS2V5LCBTZWVkIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgTmV0d29ya1R5cGUgfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcbmltcG9ydCB7IGRlY29kZUFkZHJlc3MsIGVuY29kZUFkZHJlc3MsIEtleXJpbmcgfSBmcm9tICdAcG9sa2Fkb3Qva2V5cmluZyc7XG5pbXBvcnQgeyBkZWNvZGVQYWlyIH0gZnJvbSAnQHBvbGthZG90L2tleXJpbmcvcGFpci9kZWNvZGUnO1xuaW1wb3J0IHsgS2V5cmluZ1BhaXIgfSBmcm9tICdAcG9sa2Fkb3Qva2V5cmluZy90eXBlcyc7XG5pbXBvcnQgeyBFWFRSSU5TSUNfVkVSU0lPTiB9IGZyb20gJ0Bwb2xrYWRvdC90eXBlcy9leHRyaW5zaWMvdjQvRXh0cmluc2ljJztcbmltcG9ydCB7IGhleFRvVThhLCBpc0hleCwgdThhVG9IZXgsIHU4YVRvVThhIH0gZnJvbSAnQHBvbGthZG90L3V0aWwnO1xuaW1wb3J0IHsgYmFzZTY0RGVjb2RlLCBzaWduYXR1cmVWZXJpZnkgfSBmcm9tICdAcG9sa2Fkb3QvdXRpbC1jcnlwdG8nO1xuaW1wb3J0IHsgVW5zaWduZWRUcmFuc2FjdGlvbiB9IGZyb20gJ0BzdWJzdHJhdGUvdHh3cmFwcGVyLWNvcmUnO1xuaW1wb3J0IHsgRGVjb2RlZFNpZ25lZFR4LCBEZWNvZGVkU2lnbmluZ1BheWxvYWQsIFR5cGVSZWdpc3RyeSB9IGZyb20gJ0BzdWJzdHJhdGUvdHh3cmFwcGVyLWNvcmUvbGliL3R5cGVzJztcbmltcG9ydCB7IGNvbnN0cnVjdCB9IGZyb20gJ0BzdWJzdHJhdGUvdHh3cmFwcGVyLXBvbGthZG90JztcbmltcG9ydCBiczU4IGZyb20gJ2JzNTgnO1xuaW1wb3J0IGJhc2UzMiBmcm9tICdoaS1iYXNlMzInO1xuaW1wb3J0IG5hY2wgZnJvbSAndHdlZXRuYWNsJztcbmltcG9ydCB7IEtleVBhaXIgfSBmcm9tICcuJztcbmltcG9ydCB7XG4gIEhleFN0cmluZyxcbiAgTWF0ZXJpYWwsXG4gIFRyYW5zZmVyQWxsQXJncyxcbiAgVHJhbnNmZXJBcmdzLFxuICBUeE1ldGhvZCxcbiAgQWRkU3Rha2VBcmdzLFxuICBSZW1vdmVTdGFrZUFyZ3MsXG4gIEJvbmRBcmdzLFxuICBCb25kRXh0cmFBcmdzLFxuICBOb21pbmF0ZUFyZ3MsXG4gIENoaWxsQXJncyxcbiAgVW5ib25kQXJncyxcbiAgV2l0aGRyYXdVbmJvbmRlZEFyZ3MsXG4gIEJhdGNoQXJncyxcbn0gZnJvbSAnLi9pZmFjZSc7XG5cbmV4cG9ydCBjbGFzcyBVdGlscyBpbXBsZW1lbnRzIEJhc2VVdGlscyB7XG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBpc1ZhbGlkQWRkcmVzcyhhZGRyZXNzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgZW5jb2RlQWRkcmVzcyhpc0hleChhZGRyZXNzKSA/IGhleFRvVThhKGFkZHJlc3MpIDogZGVjb2RlQWRkcmVzcyhhZGRyZXNzKSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBpc1ZhbGlkQmxvY2tJZChoYXNoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaXNIZXgoaGFzaCwgMjU2KTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBpc1ZhbGlkUHJpdmF0ZUtleShrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkZWNvZGVkUHJ2ID0gaGV4VG9VOGEoa2V5KTtcbiAgICAgIHJldHVybiBkZWNvZGVkUHJ2Lmxlbmd0aCA9PT0gbmFjbC5zaWduLnNlY3JldEtleUxlbmd0aCAvIDI7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBpc1ZhbGlkUHVibGljS2V5KGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgbGV0IHB1YktleSA9IGtleTtcblxuICAgIC8vIGNvbnZlcnQgYmFzZTU4IHB1YiBrZXkgdG8gaGV4IGZvcm1hdFxuICAgIC8vIHRzcyBjb21tb24gcHViIGlzIGluIGJhc2U1OCBmb3JtYXQgYW5kIGRlY29kZXMgdG8gbGVuZ3RoIG9mIDMyXG4gICAgaWYgKGlzQmFzZTU4KHB1YktleSwgMzIpKSB7XG4gICAgICBjb25zdCBiYXNlNThEZWNvZGUgPSBiczU4LmRlY29kZShwdWJLZXkpO1xuICAgICAgcHViS2V5ID0gYmFzZTU4RGVjb2RlLnRvU3RyaW5nKCdoZXgnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaXNWYWxpZEVkMjU1MTlQdWJsaWNLZXkocHViS2V5KTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBpc1ZhbGlkU2lnbmF0dXJlKHNpZ25hdHVyZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgc2lnbmF0dXJlVThhID0gdThhVG9VOGEoc2lnbmF0dXJlKTtcbiAgICByZXR1cm4gWzY0LCA2NSwgNjZdLmluY2x1ZGVzKHNpZ25hdHVyZVU4YS5sZW5ndGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIHRoZSBzaWduYXR1cmUgb24gYSBnaXZlbiBtZXNzYWdlXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzaWduZWRNZXNzYWdlIHRoZSBzaWduZWQgbWVzc2FnZSBmb3IgdGhlIHNpZ25hdHVyZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2lnbmF0dXJlIHRoZSBzaWduYXR1cmUgdG8gdmVyaWZ5XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhZGRyZXNzIHRoZSBhZGRyZXNzIG9mIHRoZSBzaWduZXJcbiAgICogQHJldHVybnMge2Jvb2xlYW59IHdoZXRoZXIgdGhlIHNpZ25hdHVyZSBpcyB2YWxpZCBvciBub3RcbiAgICovXG4gIHZlcmlmeVNpZ25hdHVyZShzaWduZWRNZXNzYWdlOiBzdHJpbmcsIHNpZ25hdHVyZTogc3RyaW5nLCBhZGRyZXNzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBwdWJsaWNLZXkgPSBkZWNvZGVBZGRyZXNzKGFkZHJlc3MpO1xuICAgIGNvbnN0IGhleFB1YmxpY0tleSA9IHU4YVRvSGV4KHB1YmxpY0tleSk7XG5cbiAgICByZXR1cm4gc2lnbmF0dXJlVmVyaWZ5KHNpZ25lZE1lc3NhZ2UsIHNpZ25hdHVyZSwgaGV4UHVibGljS2V5KS5pc1ZhbGlkO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGlzVmFsaWRUcmFuc2FjdGlvbklkKHR4SWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpc0hleCh0eElkLCAyNTYpO1xuICB9XG5cbiAgLyoqXG4gICAqIGRlY29kZVNlZWQgZGVjb2RlcyBhIHN1YnN0cmF0ZSBzZWVkXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWVkIC0gdGhlIHNlZWQgdG8gYmUgdmFsaWRhdGVkLlxuICAgKiBAcmV0dXJucyB7U2VlZH0gLSB0aGUgb2JqZWN0IFNlZWRcbiAgICovXG4gIGRlY29kZVNlZWQoc2VlZDogc3RyaW5nKTogU2VlZCB7XG4gICAgY29uc3QgZGVjb2RlZCA9IGJhc2UzMi5kZWNvZGUuYXNCeXRlcyhzZWVkKTtcbiAgICByZXR1cm4ge1xuICAgICAgc2VlZDogQnVmZmVyLmZyb20oZGVjb2RlZCksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBrZXlQYWlyRnJvbVNlZWQgZ2VuZXJhdGVzIGFuIG9iamVjdCB3aXRoIHNlY3JldEtleSBhbmQgcHVibGljS2V5IHVzaW5nIHRoZSBzdWJzdHJhdGUgc2RrXG4gICAqIEBwYXJhbSBzZWVkIDMyIGJ5dGVzIGxvbmcgc2VlZFxuICAgKiBAcmV0dXJucyBLZXlQYWlyXG4gICAqL1xuICBrZXlQYWlyRnJvbVNlZWQoc2VlZDogVWludDhBcnJheSk6IEtleVBhaXIge1xuICAgIGNvbnN0IGtleXJpbmcgPSBuZXcgS2V5cmluZyh7IHR5cGU6ICdlZDI1NTE5JyB9KTtcbiAgICBjb25zdCBrZXlyaW5nUGFpciA9IGtleXJpbmcuYWRkRnJvbVNlZWQoc2VlZCk7XG4gICAgY29uc3QgcGFpckpzb24gPSBrZXlyaW5nUGFpci50b0pzb24oKTtcbiAgICBjb25zdCBkZWNvZGVkS2V5UGFpciA9IGRlY29kZVBhaXIoJycsIGJhc2U2NERlY29kZShwYWlySnNvbi5lbmNvZGVkKSwgcGFpckpzb24uZW5jb2RpbmcudHlwZSk7XG4gICAgcmV0dXJuIG5ldyBLZXlQYWlyKHsgcHJ2OiBCdWZmZXIuZnJvbShkZWNvZGVkS2V5UGFpci5zZWNyZXRLZXkpLnRvU3RyaW5nKCdoZXgnKSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWduaW5nIGZ1bmN0aW9uLiBJbXBsZW1lbnQgdGhpcyBvbiB0aGUgT0ZGTElORSBzaWduaW5nIGRldmljZS5cbiAgICpcbiAgICogQHBhcmFtIHtLZXlyaW5nUGFpcn0gcGFpciAtIFRoZSBzaWduaW5nIHBhaXIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzaWduaW5nUGF5bG9hZCAtIFBheWxvYWQgdG8gc2lnbi5cbiAgICogQHBhcmFtIHtVbnNpZ25lZFRyYW5zYWN0aW9ufSB0cmFuc2FjdGlvbiAtIHJhdyB0cmFuc2FjdGlvbiB0byBzaWduXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gICAqIEBwYXJhbSB7SGV4U3RyaW5nfSBvcHRpb25zLm1ldGFkYXRhUnBjIC0gbWV0YWRhdGEgdGhhdCBpcyBuZWVkZWQgZm9yIHN1YnN0cmF0ZSB0byBzaWduXG4gICAqIEBwYXJhbSB7VHlwZVJlZ2lzdHJ5fSBvcHRpb25zLnJlZ2lzdHJ5IC0gbWV0YWRhdGEgdGhhdCBpcyBuZWVkZWQgZm9yIHN1YnN0cmF0ZSB0byBzaWduXG4gICAqL1xuICBjcmVhdGVTaWduZWRUeChcbiAgICBwYWlyOiBLZXlyaW5nUGFpcixcbiAgICBzaWduaW5nUGF5bG9hZDogc3RyaW5nLFxuICAgIHRyYW5zYWN0aW9uOiBVbnNpZ25lZFRyYW5zYWN0aW9uLFxuICAgIG9wdGlvbnM6IHsgbWV0YWRhdGFScGM6IEhleFN0cmluZzsgcmVnaXN0cnk6IFR5cGVSZWdpc3RyeSB9XG4gICk6IHN0cmluZyB7XG4gICAgY29uc3QgeyByZWdpc3RyeSwgbWV0YWRhdGFScGMgfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgeyBzaWduYXR1cmUgfSA9IHJlZ2lzdHJ5XG4gICAgICAuY3JlYXRlVHlwZSgnRXh0cmluc2ljUGF5bG9hZCcsIHNpZ25pbmdQYXlsb2FkLCB7XG4gICAgICAgIHZlcnNpb246IEVYVFJJTlNJQ19WRVJTSU9OLFxuICAgICAgfSlcbiAgICAgIC5zaWduKHBhaXIpO1xuXG4gICAgLy8gU2VyaWFsaXplIGEgc2lnbmVkIHRyYW5zYWN0aW9uLlxuICAgIHJldHVybiB0aGlzLnNlcmlhbGl6ZVNpZ25lZFRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uLCBzaWduYXR1cmUsIG1ldGFkYXRhUnBjLCByZWdpc3RyeSk7XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplcyB0aGUgc2lnbmVkIHRyYW5zYWN0aW9uXG4gICAqXG4gICAqIEBwYXJhbSB0cmFuc2FjdGlvbiBUcmFuc2FjdGlvbiB0byBzZXJpYWxpemVcbiAgICogQHBhcmFtIHNpZ25hdHVyZSBTaWduYXR1cmUgb2YgdGhlIG1lc3NhZ2VcbiAgICogQHBhcmFtIG1ldGFkYXRhUnBjIE5ldHdvcmsgbWV0YWRhdGFcbiAgICogQHBhcmFtIHJlZ2lzdHJ5IFRyYW5zYWN0aW9uIHJlZ2lzdHJ5XG4gICAqIEByZXR1cm5zIHN0cmluZyBTZXJpYWxpemVkIHRyYW5zYWN0aW9uXG4gICAqL1xuICBzZXJpYWxpemVTaWduZWRUcmFuc2FjdGlvbihcbiAgICB0cmFuc2FjdGlvbjogVW5zaWduZWRUcmFuc2FjdGlvbixcbiAgICBzaWduYXR1cmU6IEhleFN0cmluZyxcbiAgICBtZXRhZGF0YVJwYzogYDB4JHtzdHJpbmd9YCxcbiAgICByZWdpc3RyeTogVHlwZVJlZ2lzdHJ5XG4gICk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGNvbnN0cnVjdC5zaWduZWRUeCh0cmFuc2FjdGlvbiwgc2lnbmF0dXJlLCB7XG4gICAgICBtZXRhZGF0YVJwYyxcbiAgICAgIHJlZ2lzdHJ5LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIERlY29kZXMgdGhlIHN1YnN0cmF0ZSBhZGRyZXNzIGZyb20gdGhlIGdpdmVuIGZvcm1hdFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYWRkcmVzc1xuICAgKiBAcGFyYW0ge251bWJlcn0gW3NzNThGb3JtYXRdXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBkZWNvZGVTdWJzdHJhdGVBZGRyZXNzKGFkZHJlc3M6IHN0cmluZywgc3M1OEZvcm1hdDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCBrZXlwYWlyID0gbmV3IEtleVBhaXIoeyBwdWI6IEJ1ZmZlci5mcm9tKGRlY29kZUFkZHJlc3MoYWRkcmVzcywgdW5kZWZpbmVkLCBzczU4Rm9ybWF0KSkudG9TdHJpbmcoJ2hleCcpIH0pO1xuICAgIHJldHVybiBrZXlwYWlyLmdldEFkZHJlc3Moc3M1OEZvcm1hdCk7XG4gIH1cblxuICAvKipcbiAgICogRGVjb2RlcyB0aGUgc3Vic3RyYXRlIGFkZHJlc3MgZnJvbSB0aGUgZ2l2ZW4gZm9ybWF0XG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhZGRyZXNzXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbc3M1OEZvcm1hdF1cbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGVuY29kZVN1YnN0cmF0ZUFkZHJlc3MoYWRkcmVzczogc3RyaW5nLCBzczU4Rm9ybWF0PzogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZW5jb2RlQWRkcmVzcyhhZGRyZXNzLCBzczU4Rm9ybWF0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgdGhlIHR4SGFzaCBvZiBhIHNpZ25lZCB0eEhleFxuICAgKlxuICAgKiBAcGFyYW0gdHhIZXggc2lnbmVkIHRyYW5zYWN0aW9uIGhleFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0VHhIYXNoKHR4SGV4OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBjb25zdHJ1Y3QudHhIYXNoKHR4SGV4KTtcbiAgfVxuXG4gIGlzU2lnbmluZ1BheWxvYWQocGF5bG9hZDogRGVjb2RlZFNpZ25pbmdQYXlsb2FkIHwgRGVjb2RlZFNpZ25lZFR4KTogcGF5bG9hZCBpcyBEZWNvZGVkU2lnbmluZ1BheWxvYWQge1xuICAgIHJldHVybiAocGF5bG9hZCBhcyBEZWNvZGVkU2lnbmluZ1BheWxvYWQpLmJsb2NrSGFzaCAhPT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgaXNUcmFuc2Zlcihhcmc6IFR4TWV0aG9kWydhcmdzJ10pOiBhcmcgaXMgVHJhbnNmZXJBcmdzIHtcbiAgICByZXR1cm4gKGFyZyBhcyBUcmFuc2ZlckFyZ3MpLmRlc3Q/LmlkICE9PSB1bmRlZmluZWQgJiYgKGFyZyBhcyBUcmFuc2ZlckFyZ3MpLnZhbHVlICE9PSB1bmRlZmluZWQ7XG4gIH1cblxuICBpc1RyYW5zZmVyQWxsKGFyZzogVHhNZXRob2RbJ2FyZ3MnXSk6IGFyZyBpcyBUcmFuc2ZlckFsbEFyZ3Mge1xuICAgIHJldHVybiAoYXJnIGFzIFRyYW5zZmVyQWxsQXJncykuZGVzdD8uaWQgIT09IHVuZGVmaW5lZCAmJiAoYXJnIGFzIFRyYW5zZmVyQWxsQXJncykua2VlcEFsaXZlICE9PSB1bmRlZmluZWQ7XG4gIH1cblxuICBpc0FkZFN0YWtlKGFyZzogVHhNZXRob2RbJ2FyZ3MnXSk6IGFyZyBpcyBBZGRTdGFrZUFyZ3Mge1xuICAgIHJldHVybiAoXG4gICAgICAoYXJnIGFzIEFkZFN0YWtlQXJncykuYW1vdW50U3Rha2VkICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIChhcmcgYXMgQWRkU3Rha2VBcmdzKS5ob3RrZXkgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgKGFyZyBhcyBBZGRTdGFrZUFyZ3MpLm5ldHVpZCAhPT0gdW5kZWZpbmVkXG4gICAgKTtcbiAgfVxuXG4gIGlzUmVtb3ZlU3Rha2UoYXJnOiBUeE1ldGhvZFsnYXJncyddKTogYXJnIGlzIFJlbW92ZVN0YWtlQXJncyB7XG4gICAgcmV0dXJuIChcbiAgICAgIChhcmcgYXMgUmVtb3ZlU3Rha2VBcmdzKS5hbW91bnRVbnN0YWtlZCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAoYXJnIGFzIFJlbW92ZVN0YWtlQXJncykuaG90a2V5ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIChhcmcgYXMgUmVtb3ZlU3Rha2VBcmdzKS5uZXR1aWQgIT09IHVuZGVmaW5lZFxuICAgICk7XG4gIH1cblxuICBpc0JvbmQoYXJnOiBUeE1ldGhvZFsnYXJncyddKTogYXJnIGlzIEJvbmRBcmdzIHtcbiAgICByZXR1cm4gKFxuICAgICAgKGFyZyBhcyBCb25kQXJncykudmFsdWUgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgKGFyZyBhcyBCb25kQXJncykuY29udHJvbGxlciAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAoYXJnIGFzIEJvbmRBcmdzKS5wYXllZSAhPT0gdW5kZWZpbmVkXG4gICAgKTtcbiAgfVxuXG4gIGlzQm9uZEV4dHJhKGFyZzogVHhNZXRob2RbJ2FyZ3MnXSk6IGFyZyBpcyBCb25kRXh0cmFBcmdzIHtcbiAgICByZXR1cm4gKGFyZyBhcyBCb25kRXh0cmFBcmdzKS5tYXhBZGRpdGlvbmFsICE9PSB1bmRlZmluZWQ7XG4gIH1cblxuICBpc05vbWluYXRlKGFyZzogVHhNZXRob2RbJ2FyZ3MnXSk6IGFyZyBpcyBOb21pbmF0ZUFyZ3Mge1xuICAgIHJldHVybiAoYXJnIGFzIE5vbWluYXRlQXJncykudGFyZ2V0cyAhPT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgaXNDaGlsbChhcmc6IFR4TWV0aG9kWydhcmdzJ10pOiBhcmcgaXMgQ2hpbGxBcmdzIHtcbiAgICByZXR1cm4gdHJ1ZTsgLy8gQ2hpbGwgaGFzIG5vIGFyZ3VtZW50cywgc28gYW55IG9iamVjdCBjYW4gYmUgY29uc2lkZXJlZCBDaGlsbEFyZ3NcbiAgfVxuXG4gIGlzVW5ib25kKGFyZzogVHhNZXRob2RbJ2FyZ3MnXSk6IGFyZyBpcyBVbmJvbmRBcmdzIHtcbiAgICByZXR1cm4gKGFyZyBhcyBVbmJvbmRBcmdzKS52YWx1ZSAhPT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgaXNXaXRoZHJhd1VuYm9uZGVkKGFyZzogVHhNZXRob2RbJ2FyZ3MnXSk6IGFyZyBpcyBXaXRoZHJhd1VuYm9uZGVkQXJncyB7XG4gICAgcmV0dXJuIChhcmcgYXMgV2l0aGRyYXdVbmJvbmRlZEFyZ3MpLm51bVNsYXNoaW5nU3BhbnMgIT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGlzQmF0Y2goYXJnOiBUeE1ldGhvZFsnYXJncyddKTogYXJnIGlzIEJhdGNoQXJncyB7XG4gICAgcmV0dXJuIChhcmcgYXMgQmF0Y2hBcmdzKS5jYWxscyAhPT0gdW5kZWZpbmVkICYmIEFycmF5LmlzQXJyYXkoKGFyZyBhcyBCYXRjaEFyZ3MpLmNhbGxzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBleHRyYWN0cyBhbmQgcmV0dXJucyB0aGUgc2lnbmF0dXJlIGluIGhleCBmb3JtYXQgZ2l2ZW4gYSByYXcgc2lnbmVkIHRyYW5zYWN0aW9uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByYXdUeCBzaWduZWQgcmF3IHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSBvcHRpb25zIHJlZ2lzdHJ5IHN1YnN0cmF0ZSByZWdpc3RyeSB1c2VkIHRvIHJldHJpZXZlIHRoZSBzaWduYXR1cmVcbiAgICovXG4gIHJlY292ZXJTaWduYXR1cmVGcm9tUmF3VHgocmF3VHg6IHN0cmluZywgb3B0aW9uczogeyByZWdpc3RyeTogVHlwZVJlZ2lzdHJ5IH0pOiBzdHJpbmcge1xuICAgIGNvbnN0IHsgcmVnaXN0cnkgfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgbWV0aG9kQ2FsbCA9IHJlZ2lzdHJ5LmNyZWF0ZVR5cGUoJ0V4dHJpbnNpYycsIHJhd1R4LCB7XG4gICAgICBpc1NpZ25lZDogdHJ1ZSxcbiAgICB9KTtcbiAgICBsZXQgc2lnbmF0dXJlID0gdThhVG9IZXgobWV0aG9kQ2FsbC5zaWduYXR1cmUpIGFzIHN0cmluZztcblxuICAgIC8vIHJlbW92ZSAweCBmcm9tIHRoZSBzaWduYXR1cmUgc2luY2UgdGhpcyBpcyBob3cgaXQncyByZXR1cm5lZCBmcm9tIFRTUyBzaWduaW5nXG4gICAgaWYgKHNpZ25hdHVyZS5zdGFydHNXaXRoKCcweCcpKSB7XG4gICAgICBzaWduYXR1cmUgPSBzaWduYXR1cmUuc3Vic3RyKDIpO1xuICAgIH1cbiAgICByZXR1cm4gc2lnbmF0dXJlO1xuICB9XG5cbiAgLyoqXG4gICAqIERlY29kZXMgdGhlIGRvdCBhZGRyZXNzIGZyb20gdGhlIGdpdmVuIGZvcm1hdFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYWRkcmVzc1xuICAgKiBAcGFyYW0ge251bWJlcn0gW3NzNThGb3JtYXRdXG4gICAqIEByZXR1cm5zIHtLZXlQYWlyfVxuICAgKi9cbiAgZGVjb2RlU3Vic3RyYXRlQWRkcmVzc1RvS2V5UGFpcihhZGRyZXNzOiBzdHJpbmcsIHNzNThGb3JtYXQ/OiBudW1iZXIpOiBLZXlQYWlyIHtcbiAgICByZXR1cm4gbmV3IEtleVBhaXIoeyBwdWI6IEJ1ZmZlci5mcm9tKGRlY29kZUFkZHJlc3MoYWRkcmVzcywgdW5kZWZpbmVkLCBzczU4Rm9ybWF0KSkudG9TdHJpbmcoJ2hleCcpIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBpbnB1dCBpcyBhIGhleCBzdHJpbmcgd2l0aCB3aXRoIDAgdmFsdWVcbiAgICogdXNlZCB0byBjaGVjayB3aGV0aGVyIGEgZ2l2ZW4gdHJhbnNhY3Rpb24gaXMgaW1tb3J0YWwgb3IgbW9ydGFsXG4gICAqIEBwYXJhbSBoZXhWYWx1ZVxuICAgKi9cbiAgaXNaZXJvSGV4KGhleFZhbHVlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaGV4VmFsdWUgPT09ICcweDAwJztcbiAgfVxuXG4gIGdldE1hdGVyaWFsKG5ldHdvcmtUeXBlOiBOZXR3b3JrVHlwZSk6IE1hdGVyaWFsIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJyk7XG4gIH1cbn1cblxuY29uc3QgdXRpbHMgPSBuZXcgVXRpbHMoKTtcblxuZXhwb3J0IGRlZmF1bHQgdXRpbHM7XG4iXX0=