@bitgo-beta/sdk-coin-flrp 1.0.1-beta.3 → 1.0.1-beta.300

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 (109) hide show
  1. package/dist/src/flrp.d.ts +75 -61
  2. package/dist/src/flrp.d.ts.map +1 -1
  3. package/dist/src/flrp.js +276 -134
  4. package/dist/src/index.d.ts +0 -1
  5. package/dist/src/index.d.ts.map +1 -1
  6. package/dist/src/index.js +1 -2
  7. package/dist/src/lib/ExportInCTxBuilder.d.ts +51 -0
  8. package/dist/src/lib/ExportInCTxBuilder.d.ts.map +1 -0
  9. package/dist/src/lib/ExportInCTxBuilder.js +188 -0
  10. package/dist/src/lib/ExportInPTxBuilder.d.ts +47 -0
  11. package/dist/src/lib/ExportInPTxBuilder.d.ts.map +1 -0
  12. package/dist/src/lib/ExportInPTxBuilder.js +273 -0
  13. package/dist/src/lib/ImportInCTxBuilder.d.ts +48 -0
  14. package/dist/src/lib/ImportInCTxBuilder.d.ts.map +1 -0
  15. package/dist/src/lib/ImportInCTxBuilder.js +215 -0
  16. package/dist/src/lib/ImportInPTxBuilder.d.ts +33 -0
  17. package/dist/src/lib/ImportInPTxBuilder.d.ts.map +1 -0
  18. package/dist/src/lib/ImportInPTxBuilder.js +180 -0
  19. package/dist/src/lib/atomicInCTransactionBuilder.d.ts +18 -16
  20. package/dist/src/lib/atomicInCTransactionBuilder.d.ts.map +1 -1
  21. package/dist/src/lib/atomicInCTransactionBuilder.js +38 -36
  22. package/dist/src/lib/atomicTransactionBuilder.d.ts +49 -34
  23. package/dist/src/lib/atomicTransactionBuilder.d.ts.map +1 -1
  24. package/dist/src/lib/atomicTransactionBuilder.js +159 -33
  25. package/dist/src/lib/iface.d.ts +50 -22
  26. package/dist/src/lib/iface.d.ts.map +1 -1
  27. package/dist/src/lib/iface.js +13 -14
  28. package/dist/src/lib/index.d.ts +7 -0
  29. package/dist/src/lib/index.d.ts.map +1 -1
  30. package/dist/src/lib/index.js +16 -2
  31. package/dist/src/lib/keyPair.d.ts +5 -5
  32. package/dist/src/lib/keyPair.d.ts.map +1 -1
  33. package/dist/src/lib/keyPair.js +15 -9
  34. package/dist/src/lib/permissionlessValidatorTxBuilder.d.ts +43 -0
  35. package/dist/src/lib/permissionlessValidatorTxBuilder.d.ts.map +1 -0
  36. package/dist/src/lib/permissionlessValidatorTxBuilder.js +132 -0
  37. package/dist/src/lib/transaction.d.ts +51 -0
  38. package/dist/src/lib/transaction.d.ts.map +1 -0
  39. package/dist/src/lib/transaction.js +373 -0
  40. package/dist/src/lib/transactionBuilder.d.ts +107 -0
  41. package/dist/src/lib/transactionBuilder.d.ts.map +1 -0
  42. package/dist/src/lib/transactionBuilder.js +210 -0
  43. package/dist/src/lib/transactionBuilderFactory.d.ts +57 -0
  44. package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -0
  45. package/dist/src/lib/transactionBuilderFactory.js +148 -0
  46. package/dist/src/lib/utils.d.ts +78 -102
  47. package/dist/src/lib/utils.d.ts.map +1 -1
  48. package/dist/src/lib/utils.js +220 -246
  49. package/dist/test/resources/account.d.ts +51 -0
  50. package/dist/test/resources/account.d.ts.map +1 -0
  51. package/dist/test/resources/account.js +54 -0
  52. package/dist/test/resources/transactionData/exportInC.d.ts +20 -0
  53. package/dist/test/resources/transactionData/exportInC.d.ts.map +1 -0
  54. package/dist/test/resources/transactionData/exportInC.js +34 -0
  55. package/dist/test/resources/transactionData/exportInP.d.ts +69 -0
  56. package/dist/test/resources/transactionData/exportInP.d.ts.map +1 -0
  57. package/dist/test/resources/transactionData/exportInP.js +140 -0
  58. package/dist/test/resources/transactionData/importInC.d.ts +27 -0
  59. package/dist/test/resources/transactionData/importInC.d.ts.map +1 -0
  60. package/dist/test/resources/transactionData/importInC.js +44 -0
  61. package/dist/test/resources/transactionData/importInP.d.ts +35 -0
  62. package/dist/test/resources/transactionData/importInP.d.ts.map +1 -0
  63. package/dist/test/resources/transactionData/importInP.js +58 -0
  64. package/dist/test/unit/flrp.js +490 -20
  65. package/dist/test/unit/lib/exportInCTxBuilder.d.ts +2 -0
  66. package/dist/test/unit/lib/exportInCTxBuilder.d.ts.map +1 -0
  67. package/dist/test/unit/lib/exportInCTxBuilder.js +166 -0
  68. package/dist/test/unit/lib/exportInPTxBuilder.d.ts +2 -0
  69. package/dist/test/unit/lib/exportInPTxBuilder.d.ts.map +1 -0
  70. package/dist/test/unit/lib/exportInPTxBuilder.js +121 -0
  71. package/dist/test/unit/lib/importInCTxBuilder.d.ts +2 -0
  72. package/dist/test/unit/lib/importInCTxBuilder.d.ts.map +1 -0
  73. package/dist/test/unit/lib/importInCTxBuilder.js +47 -0
  74. package/dist/test/unit/lib/importInPTxBuilder.d.ts +2 -0
  75. package/dist/test/unit/lib/importInPTxBuilder.d.ts.map +1 -0
  76. package/dist/test/unit/lib/importInPTxBuilder.js +73 -0
  77. package/dist/test/unit/lib/keyPair.d.ts +2 -0
  78. package/dist/test/unit/lib/keyPair.d.ts.map +1 -0
  79. package/dist/test/unit/lib/keyPair.js +158 -0
  80. package/dist/test/unit/lib/signFlowTestSuit.d.ts +20 -0
  81. package/dist/test/unit/lib/signFlowTestSuit.d.ts.map +1 -0
  82. package/dist/test/unit/lib/signFlowTestSuit.js +89 -0
  83. package/dist/test/unit/lib/utils.d.ts +2 -0
  84. package/dist/test/unit/lib/utils.d.ts.map +1 -0
  85. package/dist/test/unit/lib/utils.js +453 -0
  86. package/dist/tsconfig.tsbuildinfo +1 -1
  87. package/package.json +16 -11
  88. package/.eslintignore +0 -5
  89. package/.eslintrc.json +0 -7
  90. package/.mocharc.yml +0 -8
  91. package/CHANGELOG.md +0 -0
  92. package/dist/src/iface.d.ts +0 -25
  93. package/dist/src/iface.d.ts.map +0 -1
  94. package/dist/src/iface.js +0 -3
  95. package/dist/src/lib/constants.d.ts +0 -11
  96. package/dist/src/lib/constants.d.ts.map +0 -1
  97. package/dist/src/lib/constants.js +0 -17
  98. package/dist/src/lib/errors.d.ts +0 -8
  99. package/dist/src/lib/errors.d.ts.map +0 -1
  100. package/dist/src/lib/errors.js +0 -19
  101. package/dist/src/lib/exportInCTxBuilder.d.ts +0 -77
  102. package/dist/src/lib/exportInCTxBuilder.d.ts.map +0 -1
  103. package/dist/src/lib/exportInCTxBuilder.js +0 -164
  104. package/dist/src/lib/exportInPTxBuilder.d.ts +0 -30
  105. package/dist/src/lib/exportInPTxBuilder.d.ts.map +0 -1
  106. package/dist/src/lib/exportInPTxBuilder.js +0 -56
  107. package/dist/test/unit/smoke.d.ts +0 -2
  108. package/dist/test/unit/smoke.d.ts.map +0 -1
  109. package/dist/test/unit/smoke.js +0 -9
@@ -0,0 +1,373 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.Transaction = void 0;
7
+ const sdk_core_1 = require("@bitgo-beta/sdk-core");
8
+ const flarejs_1 = require("@flarenetwork/flarejs");
9
+ const buffer_1 = require("buffer");
10
+ const crypto_1 = require("crypto");
11
+ const iface_1 = require("./iface");
12
+ const utils_1 = __importDefault(require("./utils"));
13
+ /**
14
+ * Checks if a signature is empty (first 90 hex chars are zeros)
15
+ * @param signature
16
+ * @returns {boolean}
17
+ */
18
+ function isEmptySignature(signature) {
19
+ return !!signature && utils_1.default.removeHexPrefix(signature).startsWith(''.padStart(90, '0'));
20
+ }
21
+ /**
22
+ * Checks if an empty signature has an embedded address (non-zero bytes after position 90)
23
+ * @param signature Hex string of the signature
24
+ */
25
+ function hasEmbeddedAddress(signature) {
26
+ if (!isEmptySignature(signature))
27
+ return false;
28
+ const cleanSig = utils_1.default.removeHexPrefix(signature);
29
+ if (cleanSig.length < 130)
30
+ return false;
31
+ const embeddedPart = cleanSig.substring(90, 130);
32
+ // Check if it's not all zeros
33
+ return embeddedPart !== '0'.repeat(40);
34
+ }
35
+ /**
36
+ * Generates a function to check if a signature slot matches a given address.
37
+ * If signatures have embedded addresses, it matches by address.
38
+ * Otherwise, it just finds empty slots.
39
+ * @param signatures Array of signature hex strings
40
+ */
41
+ function generateSelectorSignature(signatures) {
42
+ // Check if any empty signature has an embedded address
43
+ const hasEmbeddedAddresses = signatures.some((sig) => isEmptySignature(sig) && hasEmbeddedAddress(sig));
44
+ if (hasEmbeddedAddresses) {
45
+ // Look for address embedded in the empty signature (after position 90)
46
+ return function (sig, address) {
47
+ try {
48
+ if (!isEmptySignature(sig)) {
49
+ return false;
50
+ }
51
+ const cleanSig = utils_1.default.removeHexPrefix(sig);
52
+ const embeddedAddr = cleanSig.substring(90, 130).toLowerCase();
53
+ return embeddedAddr === address.toLowerCase();
54
+ }
55
+ catch (e) {
56
+ return false;
57
+ }
58
+ };
59
+ }
60
+ else {
61
+ // Look for any empty slot (no embedded addresses)
62
+ return function (sig, address) {
63
+ return isEmptySignature(sig);
64
+ };
65
+ }
66
+ }
67
+ class Transaction extends sdk_core_1.BaseTransaction {
68
+ constructor(coinConfig) {
69
+ super(coinConfig);
70
+ this._threshold = 2;
71
+ this._locktime = BigInt(0);
72
+ this._fromAddresses = [];
73
+ this._to = [];
74
+ this._rewardAddresses = [];
75
+ this._utxos = []; // Define proper type based on Flare's UTXO structure
76
+ this._fee = {};
77
+ this._network = coinConfig.network;
78
+ // Decode cb58-encoded asset ID to hex for use in transaction serialization
79
+ this._assetId = utils_1.default.cb58Decode(this._network.assetId).toString('hex');
80
+ this._blockchainID = this._network.blockchainID;
81
+ this._networkID = this._network.networkID;
82
+ }
83
+ get signature() {
84
+ if (!this.hasCredentials) {
85
+ return [];
86
+ }
87
+ return this.credentials[0].getSignatures().filter((s) => !isEmptySignature(s));
88
+ }
89
+ get credentials() {
90
+ return this._flareTransaction?.credentials;
91
+ }
92
+ get hasCredentials() {
93
+ return this.credentials !== undefined && this.credentials.length > 0;
94
+ }
95
+ /** @inheritdoc */
96
+ canSign({ key }) {
97
+ return true;
98
+ }
99
+ async sign(keyPair) {
100
+ const prv = keyPair.getPrivateKey();
101
+ if (!prv) {
102
+ throw new sdk_core_1.SigningError('Missing private key');
103
+ }
104
+ if (!this._flareTransaction) {
105
+ throw new sdk_core_1.InvalidTransactionError('empty transaction to sign');
106
+ }
107
+ if (!this.hasCredentials) {
108
+ throw new sdk_core_1.InvalidTransactionError('empty credentials to sign');
109
+ }
110
+ const unsignedTx = this._flareTransaction;
111
+ const unsignedBytes = unsignedTx.toBytes();
112
+ const publicKey = flarejs_1.secp256k1.getPublicKey(prv);
113
+ // Derive both EVM and P-chain addresses from the public key
114
+ const evmAddressHex = new flarejs_1.Address(flarejs_1.secp256k1.publicKeyToEthAddress(publicKey)).toHex();
115
+ // P-chain address derivation: ripemd160(sha256(publicKey))
116
+ const sha256Hash = (0, crypto_1.createHash)('sha256').update(buffer_1.Buffer.from(publicKey)).digest();
117
+ const pChainAddressBuffer = (0, crypto_1.createHash)('ripemd160').update(sha256Hash).digest();
118
+ const pChainAddressHex = pChainAddressBuffer.toString('hex');
119
+ const addressMap = unsignedTx.getAddresses();
120
+ // Check for both EVM and P-chain address formats
121
+ const hasMatchingAddress = addressMap.some((addr) => {
122
+ const addrHex = buffer_1.Buffer.from(addr).toString('hex').toLowerCase();
123
+ return (addrHex === utils_1.default.removeHexPrefix(evmAddressHex).toLowerCase() || addrHex === pChainAddressHex.toLowerCase());
124
+ });
125
+ const signature = await flarejs_1.secp256k1.sign(unsignedBytes, prv);
126
+ let signatureSet = false;
127
+ if (hasMatchingAddress) {
128
+ // Use address-based slot matching (like AVAX-P)
129
+ let checkSign = undefined;
130
+ for (const credential of unsignedTx.credentials) {
131
+ const signatures = credential.getSignatures();
132
+ if (checkSign === undefined) {
133
+ checkSign = generateSelectorSignature(signatures);
134
+ }
135
+ // Find the slot that matches this address
136
+ for (let i = 0; i < signatures.length; i++) {
137
+ const sig = signatures[i];
138
+ // Try matching with P-chain address first, then EVM address
139
+ if (checkSign(sig, pChainAddressHex) || checkSign(sig, utils_1.default.removeHexPrefix(evmAddressHex).toLowerCase())) {
140
+ credential.setSignature(i, signature);
141
+ signatureSet = true;
142
+ // Clear raw signed bytes since we've modified the transaction
143
+ this._rawSignedBytes = undefined;
144
+ break;
145
+ }
146
+ }
147
+ if (signatureSet)
148
+ break;
149
+ }
150
+ }
151
+ // Fallback: If address-based matching didn't work (e.g., ImportInC loaded from unsigned tx
152
+ // where P-chain addresses aren't in addressMaps), try to sign the first empty slot.
153
+ // This handles the case where we have empty credentials but signer address isn't in the map.
154
+ if (!signatureSet) {
155
+ for (const credential of unsignedTx.credentials) {
156
+ const signatures = credential.getSignatures();
157
+ for (let i = 0; i < signatures.length; i++) {
158
+ if (isEmptySignature(signatures[i])) {
159
+ credential.setSignature(i, signature);
160
+ signatureSet = true;
161
+ this._rawSignedBytes = undefined;
162
+ break;
163
+ }
164
+ }
165
+ if (signatureSet)
166
+ break;
167
+ }
168
+ }
169
+ if (!signatureSet) {
170
+ throw new sdk_core_1.SigningError('No matching signature slot found for this private key');
171
+ }
172
+ }
173
+ toBroadcastFormat() {
174
+ if (!this._flareTransaction) {
175
+ throw new sdk_core_1.InvalidTransactionError('Empty transaction data');
176
+ }
177
+ // If we have the original raw signed bytes, use them directly to preserve exact format
178
+ if (this._rawSignedBytes) {
179
+ return flarejs_1.utils.bufferToHex(this._rawSignedBytes);
180
+ }
181
+ const unsignedTx = this._flareTransaction;
182
+ // For signed transactions, return the full signed tx with credentials
183
+ // Check signature.length for robustness
184
+ if (this.signature.length > 0) {
185
+ return flarejs_1.utils.bufferToHex(unsignedTx.getSignedTx().toBytes());
186
+ }
187
+ // For unsigned transactions, return just the transaction bytes
188
+ return flarejs_1.utils.bufferToHex(unsignedTx.toBytes());
189
+ }
190
+ toJson() {
191
+ if (!this._flareTransaction) {
192
+ throw new sdk_core_1.InvalidTransactionError('Empty transaction data');
193
+ }
194
+ return {
195
+ id: this.id,
196
+ inputs: this.inputs,
197
+ fromAddresses: this.fromAddresses,
198
+ threshold: this._threshold,
199
+ locktime: this._locktime.toString(),
200
+ type: this.type,
201
+ signatures: this.signature,
202
+ outputs: this.outputs,
203
+ changeOutputs: this.changeOutputs,
204
+ };
205
+ }
206
+ setTransaction(tx) {
207
+ this._flareTransaction = tx;
208
+ }
209
+ setTransactionType(transactionType) {
210
+ if (![sdk_core_1.TransactionType.AddPermissionlessValidator].includes(transactionType)) {
211
+ throw new Error(`Transaction type ${transactionType} is not supported`);
212
+ }
213
+ this._type = transactionType;
214
+ }
215
+ get signablePayload() {
216
+ return utils_1.default.sha256(this._flareTransaction.toBytes());
217
+ }
218
+ get id() {
219
+ const bufferArray = utils_1.default.sha256(this._flareTransaction.toBytes());
220
+ return utils_1.default.cb58Encode(buffer_1.Buffer.from(bufferArray));
221
+ }
222
+ get fromAddresses() {
223
+ return this._fromAddresses.map((a) => flarejs_1.utils.format(this._network.alias, this._network.hrp, a));
224
+ }
225
+ get rewardAddresses() {
226
+ return this._rewardAddresses.map((a) => flarejs_1.utils.format(this._network.alias, this._network.hrp, a));
227
+ }
228
+ get fee() {
229
+ return { fee: '0', ...this._fee };
230
+ }
231
+ /**
232
+ * Check if this transaction is for C-chain (EVM transactions)
233
+ */
234
+ get isTransactionForCChain() {
235
+ const tx = this._flareTransaction.getTx();
236
+ const txType = tx._type;
237
+ return txType === iface_1.FlareTransactionType.EvmExportTx || txType === iface_1.FlareTransactionType.EvmImportTx;
238
+ }
239
+ get outputs() {
240
+ const tx = this._flareTransaction.getTx();
241
+ switch (this.type) {
242
+ case sdk_core_1.TransactionType.Import:
243
+ if (this.isTransactionForCChain) {
244
+ // C-chain Import: output is to a C-chain address
245
+ const importTx = tx;
246
+ return importTx.Outs.map((out) => ({
247
+ address: '0x' + buffer_1.Buffer.from(out.address.toBytes()).toString('hex'),
248
+ value: out.amount.value().toString(),
249
+ }));
250
+ }
251
+ else {
252
+ // P-chain Import: outputs are the baseTx.outputs (destination on P-chain)
253
+ const pvmImportTx = tx;
254
+ return pvmImportTx.baseTx.outputs.map(utils_1.default.mapOutputToEntry(this._network));
255
+ }
256
+ case sdk_core_1.TransactionType.Export:
257
+ if (this.isTransactionForCChain) {
258
+ // C-chain Export: exported outputs go to P-chain
259
+ const exportTx = tx;
260
+ return exportTx.exportedOutputs.map(utils_1.default.mapOutputToEntry(this._network));
261
+ }
262
+ else {
263
+ // P-chain Export: exported outputs go to C-chain
264
+ const pvmExportTx = tx;
265
+ return pvmExportTx.outs.map(utils_1.default.mapOutputToEntry(this._network));
266
+ }
267
+ case sdk_core_1.TransactionType.AddPermissionlessValidator:
268
+ return [
269
+ {
270
+ address: tx.subnetValidator.validator.nodeId.toString(),
271
+ value: tx.subnetValidator.validator.weight.toJSON(),
272
+ },
273
+ ];
274
+ default:
275
+ return [];
276
+ }
277
+ }
278
+ get changeOutputs() {
279
+ const tx = this._flareTransaction.getTx();
280
+ // C-chain transactions and Import transactions don't have change outputs
281
+ if (this.isTransactionForCChain || this.type === sdk_core_1.TransactionType.Import) {
282
+ return [];
283
+ }
284
+ switch (this.type) {
285
+ case sdk_core_1.TransactionType.Export:
286
+ // P-chain Export: change outputs are in baseTx.outputs
287
+ return tx.baseTx.outputs.map(utils_1.default.mapOutputToEntry(this._network));
288
+ case sdk_core_1.TransactionType.AddPermissionlessValidator:
289
+ return tx.baseTx.outputs.map(utils_1.default.mapOutputToEntry(this._network));
290
+ default:
291
+ return [];
292
+ }
293
+ }
294
+ get inputs() {
295
+ const tx = this._flareTransaction.getTx();
296
+ switch (this.type) {
297
+ case sdk_core_1.TransactionType.Import:
298
+ if (this.isTransactionForCChain) {
299
+ // C-chain Import: inputs come from P-chain (importedInputs)
300
+ const importTx = tx;
301
+ return importTx.importedInputs.map((input) => ({
302
+ id: utils_1.default.cb58Encode(buffer_1.Buffer.from(input.utxoID.txID.toBytes())) + ':' + input.utxoID.outputIdx.value(),
303
+ address: this.fromAddresses.sort().join(iface_1.ADDRESS_SEPARATOR),
304
+ value: input.amount().toString(),
305
+ }));
306
+ }
307
+ else {
308
+ // P-chain Import: inputs are ins (imported from C-chain)
309
+ const pvmImportTx = tx;
310
+ return pvmImportTx.ins.map((input) => ({
311
+ id: utils_1.default.cb58Encode(buffer_1.Buffer.from(input.utxoID.txID.toBytes())) + ':' + input.utxoID.outputIdx.value(),
312
+ address: this.fromAddresses.sort().join(iface_1.ADDRESS_SEPARATOR),
313
+ value: input.amount().toString(),
314
+ }));
315
+ }
316
+ case sdk_core_1.TransactionType.Export:
317
+ if (this.isTransactionForCChain) {
318
+ // C-chain Export: inputs are from C-chain (EVM inputs)
319
+ const exportTx = tx;
320
+ return exportTx.ins.map((evmInput) => ({
321
+ address: '0x' + buffer_1.Buffer.from(evmInput.address.toBytes()).toString('hex'),
322
+ value: evmInput.amount.value().toString(),
323
+ nonce: Number(evmInput.nonce.value()),
324
+ }));
325
+ }
326
+ else {
327
+ // P-chain Export: inputs are from baseTx.inputs
328
+ const pvmExportTx = tx;
329
+ return pvmExportTx.baseTx.inputs.map((input) => ({
330
+ id: utils_1.default.cb58Encode(buffer_1.Buffer.from(input.utxoID.txID.toBytes())) + ':' + input.utxoID.outputIdx.value(),
331
+ address: this.fromAddresses.sort().join(iface_1.ADDRESS_SEPARATOR),
332
+ value: input.amount().toString(),
333
+ }));
334
+ }
335
+ case sdk_core_1.TransactionType.AddPermissionlessValidator:
336
+ default:
337
+ const baseTx = tx;
338
+ if (baseTx.baseTx?.inputs) {
339
+ return baseTx.baseTx.inputs.map((input) => ({
340
+ id: utils_1.default.cb58Encode(buffer_1.Buffer.from(input.utxoID.txID.toBytes())) + ':' + input.utxoID.outputIdx.value(),
341
+ address: this.fromAddresses.sort().join(iface_1.ADDRESS_SEPARATOR),
342
+ value: input.amount().toString(),
343
+ }));
344
+ }
345
+ return [];
346
+ }
347
+ }
348
+ explainTransaction() {
349
+ const txJson = this.toJson();
350
+ const displayOrder = ['id', 'inputs', 'outputAmount', 'changeAmount', 'outputs', 'changeOutputs', 'fee', 'type'];
351
+ const outputAmount = txJson.outputs.reduce((p, n) => p + BigInt(n.value), BigInt(0)).toString();
352
+ const changeAmount = txJson.changeOutputs.reduce((p, n) => p + BigInt(n.value), BigInt(0)).toString();
353
+ let rewardAddresses;
354
+ if ([sdk_core_1.TransactionType.AddPermissionlessValidator].includes(txJson.type)) {
355
+ rewardAddresses = this.rewardAddresses;
356
+ displayOrder.splice(6, 0, 'rewardAddresses');
357
+ }
358
+ return {
359
+ displayOrder,
360
+ id: txJson.id,
361
+ inputs: txJson.inputs,
362
+ outputs: txJson.outputs.map((o) => ({ address: o.address, amount: o.value })),
363
+ outputAmount,
364
+ changeOutputs: txJson.changeOutputs.map((o) => ({ address: o.address, amount: o.value })),
365
+ changeAmount,
366
+ rewardAddresses,
367
+ fee: this.fee,
368
+ type: txJson.type,
369
+ };
370
+ }
371
+ }
372
+ exports.Transaction = Transaction;
373
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3RyYW5zYWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUNBLG1EQVE4QjtBQUM5QixtREFTK0I7QUFDL0IsbUNBQWdDO0FBQ2hDLG1DQUFvQztBQUNwQyxtQ0FBc0g7QUFFdEgsb0RBQTRCO0FBRTVCOzs7O0dBSUc7QUFDSCxTQUFTLGdCQUFnQixDQUFDLFNBQWlCO0lBQ3pDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsSUFBSSxlQUFLLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzFGLENBQUM7QUFTRDs7O0dBR0c7QUFDSCxTQUFTLGtCQUFrQixDQUFDLFNBQWlCO0lBQzNDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUM7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUMvQyxNQUFNLFFBQVEsR0FBRyxlQUFLLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ2xELElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxHQUFHO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDeEMsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDakQsOEJBQThCO0lBQzlCLE9BQU8sWUFBWSxLQUFLLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDekMsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBUyx5QkFBeUIsQ0FBQyxVQUFvQjtJQUNyRCx1REFBdUQ7SUFDdkQsTUFBTSxvQkFBb0IsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBRXhHLElBQUksb0JBQW9CLEVBQUUsQ0FBQztRQUN6Qix1RUFBdUU7UUFDdkUsT0FBTyxVQUFVLEdBQVcsRUFBRSxPQUFlO1lBQzNDLElBQUksQ0FBQztnQkFDSCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDM0IsT0FBTyxLQUFLLENBQUM7Z0JBQ2YsQ0FBQztnQkFDRCxNQUFNLFFBQVEsR0FBRyxlQUFLLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUM1QyxNQUFNLFlBQVksR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDL0QsT0FBTyxZQUFZLEtBQUssT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ2hELENBQUM7WUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO2dCQUNYLE9BQU8sS0FBSyxDQUFDO1lBQ2YsQ0FBQztRQUNILENBQUMsQ0FBQztJQUNKLENBQUM7U0FBTSxDQUFDO1FBQ04sa0RBQWtEO1FBQ2xELE9BQU8sVUFBVSxHQUFXLEVBQUUsT0FBZTtZQUMzQyxPQUFPLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQy9CLENBQUMsQ0FBQztJQUNKLENBQUM7QUFDSCxDQUFDO0FBRUQsTUFBYSxXQUFZLFNBQVEsMEJBQWU7SUFxQjlDLFlBQVksVUFBZ0M7UUFDMUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBWGIsZUFBVSxHQUFHLENBQUMsQ0FBQztRQUNmLGNBQVMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEIsbUJBQWMsR0FBaUIsRUFBRSxDQUFDO1FBQ2xDLFFBQUcsR0FBaUIsRUFBRSxDQUFDO1FBQ3ZCLHFCQUFnQixHQUFpQixFQUFFLENBQUM7UUFDcEMsV0FBTSxHQUFxQixFQUFFLENBQUMsQ0FBQyxxREFBcUQ7UUFDcEYsU0FBSSxHQUE0QixFQUFFLENBQUM7UUFNeEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxVQUFVLENBQUMsT0FBdUIsQ0FBQztRQUNuRCwyRUFBMkU7UUFDM0UsSUFBSSxDQUFDLFFBQVEsR0FBRyxlQUFLLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3hFLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUM7UUFDaEQsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQztJQUM1QyxDQUFDO0lBRUQsSUFBSSxTQUFTO1FBQ1gsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN6QixPQUFPLEVBQUUsQ0FBQztRQUNaLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDakYsQ0FBQztJQUVELElBQUksV0FBVztRQUNiLE9BQVEsSUFBSSxDQUFDLGlCQUFnQyxFQUFFLFdBQVcsQ0FBQztJQUM3RCxDQUFDO0lBRUQsSUFBSSxjQUFjO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLFdBQVcsS0FBSyxTQUFTLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7SUFFRCxrQkFBa0I7SUFDbEIsT0FBTyxDQUFDLEVBQUUsR0FBRyxFQUFXO1FBQ3RCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBZ0I7UUFDekIsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLGFBQWEsRUFBZ0IsQ0FBQztRQUNsRCxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDVCxNQUFNLElBQUksdUJBQVksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQ2hELENBQUM7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDNUIsTUFBTSxJQUFJLGtDQUF1QixDQUFDLDJCQUEyQixDQUFDLENBQUM7UUFDakUsQ0FBQztRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDekIsTUFBTSxJQUFJLGtDQUF1QixDQUFDLDJCQUEyQixDQUFDLENBQUM7UUFDakUsQ0FBQztRQUVELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxpQkFBa0MsQ0FBQztRQUMzRCxNQUFNLGFBQWEsR0FBRyxVQUFVLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDM0MsTUFBTSxTQUFTLEdBQUcsbUJBQVMsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFOUMsNERBQTREO1FBQzVELE1BQU0sYUFBYSxHQUFHLElBQUksaUJBQU8sQ0FBQyxtQkFBUyxDQUFDLHFCQUFxQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7UUFFdEYsMkRBQTJEO1FBQzNELE1BQU0sVUFBVSxHQUFHLElBQUEsbUJBQVUsRUFBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsZUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2hGLE1BQU0sbUJBQW1CLEdBQUcsSUFBQSxtQkFBVSxFQUFDLFdBQVcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNoRixNQUFNLGdCQUFnQixHQUFHLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUU3RCxNQUFNLFVBQVUsR0FBRyxVQUFVLENBQUMsWUFBWSxFQUFFLENBQUM7UUFFN0MsaURBQWlEO1FBQ2pELE1BQU0sa0JBQWtCLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQ2xELE1BQU0sT0FBTyxHQUFHLGVBQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ2hFLE9BQU8sQ0FDTCxPQUFPLEtBQUssZUFBSyxDQUFDLGVBQWUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxXQUFXLEVBQUUsSUFBSSxPQUFPLEtBQUssZ0JBQWdCLENBQUMsV0FBVyxFQUFFLENBQzdHLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztRQUVILE1BQU0sU0FBUyxHQUFHLE1BQU0sbUJBQVMsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzNELElBQUksWUFBWSxHQUFHLEtBQUssQ0FBQztRQUV6QixJQUFJLGtCQUFrQixFQUFFLENBQUM7WUFDdkIsZ0RBQWdEO1lBQ2hELElBQUksU0FBUyxHQUErQixTQUFTLENBQUM7WUFFdEQsS0FBSyxNQUFNLFVBQVUsSUFBSSxVQUFVLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ2hELE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxhQUFhLEVBQUUsQ0FBQztnQkFDOUMsSUFBSSxTQUFTLEtBQUssU0FBUyxFQUFFLENBQUM7b0JBQzVCLFNBQVMsR0FBRyx5QkFBeUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDcEQsQ0FBQztnQkFFRCwwQ0FBMEM7Z0JBQzFDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7b0JBQzNDLE1BQU0sR0FBRyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDMUIsNERBQTREO29CQUM1RCxJQUFJLFNBQVMsQ0FBQyxHQUFHLEVBQUUsZ0JBQWdCLENBQUMsSUFBSSxTQUFTLENBQUMsR0FBRyxFQUFFLGVBQUssQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsRUFBRSxDQUFDO3dCQUMzRyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQzt3QkFDdEMsWUFBWSxHQUFHLElBQUksQ0FBQzt3QkFDcEIsOERBQThEO3dCQUM5RCxJQUFJLENBQUMsZUFBZSxHQUFHLFNBQVMsQ0FBQzt3QkFDakMsTUFBTTtvQkFDUixDQUFDO2dCQUNILENBQUM7Z0JBRUQsSUFBSSxZQUFZO29CQUFFLE1BQU07WUFDMUIsQ0FBQztRQUNILENBQUM7UUFFRCwyRkFBMkY7UUFDM0Ysb0ZBQW9GO1FBQ3BGLDZGQUE2RjtRQUM3RixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDbEIsS0FBSyxNQUFNLFVBQVUsSUFBSSxVQUFVLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ2hELE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxhQUFhLEVBQUUsQ0FBQztnQkFDOUMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztvQkFDM0MsSUFBSSxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO3dCQUNwQyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQzt3QkFDdEMsWUFBWSxHQUFHLElBQUksQ0FBQzt3QkFDcEIsSUFBSSxDQUFDLGVBQWUsR0FBRyxTQUFTLENBQUM7d0JBQ2pDLE1BQU07b0JBQ1IsQ0FBQztnQkFDSCxDQUFDO2dCQUNELElBQUksWUFBWTtvQkFBRSxNQUFNO1lBQzFCLENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ2xCLE1BQU0sSUFBSSx1QkFBWSxDQUFDLHVEQUF1RCxDQUFDLENBQUM7UUFDbEYsQ0FBQztJQUNILENBQUM7SUFFRCxpQkFBaUI7UUFDZixJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDNUIsTUFBTSxJQUFJLGtDQUF1QixDQUFDLHdCQUF3QixDQUFDLENBQUM7UUFDOUQsQ0FBQztRQUNELHVGQUF1RjtRQUN2RixJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUN6QixPQUFPLGVBQVUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ3RELENBQUM7UUFDRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsaUJBQStCLENBQUM7UUFDeEQsc0VBQXNFO1FBQ3RFLHdDQUF3QztRQUN4QyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzlCLE9BQU8sZUFBVSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUNwRSxDQUFDO1FBQ0QsK0RBQStEO1FBQy9ELE9BQU8sZUFBVSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBRUQsTUFBTTtRQUNKLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUM1QixNQUFNLElBQUksa0NBQXVCLENBQUMsd0JBQXdCLENBQUMsQ0FBQztRQUM5RCxDQUFDO1FBQ0QsT0FBTztZQUNMLEVBQUUsRUFBRSxJQUFJLENBQUMsRUFBRTtZQUNYLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtZQUNuQixhQUFhLEVBQUUsSUFBSSxDQUFDLGFBQWE7WUFDakMsU0FBUyxFQUFFLElBQUksQ0FBQyxVQUFVO1lBQzFCLFFBQVEsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRTtZQUNuQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7WUFDZixVQUFVLEVBQUUsSUFBSSxDQUFDLFNBQVM7WUFDMUIsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO1lBQ3JCLGFBQWEsRUFBRSxJQUFJLENBQUMsYUFBYTtTQUNsQyxDQUFDO0lBQ0osQ0FBQztJQUVELGNBQWMsQ0FBQyxFQUFNO1FBQ25CLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxFQUFnQixDQUFDO0lBQzVDLENBQUM7SUFFRCxrQkFBa0IsQ0FBQyxlQUFnQztRQUNqRCxJQUFJLENBQUMsQ0FBQywwQkFBZSxDQUFDLDBCQUEwQixDQUFDLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUM7WUFDNUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxvQkFBb0IsZUFBZSxtQkFBbUIsQ0FBQyxDQUFDO1FBQzFFLENBQUM7UUFDRCxJQUFJLENBQUMsS0FBSyxHQUFHLGVBQWUsQ0FBQztJQUMvQixDQUFDO0lBRUQsSUFBSSxlQUFlO1FBQ2pCLE9BQU8sZUFBSyxDQUFDLE1BQU0sQ0FBRSxJQUFJLENBQUMsaUJBQWdDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUN4RSxDQUFDO0lBRUQsSUFBSSxFQUFFO1FBQ0osTUFBTSxXQUFXLEdBQUcsZUFBSyxDQUFDLE1BQU0sQ0FBRSxJQUFJLENBQUMsaUJBQWdDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUNuRixPQUFPLGVBQUssQ0FBQyxVQUFVLENBQUMsZUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRCxJQUFJLGFBQWE7UUFDZixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxlQUFVLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdEcsQ0FBQztJQUVELElBQUksZUFBZTtRQUNqQixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLGVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN4RyxDQUFDO0lBRUQsSUFBSSxHQUFHO1FBQ0wsT0FBTyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDcEMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBSSxzQkFBc0I7UUFDeEIsTUFBTSxFQUFFLEdBQUksSUFBSSxDQUFDLGlCQUFnQyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzFELE1BQU0sTUFBTSxHQUFJLEVBQXlCLENBQUMsS0FBSyxDQUFDO1FBQ2hELE9BQU8sTUFBTSxLQUFLLDRCQUFvQixDQUFDLFdBQVcsSUFBSSxNQUFNLEtBQUssNEJBQW9CLENBQUMsV0FBVyxDQUFDO0lBQ3BHLENBQUM7SUFFRCxJQUFJLE9BQU87UUFDVCxNQUFNLEVBQUUsR0FBSSxJQUFJLENBQUMsaUJBQWdDLENBQUMsS0FBSyxFQUFFLENBQUM7UUFFMUQsUUFBUSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDbEIsS0FBSywwQkFBZSxDQUFDLE1BQU07Z0JBQ3pCLElBQUksSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7b0JBQ2hDLGlEQUFpRDtvQkFDakQsTUFBTSxRQUFRLEdBQUcsRUFBd0IsQ0FBQztvQkFDMUMsT0FBTyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQzt3QkFDakMsT0FBTyxFQUFFLElBQUksR0FBRyxlQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO3dCQUNsRSxLQUFLLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxRQUFRLEVBQUU7cUJBQ3JDLENBQUMsQ0FBQyxDQUFDO2dCQUNOLENBQUM7cUJBQU0sQ0FBQztvQkFDTiwwRUFBMEU7b0JBQzFFLE1BQU0sV0FBVyxHQUFHLEVBQXdCLENBQUM7b0JBQzdDLE9BQU8sV0FBVyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGVBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztnQkFDL0UsQ0FBQztZQUVILEtBQUssMEJBQWUsQ0FBQyxNQUFNO2dCQUN6QixJQUFJLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO29CQUNoQyxpREFBaUQ7b0JBQ2pELE1BQU0sUUFBUSxHQUFHLEVBQXdCLENBQUM7b0JBQzFDLE9BQU8sUUFBUSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsZUFBSyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO2dCQUM3RSxDQUFDO3FCQUFNLENBQUM7b0JBQ04saURBQWlEO29CQUNqRCxNQUFNLFdBQVcsR0FBRyxFQUF3QixDQUFDO29CQUM3QyxPQUFPLFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLGVBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztnQkFDckUsQ0FBQztZQUVILEtBQUssMEJBQWUsQ0FBQywwQkFBMEI7Z0JBQzdDLE9BQU87b0JBQ0w7d0JBQ0UsT0FBTyxFQUFHLEVBQTZDLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFO3dCQUNuRyxLQUFLLEVBQUcsRUFBNkMsQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUU7cUJBQ2hHO2lCQUNGLENBQUM7WUFFSjtnQkFDRSxPQUFPLEVBQUUsQ0FBQztRQUNkLENBQUM7SUFDSCxDQUFDO0lBRUQsSUFBSSxhQUFhO1FBQ2YsTUFBTSxFQUFFLEdBQUksSUFBSSxDQUFDLGlCQUFnQyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBRTFELHlFQUF5RTtRQUN6RSxJQUFJLElBQUksQ0FBQyxzQkFBc0IsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLDBCQUFlLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDeEUsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDO1FBRUQsUUFBUSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDbEIsS0FBSywwQkFBZSxDQUFDLE1BQU07Z0JBQ3pCLHVEQUF1RDtnQkFDdkQsT0FBUSxFQUF5QixDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGVBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUU5RixLQUFLLDBCQUFlLENBQUMsMEJBQTBCO2dCQUM3QyxPQUFRLEVBQTZDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBSyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBRWxIO2dCQUNFLE9BQU8sRUFBRSxDQUFDO1FBQ2QsQ0FBQztJQUNILENBQUM7SUFFRCxJQUFJLE1BQU07UUFDUixNQUFNLEVBQUUsR0FBSSxJQUFJLENBQUMsaUJBQWdDLENBQUMsS0FBSyxFQUFFLENBQUM7UUFFMUQsUUFBUSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDbEIsS0FBSywwQkFBZSxDQUFDLE1BQU07Z0JBQ3pCLElBQUksSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7b0JBQ2hDLDREQUE0RDtvQkFDNUQsTUFBTSxRQUFRLEdBQUcsRUFBd0IsQ0FBQztvQkFDMUMsT0FBTyxRQUFRLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQzt3QkFDN0MsRUFBRSxFQUFFLGVBQUssQ0FBQyxVQUFVLENBQUMsZUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRTt3QkFDckcsT0FBTyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLHlCQUFpQixDQUFDO3dCQUMxRCxLQUFLLEVBQUUsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRTtxQkFDakMsQ0FBQyxDQUFDLENBQUM7Z0JBQ04sQ0FBQztxQkFBTSxDQUFDO29CQUNOLHlEQUF5RDtvQkFDekQsTUFBTSxXQUFXLEdBQUcsRUFBd0IsQ0FBQztvQkFDN0MsT0FBTyxXQUFXLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQzt3QkFDckMsRUFBRSxFQUFFLGVBQUssQ0FBQyxVQUFVLENBQUMsZUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRTt3QkFDckcsT0FBTyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLHlCQUFpQixDQUFDO3dCQUMxRCxLQUFLLEVBQUUsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRTtxQkFDakMsQ0FBQyxDQUFDLENBQUM7Z0JBQ04sQ0FBQztZQUVILEtBQUssMEJBQWUsQ0FBQyxNQUFNO2dCQUN6QixJQUFJLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO29CQUNoQyx1REFBdUQ7b0JBQ3ZELE1BQU0sUUFBUSxHQUFHLEVBQXdCLENBQUM7b0JBQzFDLE9BQU8sUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUM7d0JBQ3JDLE9BQU8sRUFBRSxJQUFJLEdBQUcsZUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQzt3QkFDdkUsS0FBSyxFQUFFLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsUUFBUSxFQUFFO3dCQUN6QyxLQUFLLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7cUJBQ3RDLENBQUMsQ0FBQyxDQUFDO2dCQUNOLENBQUM7cUJBQU0sQ0FBQztvQkFDTixnREFBZ0Q7b0JBQ2hELE1BQU0sV0FBVyxHQUFHLEVBQXdCLENBQUM7b0JBQzdDLE9BQU8sV0FBVyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO3dCQUMvQyxFQUFFLEVBQUUsZUFBSyxDQUFDLFVBQVUsQ0FBQyxlQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFO3dCQUNyRyxPQUFPLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMseUJBQWlCLENBQUM7d0JBQzFELEtBQUssRUFBRSxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFO3FCQUNqQyxDQUFDLENBQUMsQ0FBQztnQkFDTixDQUFDO1lBRUgsS0FBSywwQkFBZSxDQUFDLDBCQUEwQixDQUFDO1lBQ2hEO2dCQUNFLE1BQU0sTUFBTSxHQUFHLEVBQTRDLENBQUM7Z0JBQzVELElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsQ0FBQztvQkFDMUIsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7d0JBQzFDLEVBQUUsRUFBRSxlQUFLLENBQUMsVUFBVSxDQUFDLGVBQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUU7d0JBQ3JHLE9BQU8sRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyx5QkFBaUIsQ0FBQzt3QkFDMUQsS0FBSyxFQUFFLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUU7cUJBQ2pDLENBQUMsQ0FBQyxDQUFDO2dCQUNOLENBQUM7Z0JBQ0QsT0FBTyxFQUFFLENBQUM7UUFDZCxDQUFDO0lBQ0gsQ0FBQztJQUVELGtCQUFrQjtRQUNoQixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDN0IsTUFBTSxZQUFZLEdBQUcsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFFakgsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNoRyxNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBRXRHLElBQUksZUFBZSxDQUFDO1FBQ3BCLElBQUksQ0FBQywwQkFBZSxDQUFDLDBCQUEwQixDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3ZFLGVBQWUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDO1lBQ3ZDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1FBQy9DLENBQUM7UUFFRCxPQUFPO1lBQ0wsWUFBWTtZQUNaLEVBQUUsRUFBRSxNQUFNLENBQUMsRUFBRTtZQUNiLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTTtZQUNyQixPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDN0UsWUFBWTtZQUNaLGFBQWEsRUFBRSxNQUFNLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUN6RixZQUFZO1lBQ1osZUFBZTtZQUNmLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRztZQUNiLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSTtTQUNsQixDQUFDO0lBQ0osQ0FBQztDQUNGO0FBdFdELGtDQXNXQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEZsYXJlTmV0d29yaywgQmFzZUNvaW4gYXMgQ29pbkNvbmZpZyB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuaW1wb3J0IHtcbiAgQmFzZUtleSxcbiAgQmFzZVRyYW5zYWN0aW9uLFxuICBFbnRyeSxcbiAgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IsXG4gIFNpZ25pbmdFcnJvcixcbiAgVHJhbnNhY3Rpb25UeXBlLFxuICBUcmFuc2FjdGlvbkZlZSxcbn0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHtcbiAgdXRpbHMgYXMgRmxhcmVVdGlscyxcbiAgQ3JlZGVudGlhbCxcbiAgcHZtU2VyaWFsLFxuICBldm1TZXJpYWwsXG4gIFVuc2lnbmVkVHgsXG4gIHNlY3AyNTZrMSxcbiAgRVZNVW5zaWduZWRUeCxcbiAgQWRkcmVzcyxcbn0gZnJvbSAnQGZsYXJlbmV0d29yay9mbGFyZWpzJztcbmltcG9ydCB7IEJ1ZmZlciB9IGZyb20gJ2J1ZmZlcic7XG5pbXBvcnQgeyBjcmVhdGVIYXNoIH0gZnJvbSAnY3J5cHRvJztcbmltcG9ydCB7IERlY29kZWRVdHhvT2JqLCBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uLCBUeCwgVHhEYXRhLCBBRERSRVNTX1NFUEFSQVRPUiwgRmxhcmVUcmFuc2FjdGlvblR5cGUgfSBmcm9tICcuL2lmYWNlJztcbmltcG9ydCB7IEtleVBhaXIgfSBmcm9tICcuL2tleVBhaXInO1xuaW1wb3J0IHV0aWxzIGZyb20gJy4vdXRpbHMnO1xuXG4vKipcbiAqIENoZWNrcyBpZiBhIHNpZ25hdHVyZSBpcyBlbXB0eSAoZmlyc3QgOTAgaGV4IGNoYXJzIGFyZSB6ZXJvcylcbiAqIEBwYXJhbSBzaWduYXR1cmVcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBpc0VtcHR5U2lnbmF0dXJlKHNpZ25hdHVyZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAhIXNpZ25hdHVyZSAmJiB1dGlscy5yZW1vdmVIZXhQcmVmaXgoc2lnbmF0dXJlKS5zdGFydHNXaXRoKCcnLnBhZFN0YXJ0KDkwLCAnMCcpKTtcbn1cblxuLyoqXG4gKiBJbnRlcmZhY2UgZm9yIHNpZ25hdHVyZSBzbG90IGNoZWNraW5nXG4gKi9cbmludGVyZmFjZSBDaGVja1NpZ25hdHVyZSB7XG4gIChzaWduYXR1cmU6IHN0cmluZywgYWRkcmVzc0hleDogc3RyaW5nKTogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYW4gZW1wdHkgc2lnbmF0dXJlIGhhcyBhbiBlbWJlZGRlZCBhZGRyZXNzIChub24temVybyBieXRlcyBhZnRlciBwb3NpdGlvbiA5MClcbiAqIEBwYXJhbSBzaWduYXR1cmUgSGV4IHN0cmluZyBvZiB0aGUgc2lnbmF0dXJlXG4gKi9cbmZ1bmN0aW9uIGhhc0VtYmVkZGVkQWRkcmVzcyhzaWduYXR1cmU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAoIWlzRW1wdHlTaWduYXR1cmUoc2lnbmF0dXJlKSkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBjbGVhblNpZyA9IHV0aWxzLnJlbW92ZUhleFByZWZpeChzaWduYXR1cmUpO1xuICBpZiAoY2xlYW5TaWcubGVuZ3RoIDwgMTMwKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IGVtYmVkZGVkUGFydCA9IGNsZWFuU2lnLnN1YnN0cmluZyg5MCwgMTMwKTtcbiAgLy8gQ2hlY2sgaWYgaXQncyBub3QgYWxsIHplcm9zXG4gIHJldHVybiBlbWJlZGRlZFBhcnQgIT09ICcwJy5yZXBlYXQoNDApO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlcyBhIGZ1bmN0aW9uIHRvIGNoZWNrIGlmIGEgc2lnbmF0dXJlIHNsb3QgbWF0Y2hlcyBhIGdpdmVuIGFkZHJlc3MuXG4gKiBJZiBzaWduYXR1cmVzIGhhdmUgZW1iZWRkZWQgYWRkcmVzc2VzLCBpdCBtYXRjaGVzIGJ5IGFkZHJlc3MuXG4gKiBPdGhlcndpc2UsIGl0IGp1c3QgZmluZHMgZW1wdHkgc2xvdHMuXG4gKiBAcGFyYW0gc2lnbmF0dXJlcyBBcnJheSBvZiBzaWduYXR1cmUgaGV4IHN0cmluZ3NcbiAqL1xuZnVuY3Rpb24gZ2VuZXJhdGVTZWxlY3RvclNpZ25hdHVyZShzaWduYXR1cmVzOiBzdHJpbmdbXSk6IENoZWNrU2lnbmF0dXJlIHtcbiAgLy8gQ2hlY2sgaWYgYW55IGVtcHR5IHNpZ25hdHVyZSBoYXMgYW4gZW1iZWRkZWQgYWRkcmVzc1xuICBjb25zdCBoYXNFbWJlZGRlZEFkZHJlc3NlcyA9IHNpZ25hdHVyZXMuc29tZSgoc2lnKSA9PiBpc0VtcHR5U2lnbmF0dXJlKHNpZykgJiYgaGFzRW1iZWRkZWRBZGRyZXNzKHNpZykpO1xuXG4gIGlmIChoYXNFbWJlZGRlZEFkZHJlc3Nlcykge1xuICAgIC8vIExvb2sgZm9yIGFkZHJlc3MgZW1iZWRkZWQgaW4gdGhlIGVtcHR5IHNpZ25hdHVyZSAoYWZ0ZXIgcG9zaXRpb24gOTApXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChzaWc6IHN0cmluZywgYWRkcmVzczogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoIWlzRW1wdHlTaWduYXR1cmUoc2lnKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjbGVhblNpZyA9IHV0aWxzLnJlbW92ZUhleFByZWZpeChzaWcpO1xuICAgICAgICBjb25zdCBlbWJlZGRlZEFkZHIgPSBjbGVhblNpZy5zdWJzdHJpbmcoOTAsIDEzMCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgcmV0dXJuIGVtYmVkZGVkQWRkciA9PT0gYWRkcmVzcy50b0xvd2VyQ2FzZSgpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICAvLyBMb29rIGZvciBhbnkgZW1wdHkgc2xvdCAobm8gZW1iZWRkZWQgYWRkcmVzc2VzKVxuICAgIHJldHVybiBmdW5jdGlvbiAoc2lnOiBzdHJpbmcsIGFkZHJlc3M6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIGlzRW1wdHlTaWduYXR1cmUoc2lnKTtcbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBUcmFuc2FjdGlvbiBleHRlbmRzIEJhc2VUcmFuc2FjdGlvbiB7XG4gIHByb3RlY3RlZCBfZmxhcmVUcmFuc2FjdGlvbjogVHg7XG4gIHB1YmxpYyBfdHlwZTogVHJhbnNhY3Rpb25UeXBlO1xuICBwdWJsaWMgX25ldHdvcms6IEZsYXJlTmV0d29yaztcbiAgcHVibGljIF9uZXR3b3JrSUQ6IG51bWJlcjtcbiAgcHVibGljIF9hc3NldElkOiBzdHJpbmc7XG4gIHB1YmxpYyBfYmxvY2tjaGFpbklEOiBzdHJpbmc7XG4gIHB1YmxpYyBfbm9kZUlEOiBzdHJpbmc7XG4gIHB1YmxpYyBfc3RhcnRUaW1lOiBiaWdpbnQ7XG4gIHB1YmxpYyBfZW5kVGltZTogYmlnaW50O1xuICBwdWJsaWMgX3N0YWtlQW1vdW50OiBiaWdpbnQ7XG4gIHB1YmxpYyBfdGhyZXNob2xkID0gMjtcbiAgcHVibGljIF9sb2NrdGltZSA9IEJpZ0ludCgwKTtcbiAgcHVibGljIF9mcm9tQWRkcmVzc2VzOiBVaW50OEFycmF5W10gPSBbXTtcbiAgcHVibGljIF90bzogVWludDhBcnJheVtdID0gW107XG4gIHB1YmxpYyBfcmV3YXJkQWRkcmVzc2VzOiBVaW50OEFycmF5W10gPSBbXTtcbiAgcHVibGljIF91dHhvczogRGVjb2RlZFV0eG9PYmpbXSA9IFtdOyAvLyBEZWZpbmUgcHJvcGVyIHR5cGUgYmFzZWQgb24gRmxhcmUncyBVVFhPIHN0cnVjdHVyZVxuICBwdWJsaWMgX2ZlZTogUGFydGlhbDxUcmFuc2FjdGlvbkZlZT4gPSB7fTtcbiAgLy8gU3RvcmUgb3JpZ2luYWwgcmF3IHNpZ25lZCBieXRlcyB0byBwcmVzZXJ2ZSBleGFjdCBmb3JtYXQgd2hlbiByZS1zZXJpYWxpemluZ1xuICBwdWJsaWMgX3Jhd1NpZ25lZEJ5dGVzOiBCdWZmZXIgfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IoY29pbkNvbmZpZzogUmVhZG9ubHk8Q29pbkNvbmZpZz4pIHtcbiAgICBzdXBlcihjb2luQ29uZmlnKTtcbiAgICB0aGlzLl9uZXR3b3JrID0gY29pbkNvbmZpZy5uZXR3b3JrIGFzIEZsYXJlTmV0d29yaztcbiAgICAvLyBEZWNvZGUgY2I1OC1lbmNvZGVkIGFzc2V0IElEIHRvIGhleCBmb3IgdXNlIGluIHRyYW5zYWN0aW9uIHNlcmlhbGl6YXRpb25cbiAgICB0aGlzLl9hc3NldElkID0gdXRpbHMuY2I1OERlY29kZSh0aGlzLl9uZXR3b3JrLmFzc2V0SWQpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICB0aGlzLl9ibG9ja2NoYWluSUQgPSB0aGlzLl9uZXR3b3JrLmJsb2NrY2hhaW5JRDtcbiAgICB0aGlzLl9uZXR3b3JrSUQgPSB0aGlzLl9uZXR3b3JrLm5ldHdvcmtJRDtcbiAgfVxuXG4gIGdldCBzaWduYXR1cmUoKTogc3RyaW5nW10ge1xuICAgIGlmICghdGhpcy5oYXNDcmVkZW50aWFscykge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jcmVkZW50aWFsc1swXS5nZXRTaWduYXR1cmVzKCkuZmlsdGVyKChzKSA9PiAhaXNFbXB0eVNpZ25hdHVyZShzKSk7XG4gIH1cblxuICBnZXQgY3JlZGVudGlhbHMoKTogQ3JlZGVudGlhbFtdIHtcbiAgICByZXR1cm4gKHRoaXMuX2ZsYXJlVHJhbnNhY3Rpb24gYXMgVW5zaWduZWRUeCk/LmNyZWRlbnRpYWxzO1xuICB9XG5cbiAgZ2V0IGhhc0NyZWRlbnRpYWxzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNyZWRlbnRpYWxzICE9PSB1bmRlZmluZWQgJiYgdGhpcy5jcmVkZW50aWFscy5sZW5ndGggPiAwO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGNhblNpZ24oeyBrZXkgfTogQmFzZUtleSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgYXN5bmMgc2lnbihrZXlQYWlyOiBLZXlQYWlyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcHJ2ID0ga2V5UGFpci5nZXRQcml2YXRlS2V5KCkgYXMgVWludDhBcnJheTtcbiAgICBpZiAoIXBydikge1xuICAgICAgdGhyb3cgbmV3IFNpZ25pbmdFcnJvcignTWlzc2luZyBwcml2YXRlIGtleScpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuX2ZsYXJlVHJhbnNhY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignZW1wdHkgdHJhbnNhY3Rpb24gdG8gc2lnbicpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuaGFzQ3JlZGVudGlhbHMpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignZW1wdHkgY3JlZGVudGlhbHMgdG8gc2lnbicpO1xuICAgIH1cblxuICAgIGNvbnN0IHVuc2lnbmVkVHggPSB0aGlzLl9mbGFyZVRyYW5zYWN0aW9uIGFzIEVWTVVuc2lnbmVkVHg7XG4gICAgY29uc3QgdW5zaWduZWRCeXRlcyA9IHVuc2lnbmVkVHgudG9CeXRlcygpO1xuICAgIGNvbnN0IHB1YmxpY0tleSA9IHNlY3AyNTZrMS5nZXRQdWJsaWNLZXkocHJ2KTtcblxuICAgIC8vIERlcml2ZSBib3RoIEVWTSBhbmQgUC1jaGFpbiBhZGRyZXNzZXMgZnJvbSB0aGUgcHVibGljIGtleVxuICAgIGNvbnN0IGV2bUFkZHJlc3NIZXggPSBuZXcgQWRkcmVzcyhzZWNwMjU2azEucHVibGljS2V5VG9FdGhBZGRyZXNzKHB1YmxpY0tleSkpLnRvSGV4KCk7XG5cbiAgICAvLyBQLWNoYWluIGFkZHJlc3MgZGVyaXZhdGlvbjogcmlwZW1kMTYwKHNoYTI1NihwdWJsaWNLZXkpKVxuICAgIGNvbnN0IHNoYTI1Nkhhc2ggPSBjcmVhdGVIYXNoKCdzaGEyNTYnKS51cGRhdGUoQnVmZmVyLmZyb20ocHVibGljS2V5KSkuZGlnZXN0KCk7XG4gICAgY29uc3QgcENoYWluQWRkcmVzc0J1ZmZlciA9IGNyZWF0ZUhhc2goJ3JpcGVtZDE2MCcpLnVwZGF0ZShzaGEyNTZIYXNoKS5kaWdlc3QoKTtcbiAgICBjb25zdCBwQ2hhaW5BZGRyZXNzSGV4ID0gcENoYWluQWRkcmVzc0J1ZmZlci50b1N0cmluZygnaGV4Jyk7XG5cbiAgICBjb25zdCBhZGRyZXNzTWFwID0gdW5zaWduZWRUeC5nZXRBZGRyZXNzZXMoKTtcblxuICAgIC8vIENoZWNrIGZvciBib3RoIEVWTSBhbmQgUC1jaGFpbiBhZGRyZXNzIGZvcm1hdHNcbiAgICBjb25zdCBoYXNNYXRjaGluZ0FkZHJlc3MgPSBhZGRyZXNzTWFwLnNvbWUoKGFkZHIpID0+IHtcbiAgICAgIGNvbnN0IGFkZHJIZXggPSBCdWZmZXIuZnJvbShhZGRyKS50b1N0cmluZygnaGV4JykudG9Mb3dlckNhc2UoKTtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIGFkZHJIZXggPT09IHV0aWxzLnJlbW92ZUhleFByZWZpeChldm1BZGRyZXNzSGV4KS50b0xvd2VyQ2FzZSgpIHx8IGFkZHJIZXggPT09IHBDaGFpbkFkZHJlc3NIZXgudG9Mb3dlckNhc2UoKVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHNpZ25hdHVyZSA9IGF3YWl0IHNlY3AyNTZrMS5zaWduKHVuc2lnbmVkQnl0ZXMsIHBydik7XG4gICAgbGV0IHNpZ25hdHVyZVNldCA9IGZhbHNlO1xuXG4gICAgaWYgKGhhc01hdGNoaW5nQWRkcmVzcykge1xuICAgICAgLy8gVXNlIGFkZHJlc3MtYmFzZWQgc2xvdCBtYXRjaGluZyAobGlrZSBBVkFYLVApXG4gICAgICBsZXQgY2hlY2tTaWduOiBDaGVja1NpZ25hdHVyZSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICAgICAgZm9yIChjb25zdCBjcmVkZW50aWFsIG9mIHVuc2lnbmVkVHguY3JlZGVudGlhbHMpIHtcbiAgICAgICAgY29uc3Qgc2lnbmF0dXJlcyA9IGNyZWRlbnRpYWwuZ2V0U2lnbmF0dXJlcygpO1xuICAgICAgICBpZiAoY2hlY2tTaWduID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBjaGVja1NpZ24gPSBnZW5lcmF0ZVNlbGVjdG9yU2lnbmF0dXJlKHNpZ25hdHVyZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRmluZCB0aGUgc2xvdCB0aGF0IG1hdGNoZXMgdGhpcyBhZGRyZXNzXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2lnbmF0dXJlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IHNpZyA9IHNpZ25hdHVyZXNbaV07XG4gICAgICAgICAgLy8gVHJ5IG1hdGNoaW5nIHdpdGggUC1jaGFpbiBhZGRyZXNzIGZpcnN0LCB0aGVuIEVWTSBhZGRyZXNzXG4gICAgICAgICAgaWYgKGNoZWNrU2lnbihzaWcsIHBDaGFpbkFkZHJlc3NIZXgpIHx8IGNoZWNrU2lnbihzaWcsIHV0aWxzLnJlbW92ZUhleFByZWZpeChldm1BZGRyZXNzSGV4KS50b0xvd2VyQ2FzZSgpKSkge1xuICAgICAgICAgICAgY3JlZGVudGlhbC5zZXRTaWduYXR1cmUoaSwgc2lnbmF0dXJlKTtcbiAgICAgICAgICAgIHNpZ25hdHVyZVNldCA9IHRydWU7XG4gICAgICAgICAgICAvLyBDbGVhciByYXcgc2lnbmVkIGJ5dGVzIHNpbmNlIHdlJ3ZlIG1vZGlmaWVkIHRoZSB0cmFuc2FjdGlvblxuICAgICAgICAgICAgdGhpcy5fcmF3U2lnbmVkQnl0ZXMgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2lnbmF0dXJlU2V0KSBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBGYWxsYmFjazogSWYgYWRkcmVzcy1iYXNlZCBtYXRjaGluZyBkaWRuJ3Qgd29yayAoZS5nLiwgSW1wb3J0SW5DIGxvYWRlZCBmcm9tIHVuc2lnbmVkIHR4XG4gICAgLy8gd2hlcmUgUC1jaGFpbiBhZGRyZXNzZXMgYXJlbid0IGluIGFkZHJlc3NNYXBzKSwgdHJ5IHRvIHNpZ24gdGhlIGZpcnN0IGVtcHR5IHNsb3QuXG4gICAgLy8gVGhpcyBoYW5kbGVzIHRoZSBjYXNlIHdoZXJlIHdlIGhhdmUgZW1wdHkgY3JlZGVudGlhbHMgYnV0IHNpZ25lciBhZGRyZXNzIGlzbid0IGluIHRoZSBtYXAuXG4gICAgaWYgKCFzaWduYXR1cmVTZXQpIHtcbiAgICAgIGZvciAoY29uc3QgY3JlZGVudGlhbCBvZiB1bnNpZ25lZFR4LmNyZWRlbnRpYWxzKSB7XG4gICAgICAgIGNvbnN0IHNpZ25hdHVyZXMgPSBjcmVkZW50aWFsLmdldFNpZ25hdHVyZXMoKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzaWduYXR1cmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKGlzRW1wdHlTaWduYXR1cmUoc2lnbmF0dXJlc1tpXSkpIHtcbiAgICAgICAgICAgIGNyZWRlbnRpYWwuc2V0U2lnbmF0dXJlKGksIHNpZ25hdHVyZSk7XG4gICAgICAgICAgICBzaWduYXR1cmVTZXQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5fcmF3U2lnbmVkQnl0ZXMgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNpZ25hdHVyZVNldCkgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFzaWduYXR1cmVTZXQpIHtcbiAgICAgIHRocm93IG5ldyBTaWduaW5nRXJyb3IoJ05vIG1hdGNoaW5nIHNpZ25hdHVyZSBzbG90IGZvdW5kIGZvciB0aGlzIHByaXZhdGUga2V5Jyk7XG4gICAgfVxuICB9XG5cbiAgdG9Ccm9hZGNhc3RGb3JtYXQoKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuX2ZsYXJlVHJhbnNhY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignRW1wdHkgdHJhbnNhY3Rpb24gZGF0YScpO1xuICAgIH1cbiAgICAvLyBJZiB3ZSBoYXZlIHRoZSBvcmlnaW5hbCByYXcgc2lnbmVkIGJ5dGVzLCB1c2UgdGhlbSBkaXJlY3RseSB0byBwcmVzZXJ2ZSBleGFjdCBmb3JtYXRcbiAgICBpZiAodGhpcy5fcmF3U2lnbmVkQnl0ZXMpIHtcbiAgICAgIHJldHVybiBGbGFyZVV0aWxzLmJ1ZmZlclRvSGV4KHRoaXMuX3Jhd1NpZ25lZEJ5dGVzKTtcbiAgICB9XG4gICAgY29uc3QgdW5zaWduZWRUeCA9IHRoaXMuX2ZsYXJlVHJhbnNhY3Rpb24gYXMgVW5zaWduZWRUeDtcbiAgICAvLyBGb3Igc2lnbmVkIHRyYW5zYWN0aW9ucywgcmV0dXJuIHRoZSBmdWxsIHNpZ25lZCB0eCB3aXRoIGNyZWRlbnRpYWxzXG4gICAgLy8gQ2hlY2sgc2lnbmF0dXJlLmxlbmd0aCBmb3Igcm9idXN0bmVzc1xuICAgIGlmICh0aGlzLnNpZ25hdHVyZS5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gRmxhcmVVdGlscy5idWZmZXJUb0hleCh1bnNpZ25lZFR4LmdldFNpZ25lZFR4KCkudG9CeXRlcygpKTtcbiAgICB9XG4gICAgLy8gRm9yIHVuc2lnbmVkIHRyYW5zYWN0aW9ucywgcmV0dXJuIGp1c3QgdGhlIHRyYW5zYWN0aW9uIGJ5dGVzXG4gICAgcmV0dXJuIEZsYXJlVXRpbHMuYnVmZmVyVG9IZXgodW5zaWduZWRUeC50b0J5dGVzKCkpO1xuICB9XG5cbiAgdG9Kc29uKCk6IFR4RGF0YSB7XG4gICAgaWYgKCF0aGlzLl9mbGFyZVRyYW5zYWN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ0VtcHR5IHRyYW5zYWN0aW9uIGRhdGEnKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgaW5wdXRzOiB0aGlzLmlucHV0cyxcbiAgICAgIGZyb21BZGRyZXNzZXM6IHRoaXMuZnJvbUFkZHJlc3NlcyxcbiAgICAgIHRocmVzaG9sZDogdGhpcy5fdGhyZXNob2xkLFxuICAgICAgbG9ja3RpbWU6IHRoaXMuX2xvY2t0aW1lLnRvU3RyaW5nKCksXG4gICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICBzaWduYXR1cmVzOiB0aGlzLnNpZ25hdHVyZSxcbiAgICAgIG91dHB1dHM6IHRoaXMub3V0cHV0cyxcbiAgICAgIGNoYW5nZU91dHB1dHM6IHRoaXMuY2hhbmdlT3V0cHV0cyxcbiAgICB9O1xuICB9XG5cbiAgc2V0VHJhbnNhY3Rpb24odHg6IFR4KTogdm9pZCB7XG4gICAgdGhpcy5fZmxhcmVUcmFuc2FjdGlvbiA9IHR4IGFzIFVuc2lnbmVkVHg7XG4gIH1cblxuICBzZXRUcmFuc2FjdGlvblR5cGUodHJhbnNhY3Rpb25UeXBlOiBUcmFuc2FjdGlvblR5cGUpOiB2b2lkIHtcbiAgICBpZiAoIVtUcmFuc2FjdGlvblR5cGUuQWRkUGVybWlzc2lvbmxlc3NWYWxpZGF0b3JdLmluY2x1ZGVzKHRyYW5zYWN0aW9uVHlwZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVHJhbnNhY3Rpb24gdHlwZSAke3RyYW5zYWN0aW9uVHlwZX0gaXMgbm90IHN1cHBvcnRlZGApO1xuICAgIH1cbiAgICB0aGlzLl90eXBlID0gdHJhbnNhY3Rpb25UeXBlO1xuICB9XG5cbiAgZ2V0IHNpZ25hYmxlUGF5bG9hZCgpOiBCdWZmZXIge1xuICAgIHJldHVybiB1dGlscy5zaGEyNTYoKHRoaXMuX2ZsYXJlVHJhbnNhY3Rpb24gYXMgVW5zaWduZWRUeCkudG9CeXRlcygpKTtcbiAgfVxuXG4gIGdldCBpZCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGJ1ZmZlckFycmF5ID0gdXRpbHMuc2hhMjU2KCh0aGlzLl9mbGFyZVRyYW5zYWN0aW9uIGFzIFVuc2lnbmVkVHgpLnRvQnl0ZXMoKSk7XG4gICAgcmV0dXJuIHV0aWxzLmNiNThFbmNvZGUoQnVmZmVyLmZyb20oYnVmZmVyQXJyYXkpKTtcbiAgfVxuXG4gIGdldCBmcm9tQWRkcmVzc2VzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fZnJvbUFkZHJlc3Nlcy5tYXAoKGEpID0+IEZsYXJlVXRpbHMuZm9ybWF0KHRoaXMuX25ldHdvcmsuYWxpYXMsIHRoaXMuX25ldHdvcmsuaHJwLCBhKSk7XG4gIH1cblxuICBnZXQgcmV3YXJkQWRkcmVzc2VzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fcmV3YXJkQWRkcmVzc2VzLm1hcCgoYSkgPT4gRmxhcmVVdGlscy5mb3JtYXQodGhpcy5fbmV0d29yay5hbGlhcywgdGhpcy5fbmV0d29yay5ocnAsIGEpKTtcbiAgfVxuXG4gIGdldCBmZWUoKTogVHJhbnNhY3Rpb25GZWUge1xuICAgIHJldHVybiB7IGZlZTogJzAnLCAuLi50aGlzLl9mZWUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB0aGlzIHRyYW5zYWN0aW9uIGlzIGZvciBDLWNoYWluIChFVk0gdHJhbnNhY3Rpb25zKVxuICAgKi9cbiAgZ2V0IGlzVHJhbnNhY3Rpb25Gb3JDQ2hhaW4oKTogYm9vbGVhbiB7XG4gICAgY29uc3QgdHggPSAodGhpcy5fZmxhcmVUcmFuc2FjdGlvbiBhcyBVbnNpZ25lZFR4KS5nZXRUeCgpO1xuICAgIGNvbnN0IHR4VHlwZSA9ICh0eCBhcyB7IF90eXBlPzogc3RyaW5nIH0pLl90eXBlO1xuICAgIHJldHVybiB0eFR5cGUgPT09IEZsYXJlVHJhbnNhY3Rpb25UeXBlLkV2bUV4cG9ydFR4IHx8IHR4VHlwZSA9PT0gRmxhcmVUcmFuc2FjdGlvblR5cGUuRXZtSW1wb3J0VHg7XG4gIH1cblxuICBnZXQgb3V0cHV0cygpOiBFbnRyeVtdIHtcbiAgICBjb25zdCB0eCA9ICh0aGlzLl9mbGFyZVRyYW5zYWN0aW9uIGFzIFVuc2lnbmVkVHgpLmdldFR4KCk7XG5cbiAgICBzd2l0Y2ggKHRoaXMudHlwZSkge1xuICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuSW1wb3J0OlxuICAgICAgICBpZiAodGhpcy5pc1RyYW5zYWN0aW9uRm9yQ0NoYWluKSB7XG4gICAgICAgICAgLy8gQy1jaGFpbiBJbXBvcnQ6IG91dHB1dCBpcyB0byBhIEMtY2hhaW4gYWRkcmVzc1xuICAgICAgICAgIGNvbnN0IGltcG9ydFR4ID0gdHggYXMgZXZtU2VyaWFsLkltcG9ydFR4O1xuICAgICAgICAgIHJldHVybiBpbXBvcnRUeC5PdXRzLm1hcCgob3V0KSA9PiAoe1xuICAgICAgICAgICAgYWRkcmVzczogJzB4JyArIEJ1ZmZlci5mcm9tKG91dC5hZGRyZXNzLnRvQnl0ZXMoKSkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgICAgdmFsdWU6IG91dC5hbW91bnQudmFsdWUoKS50b1N0cmluZygpLFxuICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBQLWNoYWluIEltcG9ydDogb3V0cHV0cyBhcmUgdGhlIGJhc2VUeC5vdXRwdXRzIChkZXN0aW5hdGlvbiBvbiBQLWNoYWluKVxuICAgICAgICAgIGNvbnN0IHB2bUltcG9ydFR4ID0gdHggYXMgcHZtU2VyaWFsLkltcG9ydFR4O1xuICAgICAgICAgIHJldHVybiBwdm1JbXBvcnRUeC5iYXNlVHgub3V0cHV0cy5tYXAodXRpbHMubWFwT3V0cHV0VG9FbnRyeSh0aGlzLl9uZXR3b3JrKSk7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuRXhwb3J0OlxuICAgICAgICBpZiAodGhpcy5pc1RyYW5zYWN0aW9uRm9yQ0NoYWluKSB7XG4gICAgICAgICAgLy8gQy1jaGFpbiBFeHBvcnQ6IGV4cG9ydGVkIG91dHB1dHMgZ28gdG8gUC1jaGFpblxuICAgICAgICAgIGNvbnN0IGV4cG9ydFR4ID0gdHggYXMgZXZtU2VyaWFsLkV4cG9ydFR4O1xuICAgICAgICAgIHJldHVybiBleHBvcnRUeC5leHBvcnRlZE91dHB1dHMubWFwKHV0aWxzLm1hcE91dHB1dFRvRW50cnkodGhpcy5fbmV0d29yaykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFAtY2hhaW4gRXhwb3J0OiBleHBvcnRlZCBvdXRwdXRzIGdvIHRvIEMtY2hhaW5cbiAgICAgICAgICBjb25zdCBwdm1FeHBvcnRUeCA9IHR4IGFzIHB2bVNlcmlhbC5FeHBvcnRUeDtcbiAgICAgICAgICByZXR1cm4gcHZtRXhwb3J0VHgub3V0cy5tYXAodXRpbHMubWFwT3V0cHV0VG9FbnRyeSh0aGlzLl9uZXR3b3JrKSk7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuQWRkUGVybWlzc2lvbmxlc3NWYWxpZGF0b3I6XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWRkcmVzczogKHR4IGFzIHB2bVNlcmlhbC5BZGRQZXJtaXNzaW9ubGVzc1ZhbGlkYXRvclR4KS5zdWJuZXRWYWxpZGF0b3IudmFsaWRhdG9yLm5vZGVJZC50b1N0cmluZygpLFxuICAgICAgICAgICAgdmFsdWU6ICh0eCBhcyBwdm1TZXJpYWwuQWRkUGVybWlzc2lvbmxlc3NWYWxpZGF0b3JUeCkuc3VibmV0VmFsaWRhdG9yLnZhbGlkYXRvci53ZWlnaHQudG9KU09OKCksXG4gICAgICAgICAgfSxcbiAgICAgICAgXTtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgfVxuXG4gIGdldCBjaGFuZ2VPdXRwdXRzKCk6IEVudHJ5W10ge1xuICAgIGNvbnN0IHR4ID0gKHRoaXMuX2ZsYXJlVHJhbnNhY3Rpb24gYXMgVW5zaWduZWRUeCkuZ2V0VHgoKTtcblxuICAgIC8vIEMtY2hhaW4gdHJhbnNhY3Rpb25zIGFuZCBJbXBvcnQgdHJhbnNhY3Rpb25zIGRvbid0IGhhdmUgY2hhbmdlIG91dHB1dHNcbiAgICBpZiAodGhpcy5pc1RyYW5zYWN0aW9uRm9yQ0NoYWluIHx8IHRoaXMudHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLkltcG9ydCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIHN3aXRjaCAodGhpcy50eXBlKSB7XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5FeHBvcnQ6XG4gICAgICAgIC8vIFAtY2hhaW4gRXhwb3J0OiBjaGFuZ2Ugb3V0cHV0cyBhcmUgaW4gYmFzZVR4Lm91dHB1dHNcbiAgICAgICAgcmV0dXJuICh0eCBhcyBwdm1TZXJpYWwuRXhwb3J0VHgpLmJhc2VUeC5vdXRwdXRzLm1hcCh1dGlscy5tYXBPdXRwdXRUb0VudHJ5KHRoaXMuX25ldHdvcmspKTtcblxuICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuQWRkUGVybWlzc2lvbmxlc3NWYWxpZGF0b3I6XG4gICAgICAgIHJldHVybiAodHggYXMgcHZtU2VyaWFsLkFkZFBlcm1pc3Npb25sZXNzVmFsaWRhdG9yVHgpLmJhc2VUeC5vdXRwdXRzLm1hcCh1dGlscy5tYXBPdXRwdXRUb0VudHJ5KHRoaXMuX25ldHdvcmspKTtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgfVxuXG4gIGdldCBpbnB1dHMoKTogRW50cnlbXSB7XG4gICAgY29uc3QgdHggPSAodGhpcy5fZmxhcmVUcmFuc2FjdGlvbiBhcyBVbnNpZ25lZFR4KS5nZXRUeCgpO1xuXG4gICAgc3dpdGNoICh0aGlzLnR5cGUpIHtcbiAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLkltcG9ydDpcbiAgICAgICAgaWYgKHRoaXMuaXNUcmFuc2FjdGlvbkZvckNDaGFpbikge1xuICAgICAgICAgIC8vIEMtY2hhaW4gSW1wb3J0OiBpbnB1dHMgY29tZSBmcm9tIFAtY2hhaW4gKGltcG9ydGVkSW5wdXRzKVxuICAgICAgICAgIGNvbnN0IGltcG9ydFR4ID0gdHggYXMgZXZtU2VyaWFsLkltcG9ydFR4O1xuICAgICAgICAgIHJldHVybiBpbXBvcnRUeC5pbXBvcnRlZElucHV0cy5tYXAoKGlucHV0KSA9PiAoe1xuICAgICAgICAgICAgaWQ6IHV0aWxzLmNiNThFbmNvZGUoQnVmZmVyLmZyb20oaW5wdXQudXR4b0lELnR4SUQudG9CeXRlcygpKSkgKyAnOicgKyBpbnB1dC51dHhvSUQub3V0cHV0SWR4LnZhbHVlKCksXG4gICAgICAgICAgICBhZGRyZXNzOiB0aGlzLmZyb21BZGRyZXNzZXMuc29ydCgpLmpvaW4oQUREUkVTU19TRVBBUkFUT1IpLFxuICAgICAgICAgICAgdmFsdWU6IGlucHV0LmFtb3VudCgpLnRvU3RyaW5nKCksXG4gICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFAtY2hhaW4gSW1wb3J0OiBpbnB1dHMgYXJlIGlucyAoaW1wb3J0ZWQgZnJvbSBDLWNoYWluKVxuICAgICAgICAgIGNvbnN0IHB2bUltcG9ydFR4ID0gdHggYXMgcHZtU2VyaWFsLkltcG9ydFR4O1xuICAgICAgICAgIHJldHVybiBwdm1JbXBvcnRUeC5pbnMubWFwKChpbnB1dCkgPT4gKHtcbiAgICAgICAgICAgIGlkOiB1dGlscy5jYjU4RW5jb2RlKEJ1ZmZlci5mcm9tKGlucHV0LnV0eG9JRC50eElELnRvQnl0ZXMoKSkpICsgJzonICsgaW5wdXQudXR4b0lELm91dHB1dElkeC52YWx1ZSgpLFxuICAgICAgICAgICAgYWRkcmVzczogdGhpcy5mcm9tQWRkcmVzc2VzLnNvcnQoKS5qb2luKEFERFJFU1NfU0VQQVJBVE9SKSxcbiAgICAgICAgICAgIHZhbHVlOiBpbnB1dC5hbW91bnQoKS50b1N0cmluZygpLFxuICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5FeHBvcnQ6XG4gICAgICAgIGlmICh0aGlzLmlzVHJhbnNhY3Rpb25Gb3JDQ2hhaW4pIHtcbiAgICAgICAgICAvLyBDLWNoYWluIEV4cG9ydDogaW5wdXRzIGFyZSBmcm9tIEMtY2hhaW4gKEVWTSBpbnB1dHMpXG4gICAgICAgICAgY29uc3QgZXhwb3J0VHggPSB0eCBhcyBldm1TZXJpYWwuRXhwb3J0VHg7XG4gICAgICAgICAgcmV0dXJuIGV4cG9ydFR4Lmlucy5tYXAoKGV2bUlucHV0KSA9PiAoe1xuICAgICAgICAgICAgYWRkcmVzczogJzB4JyArIEJ1ZmZlci5mcm9tKGV2bUlucHV0LmFkZHJlc3MudG9CeXRlcygpKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgICB2YWx1ZTogZXZtSW5wdXQuYW1vdW50LnZhbHVlKCkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIG5vbmNlOiBOdW1iZXIoZXZtSW5wdXQubm9uY2UudmFsdWUoKSksXG4gICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFAtY2hhaW4gRXhwb3J0OiBpbnB1dHMgYXJlIGZyb20gYmFzZVR4LmlucHV0c1xuICAgICAgICAgIGNvbnN0IHB2bUV4cG9ydFR4ID0gdHggYXMgcHZtU2VyaWFsLkV4cG9ydFR4O1xuICAgICAgICAgIHJldHVybiBwdm1FeHBvcnRUeC5iYXNlVHguaW5wdXRzLm1hcCgoaW5wdXQpID0+ICh7XG4gICAgICAgICAgICBpZDogdXRpbHMuY2I1OEVuY29kZShCdWZmZXIuZnJvbShpbnB1dC51dHhvSUQudHhJRC50b0J5dGVzKCkpKSArICc6JyArIGlucHV0LnV0eG9JRC5vdXRwdXRJZHgudmFsdWUoKSxcbiAgICAgICAgICAgIGFkZHJlc3M6IHRoaXMuZnJvbUFkZHJlc3Nlcy5zb3J0KCkuam9pbihBRERSRVNTX1NFUEFSQVRPUiksXG4gICAgICAgICAgICB2YWx1ZTogaW5wdXQuYW1vdW50KCkudG9TdHJpbmcoKSxcbiAgICAgICAgICB9KSk7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuQWRkUGVybWlzc2lvbmxlc3NWYWxpZGF0b3I6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBjb25zdCBiYXNlVHggPSB0eCBhcyBwdm1TZXJpYWwuQWRkUGVybWlzc2lvbmxlc3NWYWxpZGF0b3JUeDtcbiAgICAgICAgaWYgKGJhc2VUeC5iYXNlVHg/LmlucHV0cykge1xuICAgICAgICAgIHJldHVybiBiYXNlVHguYmFzZVR4LmlucHV0cy5tYXAoKGlucHV0KSA9PiAoe1xuICAgICAgICAgICAgaWQ6IHV0aWxzLmNiNThFbmNvZGUoQnVmZmVyLmZyb20oaW5wdXQudXR4b0lELnR4SUQudG9CeXRlcygpKSkgKyAnOicgKyBpbnB1dC51dHhvSUQub3V0cHV0SWR4LnZhbHVlKCksXG4gICAgICAgICAgICBhZGRyZXNzOiB0aGlzLmZyb21BZGRyZXNzZXMuc29ydCgpLmpvaW4oQUREUkVTU19TRVBBUkFUT1IpLFxuICAgICAgICAgICAgdmFsdWU6IGlucHV0LmFtb3VudCgpLnRvU3RyaW5nKCksXG4gICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH1cblxuICBleHBsYWluVHJhbnNhY3Rpb24oKTogVHJhbnNhY3Rpb25FeHBsYW5hdGlvbiB7XG4gICAgY29uc3QgdHhKc29uID0gdGhpcy50b0pzb24oKTtcbiAgICBjb25zdCBkaXNwbGF5T3JkZXIgPSBbJ2lkJywgJ2lucHV0cycsICdvdXRwdXRBbW91bnQnLCAnY2hhbmdlQW1vdW50JywgJ291dHB1dHMnLCAnY2hhbmdlT3V0cHV0cycsICdmZWUnLCAndHlwZSddO1xuXG4gICAgY29uc3Qgb3V0cHV0QW1vdW50ID0gdHhKc29uLm91dHB1dHMucmVkdWNlKChwLCBuKSA9PiBwICsgQmlnSW50KG4udmFsdWUpLCBCaWdJbnQoMCkpLnRvU3RyaW5nKCk7XG4gICAgY29uc3QgY2hhbmdlQW1vdW50ID0gdHhKc29uLmNoYW5nZU91dHB1dHMucmVkdWNlKChwLCBuKSA9PiBwICsgQmlnSW50KG4udmFsdWUpLCBCaWdJbnQoMCkpLnRvU3RyaW5nKCk7XG5cbiAgICBsZXQgcmV3YXJkQWRkcmVzc2VzO1xuICAgIGlmIChbVHJhbnNhY3Rpb25UeXBlLkFkZFBlcm1pc3Npb25sZXNzVmFsaWRhdG9yXS5pbmNsdWRlcyh0eEpzb24udHlwZSkpIHtcbiAgICAgIHJld2FyZEFkZHJlc3NlcyA9IHRoaXMucmV3YXJkQWRkcmVzc2VzO1xuICAgICAgZGlzcGxheU9yZGVyLnNwbGljZSg2LCAwLCAncmV3YXJkQWRkcmVzc2VzJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGRpc3BsYXlPcmRlcixcbiAgICAgIGlkOiB0eEpzb24uaWQsXG4gICAgICBpbnB1dHM6IHR4SnNvbi5pbnB1dHMsXG4gICAgICBvdXRwdXRzOiB0eEpzb24ub3V0cHV0cy5tYXAoKG8pID0+ICh7IGFkZHJlc3M6IG8uYWRkcmVzcywgYW1vdW50OiBvLnZhbHVlIH0pKSxcbiAgICAgIG91dHB1dEFtb3VudCxcbiAgICAgIGNoYW5nZU91dHB1dHM6IHR4SnNvbi5jaGFuZ2VPdXRwdXRzLm1hcCgobykgPT4gKHsgYWRkcmVzczogby5hZGRyZXNzLCBhbW91bnQ6IG8udmFsdWUgfSkpLFxuICAgICAgY2hhbmdlQW1vdW50LFxuICAgICAgcmV3YXJkQWRkcmVzc2VzLFxuICAgICAgZmVlOiB0aGlzLmZlZSxcbiAgICAgIHR5cGU6IHR4SnNvbi50eXBlLFxuICAgIH07XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,107 @@
1
+ import { BaseTransactionBuilder, BaseKey, BaseAddress } from '@bitgo-beta/sdk-core';
2
+ import { BaseCoin as CoinConfig } from '@bitgo-beta/statics';
3
+ import { DecodedUtxoObj, Tx } from './iface';
4
+ import { KeyPair } from './keyPair';
5
+ import { Transaction } from './transaction';
6
+ import BigNumber from 'bignumber.js';
7
+ export declare abstract class TransactionBuilder extends BaseTransactionBuilder {
8
+ protected _transaction: Transaction;
9
+ protected recoverSigner: boolean;
10
+ _signer: KeyPair[];
11
+ constructor(_coinConfig: Readonly<CoinConfig>);
12
+ /**
13
+ * Initialize the transaction builder fields using the decoded transaction data
14
+ *
15
+ * @param {Transaction} tx the transaction data
16
+ * @returns itself
17
+ */
18
+ initBuilder(tx: Tx): this;
19
+ /**
20
+ * Validates the threshold for multi-signature transactions
21
+ * @param threshold - Number of required signatures
22
+ */
23
+ validateThreshold(threshold: number): void;
24
+ /**
25
+ * Validates a single UTXO object
26
+ * @param value - UTXO to validate
27
+ */
28
+ validateUtxo(value: DecodedUtxoObj): void;
29
+ /**
30
+ * Validates an array of UTXOs
31
+ * @param values - Array of UTXOs to validate
32
+ */
33
+ validateUtxos(values: DecodedUtxoObj[]): void;
34
+ /**
35
+ * Validates the locktime value
36
+ * @param locktime - Timestamp after which the output can be spent
37
+ */
38
+ validateLocktime(locktime: bigint): void;
39
+ /**
40
+ * Sets the threshold for multi-signature transactions
41
+ * @param value - Number of required signatures
42
+ */
43
+ threshold(value: number): this;
44
+ /**
45
+ * Sets the locktime for the transaction
46
+ * @param value - Timestamp after which the output can be spent
47
+ */
48
+ locktime(value: string | number): this;
49
+ /**
50
+ * Enables recovery mode for the transaction
51
+ * @param recoverSigner - Whether to use recovery signing
52
+ */
53
+ recoverMode(recoverSigner?: boolean): this;
54
+ /**
55
+ * Sets the sender's public key(s)
56
+ * @param senderPubKey - Public key or array of public keys
57
+ */
58
+ fromPubKey(senderPubKey: string | string[]): this;
59
+ /**
60
+ * Sets the UTXOs for the transaction
61
+ * @param value - Array of UTXOs to use
62
+ */
63
+ utxos(value: DecodedUtxoObj[]): this;
64
+ /** @inheritdoc */
65
+ protected fromImplementation(rawTransaction: string): Transaction;
66
+ /**
67
+ * Abstract method to be implemented by specific transaction builders
68
+ * Builds the actual transaction based on the builder's configuration
69
+ */
70
+ protected abstract buildImplementation(): Promise<Transaction>;
71
+ /**
72
+ * Check the buffer has 32 byte long.
73
+ * @param chainID
74
+ */
75
+ validateChainId(chainID: Buffer): void;
76
+ /** @inheritdoc */
77
+ protected get transaction(): Transaction;
78
+ protected set transaction(transaction: Transaction);
79
+ /**
80
+ * Check that fee is greater than 0.
81
+ * @param {bigint} fee
82
+ */
83
+ validateFee(fee: bigint): void;
84
+ /** @inheritdoc */
85
+ validateKey({ key }: BaseKey): void;
86
+ /** @inheritdoc */
87
+ validateTransaction(transaction?: Transaction): void;
88
+ /** @inheritdoc */
89
+ validateValue(value: BigNumber): void;
90
+ /** @inheritdoc */
91
+ validateAddress(address: BaseAddress, addressFormat?: string): void;
92
+ /**
93
+ * Check the raw transaction has a valid format in the blockchain context, throw otherwise.
94
+ *
95
+ * @param rawTransaction Transaction in any format
96
+ */
97
+ validateRawTransaction(rawTransaction: string): void;
98
+ /** @inheritdoc */
99
+ protected signImplementation({ key }: BaseKey): Transaction;
100
+ hasSigner(): boolean;
101
+ /**
102
+ * Check the amount is positive.
103
+ * @param amount
104
+ */
105
+ validateAmount(amount: bigint): void;
106
+ }
107
+ //# sourceMappingURL=transactionBuilder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transactionBuilder.d.ts","sourceRoot":"","sources":["../../../src/lib/transactionBuilder.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAyB,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAC3G,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,OAAO,SAAS,MAAM,cAAc,CAAC;AAErC,8BAAsB,kBAAmB,SAAQ,sBAAsB;IACrE,SAAS,CAAC,YAAY,EAAE,WAAW,CAAC;IACpC,SAAS,CAAC,aAAa,UAAS;IACzB,OAAO,EAAE,OAAO,EAAE,CAAM;gBAEnB,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC;IAK7C;;;;;OAKG;IACH,WAAW,CAAC,EAAE,EAAE,EAAE,GAAG,IAAI;IAgBzB;;;OAGG;IACH,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAM1C;;;OAGG;IACH,YAAY,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI;IASzC;;;OAGG;IACH,aAAa,CAAC,MAAM,EAAE,cAAc,EAAE,GAAG,IAAI;IAO7C;;;OAGG;IACH,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAOxC;;;OAGG;IACH,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAM9B;;;OAGG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAMtC;;;OAGG;IACH,WAAW,CAAC,aAAa,UAAO,GAAG,IAAI;IAKvC;;;OAGG;IACH,UAAU,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI;IAMjD;;;OAGG;IACH,KAAK,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,IAAI;IAMpC,kBAAkB;IAClB,SAAS,CAAC,kBAAkB,CAAC,cAAc,EAAE,MAAM,GAAG,WAAW;IAcjE;;;OAGG;IACH,SAAS,CAAC,QAAQ,CAAC,mBAAmB,IAAI,OAAO,CAAC,WAAW,CAAC;IAE9D;;;OAGG;IACH,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAMtC,kBAAkB;IAClB,SAAS,KAAK,WAAW,IAAI,WAAW,CAEvC;IAED,SAAS,KAAK,WAAW,CAAC,WAAW,EAAE,WAAW,EAEjD;IAED;;;OAGG;IACH,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAM9B,kBAAkB;IAClB,WAAW,CAAC,EAAE,GAAG,EAAE,EAAE,OAAO,GAAG,IAAI;IAQnC,kBAAkB;IAClB,mBAAmB,CAAC,WAAW,CAAC,EAAE,WAAW,GAAG,IAAI;IAIpD,kBAAkB;IAClB,aAAa,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI;IAMrC,kBAAkB;IAClB,eAAe,CAAC,OAAO,EAAE,WAAW,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI;IAMnE;;;;OAIG;IACH,sBAAsB,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI;IAIpD,kBAAkB;IAClB,SAAS,CAAC,kBAAkB,CAAC,EAAE,GAAG,EAAE,EAAE,OAAO,GAAG,WAAW;IAK3D,SAAS,IAAI,OAAO;IAIpB;;;OAGG;IACH,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;CAKrC"}