@bitgo/sdk-coin-algo 2.5.2 → 2.5.3

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/dist/test/fixtures/algo.d.ts +101 -0
  2. package/dist/test/fixtures/algo.d.ts.map +1 -0
  3. package/dist/test/fixtures/algo.js +239 -0
  4. package/dist/test/fixtures/resources.d.ts +114 -0
  5. package/dist/test/fixtures/resources.d.ts.map +1 -0
  6. package/dist/test/fixtures/resources.js +123 -0
  7. package/dist/test/integration/algo.integration.d.ts +2 -0
  8. package/dist/test/integration/algo.integration.d.ts.map +1 -0
  9. package/dist/test/integration/algo.integration.js +71 -0
  10. package/dist/test/unit/algo.d.ts +2 -0
  11. package/dist/test/unit/algo.d.ts.map +1 -0
  12. package/dist/test/unit/algo.js +1096 -0
  13. package/dist/test/unit/algoIsWalletAddress.d.ts +2 -0
  14. package/dist/test/unit/algoIsWalletAddress.d.ts.map +1 -0
  15. package/dist/test/unit/algoIsWalletAddress.js +118 -0
  16. package/dist/test/unit/algoToken.d.ts +2 -0
  17. package/dist/test/unit/algoToken.d.ts.map +1 -0
  18. package/dist/test/unit/algoToken.js +79 -0
  19. package/dist/test/unit/fixtures/algoBackupKey.d.ts +4 -0
  20. package/dist/test/unit/fixtures/algoBackupKey.d.ts.map +1 -0
  21. package/dist/test/unit/fixtures/algoBackupKey.js +10 -0
  22. package/dist/test/unit/lib/keyPair.d.ts +2 -0
  23. package/dist/test/unit/lib/keyPair.d.ts.map +1 -0
  24. package/dist/test/unit/lib/keyPair.js +110 -0
  25. package/dist/test/unit/lib/seedEncoding.d.ts +2 -0
  26. package/dist/test/unit/lib/seedEncoding.d.ts.map +1 -0
  27. package/dist/test/unit/lib/seedEncoding.js +59 -0
  28. package/dist/test/unit/lib/transaction.d.ts +2 -0
  29. package/dist/test/unit/lib/transaction.d.ts.map +1 -0
  30. package/dist/test/unit/lib/transaction.js +157 -0
  31. package/dist/test/unit/lib/transactionBuilder/assetTransferBuilder.d.ts +2 -0
  32. package/dist/test/unit/lib/transactionBuilder/assetTransferBuilder.d.ts.map +1 -0
  33. package/dist/test/unit/lib/transactionBuilder/assetTransferBuilder.js +300 -0
  34. package/dist/test/unit/lib/transactionBuilder/base.d.ts +2 -0
  35. package/dist/test/unit/lib/transactionBuilder/base.d.ts.map +1 -0
  36. package/dist/test/unit/lib/transactionBuilder/base.js +310 -0
  37. package/dist/test/unit/lib/transactionBuilder/keyRegistrationBuilder.d.ts +2 -0
  38. package/dist/test/unit/lib/transactionBuilder/keyRegistrationBuilder.d.ts.map +1 -0
  39. package/dist/test/unit/lib/transactionBuilder/keyRegistrationBuilder.js +473 -0
  40. package/dist/test/unit/lib/transactionBuilder/transactionBuilderFactory.d.ts +2 -0
  41. package/dist/test/unit/lib/transactionBuilder/transactionBuilderFactory.d.ts.map +1 -0
  42. package/dist/test/unit/lib/transactionBuilder/transactionBuilderFactory.js +138 -0
  43. package/dist/test/unit/lib/transactionBuilder/transferBuilder.d.ts +2 -0
  44. package/dist/test/unit/lib/transactionBuilder/transferBuilder.d.ts.map +1 -0
  45. package/dist/test/unit/lib/transactionBuilder/transferBuilder.js +290 -0
  46. package/dist/test/unit/lib/utils.d.ts +2 -0
  47. package/dist/test/unit/lib/utils.d.ts.map +1 -0
  48. package/dist/test/unit/lib/utils.js +307 -0
  49. package/dist/tsconfig.tsbuildinfo +1 -0
  50. package/package.json +9 -6
  51. package/.eslintignore +0 -5
  52. package/.mocharc.yml +0 -8
  53. package/CHANGELOG.md +0 -868
  54. package/types/index.d.ts +0 -60
@@ -0,0 +1,310 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ const crypto_1 = __importDefault(require("crypto"));
40
+ const statics_1 = require("@bitgo/statics");
41
+ const algosdk_1 = __importDefault(require("algosdk"));
42
+ const assert_1 = __importDefault(require("assert"));
43
+ const should_1 = __importDefault(require("should"));
44
+ const sinon_1 = __importStar(require("sinon"));
45
+ const lib_1 = require("../../../../src/lib");
46
+ const AlgoResources = __importStar(require("../../../fixtures/resources"));
47
+ const STANDARD_REQUIRED_NUMBER_OF_SIGNERS = 2;
48
+ class StubTransactionBuilder extends lib_1.TransactionBuilder {
49
+ constructor(coinConfig) {
50
+ super(coinConfig);
51
+ }
52
+ getFee() {
53
+ return this._fee;
54
+ }
55
+ getSender() {
56
+ return this._sender;
57
+ }
58
+ getGenesisHash() {
59
+ return this._genesisHash;
60
+ }
61
+ getGenesisId() {
62
+ return this._genesisId;
63
+ }
64
+ getFirstRound() {
65
+ return this._firstRound;
66
+ }
67
+ getLastRound() {
68
+ return this._lastRound;
69
+ }
70
+ getLease() {
71
+ return this._lease;
72
+ }
73
+ getNote() {
74
+ return this._note;
75
+ }
76
+ getReKeyTo() {
77
+ return this._reKeyTo;
78
+ }
79
+ getKeyPairs() {
80
+ return this._keyPairs;
81
+ }
82
+ getTransaction() {
83
+ return this._transaction;
84
+ }
85
+ buildImplementation() {
86
+ return super.buildImplementation();
87
+ }
88
+ fromImplementation(rawTransaction) {
89
+ return super.fromImplementation(rawTransaction);
90
+ }
91
+ signImplementation(key) {
92
+ return super.signImplementation(key);
93
+ }
94
+ getSuggestedParams() {
95
+ return this.suggestedParams;
96
+ }
97
+ buildAlgoTxn() {
98
+ throw new Error('Method not implemented.');
99
+ }
100
+ get transactionType() {
101
+ throw new Error('Method not implemented.');
102
+ }
103
+ }
104
+ describe('Algo Transaction Builder', () => {
105
+ let txnBuilder;
106
+ const { accounts: { account1, account2, account3 }, networks: { testnet }, } = AlgoResources;
107
+ beforeEach(() => {
108
+ const config = statics_1.coins.get('algo');
109
+ txnBuilder = new StubTransactionBuilder(config);
110
+ });
111
+ describe('setter validation', () => {
112
+ it('should validate fee is not lt 1000 microalgos if flat fee is set to true', () => {
113
+ txnBuilder.isFlatFee(true);
114
+ assert_1.default.throws(() => txnBuilder.fee({ fee: '999' }), (e) => e.name === lib_1.InsufficientFeeError.name);
115
+ should_1.default.doesNotThrow(() => txnBuilder.fee({ fee: '1000' }));
116
+ });
117
+ it('should validate sender address is a valid algo address', () => {
118
+ const spy = sinon_1.default.spy(txnBuilder, 'validateAddress');
119
+ assert_1.default.throws(() => txnBuilder.sender({ address: 'asdf' }), (e) => e.name === lib_1.AddressValidationError.name);
120
+ should_1.default.doesNotThrow(() => txnBuilder.sender({ address: account1.address }));
121
+ sinon_1.assert.calledTwice(spy);
122
+ });
123
+ it('should validate number of signers is not less than 0', () => {
124
+ assert_1.default.throws(() => txnBuilder.numberOfRequiredSigners(-1), /Number of signers: '-1' cannot be negative/);
125
+ for (let i = 0; i < STANDARD_REQUIRED_NUMBER_OF_SIGNERS; i++) {
126
+ should_1.default.doesNotThrow(() => txnBuilder.numberOfRequiredSigners(i));
127
+ }
128
+ });
129
+ });
130
+ describe('suggested params verification', () => {
131
+ it('should retrieve the suggested parameters as they have been set', () => {
132
+ const isFlatFee = true;
133
+ const fee = 1000;
134
+ const firstRound = 1;
135
+ const lastRound = 10;
136
+ const genesisId = 'testnet-v1.0';
137
+ const genesisHash = 'SGO1GKSzyE7IEPItTxCByw9x8FmnrCDexi9/cOUJOiI=';
138
+ txnBuilder
139
+ .isFlatFee(isFlatFee)
140
+ .fee({ fee: fee.toString() })
141
+ .firstRound(firstRound)
142
+ .lastRound(lastRound)
143
+ .genesisId(genesisId)
144
+ .genesisHash(genesisHash);
145
+ const suggestedParams = txnBuilder.getSuggestedParams();
146
+ should_1.default.equal(isFlatFee, suggestedParams.flatFee);
147
+ should_1.default.equal(fee, suggestedParams.fee);
148
+ should_1.default.equal(firstRound, suggestedParams.firstRound);
149
+ should_1.default.equal(lastRound, suggestedParams.lastRound);
150
+ should_1.default.equal(genesisId, suggestedParams.genesisID);
151
+ should_1.default.equal(genesisHash, suggestedParams.genesisHash);
152
+ });
153
+ });
154
+ describe('private key validation', () => {
155
+ it('validates byte arrays', () => {
156
+ should_1.default.doesNotThrow(() => txnBuilder.validateKey({ key: account1.secretKey }));
157
+ });
158
+ it('validates hex encoded strings', () => {
159
+ should_1.default.doesNotThrow(() => txnBuilder.validateKey({ key: account1.secretKey.toString('hex') }));
160
+ });
161
+ it('validates base64 encoded strings', () => {
162
+ should_1.default.doesNotThrow(() => txnBuilder.validateKey({ key: account1.secretKey.toString('base64') }));
163
+ });
164
+ });
165
+ describe('implementation functions', () => {
166
+ const to = account1.address;
167
+ const from = account2.address;
168
+ const reKeyTo = account3.address;
169
+ const amount = 1000;
170
+ const firstRound = 1;
171
+ const lastRound = 10;
172
+ const closeRemainderTo = account3.address;
173
+ // Uint8array conversion required because algosdk checks if the constructor
174
+ // is Uint8Array.
175
+ const lease = new Uint8Array(crypto_1.default.randomBytes(32));
176
+ const note = new Uint8Array(Buffer.from('note', 'utf-8'));
177
+ const fee = 1000;
178
+ const algoTxn = algosdk_1.default.makePaymentTxnWithSuggestedParams(from, to, amount, closeRemainderTo, note, {
179
+ fee,
180
+ flatFee: true,
181
+ firstRound,
182
+ lastRound,
183
+ genesisID: testnet.genesisID,
184
+ genesisHash: testnet.genesisHash,
185
+ }, reKeyTo);
186
+ algoTxn.fee = fee;
187
+ algoTxn.flatFee = true;
188
+ algoTxn.addLease(lease);
189
+ it('should assign all decoded fields into transaction builder', () => {
190
+ txnBuilder.fromImplementation(algosdk_1.default.encodeUnsignedTransaction(algoTxn));
191
+ (0, should_1.default)(txnBuilder.getFee()).equal(fee);
192
+ (0, should_1.default)(txnBuilder.getSender()).equal(from);
193
+ (0, should_1.default)(txnBuilder.getGenesisHash()).equal(testnet.genesisHash);
194
+ (0, should_1.default)(txnBuilder.getGenesisId()).equal(testnet.genesisID);
195
+ (0, should_1.default)(txnBuilder.getFirstRound()).equal(firstRound);
196
+ (0, should_1.default)(txnBuilder.getLastRound()).equal(lastRound);
197
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
198
+ (0, should_1.default)(Buffer.from(txnBuilder.getLease()).toString('hex')).equal(Buffer.from(lease).toString('hex'));
199
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
200
+ (0, should_1.default)(Buffer.from(txnBuilder.getNote()).toString('hex')).equal(Buffer.from(note).toString('hex'));
201
+ (0, should_1.default)(txnBuilder.getReKeyTo()).equal(reKeyTo);
202
+ (0, should_1.default)(txnBuilder.getTransaction().getAlgoTransaction()).not.be.undefined();
203
+ });
204
+ it('should assign signers into transaction builder', () => {
205
+ sinon_1.default.stub(lib_1.algoUtils, 'decodeAlgoTxn').callsFake((txnBytes) => {
206
+ return {
207
+ rawTransaction: Buffer.from([]),
208
+ signed: true,
209
+ signers: [
210
+ '25NJQAMCWEFLPVKL73J4SZAHHIHOC4XT3KTCGJNPAINGR5YHKENMEF5QTE',
211
+ '7RI43DTCDCQ2HDNEP3IAEMHQLAEBN3ITXIZQHLC55OIRKSEQQAS52OYKJE',
212
+ ],
213
+ txn: algoTxn,
214
+ };
215
+ });
216
+ txnBuilder.fromImplementation(algosdk_1.default.encodeUnsignedTransaction(algoTxn));
217
+ (0, should_1.default)(txnBuilder.getTransaction().signers).deepEqual([
218
+ '25NJQAMCWEFLPVKL73J4SZAHHIHOC4XT3KTCGJNPAINGR5YHKENMEF5QTE',
219
+ '7RI43DTCDCQ2HDNEP3IAEMHQLAEBN3ITXIZQHLC55OIRKSEQQAS52OYKJE',
220
+ ]);
221
+ sinon_1.default.restore();
222
+ });
223
+ it('transaction builder should fail when signers are incorrect', () => {
224
+ sinon_1.default.stub(lib_1.algoUtils, 'decodeAlgoTxn').callsFake((txnBytes) => {
225
+ return {
226
+ rawTransaction: Buffer.from([]),
227
+ signed: true,
228
+ signers: [
229
+ '25NJQAMCWEFLPVKL73J4SZAHHIHOC4XT3KTCGJNPAINGR5YHKENMEF5AAA',
230
+ '7RI43DTCDCQ2HDNEP3IAEMHQLAEBN3ITXIZQHLC55OIRKSEQQAS52OYKJE',
231
+ ],
232
+ txn: algoTxn,
233
+ };
234
+ });
235
+ (0, should_1.default)(() => txnBuilder.fromImplementation(algosdk_1.default.encodeUnsignedTransaction(algoTxn))).throw("The address '25NJQAMCWEFLPVKL73J4SZAHHIHOC4XT3KTCGJNPAINGR5YHKENMEF5AAA' is not a well-formed algorand address");
236
+ sinon_1.default.restore();
237
+ });
238
+ it('should not sign the transaction', () => {
239
+ const txn = txnBuilder.getTransaction();
240
+ txn.setAlgoTransaction(algoTxn);
241
+ txn.setNumberOfRequiredSigners(1);
242
+ assert_1.default.throws(() => txnBuilder.signImplementation({ key: Buffer.from(account1.prvKey).toString('hex') }), new RegExp('Invalid base32 characters'));
243
+ });
244
+ it('should sign the transaction', () => {
245
+ const { prv, pub } = new lib_1.KeyPair().recordKeysFromPrivateKeyInProtocolFormat(account1.prvKey);
246
+ const prvKey = lib_1.algoUtils.encodeSeed(Buffer.from(prv + pub));
247
+ const txn = txnBuilder.getTransaction();
248
+ txn.setAlgoTransaction(algoTxn);
249
+ txn.setNumberOfRequiredSigners(1);
250
+ should_1.default.doesNotThrow(() => txnBuilder.signImplementation({ key: prvKey }));
251
+ });
252
+ });
253
+ describe('transaction validation', () => {
254
+ it('should validate a normal transaction', () => {
255
+ txnBuilder
256
+ .fee({ fee: '1000' })
257
+ .isFlatFee(true)
258
+ .firstRound(1)
259
+ .lastRound(10)
260
+ .sender({ address: account1.address })
261
+ .genesisId(testnet.genesisID)
262
+ .genesisHash(testnet.genesisHash);
263
+ should_1.default.doesNotThrow(() => txnBuilder.validateTransaction(txnBuilder.getTransaction()));
264
+ });
265
+ it('should validate last round is after first round', () => {
266
+ txnBuilder
267
+ .fee({ fee: '1000' })
268
+ .isFlatFee(true)
269
+ .firstRound(10)
270
+ .lastRound(1)
271
+ .sender({ address: account1.address })
272
+ .genesisId(testnet.genesisID)
273
+ .genesisHash(testnet.genesisHash);
274
+ assert_1.default.throws(() => txnBuilder.validateTransaction(txnBuilder.getTransaction()), new RegExp('Transaction validation failed: "value" failed custom validation because lastRound cannot be greater than or equal to firstRound'));
275
+ });
276
+ it('should build a normal transaction with correct signers', () => {
277
+ txnBuilder
278
+ .fee({ fee: '1000' })
279
+ .isFlatFee(true)
280
+ .firstRound(1)
281
+ .lastRound(10)
282
+ .sender({ address: account1.address })
283
+ .setSigners([
284
+ '25NJQAMCWEFLPVKL73J4SZAHHIHOC4XT3KTCGJNPAINGR5YHKENMEF5QTE',
285
+ '7RI43DTCDCQ2HDNEP3IAEMHQLAEBN3ITXIZQHLC55OIRKSEQQAS52OYKJE',
286
+ ])
287
+ .genesisId(testnet.genesisID)
288
+ .genesisHash(testnet.genesisHash);
289
+ (0, should_1.default)(txnBuilder.getTransaction().signers).deepEqual([
290
+ '25NJQAMCWEFLPVKL73J4SZAHHIHOC4XT3KTCGJNPAINGR5YHKENMEF5QTE',
291
+ '7RI43DTCDCQ2HDNEP3IAEMHQLAEBN3ITXIZQHLC55OIRKSEQQAS52OYKJE',
292
+ ]);
293
+ });
294
+ it('should not build a normal transaction with incorrect signers', () => {
295
+ (0, should_1.default)(() => txnBuilder
296
+ .fee({ fee: '1000' })
297
+ .isFlatFee(true)
298
+ .firstRound(1)
299
+ .lastRound(10)
300
+ .sender({ address: account1.address })
301
+ .setSigners([
302
+ '25NJQAMCWEFLPVKL73J4SZAHHIHOC4XT3KTCGJNPAINGR5YHKENMEF5AAA',
303
+ '7RI43DTCDCQ2HDNEP3IAEMHQLAEBN3ITXIZQHLC55OIRKSEQQAS52OYKJE',
304
+ ])
305
+ .genesisId(testnet.genesisID)
306
+ .genesisHash(testnet.genesisHash)).throw("The address '25NJQAMCWEFLPVKL73J4SZAHHIHOC4XT3KTCGJNPAINGR5YHKENMEF5AAA' is not a well-formed algorand address");
307
+ });
308
+ });
309
+ });
310
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Rlc3QvdW5pdC9saWIvdHJhbnNhY3Rpb25CdWlsZGVyL2Jhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsNENBQStEO0FBQy9ELHNEQUE4QjtBQUM5QixvREFBNEI7QUFDNUIsb0RBQTRCO0FBQzVCLCtDQUFxRDtBQUNyRCw2Q0FNNkI7QUFHN0IsMkVBQTZEO0FBSTdELE1BQU0sbUNBQW1DLEdBQUcsQ0FBQyxDQUFDO0FBRTlDLE1BQU0sc0JBQXVCLFNBQVEsd0JBQWtCO0lBQ3JELFlBQVksVUFBZ0M7UUFDMUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3BCLENBQUM7SUFFRCxNQUFNO1FBQ0osT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQ25CLENBQUM7SUFFRCxTQUFTO1FBQ1AsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3RCLENBQUM7SUFFRCxjQUFjO1FBQ1osT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO0lBQzNCLENBQUM7SUFFRCxZQUFZO1FBQ1YsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO0lBQ3pCLENBQUM7SUFFRCxhQUFhO1FBQ1gsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQzFCLENBQUM7SUFFRCxZQUFZO1FBQ1YsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO0lBQ3pCLENBQUM7SUFFRCxRQUFRO1FBQ04sT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3JCLENBQUM7SUFFRCxPQUFPO1FBQ0wsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3BCLENBQUM7SUFFRCxVQUFVO1FBQ1IsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxXQUFXO1FBQ1QsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFD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R0FBRyxFQUFFLENBQ1YsVUFBVTtpQkFDUCxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLENBQUM7aUJBQ3BCLFNBQVMsQ0FBQyxJQUFJLENBQUM7aUJBQ2YsVUFBVSxDQUFDLENBQUMsQ0FBQztpQkFDYixTQUFTLENBQUMsRUFBRSxDQUFDO2lCQUNiLE1BQU0sQ0FBQyxFQUFFLE9BQU8sRUFBRSxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUM7aUJBQ3JDLFVBQVUsQ0FBQztnQkFDViw0REFBNEQ7Z0JBQzVELDREQUE0RDthQUM3RCxDQUFDO2lCQUNELFNBQVMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDO2lCQUM1QixXQUFXLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUNwQyxDQUFDLEtBQUssQ0FDTCxnSEFBZ0gsQ0FDakgsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjcnlwdG8gZnJvbSAnY3J5cHRvJztcbmltcG9ydCB7IEJhc2VDb2luIGFzIENvaW5Db25maWcsIGNvaW5zIH0gZnJvbSAnQGJpdGdvL3N0YXRpY3MnO1xuaW1wb3J0IGFsZ29zZGsgZnJvbSAnYWxnb3Nkayc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgc2hvdWxkIGZyb20gJ3Nob3VsZCc7XG5pbXBvcnQgc2lub24sIHsgYXNzZXJ0IGFzIFNpbm9uQXNzZXJ0IH0gZnJvbSAnc2lub24nO1xuaW1wb3J0IHtcbiAgQWRkcmVzc1ZhbGlkYXRpb25FcnJvcixcbiAgSW5zdWZmaWNpZW50RmVlRXJyb3IsXG4gIEtleVBhaXIsXG4gIFRyYW5zYWN0aW9uQnVpbGRlcixcbiAgYWxnb1V0aWxzLFxufSBmcm9tICcuLi8uLi8uLi8uLi9zcmMvbGliJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uIH0gZnJvbSAnLi4vLi4vLi4vLi4vc3JjL2xpYi90cmFuc2FjdGlvbic7XG5cbmltcG9ydCAqIGFzIEFsZ29SZXNvdXJjZXMgZnJvbSAnLi4vLi4vLi4vZml4dHVyZXMvcmVzb3VyY2VzJztcbmltcG9ydCB7IEJhc2VLZXksIFRyYW5zYWN0aW9uVHlwZSB9IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQgeyBFbmNvZGVkVHggfSBmcm9tICcuLi8uLi8uLi8uLi9zcmMvbGliL2lmYWNlcyc7XG5cbmNvbnN0IFNUQU5EQVJEX1JFUVVJUkVEX05VTUJFUl9PRl9TSUdORVJTID0gMjtcblxuY2xhc3MgU3R1YlRyYW5zYWN0aW9uQnVpbGRlciBleHRlbmRzIFRyYW5zYWN0aW9uQnVpbGRlciB7XG4gIGNvbnN0cnVjdG9yKGNvaW5Db25maWc6IFJlYWRvbmx5PENvaW5Db25maWc+KSB7XG4gICAgc3VwZXIoY29pbkNvbmZpZyk7XG4gIH1cblxuICBnZXRGZWUoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fZmVlO1xuICB9XG5cbiAgZ2V0U2VuZGVyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3NlbmRlcjtcbiAgfVxuXG4gIGdldEdlbmVzaXNIYXNoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2dlbmVzaXNIYXNoO1xuICB9XG5cbiAgZ2V0R2VuZXNpc0lkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2dlbmVzaXNJZDtcbiAgfVxuXG4gIGdldEZpcnN0Um91bmQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fZmlyc3RSb3VuZDtcbiAgfVxuXG4gIGdldExhc3RSb3VuZCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9sYXN0Um91bmQ7XG4gIH1cblxuICBnZXRMZWFzZSgpOiBVaW50OEFycmF5IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fbGVhc2U7XG4gIH1cblxuICBnZXROb3RlKCk6IFVpbnQ4QXJyYXkgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9ub3RlO1xuICB9XG5cbiAgZ2V0UmVLZXlUbygpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9yZUtleVRvO1xuICB9XG5cbiAgZ2V0S2V5UGFpcnMoKTogS2V5UGFpcltdIHtcbiAgICByZXR1cm4gdGhpcy5fa2V5UGFpcnM7XG4gIH1cblxuICBnZXRUcmFuc2FjdGlvbigpOiBUcmFuc2FjdGlvbiB7XG4gICAgcmV0dXJuIHRoaXMuX3RyYW5zYWN0aW9uO1xuICB9XG5cbiAgYnVpbGRJbXBsZW1lbnRhdGlvbigpOiBQcm9taXNlPFRyYW5zYWN0aW9uPiB7XG4gICAgcmV0dXJuIHN1cGVyLmJ1aWxkSW1wbGVtZW50YXRpb24oKTtcbiAgfVxuXG4gIGZyb21JbXBsZW1lbnRhdGlvbihyYXdUcmFuc2FjdGlvbjogVWludDhBcnJheSB8IHN0cmluZyk6IFRyYW5zYWN0aW9uIHtcbiAgICByZXR1cm4gc3VwZXIuZnJvbUltcGxlbWVudGF0aW9uKHJhd1RyYW5zYWN0aW9uKTtcbiAgfVxuXG4gIHNpZ25JbXBsZW1lbnRhdGlvbihrZXk6IEJhc2VLZXkpOiBUcmFuc2FjdGlvbiB7XG4gICAgcmV0dXJuIHN1cGVyLnNpZ25JbXBsZW1lbnRhdGlvbihrZXkpO1xuICB9XG5cbiAgZ2V0U3VnZ2VzdGVkUGFyYW1zKCk6IGFsZ29zZGsuU3VnZ2VzdGVkUGFyYW1zIHtcbiAgICByZXR1cm4gdGhpcy5zdWdnZXN0ZWRQYXJhbXM7XG4gIH1cblxuICBwcm90ZWN0ZWQgYnVpbGRBbGdvVHhuKCk6IGFsZ29zZGsuVHJhbnNhY3Rpb24ge1xuICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0IHRyYW5zYWN0aW9uVHlwZSgpOiBUcmFuc2FjdGlvblR5cGUge1xuICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKTtcbiAgfVxufVxuXG5kZXNjcmliZSgnQWxnbyBUcmFuc2FjdGlvbiBCdWlsZGVyJywgKCkgPT4ge1xuICBsZXQgdHhuQnVpbGRlcjogU3R1YlRyYW5zYWN0aW9uQnVpbGRlcjtcbiAgY29uc3Qge1xuICAgIGFjY291bnRzOiB7IGFjY291bnQxLCBhY2NvdW50MiwgYWNjb3VudDMgfSxcbiAgICBuZXR3b3JrczogeyB0ZXN0bmV0IH0sXG4gIH0gPSBBbGdvUmVzb3VyY2VzO1xuXG4gIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgIGNvbnN0IGNvbmZpZyA9IGNvaW5zLmdldCgnYWxnbycpO1xuICAgIHR4bkJ1aWxkZXIgPSBuZXcgU3R1YlRyYW5zYWN0aW9uQnVpbGRlcihjb25maWcpO1xuICB9KTtcblxuICBkZXNjcmliZSgnc2V0dGVyIHZhbGlkYXRpb24nLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBmZWUgaXMgbm90IGx0IDEwMDAgbWljcm9hbGdvcyBpZiBmbGF0IGZlZSBpcyBzZXQgdG8gdHJ1ZScsICgpID0+IHtcbiAgICAgIHR4bkJ1aWxkZXIuaXNGbGF0RmVlKHRydWUpO1xuXG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiB0eG5CdWlsZGVyLmZlZSh7IGZlZTogJzk5OScgfSksXG4gICAgICAgIChlOiBFcnJvcikgPT4gZS5uYW1lID09PSBJbnN1ZmZpY2llbnRGZWVFcnJvci5uYW1lXG4gICAgICApO1xuICAgICAgc2hvdWxkLmRvZXNOb3RUaHJvdygoKSA9PiB0eG5CdWlsZGVyLmZlZSh7IGZlZTogJzEwMDAnIH0pKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgc2VuZGVyIGFkZHJlc3MgaXMgYSB2YWxpZCBhbGdvIGFkZHJlc3MnLCAoKSA9PiB7XG4gICAgICBjb25zdCBzcHkgPSBzaW5vbi5zcHkodHhuQnVpbGRlciwgJ3ZhbGlkYXRlQWRkcmVzcycpO1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4gdHhuQnVpbGRlci5zZW5kZXIoeyBhZGRyZXNzOiAnYXNkZicgfSksXG4gICAgICAgIChlOiBFcnJvcikgPT4gZS5uYW1lID09PSBBZGRyZXNzVmFsaWRhdGlvbkVycm9yLm5hbWVcbiAgICAgICk7XG4gICAgICBzaG91bGQuZG9lc05vdFRocm93KCgpID0+IHR4bkJ1aWxkZXIuc2VuZGVyKHsgYWRkcmVzczogYWNjb3VudDEuYWRkcmVzcyB9KSk7XG4gICAgICBTaW5vbkFzc2VydC5jYWxsZWRUd2ljZShzcHkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBudW1iZXIgb2Ygc2lnbmVycyBpcyBub3QgbGVzcyB0aGFuIDAnLCAoKSA9PiB7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHR4bkJ1aWxkZXIubnVtYmVyT2ZSZXF1aXJlZFNpZ25lcnMoLTEpLCAvTnVtYmVyIG9mIHNpZ25lcnM6ICctMScgY2Fubm90IGJlIG5lZ2F0aXZlLyk7XG5cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgU1RBTkRBUkRfUkVRVUlSRURfTlVNQkVSX09GX1NJR05FUlM7IGkrKykge1xuICAgICAgICBzaG91bGQuZG9lc05vdFRocm93KCgpID0+IHR4bkJ1aWxkZXIubnVtYmVyT2ZSZXF1aXJlZFNpZ25lcnMoaSkpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnc3VnZ2VzdGVkIHBhcmFtcyB2ZXJpZmljYXRpb24nLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCByZXRyaWV2ZSB0aGUgc3VnZ2VzdGVkIHBhcmFtZXRlcnMgYXMgdGhleSBoYXZlIGJlZW4gc2V0JywgKCkgPT4ge1xuICAgICAgY29uc3QgaXNGbGF0RmVlID0gdHJ1ZTtcbiAgICAgIGNvbnN0IGZlZSA9IDEwMDA7XG4gICAgICBjb25zdCBmaXJzdFJvdW5kID0gMTtcbiAgICAgIGNvbnN0IGxhc3RSb3VuZCA9IDEwO1xuICAgICAgY29uc3QgZ2VuZXNpc0lkID0gJ3Rlc3RuZXQtdjEuMCc7XG4gICAgICBjb25zdCBnZW5lc2lzSGFzaCA9ICdTR08xR0tTenlFN0lFUEl0VHhDQnl3OXg4Rm1uckNEZXhpOS9jT1VKT2lJPSc7XG5cbiAgICAgIHR4bkJ1aWxkZXJcbiAgICAgICAgLmlzRmxhdEZlZShpc0ZsYXRGZWUpXG4gICAgICAgIC5mZWUoeyBmZWU6IGZlZS50b1N0cmluZygpIH0pXG4gICAgICAgIC5maXJzdFJvdW5kKGZpcnN0Um91bmQpXG4gICAgICAgIC5sYXN0Um91bmQobGFzdFJvdW5kKVxuICAgICAgICAuZ2VuZXNpc0lkKGdlbmVzaXNJZClcbiAgICAgICAgLmdlbmVzaXNIYXNoKGdlbmVzaXNIYXNoKTtcblxuICAgICAgY29uc3Qgc3VnZ2VzdGVkUGFyYW1zID0gdHhuQnVpbGRlci5nZXRTdWdnZXN0ZWRQYXJhbXMoKTtcbiAgICAgIHNob3VsZC5lcXVhbChpc0ZsYXRGZWUsIHN1Z2dlc3RlZFBhcmFtcy5mbGF0RmVlKTtcbiAgICAgIHNob3VsZC5lcXVhbChmZWUsIHN1Z2dlc3RlZFBhcmFtcy5mZWUpO1xuICAgICAgc2hvdWxkLmVxdWFsKGZpcnN0Um91bmQsIHN1Z2dlc3RlZFBhcmFtcy5maXJzdFJvdW5kKTtcbiAgICAgIHNob3VsZC5lcXVhbChsYXN0Um91bmQsIHN1Z2dlc3RlZFBhcmFtcy5sYXN0Um91bmQpO1xuICAgICAgc2hvdWxkLmVxdWFsKGdlbmVzaXNJZCwgc3VnZ2VzdGVkUGFyYW1zLmdlbmVzaXNJRCk7XG4gICAgICBzaG91bGQuZXF1YWwoZ2VuZXNpc0hhc2gsIHN1Z2dlc3RlZFBhcmFtcy5nZW5lc2lzSGFzaCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdwcml2YXRlIGtleSB2YWxpZGF0aW9uJywgKCkgPT4ge1xuICAgIGl0KCd2YWxpZGF0ZXMgYnl0ZSBhcnJheXMnLCAoKSA9PiB7XG4gICAgICBzaG91bGQuZG9lc05vdFRocm93KCgpID0+IHR4bkJ1aWxkZXIudmFsaWRhdGVLZXkoeyBrZXk6IGFjY291bnQxLnNlY3JldEtleSB9KSk7XG4gICAgfSk7XG5cbiAgICBpdCgndmFsaWRhdGVzIGhleCBlbmNvZGVkIHN0cmluZ3MnLCAoKSA9PiB7XG4gICAgICBzaG91bGQuZG9lc05vdFRocm93KCgpID0+IHR4bkJ1aWxkZXIudmFsaWRhdGVLZXkoeyBrZXk6IGFjY291bnQxLnNlY3JldEtleS50b1N0cmluZygnaGV4JykgfSkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3ZhbGlkYXRlcyBiYXNlNjQgZW5jb2RlZCBzdHJpbmdzJywgKCkgPT4ge1xuICAgICAgc2hvdWxkLmRvZXNOb3RUaHJvdygoKSA9PiB0eG5CdWlsZGVyLnZhbGlkYXRlS2V5KHsga2V5OiBhY2NvdW50MS5zZWNyZXRLZXkudG9TdHJpbmcoJ2Jhc2U2NCcpIH0pKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2ltcGxlbWVudGF0aW9uIGZ1bmN0aW9ucycsICgpID0+IHtcbiAgICBjb25zdCB0byA9IGFjY291bnQxLmFkZHJlc3M7XG4gICAgY29uc3QgZnJvbSA9IGFjY291bnQyLmFkZHJlc3M7XG4gICAgY29uc3QgcmVLZXlUbyA9IGFjY291bnQzLmFkZHJlc3M7XG4gICAgY29uc3QgYW1vdW50ID0gMTAwMDtcbiAgICBjb25zdCBmaXJzdFJvdW5kID0gMTtcbiAgICBjb25zdCBsYXN0Um91bmQgPSAxMDtcbiAgICBjb25zdCBjbG9zZVJlbWFpbmRlclRvID0gYWNjb3VudDMuYWRkcmVzcztcblxuICAgIC8vIFVpbnQ4YXJyYXkgY29udmVyc2lvbiByZXF1aXJlZCBiZWNhdXNlIGFsZ29zZGsgY2hlY2tzIGlmIHRoZSBjb25zdHJ1Y3RvclxuICAgIC8vIGlzIFVpbnQ4QXJyYXkuXG4gICAgY29uc3QgbGVhc2UgPSBuZXcgVWludDhBcnJheShjcnlwdG8ucmFuZG9tQnl0ZXMoMzIpKTtcbiAgICBjb25zdCBub3RlID0gbmV3IFVpbnQ4QXJyYXkoQnVmZmVyLmZyb20oJ25vdGUnLCAndXRmLTgnKSk7XG5cbiAgICBjb25zdCBmZWUgPSAxMDAwO1xuXG4gICAgY29uc3QgYWxnb1R4biA9IGFsZ29zZGsubWFrZVBheW1lbnRUeG5XaXRoU3VnZ2VzdGVkUGFyYW1zKFxuICAgICAgZnJvbSxcbiAgICAgIHRvLFxuICAgICAgYW1vdW50LFxuICAgICAgY2xvc2VSZW1haW5kZXJUbyxcbiAgICAgIG5vdGUsXG4gICAgICB7XG4gICAgICAgIGZlZSxcbiAgICAgICAgZmxhdEZlZTogdHJ1ZSxcbiAgICAgICAgZmlyc3RSb3VuZCxcbiAgICAgICAgbGFzdFJvdW5kLFxuICAgICAgICBnZW5lc2lzSUQ6IHRlc3RuZXQuZ2VuZXNpc0lELFxuICAgICAgICBnZW5lc2lzSGFzaDogdGVzdG5ldC5nZW5lc2lzSGFzaCxcbiAgICAgIH0sXG4gICAgICByZUtleVRvXG4gICAgKTtcbiAgICBhbGdvVHhuLmZlZSA9IGZlZTtcbiAgICBhbGdvVHhuLmZsYXRGZWUgPSB0cnVlO1xuICAgIGFsZ29UeG4uYWRkTGVhc2UobGVhc2UpO1xuXG4gICAgaXQoJ3Nob3VsZCBhc3NpZ24gYWxsIGRlY29kZWQgZmllbGRzIGludG8gdHJhbnNhY3Rpb24gYnVpbGRlcicsICgpID0+IHtcbiAgICAgIHR4bkJ1aWxkZXIuZnJvbUltcGxlbWVudGF0aW9uKGFsZ29zZGsuZW5jb2RlVW5zaWduZWRUcmFuc2FjdGlvbihhbGdvVHhuKSk7XG5cbiAgICAgIHNob3VsZCh0eG5CdWlsZGVyLmdldEZlZSgpKS5lcXVhbChmZWUpO1xuICAgICAgc2hvdWxkKHR4bkJ1aWxkZXIuZ2V0U2VuZGVyKCkpLmVxdWFsKGZyb20pO1xuICAgICAgc2hvdWxkKHR4bkJ1aWxkZXIuZ2V0R2VuZXNpc0hhc2goKSkuZXF1YWwodGVzdG5ldC5nZW5lc2lzSGFzaCk7XG4gICAgICBzaG91bGQodHhuQnVpbGRlci5nZXRHZW5lc2lzSWQoKSkuZXF1YWwodGVzdG5ldC5nZW5lc2lzSUQpO1xuICAgICAgc2hvdWxkKHR4bkJ1aWxkZXIuZ2V0Rmlyc3RSb3VuZCgpKS5lcXVhbChmaXJzdFJvdW5kKTtcbiAgICAgIHNob3VsZCh0eG5CdWlsZGVyLmdldExhc3RSb3VuZCgpKS5lcXVhbChsYXN0Um91bmQpO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1ub24tbnVsbC1hc3NlcnRpb25cbiAgICAgIHNob3VsZChCdWZmZXIuZnJvbSh0eG5CdWlsZGVyLmdldExlYXNlKCkhKS50b1N0cmluZygnaGV4JykpLmVxdWFsKEJ1ZmZlci5mcm9tKGxlYXNlKS50b1N0cmluZygnaGV4JykpO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1ub24tbnVsbC1hc3NlcnRpb25cbiAgICAgIHNob3VsZChCdWZmZXIuZnJvbSh0eG5CdWlsZGVyLmdldE5vdGUoKSEpLnRvU3RyaW5nKCdoZXgnKSkuZXF1YWwoQnVmZmVyLmZyb20obm90ZSkudG9TdHJpbmcoJ2hleCcpKTtcbiAgICAgIHNob3VsZCh0eG5CdWlsZGVyLmdldFJlS2V5VG8oKSkuZXF1YWwocmVLZXlUbyk7XG5cbiAgICAgIHNob3VsZCh0eG5CdWlsZGVyLmdldFRyYW5zYWN0aW9uKCkuZ2V0QWxnb1RyYW5zYWN0aW9uKCkpLm5vdC5iZS51bmRlZmluZWQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYXNzaWduIHNpZ25lcnMgaW50byB0cmFuc2FjdGlvbiBidWlsZGVyJywgKCkgPT4ge1xuICAgICAgc2lub24uc3R1YihhbGdvVXRpbHMsICdkZWNvZGVBbGdvVHhuJykuY2FsbHNGYWtlKCh0eG5CeXRlczogVWludDhBcnJheSB8IHN0cmluZyk6IEVuY29kZWRUeCA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgcmF3VHJhbnNhY3Rpb246IEJ1ZmZlci5mcm9tKFtdKSxcbiAgICAgICAgICBzaWduZWQ6IHRydWUsXG4gICAgICAgICAgc2lnbmVyczogW1xuICAgICAgICAgICAgJzI1TkpRQU1DV0VGTFBWS0w3M0o0U1pBSEhJSE9DNFhUM0tUQ0dKTlBBSU5HUjVZSEtFTk1FRjVRVEUnLFxuICAgICAgICAgICAgJzdSSTQzRFRDRENRMkhETkVQM0lBRU1IUUxBRUJOM0lUWElaUUhMQzU1T0lSS1NFUVFBUzUyT1lLSkUnLFxuICAgICAgICAgIF0sXG4gICAgICAgICAgdHhuOiBhbGdvVHhuLFxuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgICB0eG5CdWlsZGVyLmZyb21JbXBsZW1lbnRhdGlvbihhbGdvc2RrLmVuY29kZVVuc2lnbmVkVHJhbnNhY3Rpb24oYWxnb1R4bikpO1xuICAgICAgc2hvdWxkKHR4bkJ1aWxkZXIuZ2V0VHJhbnNhY3Rpb24oKS5zaWduZXJzKS5kZWVwRXF1YWwoW1xuICAgICAgICAnMjVOSlFBTUNXRUZMUFZLTDczSjRTWkFISElIT0M0WFQzS1RDR0pOUEFJTkdSNVlIS0VOTUVGNVFURScsXG4gICAgICAgICc3Ukk0M0RUQ0RDUTJIRE5FUDNJQUVNSFFMQUVCTjNJVFhJWlFITEM1NU9JUktTRVFRQVM1Mk9ZS0pFJyxcbiAgICAgIF0pO1xuICAgICAgc2lub24ucmVzdG9yZSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3RyYW5zYWN0aW9uIGJ1aWxkZXIgc2hvdWxkIGZhaWwgd2hlbiBzaWduZXJzIGFyZSBpbmNvcnJlY3QnLCAoKSA9PiB7XG4gICAgICBzaW5vbi5zdHViKGFsZ29VdGlscywgJ2RlY29kZUFsZ29UeG4nKS5jYWxsc0Zha2UoKHR4bkJ5dGVzOiBVaW50OEFycmF5IHwgc3RyaW5nKTogRW5jb2RlZFR4ID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICByYXdUcmFuc2FjdGlvbjogQnVmZmVyLmZyb20oW10pLFxuICAgICAgICAgIHNpZ25lZDogdHJ1ZSxcbiAgICAgICAgICBzaWduZXJzOiBbXG4gICAgICAgICAgICAnMjVOSlFBTUNXRUZMUFZLTDczSjRTWkFISElIT0M0WFQzS1RDR0pOUEFJTkdSNVlIS0VOTUVGNUFBQScsXG4gICAgICAgICAgICAnN1JJNDNEVENEQ1EySERORVAzSUFFTUhRTEFFQk4zSVRYSVpRSExDNTVPSVJLU0VRUUFTNTJPWUtKRScsXG4gICAgICAgICAgXSxcbiAgICAgICAgICB0eG46IGFsZ29UeG4sXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICAgIHNob3VsZCgoKSA9PiB0eG5CdWlsZGVyLmZyb21JbXBsZW1lbnRhdGlvbihhbGdvc2RrLmVuY29kZVVuc2lnbmVkVHJhbnNhY3Rpb24oYWxnb1R4bikpKS50aHJvdyhcbiAgICAgICAgXCJUaGUgYWRkcmVzcyAnMjVOSlFBTUNXRUZMUFZLTDczSjRTWkFISElIT0M0WFQzS1RDR0pOUEFJTkdSNVlIS0VOTUVGNUFBQScgaXMgbm90IGEgd2VsbC1mb3JtZWQgYWxnb3JhbmQgYWRkcmVzc1wiXG4gICAgICApO1xuICAgICAgc2lub24ucmVzdG9yZSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBub3Qgc2lnbiB0aGUgdHJhbnNhY3Rpb24nLCAoKSA9PiB7XG4gICAgICBjb25zdCB0eG4gPSB0eG5CdWlsZGVyLmdldFRyYW5zYWN0aW9uKCk7XG4gICAgICB0eG4uc2V0QWxnb1RyYW5zYWN0aW9uKGFsZ29UeG4pO1xuICAgICAgdHhuLnNldE51bWJlck9mUmVxdWlyZWRTaWduZXJzKDEpO1xuXG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiB0eG5CdWlsZGVyLnNpZ25JbXBsZW1lbnRhdGlvbih7IGtleTogQnVmZmVyLmZyb20oYWNjb3VudDEucHJ2S2V5KS50b1N0cmluZygnaGV4JykgfSksXG4gICAgICAgIG5ldyBSZWdFeHAoJ0ludmFsaWQgYmFzZTMyIGNoYXJhY3RlcnMnKVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgc2lnbiB0aGUgdHJhbnNhY3Rpb24nLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IHBydiwgcHViIH0gPSBuZXcgS2V5UGFpcigpLnJlY29yZEtleXNGcm9tUHJpdmF0ZUtleUluUHJvdG9jb2xGb3JtYXQoYWNjb3VudDEucHJ2S2V5KTtcbiAgICAgIGNvbnN0IHBydktleSA9IGFsZ29VdGlscy5lbmNvZGVTZWVkKEJ1ZmZlci5mcm9tKHBydiArIHB1YikpO1xuICAgICAgY29uc3QgdHhuID0gdHhuQnVpbGRlci5nZXRUcmFuc2FjdGlvbigpO1xuICAgICAgdHhuLnNldEFsZ29UcmFuc2FjdGlvbihhbGdvVHhuKTtcbiAgICAgIHR4bi5zZXROdW1iZXJPZlJlcXVpcmVkU2lnbmVycygxKTtcblxuICAgICAgc2hvdWxkLmRvZXNOb3RUaHJvdygoKSA9PiB0eG5CdWlsZGVyLnNpZ25JbXBsZW1lbnRhdGlvbih7IGtleTogcHJ2S2V5IH0pKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3RyYW5zYWN0aW9uIHZhbGlkYXRpb24nLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBhIG5vcm1hbCB0cmFuc2FjdGlvbicsICgpID0+IHtcbiAgICAgIHR4bkJ1aWxkZXJcbiAgICAgICAgLmZlZSh7IGZlZTogJzEwMDAnIH0pXG4gICAgICAgIC5pc0ZsYXRGZWUodHJ1ZSlcbiAgICAgICAgLmZpcnN0Um91bmQoMSlcbiAgICAgICAgLmxhc3RSb3VuZCgxMClcbiAgICAgICAgLnNlbmRlcih7IGFkZHJlc3M6IGFjY291bnQxLmFkZHJlc3MgfSlcbiAgICAgICAgLmdlbmVzaXNJZCh0ZXN0bmV0LmdlbmVzaXNJRClcbiAgICAgICAgLmdlbmVzaXNIYXNoKHRlc3RuZXQuZ2VuZXNpc0hhc2gpO1xuXG4gICAgICBzaG91bGQuZG9lc05vdFRocm93KCgpID0+IHR4bkJ1aWxkZXIudmFsaWRhdGVUcmFuc2FjdGlvbih0eG5CdWlsZGVyLmdldFRyYW5zYWN0aW9uKCkpKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgbGFzdCByb3VuZCBpcyBhZnRlciBmaXJzdCByb3VuZCcsICgpID0+IHtcbiAgICAgIHR4bkJ1aWxkZXJcbiAgICAgICAgLmZlZSh7IGZlZTogJzEwMDAnIH0pXG4gICAgICAgIC5pc0ZsYXRGZWUodHJ1ZSlcbiAgICAgICAgLmZpcnN0Um91bmQoMTApXG4gICAgICAgIC5sYXN0Um91bmQoMSlcbiAgICAgICAgLnNlbmRlcih7IGFkZHJlc3M6IGFjY291bnQxLmFkZHJlc3MgfSlcbiAgICAgICAgLmdlbmVzaXNJZCh0ZXN0bmV0LmdlbmVzaXNJRClcbiAgICAgICAgLmdlbmVzaXNIYXNoKHRlc3RuZXQuZ2VuZXNpc0hhc2gpO1xuXG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiB0eG5CdWlsZGVyLnZhbGlkYXRlVHJhbnNhY3Rpb24odHhuQnVpbGRlci5nZXRUcmFuc2FjdGlvbigpKSxcbiAgICAgICAgbmV3IFJlZ0V4cChcbiAgICAgICAgICAnVHJhbnNhY3Rpb24gdmFsaWRhdGlvbiBmYWlsZWQ6IFwidmFsdWVcIiBmYWlsZWQgY3VzdG9tIHZhbGlkYXRpb24gYmVjYXVzZSBsYXN0Um91bmQgY2Fubm90IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBmaXJzdFJvdW5kJ1xuICAgICAgICApXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBidWlsZCBhIG5vcm1hbCB0cmFuc2FjdGlvbiB3aXRoIGNvcnJlY3Qgc2lnbmVycycsICgpID0+IHtcbiAgICAgIHR4bkJ1aWxkZXJcbiAgICAgICAgLmZlZSh7IGZlZTogJzEwMDAnIH0pXG4gICAgICAgIC5pc0ZsYXRGZWUodHJ1ZSlcbiAgICAgICAgLmZpcnN0Um91bmQoMSlcbiAgICAgICAgLmxhc3RSb3VuZCgxMClcbiAgICAgICAgLnNlbmRlcih7IGFkZHJlc3M6IGFjY291bnQxLmFkZHJlc3MgfSlcbiAgICAgICAgLnNldFNpZ25lcnMoW1xuICAgICAgICAgICcyNU5KUUFNQ1dFRkxQVktMNzNKNFNaQUhISUhPQzRYVDNLVENHSk5QQUlOR1I1WUhLRU5NRUY1UVRFJyxcbiAgICAgICAgICAnN1JJNDNEVENEQ1EySERORVAzSUFFTUhRTEFFQk4zSVRYSVpRSExDNTVPSVJLU0VRUUFTNTJPWUtKRScsXG4gICAgICAgIF0pXG4gICAgICAgIC5nZW5lc2lzSWQodGVzdG5ldC5nZW5lc2lzSUQpXG4gICAgICAgIC5nZW5lc2lzSGFzaCh0ZXN0bmV0LmdlbmVzaXNIYXNoKTtcbiAgICAgIHNob3VsZCh0eG5CdWlsZGVyLmdldFRyYW5zYWN0aW9uKCkuc2lnbmVycykuZGVlcEVxdWFsKFtcbiAgICAgICAgJzI1TkpRQU1DV0VGTFBWS0w3M0o0U1pBSEhJSE9DNFhUM0tUQ0dKTlBBSU5HUjVZSEtFTk1FRjVRVEUnLFxuICAgICAgICAnN1JJNDNEVENEQ1EySERORVAzSUFFTUhRTEFFQk4zSVRYSVpRSExDNTVPSVJLU0VRUUFTNTJPWUtKRScsXG4gICAgICBdKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgbm90IGJ1aWxkIGEgbm9ybWFsIHRyYW5zYWN0aW9uIHdpdGggaW5jb3JyZWN0IHNpZ25lcnMnLCAoKSA9PiB7XG4gICAgICBzaG91bGQoKCkgPT5cbiAgICAgICAgdHhuQnVpbGRlclxuICAgICAgICAgIC5mZWUoeyBmZWU6ICcxMDAwJyB9KVxuICAgICAgICAgIC5pc0ZsYXRGZWUodHJ1ZSlcbiAgICAgICAgICAuZmlyc3RSb3VuZCgxKVxuICAgICAgICAgIC5sYXN0Um91bmQoMTApXG4gICAgICAgICAgLnNlbmRlcih7IGFkZHJlc3M6IGFjY291bnQxLmFkZHJlc3MgfSlcbiAgICAgICAgICAuc2V0U2lnbmVycyhbXG4gICAgICAgICAgICAnMjVOSlFBTUNXRUZMUFZLTDczSjRTWkFISElIT0M0WFQzS1RDR0pOUEFJTkdSNVlIS0VOTUVGNUFBQScsXG4gICAgICAgICAgICAnN1JJNDNEVENEQ1EySERORVAzSUFFTUhRTEFFQk4zSVRYSVpRSExDNTVPSVJLU0VRUUFTNTJPWUtKRScsXG4gICAgICAgICAgXSlcbiAgICAgICAgICAuZ2VuZXNpc0lkKHRlc3RuZXQuZ2VuZXNpc0lEKVxuICAgICAgICAgIC5nZW5lc2lzSGFzaCh0ZXN0bmV0LmdlbmVzaXNIYXNoKVxuICAgICAgKS50aHJvdyhcbiAgICAgICAgXCJUaGUgYWRkcmVzcyAnMjVOSlFBTUNXRUZMUFZLTDczSjRTWkFISElIT0M0WFQzS1RDR0pOUEFJTkdSNVlIS0VOTUVGNUFBQScgaXMgbm90IGEgd2VsbC1mb3JtZWQgYWxnb3JhbmQgYWRkcmVzc1wiXG4gICAgICApO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=keyRegistrationBuilder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keyRegistrationBuilder.d.ts","sourceRoot":"","sources":["../../../../../test/unit/lib/transactionBuilder/keyRegistrationBuilder.ts"],"names":[],"mappings":""}