@bitgo/sdk-api 2.0.0-hotfix.0 → 2.1.0
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.
- package/dist/package.json +33 -28
- package/dist/src/api.d.ts +9 -8
- package/dist/src/api.d.ts.map +1 -1
- package/dist/src/api.js +132 -72
- package/dist/src/bitgoAPI.d.ts +366 -22
- package/dist/src/bitgoAPI.d.ts.map +1 -1
- package/dist/src/bitgoAPI.js +1286 -212
- package/dist/src/encrypt.d.ts +16 -6
- package/dist/src/encrypt.d.ts.map +1 -1
- package/dist/src/encrypt.js +92 -14
- package/dist/src/encryptV2.d.ts +68 -0
- package/dist/src/encryptV2.d.ts.map +1 -0
- package/dist/src/encryptV2.js +202 -0
- package/dist/src/encryptionSession.d.ts +34 -0
- package/dist/src/encryptionSession.d.ts.map +1 -0
- package/dist/src/encryptionSession.js +95 -0
- package/dist/src/index.d.ts +2 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +8 -3
- package/dist/src/types.d.ts +195 -65
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/types.js +5 -15
- package/dist/src/util.d.ts +12 -8
- package/dist/src/util.d.ts.map +1 -1
- package/dist/src/util.js +54 -20
- package/dist/src/v1/blockchain.d.ts +5 -0
- package/dist/src/v1/blockchain.d.ts.map +1 -0
- package/dist/src/v1/blockchain.js +127 -0
- package/dist/src/v1/keychains.d.ts +5 -0
- package/dist/src/v1/keychains.d.ts.map +1 -0
- package/dist/src/v1/keychains.js +328 -0
- package/dist/src/v1/markets.d.ts +5 -0
- package/dist/src/v1/markets.d.ts.map +1 -0
- package/dist/src/v1/markets.js +68 -0
- package/dist/src/v1/pendingapproval.d.ts +6 -0
- package/dist/src/v1/pendingapproval.d.ts.map +1 -0
- package/dist/src/v1/pendingapproval.js +361 -0
- package/dist/src/v1/pendingapprovals.d.ts +6 -0
- package/dist/src/v1/pendingapprovals.d.ts.map +1 -0
- package/dist/src/v1/pendingapprovals.js +102 -0
- package/dist/src/v1/signPsbt.d.ts +14 -0
- package/dist/src/v1/signPsbt.d.ts.map +1 -0
- package/dist/src/v1/signPsbt.js +69 -0
- package/dist/src/v1/transactionBuilder.d.ts +5 -0
- package/dist/src/v1/transactionBuilder.d.ts.map +1 -0
- package/dist/src/v1/transactionBuilder.js +1034 -0
- package/dist/src/v1/travelRule.d.ts +5 -0
- package/dist/src/v1/travelRule.d.ts.map +1 -0
- package/dist/src/v1/travelRule.js +316 -0
- package/dist/src/v1/verifyAddress.d.ts +6 -0
- package/dist/src/v1/verifyAddress.d.ts.map +1 -0
- package/dist/src/v1/verifyAddress.js +50 -0
- package/dist/src/v1/wallet.d.ts +6 -0
- package/dist/src/v1/wallet.d.ts.map +1 -0
- package/dist/src/v1/wallet.js +2366 -0
- package/dist/src/v1/wallets.d.ts +5 -0
- package/dist/src/v1/wallets.d.ts.map +1 -0
- package/dist/src/v1/wallets.js +537 -0
- package/dist/test/unit/api.d.ts +2 -0
- package/dist/test/unit/api.d.ts.map +1 -0
- package/dist/test/unit/api.js +307 -0
- package/dist/test/unit/bitgoAPI.d.ts +2 -0
- package/dist/test/unit/bitgoAPI.d.ts.map +1 -0
- package/dist/test/unit/bitgoAPI.js +1001 -0
- package/dist/test/unit/encrypt.d.ts +2 -0
- package/dist/test/unit/encrypt.d.ts.map +1 -0
- package/dist/test/unit/encrypt.js +377 -0
- package/dist/test/unit/hmacStrategy.d.ts +2 -0
- package/dist/test/unit/hmacStrategy.d.ts.map +1 -0
- package/dist/test/unit/hmacStrategy.js +136 -0
- package/dist/test/unit/utils.d.ts +2 -0
- package/dist/test/unit/utils.d.ts.map +1 -0
- package/dist/test/unit/utils.js +65 -0
- package/dist/test/unit/v1/fixtures/accelerate-tx.d.ts +4 -0
- package/dist/test/unit/v1/fixtures/accelerate-tx.d.ts.map +1 -0
- package/dist/test/unit/v1/fixtures/accelerate-tx.js +53 -0
- package/dist/test/unit/v1/fixtures/index.d.ts +3 -0
- package/dist/test/unit/v1/fixtures/index.d.ts.map +1 -0
- package/dist/test/unit/v1/fixtures/index.js +24 -0
- package/dist/test/unit/v1/signPsbt.d.ts +2 -0
- package/dist/test/unit/v1/signPsbt.d.ts.map +1 -0
- package/dist/test/unit/v1/signPsbt.js +53 -0
- package/dist/test/unit/v1/travelRule.d.ts +2 -0
- package/dist/test/unit/v1/travelRule.d.ts.map +1 -0
- package/dist/test/unit/v1/travelRule.js +125 -0
- package/dist/test/unit/v1/wallet.d.ts +2 -0
- package/dist/test/unit/v1/wallet.d.ts.map +1 -0
- package/dist/test/unit/v1/wallet.js +1658 -0
- package/dist/tsconfig.tsbuildinfo +1 -5259
- package/package.json +33 -28
- package/.eslintignore +0 -5
- package/CHANGELOG.md +0 -67
- package/dist/src/bip32path.d.ts +0 -24
- package/dist/src/bip32path.d.ts.map +0 -1
- package/dist/src/bip32path.js +0 -45
- package/dist/web/browser.html +0 -1
- package/dist/web/main.js +0 -2
- package/dist/web/main.js.LICENSE.txt +0 -30
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wallets.d.ts","sourceRoot":"","sources":["../../../src/v1/wallets.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,537 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @hidden
|
|
4
|
+
*/
|
|
5
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
8
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
9
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
10
|
+
}
|
|
11
|
+
Object.defineProperty(o, k2, desc);
|
|
12
|
+
}) : (function(o, m, k, k2) {
|
|
13
|
+
if (k2 === undefined) k2 = k;
|
|
14
|
+
o[k2] = m[k];
|
|
15
|
+
}));
|
|
16
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
17
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
18
|
+
}) : function(o, v) {
|
|
19
|
+
o["default"] = v;
|
|
20
|
+
});
|
|
21
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
22
|
+
var ownKeys = function(o) {
|
|
23
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
24
|
+
var ar = [];
|
|
25
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
26
|
+
return ar;
|
|
27
|
+
};
|
|
28
|
+
return ownKeys(o);
|
|
29
|
+
};
|
|
30
|
+
return function (mod) {
|
|
31
|
+
if (mod && mod.__esModule) return mod;
|
|
32
|
+
var result = {};
|
|
33
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
34
|
+
__setModuleDefault(result, mod);
|
|
35
|
+
return result;
|
|
36
|
+
};
|
|
37
|
+
})();
|
|
38
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
39
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
40
|
+
};
|
|
41
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
42
|
+
/**
|
|
43
|
+
*/
|
|
44
|
+
//
|
|
45
|
+
// Wallets Object
|
|
46
|
+
// BitGo accessor to a user's wallets.
|
|
47
|
+
//
|
|
48
|
+
// Copyright 2014, BitGo, Inc. All Rights Reserved.
|
|
49
|
+
//
|
|
50
|
+
const sdk_core_1 = require("@bitgo/sdk-core");
|
|
51
|
+
const utxo_lib_1 = require("@bitgo/utxo-lib");
|
|
52
|
+
const utxolib = __importStar(require("@bitgo/utxo-lib"));
|
|
53
|
+
const lodash_1 = __importDefault(require("lodash"));
|
|
54
|
+
const Wallet = require('./wallet');
|
|
55
|
+
//
|
|
56
|
+
// Constructor
|
|
57
|
+
//
|
|
58
|
+
const Wallets = function (bitgo) {
|
|
59
|
+
// @ts-expect-error - no implicit this
|
|
60
|
+
this.bitgo = bitgo;
|
|
61
|
+
};
|
|
62
|
+
//
|
|
63
|
+
// list
|
|
64
|
+
// List the user's wallets
|
|
65
|
+
//
|
|
66
|
+
Wallets.prototype.list = function (params, callback) {
|
|
67
|
+
params = params || {};
|
|
68
|
+
sdk_core_1.common.validateParams(params, [], [], callback);
|
|
69
|
+
const args = [];
|
|
70
|
+
if (params.skip && params.prevId) {
|
|
71
|
+
throw new Error('cannot specify both skip and prevId');
|
|
72
|
+
}
|
|
73
|
+
if (params.limit) {
|
|
74
|
+
if (!lodash_1.default.isNumber(params.limit)) {
|
|
75
|
+
throw new Error('invalid limit argument, expecting number');
|
|
76
|
+
}
|
|
77
|
+
args.push('limit=' + params.limit);
|
|
78
|
+
}
|
|
79
|
+
if (params.getbalances) {
|
|
80
|
+
if (!lodash_1.default.isBoolean(params.getbalances)) {
|
|
81
|
+
throw new Error('invalid getbalances argument, expecting boolean');
|
|
82
|
+
}
|
|
83
|
+
args.push('getbalances=' + params.getbalances);
|
|
84
|
+
}
|
|
85
|
+
if (params.skip) {
|
|
86
|
+
if (!lodash_1.default.isNumber(params.skip)) {
|
|
87
|
+
throw new Error('invalid skip argument, expecting number');
|
|
88
|
+
}
|
|
89
|
+
args.push('skip=' + params.skip);
|
|
90
|
+
}
|
|
91
|
+
else if (params.prevId) {
|
|
92
|
+
args.push('prevId=' + params.prevId);
|
|
93
|
+
}
|
|
94
|
+
let query = '';
|
|
95
|
+
if (args.length) {
|
|
96
|
+
query = '?' + args.join('&');
|
|
97
|
+
}
|
|
98
|
+
const self = this;
|
|
99
|
+
return Promise.resolve(this.bitgo.get(this.bitgo.url('/wallet' + query)).result())
|
|
100
|
+
.then(function (body) {
|
|
101
|
+
body.wallets = body.wallets.map(function (w) {
|
|
102
|
+
return new Wallet(self.bitgo, w);
|
|
103
|
+
});
|
|
104
|
+
return body;
|
|
105
|
+
})
|
|
106
|
+
.then(callback)
|
|
107
|
+
.catch(callback);
|
|
108
|
+
};
|
|
109
|
+
Wallets.prototype.getWallet = function (params, callback) {
|
|
110
|
+
params = params || {};
|
|
111
|
+
sdk_core_1.common.validateParams(params, ['id'], [], callback);
|
|
112
|
+
const self = this;
|
|
113
|
+
let query = '';
|
|
114
|
+
if (params.gpk) {
|
|
115
|
+
query = '?gpk=1';
|
|
116
|
+
}
|
|
117
|
+
return Promise.resolve(this.bitgo.get(this.bitgo.url('/wallet/' + params.id + query)).result())
|
|
118
|
+
.then(function (wallet) {
|
|
119
|
+
return new Wallet(self.bitgo, wallet);
|
|
120
|
+
})
|
|
121
|
+
.then(callback)
|
|
122
|
+
.catch(callback);
|
|
123
|
+
};
|
|
124
|
+
//
|
|
125
|
+
// listInvites
|
|
126
|
+
// List the invites on a user
|
|
127
|
+
//
|
|
128
|
+
Wallets.prototype.listInvites = function (params, callback) {
|
|
129
|
+
params = params || {};
|
|
130
|
+
sdk_core_1.common.validateParams(params, [], [], callback);
|
|
131
|
+
return Promise.resolve(this.bitgo.get(this.bitgo.url('/walletinvite')).result())
|
|
132
|
+
.then(callback)
|
|
133
|
+
.catch(callback);
|
|
134
|
+
};
|
|
135
|
+
//
|
|
136
|
+
// cancelInvite
|
|
137
|
+
// cancel a wallet invite that a user initiated
|
|
138
|
+
//
|
|
139
|
+
Wallets.prototype.cancelInvite = function (params, callback) {
|
|
140
|
+
params = params || {};
|
|
141
|
+
sdk_core_1.common.validateParams(params, ['walletInviteId'], [], callback);
|
|
142
|
+
return Promise.resolve(this.bitgo.del(this.bitgo.url('/walletinvite/' + params.walletInviteId)).result())
|
|
143
|
+
.then(callback)
|
|
144
|
+
.catch(callback);
|
|
145
|
+
};
|
|
146
|
+
//
|
|
147
|
+
// listShares
|
|
148
|
+
// List the user's wallet shares
|
|
149
|
+
//
|
|
150
|
+
Wallets.prototype.listShares = function (params, callback) {
|
|
151
|
+
params = params || {};
|
|
152
|
+
sdk_core_1.common.validateParams(params, [], [], callback);
|
|
153
|
+
return Promise.resolve(this.bitgo.get(this.bitgo.url('/walletshare')).result())
|
|
154
|
+
.then(callback)
|
|
155
|
+
.catch(callback);
|
|
156
|
+
};
|
|
157
|
+
//
|
|
158
|
+
// resendShareInvite
|
|
159
|
+
// Resend the invitation email which shares a wallet with another user
|
|
160
|
+
// Params:
|
|
161
|
+
// walletShareId - the wallet share to get information on
|
|
162
|
+
//
|
|
163
|
+
Wallets.prototype.resendShareInvite = function (params, callback) {
|
|
164
|
+
return async function () {
|
|
165
|
+
params = params || {};
|
|
166
|
+
sdk_core_1.common.validateParams(params, ['walletShareId'], [], callback);
|
|
167
|
+
const urlParts = params.walletShareId + '/resendemail';
|
|
168
|
+
// @ts-expect-error - no implicit this
|
|
169
|
+
return this.bitgo.post(this.bitgo.url('/walletshare/' + urlParts)).result();
|
|
170
|
+
}
|
|
171
|
+
.call(this)
|
|
172
|
+
.then(callback)
|
|
173
|
+
.catch(callback);
|
|
174
|
+
};
|
|
175
|
+
//
|
|
176
|
+
// getShare
|
|
177
|
+
// Gets a wallet share information, including the encrypted sharing keychain. requires unlock if keychain is present.
|
|
178
|
+
// Params:
|
|
179
|
+
// walletShareId - the wallet share to get information on
|
|
180
|
+
//
|
|
181
|
+
Wallets.prototype.getShare = function (params, callback) {
|
|
182
|
+
params = params || {};
|
|
183
|
+
sdk_core_1.common.validateParams(params, ['walletShareId'], [], callback);
|
|
184
|
+
return Promise.resolve(this.bitgo.get(this.bitgo.url('/walletshare/' + params.walletShareId)).result())
|
|
185
|
+
.then(callback)
|
|
186
|
+
.catch(callback);
|
|
187
|
+
};
|
|
188
|
+
//
|
|
189
|
+
// updateShare
|
|
190
|
+
// updates a wallet share
|
|
191
|
+
// Params:
|
|
192
|
+
// walletShareId - the wallet share to update
|
|
193
|
+
// state - the new state of the wallet share
|
|
194
|
+
//
|
|
195
|
+
Wallets.prototype.updateShare = function (params, callback) {
|
|
196
|
+
params = params || {};
|
|
197
|
+
sdk_core_1.common.validateParams(params, ['walletShareId'], [], callback);
|
|
198
|
+
return Promise.resolve(this.bitgo
|
|
199
|
+
.post(this.bitgo.url('/walletshare/' + params.walletShareId))
|
|
200
|
+
.send(params)
|
|
201
|
+
.result())
|
|
202
|
+
.then(callback)
|
|
203
|
+
.catch(callback);
|
|
204
|
+
};
|
|
205
|
+
//
|
|
206
|
+
// cancelShare
|
|
207
|
+
// cancels a wallet share
|
|
208
|
+
// Params:
|
|
209
|
+
// walletShareId - the wallet share to update
|
|
210
|
+
//
|
|
211
|
+
Wallets.prototype.cancelShare = function (params, callback) {
|
|
212
|
+
params = params || {};
|
|
213
|
+
sdk_core_1.common.validateParams(params, ['walletShareId'], [], callback);
|
|
214
|
+
return Promise.resolve(this.bitgo
|
|
215
|
+
.del(this.bitgo.url('/walletshare/' + params.walletShareId))
|
|
216
|
+
.send()
|
|
217
|
+
.result())
|
|
218
|
+
.then(callback)
|
|
219
|
+
.catch(callback);
|
|
220
|
+
};
|
|
221
|
+
//
|
|
222
|
+
// acceptShare
|
|
223
|
+
// Accepts a wallet share, adding the wallet to the user's list
|
|
224
|
+
// Needs a user's password to decrypt the shared key
|
|
225
|
+
// Params:
|
|
226
|
+
// walletShareId - the wallet share to accept
|
|
227
|
+
// userPassword - (required if more a keychain was shared) user's password to decrypt the shared wallet
|
|
228
|
+
// newWalletPassphrase - new wallet passphrase for saving the shared wallet xprv.
|
|
229
|
+
// If left blank and a wallet with more than view permissions was shared, then the userpassword is used.
|
|
230
|
+
// overrideEncryptedXprv - set only if the xprv was received out-of-band.
|
|
231
|
+
//
|
|
232
|
+
Wallets.prototype.acceptShare = function (params, callback) {
|
|
233
|
+
params = params || {};
|
|
234
|
+
sdk_core_1.common.validateParams(params, ['walletShareId'], ['overrideEncryptedXprv'], callback);
|
|
235
|
+
const self = this;
|
|
236
|
+
let encryptedXprv = params.overrideEncryptedXprv;
|
|
237
|
+
return this.getShare({ walletShareId: params.walletShareId })
|
|
238
|
+
.then(function (walletShare) {
|
|
239
|
+
// Return right away if there is no keychain to decrypt, or if explicit encryptedXprv was provided
|
|
240
|
+
if (!walletShare.keychain || !walletShare.keychain.encryptedXprv || encryptedXprv) {
|
|
241
|
+
return walletShare;
|
|
242
|
+
}
|
|
243
|
+
// More than viewing was requested, so we need to process the wallet keys using the shared ecdh scheme
|
|
244
|
+
if (!params.userPassword) {
|
|
245
|
+
throw new Error('userPassword param must be provided to decrypt shared key');
|
|
246
|
+
}
|
|
247
|
+
return self.bitgo.getECDHKeychain().then(async function (sharingKeychain) {
|
|
248
|
+
if (!sharingKeychain.encryptedXprv) {
|
|
249
|
+
throw new Error('EncryptedXprv was not found on sharing keychain');
|
|
250
|
+
}
|
|
251
|
+
// Now we have the sharing keychain, we can work out the secret used for sharing the wallet with us
|
|
252
|
+
sharingKeychain.xprv = await self.bitgo.decrypt({
|
|
253
|
+
password: params.userPassword,
|
|
254
|
+
input: sharingKeychain.encryptedXprv,
|
|
255
|
+
});
|
|
256
|
+
// Derive key by path (which is used between these 2 users only)
|
|
257
|
+
const secret = (0, sdk_core_1.getSharedSecret)(utxo_lib_1.bip32.fromBase58(sharingKeychain.xprv).derivePath((0, sdk_core_1.sanitizeLegacyPath)(walletShare.keychain.path)), Buffer.from(walletShare.keychain.fromPubKey, 'hex')).toString('hex');
|
|
258
|
+
// Yes! We got the secret successfully here, now decrypt the shared wallet xprv
|
|
259
|
+
const decryptedSharedWalletXprv = await self.bitgo.decrypt({
|
|
260
|
+
password: secret,
|
|
261
|
+
input: walletShare.keychain.encryptedXprv,
|
|
262
|
+
});
|
|
263
|
+
// We will now re-encrypt the wallet with our own password
|
|
264
|
+
const newWalletPassphrase = params.newWalletPassphrase || params.userPassword;
|
|
265
|
+
encryptedXprv = await self.bitgo.encrypt({
|
|
266
|
+
password: newWalletPassphrase,
|
|
267
|
+
input: decryptedSharedWalletXprv,
|
|
268
|
+
encryptionVersion: params.encryptionVersion,
|
|
269
|
+
});
|
|
270
|
+
// Carry on to the next block where we will post the acceptance of the share with the encrypted xprv
|
|
271
|
+
return walletShare;
|
|
272
|
+
});
|
|
273
|
+
})
|
|
274
|
+
.then(function (walletShare) {
|
|
275
|
+
const updateParams = {
|
|
276
|
+
walletShareId: params.walletShareId,
|
|
277
|
+
state: 'accepted',
|
|
278
|
+
};
|
|
279
|
+
if (encryptedXprv) {
|
|
280
|
+
updateParams.encryptedXprv = encryptedXprv;
|
|
281
|
+
}
|
|
282
|
+
return self.updateShare(updateParams);
|
|
283
|
+
})
|
|
284
|
+
.then(callback)
|
|
285
|
+
.catch(callback);
|
|
286
|
+
};
|
|
287
|
+
//
|
|
288
|
+
// createKey
|
|
289
|
+
// Create a single bitcoin key. This runs locally.
|
|
290
|
+
// Returns: {
|
|
291
|
+
// address: <address>
|
|
292
|
+
// key: <key, in WIF format>
|
|
293
|
+
// }
|
|
294
|
+
Wallets.prototype.createKey = function (params) {
|
|
295
|
+
const key = (0, sdk_core_1.makeRandomKey)();
|
|
296
|
+
return {
|
|
297
|
+
address: (0, sdk_core_1.getAddressP2PKH)(key),
|
|
298
|
+
key: key.toWIF(),
|
|
299
|
+
};
|
|
300
|
+
};
|
|
301
|
+
//
|
|
302
|
+
// createWalletWithKeychains
|
|
303
|
+
// Create a new 2-of-3 wallet and it's associated keychains.
|
|
304
|
+
// Returns the locally created keys with their encrypted xprvs.
|
|
305
|
+
// **WARNING: BE SURE TO BACKUP! NOT DOING SO CAN RESULT IN LOSS OF FUNDS!**
|
|
306
|
+
//
|
|
307
|
+
// 1. Creates the user keychain locally on the client, and encrypts it with the provided passphrase
|
|
308
|
+
// 2. If no xpub was provided, creates the backup keychain locally on the client, and encrypts it with the provided passphrase
|
|
309
|
+
// 3. Uploads the encrypted user and backup keychains to BitGo
|
|
310
|
+
// 4. Creates the BitGo key on the service
|
|
311
|
+
// 5. Creates the wallet on BitGo with the 3 public keys above
|
|
312
|
+
//
|
|
313
|
+
// Parameters include:
|
|
314
|
+
// "passphrase": wallet passphrase to encrypt user and backup keys with
|
|
315
|
+
// "label": wallet label, is shown in BitGo UI
|
|
316
|
+
// "backupXpub": backup keychain xpub, it is HIGHLY RECOMMENDED you generate this on a separate machine!
|
|
317
|
+
// BITGO DOES NOT GUARANTEE SAFETY OF WALLETS WITH MULTIPLE KEYS CREATED ON THE SAME MACHINE **
|
|
318
|
+
// "backupXpubProvider": Provision backup key from this provider (KRS), e.g. "keyternal".
|
|
319
|
+
// Setting this value will create an instant-capable wallet.
|
|
320
|
+
// "passcodeEncryptionCode": the code used to encrypt the wallet passcode used in the recovery process
|
|
321
|
+
// Returns: {
|
|
322
|
+
// wallet: newly created wallet model object
|
|
323
|
+
// userKeychain: the newly created user keychain, which has an encrypted xprv stored on BitGo
|
|
324
|
+
// backupKeychain: the newly created backup keychain
|
|
325
|
+
//
|
|
326
|
+
// ** BE SURE TO BACK UP THE ENCRYPTED USER AND BACKUP KEYCHAINS!**
|
|
327
|
+
//
|
|
328
|
+
// }
|
|
329
|
+
Wallets.prototype.createWalletWithKeychains = function (params, callback) {
|
|
330
|
+
params = params || {};
|
|
331
|
+
sdk_core_1.common.validateParams(params, ['passphrase'], ['label', 'backupXpub', 'enterprise', 'passcodeEncryptionCode'], callback);
|
|
332
|
+
const self = this;
|
|
333
|
+
const label = params.label;
|
|
334
|
+
// Create the user and backup key.
|
|
335
|
+
const userKeychain = this.bitgo.keychains().create();
|
|
336
|
+
const hasBackupXpub = !!params.backupXpub;
|
|
337
|
+
const hasBackupXpubProvider = !!params.backupXpubProvider;
|
|
338
|
+
if (hasBackupXpub && hasBackupXpubProvider) {
|
|
339
|
+
throw new Error('Cannot provide more than one backupXpub or backupXpubProvider flag');
|
|
340
|
+
}
|
|
341
|
+
if (params.disableTransactionNotifications !== undefined && !lodash_1.default.isBoolean(params.disableTransactionNotifications)) {
|
|
342
|
+
throw new Error('Expected disableTransactionNotifications to be a boolean. ');
|
|
343
|
+
}
|
|
344
|
+
let backupKeychain;
|
|
345
|
+
let bitgoKeychain;
|
|
346
|
+
return Promise.resolve()
|
|
347
|
+
.then(() => self.bitgo.encrypt({
|
|
348
|
+
password: params.passphrase,
|
|
349
|
+
input: userKeychain.xprv,
|
|
350
|
+
encryptionVersion: params.encryptionVersion,
|
|
351
|
+
}))
|
|
352
|
+
.then(function (encryptedXprv) {
|
|
353
|
+
userKeychain.encryptedXprv = encryptedXprv;
|
|
354
|
+
const keychainData = {
|
|
355
|
+
xpub: userKeychain.xpub,
|
|
356
|
+
encryptedXprv: userKeychain.encryptedXprv,
|
|
357
|
+
};
|
|
358
|
+
if (params.passcodeEncryptionCode) {
|
|
359
|
+
keychainData.originalPasscodeEncryptionCode = params.passcodeEncryptionCode;
|
|
360
|
+
}
|
|
361
|
+
return self.bitgo.keychains().add(keychainData);
|
|
362
|
+
})
|
|
363
|
+
.then(function () {
|
|
364
|
+
// Add the backup keychain
|
|
365
|
+
if (params.backupXpubProvider) {
|
|
366
|
+
// If requested, use a KRS or backup key provider
|
|
367
|
+
return self.bitgo
|
|
368
|
+
.keychains()
|
|
369
|
+
.createBackup({
|
|
370
|
+
provider: params.backupXpubProvider,
|
|
371
|
+
disableKRSEmail: params.disableKRSEmail,
|
|
372
|
+
})
|
|
373
|
+
.then(function (keychain) {
|
|
374
|
+
backupKeychain = keychain;
|
|
375
|
+
});
|
|
376
|
+
}
|
|
377
|
+
if (params.backupXpub) {
|
|
378
|
+
// user provided backup xpub
|
|
379
|
+
backupKeychain = { xpub: params.backupXpub };
|
|
380
|
+
}
|
|
381
|
+
else {
|
|
382
|
+
// no provided xpub, so default to creating one here
|
|
383
|
+
backupKeychain = self.bitgo.keychains().create();
|
|
384
|
+
}
|
|
385
|
+
return self.bitgo.keychains().add(backupKeychain);
|
|
386
|
+
})
|
|
387
|
+
.then(function () {
|
|
388
|
+
return self.bitgo.keychains().createBitGo();
|
|
389
|
+
})
|
|
390
|
+
.then(function (keychain) {
|
|
391
|
+
bitgoKeychain = keychain;
|
|
392
|
+
const walletParams = {
|
|
393
|
+
label: label,
|
|
394
|
+
m: 2,
|
|
395
|
+
n: 3,
|
|
396
|
+
keychains: [{ xpub: userKeychain.xpub }, { xpub: backupKeychain.xpub }, { xpub: bitgoKeychain.xpub }],
|
|
397
|
+
};
|
|
398
|
+
if (params.enterprise) {
|
|
399
|
+
walletParams.enterprise = params.enterprise;
|
|
400
|
+
}
|
|
401
|
+
if (params.disableTransactionNotifications) {
|
|
402
|
+
walletParams.disableTransactionNotifications = params.disableTransactionNotifications;
|
|
403
|
+
}
|
|
404
|
+
return self.add(walletParams);
|
|
405
|
+
})
|
|
406
|
+
.then(function (newWallet) {
|
|
407
|
+
const result = {
|
|
408
|
+
wallet: newWallet,
|
|
409
|
+
userKeychain: userKeychain,
|
|
410
|
+
backupKeychain: backupKeychain,
|
|
411
|
+
bitgoKeychain: bitgoKeychain,
|
|
412
|
+
};
|
|
413
|
+
if (backupKeychain.xprv) {
|
|
414
|
+
result.warning = 'Be sure to backup the backup keychain -- it is not stored anywhere else!';
|
|
415
|
+
}
|
|
416
|
+
return result;
|
|
417
|
+
})
|
|
418
|
+
.then(callback)
|
|
419
|
+
.catch(callback);
|
|
420
|
+
};
|
|
421
|
+
//
|
|
422
|
+
// createForwardWallet
|
|
423
|
+
// Creates a forward wallet from a single private key.
|
|
424
|
+
// BitGo will watch the wallet and send any incoming transactions to a destination multi-sig wallet
|
|
425
|
+
// WARNING: THE PRIVATE KEY WILL BE SENT TO BITGO. YOU MUST CONTACT BITGO BEFORE USING THIS FEATURE!
|
|
426
|
+
// WE CANNOT GUARANTEE THE SECURITY OF SINGLE-SIG WALLETS AS CUSTODY IS UNCLEAR.
|
|
427
|
+
//
|
|
428
|
+
// Params:
|
|
429
|
+
// privKey - the private key on a legacy single-signature wallet to be watched (WIF format)
|
|
430
|
+
// sourceAddress - the bitcoin address to forward from (corresponds to the private key)
|
|
431
|
+
// destinationWallet - the wallet object to send the destination coins to (when incoming transactions are detected)
|
|
432
|
+
// label - label for the wallet
|
|
433
|
+
//
|
|
434
|
+
Wallets.prototype.createForwardWallet = function (params, callback) {
|
|
435
|
+
params = params || {};
|
|
436
|
+
sdk_core_1.common.validateParams(params, ['privKey', 'sourceAddress'], ['label'], callback);
|
|
437
|
+
if (!lodash_1.default.isObject(params.destinationWallet) || !params.destinationWallet.id) {
|
|
438
|
+
throw new Error('expecting destinationWallet object');
|
|
439
|
+
}
|
|
440
|
+
const self = this;
|
|
441
|
+
let newDestinationAddress;
|
|
442
|
+
let addressFromPrivKey;
|
|
443
|
+
try {
|
|
444
|
+
const key = utxolib.ECPair.fromWIF(params.privKey, (0, sdk_core_1.getNetwork)());
|
|
445
|
+
addressFromPrivKey = (0, sdk_core_1.getAddressP2PKH)(key);
|
|
446
|
+
}
|
|
447
|
+
catch (e) {
|
|
448
|
+
throw new Error('expecting a valid privKey');
|
|
449
|
+
}
|
|
450
|
+
if (addressFromPrivKey !== params.sourceAddress) {
|
|
451
|
+
throw new Error('privKey does not match source address - got ' + addressFromPrivKey + ' expected ' + params.sourceAddress);
|
|
452
|
+
}
|
|
453
|
+
return params.destinationWallet.createAddress().then(function (result) {
|
|
454
|
+
// Create new address on the destination wallet to receive coins
|
|
455
|
+
newDestinationAddress = result.address;
|
|
456
|
+
const walletParams = {
|
|
457
|
+
type: 'forward',
|
|
458
|
+
sourceAddress: params.sourceAddress,
|
|
459
|
+
destinationAddress: newDestinationAddress,
|
|
460
|
+
privKey: params.privKey,
|
|
461
|
+
label: params.label,
|
|
462
|
+
};
|
|
463
|
+
if (params.enterprise) {
|
|
464
|
+
walletParams.enterprise = params.enterprise;
|
|
465
|
+
}
|
|
466
|
+
return Promise.resolve(self.bitgo.post(self.bitgo.url('/wallet')).send(walletParams).result())
|
|
467
|
+
.then(callback)
|
|
468
|
+
.catch(callback);
|
|
469
|
+
});
|
|
470
|
+
};
|
|
471
|
+
/**
|
|
472
|
+
* Add a new wallet (advanced mode).
|
|
473
|
+
* This allows you to manually submit the keychains, type, m and n of the wallet
|
|
474
|
+
* @param {string} label label of the wallet to be shown in UI
|
|
475
|
+
* @param {number} m number of keys required to unlock wallet (2)
|
|
476
|
+
* @param {number} n number of keys available on the wallet (3)
|
|
477
|
+
* @param {array} keychains array of keychain xpubs
|
|
478
|
+
* @param {string} enterprise ID of the enterprise entity to create this wallet under.
|
|
479
|
+
* @param {boolean} disableTransactionNotifications When set to true disables notifications for transactions on this wallet.
|
|
480
|
+
*/
|
|
481
|
+
Wallets.prototype.add = function (params, callback) {
|
|
482
|
+
params = params || {};
|
|
483
|
+
sdk_core_1.common.validateParams(params, [], ['label', 'enterprise'], callback);
|
|
484
|
+
if (Array.isArray(params.keychains) === false || !lodash_1.default.isNumber(params.m) || !lodash_1.default.isNumber(params.n)) {
|
|
485
|
+
throw new Error('invalid argument');
|
|
486
|
+
}
|
|
487
|
+
// TODO: support more types of multisig
|
|
488
|
+
if (params.m !== 2 || params.n !== 3) {
|
|
489
|
+
throw new Error('unsupported multi-sig type');
|
|
490
|
+
}
|
|
491
|
+
const self = this;
|
|
492
|
+
const keychains = params.keychains.map(function (k) {
|
|
493
|
+
return { xpub: k.xpub };
|
|
494
|
+
});
|
|
495
|
+
const walletParams = {
|
|
496
|
+
label: params.label,
|
|
497
|
+
m: params.m,
|
|
498
|
+
n: params.n,
|
|
499
|
+
keychains: keychains,
|
|
500
|
+
};
|
|
501
|
+
if (params.enterprise) {
|
|
502
|
+
walletParams.enterprise = params.enterprise;
|
|
503
|
+
}
|
|
504
|
+
if (params.disableTransactionNotifications) {
|
|
505
|
+
walletParams.disableTransactionNotifications = params.disableTransactionNotifications;
|
|
506
|
+
}
|
|
507
|
+
return Promise.resolve(this.bitgo.post(this.bitgo.url('/wallet')).send(walletParams).result())
|
|
508
|
+
.then(function (body) {
|
|
509
|
+
return new Wallet(self.bitgo, body);
|
|
510
|
+
})
|
|
511
|
+
.then(callback)
|
|
512
|
+
.catch(callback);
|
|
513
|
+
};
|
|
514
|
+
//
|
|
515
|
+
// get
|
|
516
|
+
// Shorthand to getWallet
|
|
517
|
+
// Parameters include:
|
|
518
|
+
// id: the id of the wallet
|
|
519
|
+
//
|
|
520
|
+
Wallets.prototype.get = function (params, callback) {
|
|
521
|
+
return this.getWallet(params, callback);
|
|
522
|
+
};
|
|
523
|
+
//
|
|
524
|
+
// remove
|
|
525
|
+
// Remove an existing wallet.
|
|
526
|
+
// Parameters include:
|
|
527
|
+
// id: the id of the wallet
|
|
528
|
+
//
|
|
529
|
+
Wallets.prototype.remove = function (params, callback) {
|
|
530
|
+
params = params || {};
|
|
531
|
+
sdk_core_1.common.validateParams(params, ['id'], [], callback);
|
|
532
|
+
return Promise.resolve(this.bitgo.del(this.bitgo.url('/wallet/' + params.id)).result())
|
|
533
|
+
.then(callback)
|
|
534
|
+
.catch(callback);
|
|
535
|
+
};
|
|
536
|
+
module.exports = Wallets;
|
|
537
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FsbGV0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy92MS93YWxsZXRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7R0FFRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFSDtHQUNHO0FBQ0gsRUFBRTtBQUNGLGlCQUFpQjtBQUNqQixzQ0FBc0M7QUFDdEMsRUFBRTtBQUNGLG9EQUFvRDtBQUNwRCxFQUFFO0FBQ0YsOENBT3lCO0FBQ3pCLDhDQUF3QztBQUN4Qyx5REFBMkM7QUFDM0Msb0RBQXVCO0FBQ3ZCLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUVuQyxFQUFFO0FBQ0YsY0FBYztBQUNkLEVBQUU7QUFDRixNQUFNLE9BQU8sR0FBRyxVQUFVLEtBQUs7SUFDN0Isc0NBQXNDO0lBQ3RDLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0FBQ3JCLENBQUMsQ0FBQztBQUVGLEVBQUU7QUFDRixPQUFPO0FBQ1AsMEJBQTBCO0FBQzFCLEVBQUU7QUFDRixPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRyxVQUFVLE1BQU0sRUFBRSxRQUFRO0lBQ2pELE1BQU0sR0FBRyxNQUFNLElBQUksRUFBRSxDQUFDO0lBQ3RCLGlCQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBRWhELE1BQU0sSUFBSSxHQUFhLEVBQUUsQ0FBQztJQUUxQixJQUFJLE1BQU0sQ0FBQyxJQUFJLElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2pDLE1BQU0sSUFBSSxLQUFLLENBQUMscUNBQXFDLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRUQsSUFBSSxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDakIsSUFBSSxDQUFDLGdCQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENB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IEBoaWRkZW5cbiAqL1xuXG4vKipcbiAqL1xuLy9cbi8vIFdhbGxldHMgT2JqZWN0XG4vLyBCaXRHbyBhY2Nlc3NvciB0byBhIHVzZXIncyB3YWxsZXRzLlxuLy9cbi8vIENvcHlyaWdodCAyMDE0LCBCaXRHbywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbi8vXG5pbXBvcnQge1xuICBjb21tb24sXG4gIGdldEFkZHJlc3NQMlBLSCxcbiAgZ2V0TmV0d29yayxcbiAgZ2V0U2hhcmVkU2VjcmV0LFxuICBtYWtlUmFuZG9tS2V5LFxuICBzYW5pdGl6ZUxlZ2FjeVBhdGgsXG59IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQgeyBiaXAzMiB9IGZyb20gJ0BiaXRnby91dHhvLWxpYic7XG5pbXBvcnQgKiBhcyB1dHhvbGliIGZyb20gJ0BiaXRnby91dHhvLWxpYic7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuY29uc3QgV2FsbGV0ID0gcmVxdWlyZSgnLi93YWxsZXQnKTtcblxuLy9cbi8vIENvbnN0cnVjdG9yXG4vL1xuY29uc3QgV2FsbGV0cyA9IGZ1bmN0aW9uIChiaXRnbykge1xuICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gbm8gaW1wbGljaXQgdGhpc1xuICB0aGlzLmJpdGdvID0gYml0Z287XG59O1xuXG4vL1xuLy8gbGlzdFxuLy8gTGlzdCB0aGUgdXNlcidzIHdhbGxldHNcbi8vXG5XYWxsZXRzLnByb3RvdHlwZS5saXN0ID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgW10sIGNhbGxiYWNrKTtcblxuICBjb25zdCBhcmdzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGlmIChwYXJhbXMuc2tpcCAmJiBwYXJhbXMucHJldklkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdjYW5ub3Qgc3BlY2lmeSBib3RoIHNraXAgYW5kIHByZXZJZCcpO1xuICB9XG5cbiAgaWYgKHBhcmFtcy5saW1pdCkge1xuICAgIGlmICghXy5pc051bWJlcihwYXJhbXMubGltaXQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgbGltaXQgYXJndW1lbnQsIGV4cGVjdGluZyBudW1iZXInKTtcbiAgICB9XG4gICAgYXJncy5wdXNoKCdsaW1pdD0nICsgcGFyYW1zLmxpbWl0KTtcbiAgfVxuICBpZiAocGFyYW1zLmdldGJhbGFuY2VzKSB7XG4gICAgaWYgKCFfLmlzQm9vbGVhbihwYXJhbXMuZ2V0YmFsYW5jZXMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgZ2V0YmFsYW5jZXMgYXJndW1lbnQsIGV4cGVjdGluZyBib29sZWFuJyk7XG4gICAgfVxuICAgIGFyZ3MucHVzaCgnZ2V0YmFsYW5jZXM9JyArIHBhcmFtcy5nZXRiYWxhbmNlcyk7XG4gIH1cbiAgaWYgKHBhcmFtcy5za2lwKSB7XG4gICAgaWYgKCFfLmlzTnVtYmVyKHBhcmFtcy5za2lwKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHNraXAgYXJndW1lbnQsIGV4cGVjdGluZyBudW1iZXInKTtcbiAgICB9XG4gICAgYXJncy5wdXNoKCdza2lwPScgKyBwYXJhbXMuc2tpcCk7XG4gIH0gZWxzZSBpZiAocGFyYW1zLnByZXZJZCkge1xuICAgIGFyZ3MucHVzaCgncHJldklkPScgKyBwYXJhbXMucHJldklkKTtcbiAgfVxuXG4gIGxldCBxdWVyeSA9ICcnO1xuICBpZiAoYXJncy5sZW5ndGgpIHtcbiAgICBxdWVyeSA9ICc/JyArIGFyZ3Muam9pbignJicpO1xuICB9XG5cbiAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5iaXRnby5nZXQodGhpcy5iaXRnby51cmwoJy93YWxsZXQnICsgcXVlcnkpKS5yZXN1bHQoKSlcbiAgICAudGhlbihmdW5jdGlvbiAoYm9keSkge1xuICAgICAgYm9keS53YWxsZXRzID0gYm9keS53YWxsZXRzLm1hcChmdW5jdGlvbiAodykge1xuICAgICAgICByZXR1cm4gbmV3IFdhbGxldChzZWxmLmJpdGdvLCB3KTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGJvZHk7XG4gICAgfSlcbiAgICAudGhlbihjYWxsYmFjaylcbiAgICAuY2F0Y2goY2FsbGJhY2spO1xufTtcblxuV2FsbGV0cy5wcm90b3R5cGUuZ2V0V2FsbGV0ID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ2lkJ10sIFtdLCBjYWxsYmFjayk7XG5cbiAgY29uc3Qgc2VsZiA9IHRoaXM7XG5cbiAgbGV0IHF1ZXJ5ID0gJyc7XG4gIGlmIChwYXJhbXMuZ3BrKSB7XG4gICAgcXVlcnkgPSAnP2dwaz0xJztcbiAgfVxuXG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5iaXRnby5nZXQodGhpcy5iaXRnby51cmwoJy93YWxsZXQvJyArIHBhcmFtcy5pZCArIHF1ZXJ5KSkucmVzdWx0KCkpXG4gICAgLnRoZW4oZnVuY3Rpb24gKHdhbGxldCkge1xuICAgICAgcmV0dXJuIG5ldyBXYWxsZXQoc2VsZi5iaXRnbywgd2FsbGV0KTtcbiAgICB9KVxuICAgIC50aGVuKGNhbGxiYWNrKVxuICAgIC5jYXRjaChjYWxsYmFjayk7XG59O1xuXG4vL1xuLy8gbGlzdEludml0ZXNcbi8vIExpc3QgdGhlIGludml0ZXMgb24gYSB1c2VyXG4vL1xuV2FsbGV0cy5wcm90b3R5cGUubGlzdEludml0ZXMgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbXSwgY2FsbGJhY2spO1xuXG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5iaXRnby5nZXQodGhpcy5iaXRnby51cmwoJy93YWxsZXRpbnZpdGUnKSkucmVzdWx0KCkpXG4gICAgLnRoZW4oY2FsbGJhY2spXG4gICAgLmNhdGNoKGNhbGxiYWNrKTtcbn07XG5cbi8vXG4vLyBjYW5jZWxJbnZpdGVcbi8vIGNhbmNlbCBhIHdhbGxldCBpbnZpdGUgdGhhdCBhIHVzZXIgaW5pdGlhdGVkXG4vL1xuV2FsbGV0cy5wcm90b3R5cGUuY2FuY2VsSW52aXRlID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3dhbGxldEludml0ZUlkJ10sIFtdLCBjYWxsYmFjayk7XG5cbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLmJpdGdvLmRlbCh0aGlzLmJpdGdvLnVybCgnL3dhbGxldGludml0ZS8nICsgcGFyYW1zLndhbGxldEludml0ZUlkKSkucmVzdWx0KCkpXG4gICAgLnRoZW4oY2FsbGJhY2spXG4gICAgLmNhdGNoKGNhbGxiYWNrKTtcbn07XG5cbi8vXG4vLyBsaXN0U2hhcmVzXG4vLyBMaXN0IHRoZSB1c2VyJ3Mgd2FsbGV0IHNoYXJlc1xuLy9cbldhbGxldHMucHJvdG90eXBlLmxpc3RTaGFyZXMgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbXSwgY2FsbGJhY2spO1xuXG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5iaXRnby5nZXQodGhpcy5iaXRnby51cmwoJy93YWxsZXRzaGFyZScpKS5yZXN1bHQoKSlcbiAgICAudGhlbihjYWxsYmFjaylcbiAgICAuY2F0Y2goY2FsbGJhY2spO1xufTtcblxuLy9cbi8vIHJlc2VuZFNoYXJlSW52aXRlXG4vLyBSZXNlbmQgdGhlIGludml0YXRpb24gZW1haWwgd2hpY2ggc2hhcmVzIGEgd2FsbGV0IHdpdGggYW5vdGhlciB1c2VyXG4vLyBQYXJhbXM6XG4vLyAgICB3YWxsZXRTaGFyZUlkIC0gdGhlIHdhbGxldCBzaGFyZSB0byBnZXQgaW5mb3JtYXRpb24gb25cbi8vXG5XYWxsZXRzLnByb3RvdHlwZS5yZXNlbmRTaGFyZUludml0ZSA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHJldHVybiBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnd2FsbGV0U2hhcmVJZCddLCBbXSwgY2FsbGJhY2spO1xuXG4gICAgY29uc3QgdXJsUGFydHMgPSBwYXJhbXMud2FsbGV0U2hhcmVJZCArICcvcmVzZW5kZW1haWwnO1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBubyBpbXBsaWNpdCB0aGlzXG4gICAgcmV0dXJuIHRoaXMuYml0Z28ucG9zdCh0aGlzLmJpdGdvLnVybCgnL3dhbGxldHNoYXJlLycgKyB1cmxQYXJ0cykpLnJlc3VsdCgpO1xuICB9XG4gICAgLmNhbGwodGhpcylcbiAgICAudGhlbihjYWxsYmFjaylcbiAgICAuY2F0Y2goY2FsbGJhY2spO1xufTtcblxuLy9cbi8vIGdldFNoYXJlXG4vLyBHZXRzIGEgd2FsbGV0IHNoYXJlIGluZm9ybWF0aW9uLCBpbmNsdWRpbmcgdGhlIGVuY3J5cHRlZCBzaGFyaW5nIGtleWNoYWluLiByZXF1aXJlcyB1bmxvY2sgaWYga2V5Y2hhaW4gaXMgcHJlc2VudC5cbi8vIFBhcmFtczpcbi8vICAgIHdhbGxldFNoYXJlSWQgLSB0aGUgd2FsbGV0IHNoYXJlIHRvIGdldCBpbmZvcm1hdGlvbiBvblxuLy9cbldhbGxldHMucHJvdG90eXBlLmdldFNoYXJlID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3dhbGxldFNoYXJlSWQnXSwgW10sIGNhbGxiYWNrKTtcblxuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuYml0Z28uZ2V0KHRoaXMuYml0Z28udXJsKCcvd2FsbGV0c2hhcmUvJyArIHBhcmFtcy53YWxsZXRTaGFyZUlkKSkucmVzdWx0KCkpXG4gICAgLnRoZW4oY2FsbGJhY2spXG4gICAgLmNhdGNoKGNhbGxiYWNrKTtcbn07XG5cbi8vXG4vLyB1cGRhdGVTaGFyZVxuLy8gdXBkYXRlcyBhIHdhbGxldCBzaGFyZVxuLy8gUGFyYW1zOlxuLy8gICAgd2FsbGV0U2hhcmVJZCAtIHRoZSB3YWxsZXQgc2hhcmUgdG8gdXBkYXRlXG4vLyAgICBzdGF0ZSAtIHRoZSBuZXcgc3RhdGUgb2YgdGhlIHdhbGxldCBzaGFyZVxuLy9cbldhbGxldHMucHJvdG90eXBlLnVwZGF0ZVNoYXJlID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3dhbGxldFNoYXJlSWQnXSwgW10sIGNhbGxiYWNrKTtcblxuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFxuICAgIHRoaXMuYml0Z29cbiAgICAgIC5wb3N0KHRoaXMuYml0Z28udXJsKCcvd2FsbGV0c2hhcmUvJyArIHBhcmFtcy53YWxsZXRTaGFyZUlkKSlcbiAgICAgIC5zZW5kKHBhcmFtcylcbiAgICAgIC5yZXN1bHQoKVxuICApXG4gICAgLnRoZW4oY2FsbGJhY2spXG4gICAgLmNhdGNoKGNhbGxiYWNrKTtcbn07XG5cbi8vXG4vLyBjYW5jZWxTaGFyZVxuLy8gY2FuY2VscyBhIHdhbGxldCBzaGFyZVxuLy8gUGFyYW1zOlxuLy8gICAgd2FsbGV0U2hhcmVJZCAtIHRoZSB3YWxsZXQgc2hhcmUgdG8gdXBkYXRlXG4vL1xuV2FsbGV0cy5wcm90b3R5cGUuY2FuY2VsU2hhcmUgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnd2FsbGV0U2hhcmVJZCddLCBbXSwgY2FsbGJhY2spO1xuXG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUoXG4gICAgdGhpcy5iaXRnb1xuICAgICAgLmRlbCh0aGlzLmJpdGdvLnVybCgnL3dhbGxldHNoYXJlLycgKyBwYXJhbXMud2FsbGV0U2hhcmVJZCkpXG4gICAgICAuc2VuZCgpXG4gICAgICAucmVzdWx0KClcbiAgKVxuICAgIC50aGVuKGNhbGxiYWNrKVxuICAgIC5jYXRjaChjYWxsYmFjayk7XG59O1xuXG4vL1xuLy8gYWNjZXB0U2hhcmVcbi8vIEFjY2VwdHMgYSB3YWxsZXQgc2hhcmUsIGFkZGluZyB0aGUgd2FsbGV0IHRvIHRoZSB1c2VyJ3MgbGlzdFxuLy8gTmVlZHMgYSB1c2VyJ3MgcGFzc3dvcmQgdG8gZGVjcnlwdCB0aGUgc2hhcmVkIGtleVxuLy8gUGFyYW1zOlxuLy8gICAgd2FsbGV0U2hhcmVJZCAtIHRoZSB3YWxsZXQgc2hhcmUgdG8gYWNjZXB0XG4vLyAgICB1c2VyUGFzc3dvcmQgLSAocmVxdWlyZWQgaWYgbW9yZSBhIGtleWNoYWluIHdhcyBzaGFyZWQpIHVzZXIncyBwYXNzd29yZCB0byBkZWNyeXB0IHRoZSBzaGFyZWQgd2FsbGV0XG4vLyAgICBuZXdXYWxsZXRQYXNzcGhyYXNlIC0gbmV3IHdhbGxldCBwYXNzcGhyYXNlIGZvciBzYXZpbmcgdGhlIHNoYXJlZCB3YWxsZXQgeHBydi5cbi8vICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBsZWZ0IGJsYW5rIGFuZCBhIHdhbGxldCB3aXRoIG1vcmUgdGhhbiB2aWV3IHBlcm1pc3Npb25zIHdhcyBzaGFyZWQsIHRoZW4gdGhlIHVzZXJwYXNzd29yZCBpcyB1c2VkLlxuLy8gICAgb3ZlcnJpZGVFbmNyeXB0ZWRYcHJ2IC0gc2V0IG9ubHkgaWYgdGhlIHhwcnYgd2FzIHJlY2VpdmVkIG91dC1vZi1iYW5kLlxuLy9cbldhbGxldHMucHJvdG90eXBlLmFjY2VwdFNoYXJlID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3dhbGxldFNoYXJlSWQnXSwgWydvdmVycmlkZUVuY3J5cHRlZFhwcnYnXSwgY2FsbGJhY2spO1xuXG4gIGNvbnN0IHNlbGYgPSB0aGlzO1xuICBsZXQgZW5jcnlwdGVkWHBydiA9IHBhcmFtcy5vdmVycmlkZUVuY3J5cHRlZFhwcnY7XG5cbiAgcmV0dXJuIHRoaXMuZ2V0U2hhcmUoeyB3YWxsZXRTaGFyZUlkOiBwYXJhbXMud2FsbGV0U2hhcmVJZCB9KVxuICAgIC50aGVuKGZ1bmN0aW9uICh3YWxsZXRTaGFyZSkge1xuICAgICAgLy8gUmV0dXJuIHJpZ2h0IGF3YXkgaWYgdGhlcmUgaXMgbm8ga2V5Y2hhaW4gdG8gZGVjcnlwdCwgb3IgaWYgZXhwbGljaXQgZW5jcnlwdGVkWHBydiB3YXMgcHJvdmlkZWRcbiAgICAgIGlmICghd2FsbGV0U2hhcmUua2V5Y2hhaW4gfHwgIXdhbGxldFNoYXJlLmtleWNoYWluLmVuY3J5cHRlZFhwcnYgfHwgZW5jcnlwdGVkWHBydikge1xuICAgICAgICByZXR1cm4gd2FsbGV0U2hhcmU7XG4gICAgICB9XG5cbiAgICAgIC8vIE1vcmUgdGhhbiB2aWV3aW5nIHdhcyByZXF1ZXN0ZWQsIHNvIHdlIG5lZWQgdG8gcHJvY2VzcyB0aGUgd2FsbGV0IGtleXMgdXNpbmcgdGhlIHNoYXJlZCBlY2RoIHNjaGVtZVxuICAgICAgaWYgKCFwYXJhbXMudXNlclBhc3N3b3JkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndXNlclBhc3N3b3JkIHBhcmFtIG11c3QgYmUgcHJvdmlkZWQgdG8gZGVjcnlwdCBzaGFyZWQga2V5Jyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzZWxmLmJpdGdvLmdldEVDREhLZXljaGFpbigpLnRoZW4oYXN5bmMgZnVuY3Rpb24gKHNoYXJpbmdLZXljaGFpbikge1xuICAgICAgICBpZiAoIXNoYXJpbmdLZXljaGFpbi5lbmNyeXB0ZWRYcHJ2KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFbmNyeXB0ZWRYcHJ2IHdhcyBub3QgZm91bmQgb24gc2hhcmluZyBrZXljaGFpbicpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTm93IHdlIGhhdmUgdGhlIHNoYXJpbmcga2V5Y2hhaW4sIHdlIGNhbiB3b3JrIG91dCB0aGUgc2VjcmV0IHVzZWQgZm9yIHNoYXJpbmcgdGhlIHdhbGxldCB3aXRoIHVzXG4gICAgICAgIHNoYXJpbmdLZXljaGFpbi54cHJ2ID0gYXdhaXQgc2VsZi5iaXRnby5kZWNyeXB0KHtcbiAgICAgICAgICBwYXNzd29yZDogcGFyYW1zLnVzZXJQYXNzd29yZCxcbiAgICAgICAgICBpbnB1dDogc2hhcmluZ0tleWNoYWluLmVuY3J5cHRlZFhwcnYsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIERlcml2ZSBrZXkgYnkgcGF0aCAod2hpY2ggaXMgdXNlZCBiZXR3ZWVuIHRoZXNlIDIgdXNlcnMgb25seSlcbiAgICAgICAgY29uc3Qgc2VjcmV0ID0gZ2V0U2hhcmVkU2VjcmV0KFxuICAgICAgICAgIGJpcDMyLmZyb21CYXNlNTgoc2hhcmluZ0tleWNoYWluLnhwcnYpLmRlcml2ZVBhdGgoc2FuaXRpemVMZWdhY3lQYXRoKHdhbGxldFNoYXJlLmtleWNoYWluLnBhdGgpKSxcbiAgICAgICAgICBCdWZmZXIuZnJvbSh3YWxsZXRTaGFyZS5rZXljaGFpbi5mcm9tUHViS2V5LCAnaGV4JylcbiAgICAgICAgKS50b1N0cmluZygnaGV4Jyk7XG5cbiAgICAgICAgLy8gWWVzISBXZSBnb3QgdGhlIHNlY3JldCBzdWNjZXNzZnVsbHkgaGVyZSwgbm93IGRlY3J5cHQgdGhlIHNoYXJlZCB3YWxsZXQgeHBydlxuICAgICAgICBjb25zdCBkZWNyeXB0ZWRTaGFyZWRXYWxsZXRYcHJ2ID0gYXdhaXQgc2VsZi5iaXRnby5kZWNyeXB0KHtcbiAgICAgICAgICBwYXNzd29yZDogc2VjcmV0LFxuICAgICAgICAgIGlucHV0OiB3YWxsZXRTaGFyZS5rZXljaGFpbi5lbmNyeXB0ZWRYcHJ2LFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBXZSB3aWxsIG5vdyByZS1lbmNyeXB0IHRoZSB3YWxsZXQgd2l0aCBvdXIgb3duIHBhc3N3b3JkXG4gICAgICAgIGNvbnN0IG5ld1dhbGxldFBhc3NwaHJhc2UgPSBwYXJhbXMubmV3V2FsbGV0UGFzc3BocmFzZSB8fCBwYXJhbXMudXNlclBhc3N3b3JkO1xuICAgICAgICBlbmNyeXB0ZWRYcHJ2ID0gYXdhaXQgc2VsZi5iaXRnby5lbmNyeXB0KHtcbiAgICAgICAgICBwYXNzd29yZDogbmV3V2FsbGV0UGFzc3BocmFzZSxcbiAgICAgICAgICBpbnB1dDogZGVjcnlwdGVkU2hhcmVkV2FsbGV0WHBydixcbiAgICAgICAgICBlbmNyeXB0aW9uVmVyc2lvbjogcGFyYW1zLmVuY3J5cHRpb25WZXJzaW9uLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBDYXJyeSBvbiB0byB0aGUgbmV4dCBibG9jayB3aGVyZSB3ZSB3aWxsIHBvc3QgdGhlIGFjY2VwdGFuY2Ugb2YgdGhlIHNoYXJlIHdpdGggdGhlIGVuY3J5cHRlZCB4cHJ2XG4gICAgICAgIHJldHVybiB3YWxsZXRTaGFyZTtcbiAgICAgIH0pO1xuICAgIH0pXG4gICAgLnRoZW4oZnVuY3Rpb24gKHdhbGxldFNoYXJlKSB7XG4gICAgICBjb25zdCB1cGRhdGVQYXJhbXM6IGFueSA9IHtcbiAgICAgICAgd2FsbGV0U2hhcmVJZDogcGFyYW1zLndhbGxldFNoYXJlSWQsXG4gICAgICAgIHN0YXRlOiAnYWNjZXB0ZWQnLFxuICAgICAgfTtcblxuICAgICAgaWYgKGVuY3J5cHRlZFhwcnYpIHtcbiAgICAgICAgdXBkYXRlUGFyYW1zLmVuY3J5cHRlZFhwcnYgPSBlbmNyeXB0ZWRYcHJ2O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2VsZi51cGRhdGVTaGFyZSh1cGRhdGVQYXJhbXMpO1xuICAgIH0pXG4gICAgLnRoZW4oY2FsbGJhY2spXG4gICAgLmNhdGNoKGNhbGxiYWNrKTtcbn07XG5cbi8vXG4vLyBjcmVhdGVLZXlcbi8vIENyZWF0ZSBhIHNpbmdsZSBiaXRjb2luIGtleS4gIFRoaXMgcnVucyBsb2NhbGx5LlxuLy8gUmV0dXJuczoge1xuLy8gICBhZGRyZXNzOiA8YWRkcmVzcz5cbi8vICAga2V5OiA8a2V5LCBpbiBXSUYgZm9ybWF0PlxuLy8gfVxuV2FsbGV0cy5wcm90b3R5cGUuY3JlYXRlS2V5ID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICBjb25zdCBrZXkgPSBtYWtlUmFuZG9tS2V5KCk7XG4gIHJldHVybiB7XG4gICAgYWRkcmVzczogZ2V0QWRkcmVzc1AyUEtIKGtleSksXG4gICAga2V5OiBrZXkudG9XSUYoKSxcbiAgfTtcbn07XG5cbi8vXG4vLyBjcmVhdGVXYWxsZXRXaXRoS2V5Y2hhaW5zXG4vLyBDcmVhdGUgYSBuZXcgMi1vZi0zIHdhbGxldCBhbmQgaXQncyBhc3NvY2lhdGVkIGtleWNoYWlucy5cbi8vIFJldHVybnMgdGhlIGxvY2FsbHkgY3JlYXRlZCBrZXlzIHdpdGggdGhlaXIgZW5jcnlwdGVkIHhwcnZzLlxuLy8gKipXQVJOSU5HOiBCRSBTVVJFIFRPIEJBQ0tVUCEgTk9UIERPSU5HIFNPIENBTiBSRVNVTFQgSU4gTE9TUyBPRiBGVU5EUyEqKlxuLy9cbi8vIDEuIENyZWF0ZXMgdGhlIHVzZXIga2V5Y2hhaW4gbG9jYWxseSBvbiB0aGUgY2xpZW50LCBhbmQgZW5jcnlwdHMgaXQgd2l0aCB0aGUgcHJvdmlkZWQgcGFzc3BocmFzZVxuLy8gMi4gSWYgbm8geHB1YiB3YXMgcHJvdmlkZWQsIGNyZWF0ZXMgdGhlIGJhY2t1cCBrZXljaGFpbiBsb2NhbGx5IG9uIHRoZSBjbGllbnQsIGFuZCBlbmNyeXB0cyBpdCB3aXRoIHRoZSBwcm92aWRlZCBwYXNzcGhyYXNlXG4vLyAzLiBVcGxvYWRzIHRoZSBlbmNyeXB0ZWQgdXNlciBhbmQgYmFja3VwIGtleWNoYWlucyB0byBCaXRHb1xuLy8gNC4gQ3JlYXRlcyB0aGUgQml0R28ga2V5IG9uIHRoZSBzZXJ2aWNlXG4vLyA1LiBDcmVhdGVzIHRoZSB3YWxsZXQgb24gQml0R28gd2l0aCB0aGUgMyBwdWJsaWMga2V5cyBhYm92ZVxuLy9cbi8vIFBhcmFtZXRlcnMgaW5jbHVkZTpcbi8vICAgXCJwYXNzcGhyYXNlXCI6IHdhbGxldCBwYXNzcGhyYXNlIHRvIGVuY3J5cHQgdXNlciBhbmQgYmFja3VwIGtleXMgd2l0aFxuLy8gICBcImxhYmVsXCI6IHdhbGxldCBsYWJlbCwgaXMgc2hvd24gaW4gQml0R28gVUlcbi8vICAgXCJiYWNrdXBYcHViXCI6IGJhY2t1cCBrZXljaGFpbiB4cHViLCBpdCBpcyBISUdITFkgUkVDT01NRU5ERUQgeW91IGdlbmVyYXRlIHRoaXMgb24gYSBzZXBhcmF0ZSBtYWNoaW5lIVxuLy8gICAgICAgICAgICAgICAgIEJJVEdPIERPRVMgTk9UIEdVQVJBTlRFRSBTQUZFVFkgT0YgV0FMTEVUUyBXSVRIIE1VTFRJUExFIEtFWVMgQ1JFQVRFRCBPTiBUSEUgU0FNRSBNQUNISU5FICoqXG4vLyAgIFwiYmFja3VwWHB1YlByb3ZpZGVyXCI6IFByb3Zpc2lvbiBiYWNrdXAga2V5IGZyb20gdGhpcyBwcm92aWRlciAoS1JTKSwgZS5nLiBcImtleXRlcm5hbFwiLlxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgU2V0dGluZyB0aGlzIHZhbHVlIHdpbGwgY3JlYXRlIGFuIGluc3RhbnQtY2FwYWJsZSB3YWxsZXQuXG4vLyAgIFwicGFzc2NvZGVFbmNyeXB0aW9uQ29kZVwiOiB0aGUgY29kZSB1c2VkIHRvIGVuY3J5cHQgdGhlIHdhbGxldCBwYXNzY29kZSB1c2VkIGluIHRoZSByZWNvdmVyeSBwcm9jZXNzXG4vLyBSZXR1cm5zOiB7XG4vLyAgIHdhbGxldDogbmV3bHkgY3JlYXRlZCB3YWxsZXQgbW9kZWwgb2JqZWN0XG4vLyAgIHVzZXJLZXljaGFpbjogdGhlIG5ld2x5IGNyZWF0ZWQgdXNlciBrZXljaGFpbiwgd2hpY2ggaGFzIGFuIGVuY3J5cHRlZCB4cHJ2IHN0b3JlZCBvbiBCaXRHb1xuLy8gICBiYWNrdXBLZXljaGFpbjogdGhlIG5ld2x5IGNyZWF0ZWQgYmFja3VwIGtleWNoYWluXG4vL1xuLy8gKiogQkUgU1VSRSBUTyBCQUNLIFVQIFRIRSBFTkNSWVBURUQgVVNFUiBBTkQgQkFDS1VQIEtFWUNIQUlOUyEqKlxuLy9cbi8vIH1cbldhbGxldHMucHJvdG90eXBlLmNyZWF0ZVdhbGxldFdpdGhLZXljaGFpbnMgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhcbiAgICBwYXJhbXMsXG4gICAgWydwYXNzcGhyYXNlJ10sXG4gICAgWydsYWJlbCcsICdiYWNrdXBYcHViJywgJ2VudGVycHJpc2UnLCAncGFzc2NvZGVFbmNyeXB0aW9uQ29kZSddLFxuICAgIGNhbGxiYWNrXG4gICk7XG4gIGNvbnN0IHNlbGYgPSB0aGlzO1xuICBjb25zdCBsYWJlbCA9IHBhcmFtcy5sYWJlbDtcblxuICAvLyBDcmVhdGUgdGhlIHVzZXIgYW5kIGJhY2t1cCBrZXkuXG4gIGNvbnN0IHVzZXJLZXljaGFpbiA9IHRoaXMuYml0Z28ua2V5Y2hhaW5zKCkuY3JlYXRlKCk7XG5cbiAgY29uc3QgaGFzQmFja3VwWHB1YiA9ICEhcGFyYW1zLmJhY2t1cFhwdWI7XG4gIGNvbnN0IGhhc0JhY2t1cFhwdWJQcm92aWRlciA9ICEhcGFyYW1zLmJhY2t1cFhwdWJQcm92aWRlcjtcbiAgaWYgKGhhc0JhY2t1cFhwdWIgJiYgaGFzQmFja3VwWHB1YlByb3ZpZGVyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgcHJvdmlkZSBtb3JlIHRoYW4gb25lIGJhY2t1cFhwdWIgb3IgYmFja3VwWHB1YlByb3ZpZGVyIGZsYWcnKTtcbiAgfVxuXG4gIGlmIChwYXJhbXMuZGlzYWJsZVRyYW5zYWN0aW9uTm90aWZpY2F0aW9ucyAhPT0gdW5kZWZpbmVkICYmICFfLmlzQm9vbGVhbihwYXJhbXMuZGlzYWJsZVRyYW5zYWN0aW9uTm90aWZpY2F0aW9ucykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIGRpc2FibGVUcmFuc2FjdGlvbk5vdGlmaWNhdGlvbnMgdG8gYmUgYSBib29sZWFuLiAnKTtcbiAgfVxuXG4gIGxldCBiYWNrdXBLZXljaGFpbjtcbiAgbGV0IGJpdGdvS2V5Y2hhaW47XG5cbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpXG4gICAgLnRoZW4oKCkgPT5cbiAgICAgIHNlbGYuYml0Z28uZW5jcnlwdCh7XG4gICAgICAgIHBhc3N3b3JkOiBwYXJhbXMucGFzc3BocmFzZSxcbiAgICAgICAgaW5wdXQ6IHVzZXJLZXljaGFpbi54cHJ2LFxuICAgICAgICBlbmNyeXB0aW9uVmVyc2lvbjogcGFyYW1zLmVuY3J5cHRpb25WZXJzaW9uLFxuICAgICAgfSlcbiAgICApXG4gICAgLnRoZW4oZnVuY3Rpb24gKGVuY3J5cHRlZFhwcnYpIHtcbiAgICAgIHVzZXJLZXljaGFpbi5lbmNyeXB0ZWRYcHJ2ID0gZW5jcnlwdGVkWHBydjtcblxuICAgICAgY29uc3Qga2V5Y2hhaW5EYXRhOiBhbnkgPSB7XG4gICAgICAgIHhwdWI6IHVzZXJLZXljaGFpbi54cHViLFxuICAgICAgICBlbmNyeXB0ZWRYcHJ2OiB1c2VyS2V5Y2hhaW4uZW5jcnlwdGVkWHBydixcbiAgICAgIH07XG5cbiAgICAgIGlmIChwYXJhbXMucGFzc2NvZGVFbmNyeXB0aW9uQ29kZSkge1xuICAgICAgICBrZXljaGFpbkRhdGEub3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlID0gcGFyYW1zLnBhc3Njb2RlRW5jcnlwdGlvbkNvZGU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzZWxmLmJpdGdvLmtleWNoYWlucygpLmFkZChrZXljaGFpbkRhdGEpO1xuICAgIH0pXG4gICAgLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgLy8gQWRkIHRoZSBiYWNrdXAga2V5Y2hhaW5cbiAgICAgIGlmIChwYXJhbXMuYmFja3VwWHB1YlByb3ZpZGVyKSB7XG4gICAgICAgIC8vIElmIHJlcXVlc3RlZCwgdXNlIGEgS1JTIG9yIGJhY2t1cCBrZXkgcHJvdmlkZXJcbiAgICAgICAgcmV0dXJuIHNlbGYuYml0Z29cbiAgICAgICAgICAua2V5Y2hhaW5zKClcbiAgICAgICAgICAuY3JlYXRlQmFja3VwKHtcbiAgICAgICAgICAgIHByb3ZpZGVyOiBwYXJhbXMuYmFja3VwWHB1YlByb3ZpZGVyLFxuICAgICAgICAgICAgZGlzYWJsZUtSU0VtYWlsOiBwYXJhbXMuZGlzYWJsZUtSU0VtYWlsLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKGtleWNoYWluKSB7XG4gICAgICAgICAgICBiYWNrdXBLZXljaGFpbiA9IGtleWNoYWluO1xuICAgICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAocGFyYW1zLmJhY2t1cFhwdWIpIHtcbiAgICAgICAgLy8gdXNlciBwcm92aWRlZCBiYWNrdXAgeHB1YlxuICAgICAgICBiYWNrdXBLZXljaGFpbiA9IHsgeHB1YjogcGFyYW1zLmJhY2t1cFhwdWIgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIG5vIHByb3ZpZGVkIHhwdWIsIHNvIGRlZmF1bHQgdG8gY3JlYXRpbmcgb25lIGhlcmVcbiAgICAgICAgYmFja3VwS2V5Y2hhaW4gPSBzZWxmLmJpdGdvLmtleWNoYWlucygpLmNyZWF0ZSgpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2VsZi5iaXRnby5rZXljaGFpbnMoKS5hZGQoYmFja3VwS2V5Y2hhaW4pO1xuICAgIH0pXG4gICAgLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHNlbGYuYml0Z28ua2V5Y2hhaW5zKCkuY3JlYXRlQml0R28oKTtcbiAgICB9KVxuICAgIC50aGVuKGZ1bmN0aW9uIChrZXljaGFpbikge1xuICAgICAgYml0Z29LZXljaGFpbiA9IGtleWNoYWluO1xuICAgICAgY29uc3Qgd2FsbGV0UGFyYW1zOiBhbnkgPSB7XG4gICAgICAgIGxhYmVsOiBsYWJlbCxcbiAgICAgICAgbTogMixcbiAgICAgICAgbjogMyxcbiAgICAgICAga2V5Y2hhaW5zOiBbeyB4cHViOiB1c2VyS2V5Y2hhaW4ueHB1YiB9LCB7IHhwdWI6IGJhY2t1cEtleWNoYWluLnhwdWIgfSwgeyB4cHViOiBiaXRnb0tleWNoYWluLnhwdWIgfV0sXG4gICAgICB9O1xuXG4gICAgICBpZiAocGFyYW1zLmVudGVycHJpc2UpIHtcbiAgICAgICAgd2FsbGV0UGFyYW1zLmVudGVycHJpc2UgPSBwYXJhbXMuZW50ZXJwcmlzZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHBhcmFtcy5kaXNhYmxlVHJhbnNhY3Rpb25Ob3RpZmljYXRpb25zKSB7XG4gICAgICAgIHdhbGxldFBhcmFtcy5kaXNhYmxlVHJhbnNhY3Rpb25Ob3RpZmljYXRpb25zID0gcGFyYW1zLmRpc2FibGVUcmFuc2FjdGlvbk5vdGlmaWNhdGlvbnM7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzZWxmLmFkZCh3YWxsZXRQYXJhbXMpO1xuICAgIH0pXG4gICAgLnRoZW4oZnVuY3Rpb24gKG5ld1dhbGxldCkge1xuICAgICAgY29uc3QgcmVzdWx0OiBhbnkgPSB7XG4gICAgICAgIHdhbGxldDogbmV3V2FsbGV0LFxuICAgICAgICB1c2VyS2V5Y2hhaW46IHVzZXJLZXljaGFpbixcbiAgICAgICAgYmFja3VwS2V5Y2hhaW46IGJhY2t1cEtleWNoYWluLFxuICAgICAgICBiaXRnb0tleWNoYWluOiBiaXRnb0tleWNoYWluLFxuICAgICAgfTtcblxuICAgICAgaWYgKGJhY2t1cEtleWNoYWluLnhwcnYpIHtcbiAgICAgICAgcmVzdWx0Lndhcm5pbmcgPSAnQmUgc3VyZSB0byBiYWNrdXAgdGhlIGJhY2t1cCBrZXljaGFpbiAtLSBpdCBpcyBub3Qgc3RvcmVkIGFueXdoZXJlIGVsc2UhJztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KVxuICAgIC50aGVuKGNhbGxiYWNrKVxuICAgIC5jYXRjaChjYWxsYmFjayk7XG59O1xuXG4vL1xuLy8gY3JlYXRlRm9yd2FyZFdhbGxldFxuLy8gQ3JlYXRlcyBhIGZvcndhcmQgd2FsbGV0IGZyb20gYSBzaW5nbGUgcHJpdmF0ZSBrZXkuXG4vLyBCaXRHbyB3aWxsIHdhdGNoIHRoZSB3YWxsZXQgYW5kIHNlbmQgYW55IGluY29taW5nIHRyYW5zYWN0aW9ucyB0byBhIGRlc3RpbmF0aW9uIG11bHRpLXNpZyB3YWxsZXRcbi8vIFdBUk5JTkc6IFRIRSBQUklWQVRFIEtFWSBXSUxMIEJFIFNFTlQgVE8gQklUR08uIFlPVSBNVVNUIENPTlRBQ1QgQklUR08gQkVGT1JFIFVTSU5HIFRISVMgRkVBVFVSRSFcbi8vIFdFIENBTk5PVCBHVUFSQU5URUUgVEhFIFNFQ1VSSVRZIE9GIFNJTkdMRS1TSUcgV0FMTEVUUyBBUyBDVVNUT0RZIElTIFVOQ0xFQVIuXG4vL1xuLy8gUGFyYW1zOlxuLy8gICAgcHJpdktleSAtIHRoZSBwcml2YXRlIGtleSBvbiBhIGxlZ2FjeSBzaW5nbGUtc2lnbmF0dXJlIHdhbGxldCB0byBiZSB3YXRjaGVkIChXSUYgZm9ybWF0KVxuLy8gICAgc291cmNlQWRkcmVzcyAtIHRoZSBiaXRjb2luIGFkZHJlc3MgdG8gZm9yd2FyZCBmcm9tIChjb3JyZXNwb25kcyB0byB0aGUgcHJpdmF0ZSBrZXkpXG4vLyAgICBkZXN0aW5hdGlvbldhbGxldCAtIHRoZSB3YWxsZXQgb2JqZWN0IHRvIHNlbmQgdGhlIGRlc3RpbmF0aW9uIGNvaW5zIHRvICh3aGVuIGluY29taW5nIHRyYW5zYWN0aW9ucyBhcmUgZGV0ZWN0ZWQpXG4vLyAgICBsYWJlbCAtIGxhYmVsIGZvciB0aGUgd2FsbGV0XG4vL1xuV2FsbGV0cy5wcm90b3R5cGUuY3JlYXRlRm9yd2FyZFdhbGxldCA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydwcml2S2V5JywgJ3NvdXJjZUFkZHJlc3MnXSwgWydsYWJlbCddLCBjYWxsYmFjayk7XG5cbiAgaWYgKCFfLmlzT2JqZWN0KHBhcmFtcy5kZXN0aW5hdGlvbldhbGxldCkgfHwgIXBhcmFtcy5kZXN0aW5hdGlvbldhbGxldC5pZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignZXhwZWN0aW5nIGRlc3RpbmF0aW9uV2FsbGV0IG9iamVjdCcpO1xuICB9XG5cbiAgY29uc3Qgc2VsZiA9IHRoaXM7XG5cbiAgbGV0IG5ld0Rlc3RpbmF0aW9uQWRkcmVzcztcbiAgbGV0IGFkZHJlc3NGcm9tUHJpdktleTtcblxuICB0cnkge1xuICAgIGNvbnN0IGtleSA9IHV0eG9saWIuRUNQYWlyLmZyb21XSUYocGFyYW1zLnByaXZLZXksIGdldE5ldHdvcmsoKSBhcyB1dHhvbGliLkJpdGNvaW5KU05ldHdvcmspO1xuICAgIGFkZHJlc3NGcm9tUHJpdktleSA9IGdldEFkZHJlc3NQMlBLSChrZXkpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdleHBlY3RpbmcgYSB2YWxpZCBwcml2S2V5Jyk7XG4gIH1cblxuICBpZiAoYWRkcmVzc0Zyb21Qcml2S2V5ICE9PSBwYXJhbXMuc291cmNlQWRkcmVzcykge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdwcml2S2V5IGRvZXMgbm90IG1hdGNoIHNvdXJjZSBhZGRyZXNzIC0gZ290ICcgKyBhZGRyZXNzRnJvbVByaXZLZXkgKyAnIGV4cGVjdGVkICcgKyBwYXJhbXMuc291cmNlQWRkcmVzc1xuICAgICk7XG4gIH1cblxuICByZXR1cm4gcGFyYW1zLmRlc3RpbmF0aW9uV2FsbGV0LmNyZWF0ZUFkZHJlc3MoKS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAvLyBDcmVhdGUgbmV3IGFkZHJlc3Mgb24gdGhlIGRlc3RpbmF0aW9uIHdhbGxldCB0byByZWNlaXZlIGNvaW5zXG4gICAgbmV3RGVzdGluYXRpb25BZGRyZXNzID0gcmVzdWx0LmFkZHJlc3M7XG5cbiAgICBjb25zdCB3YWxsZXRQYXJhbXM6IGFueSA9IHtcbiAgICAgIHR5cGU6ICdmb3J3YXJkJyxcbiAgICAgIHNvdXJjZUFkZHJlc3M6IHBhcmFtcy5zb3VyY2VBZGRyZXNzLFxuICAgICAgZGVzdGluYXRpb25BZGRyZXNzOiBuZXdEZXN0aW5hdGlvbkFkZHJlc3MsXG4gICAgICBwcml2S2V5OiBwYXJhbXMucHJpdktleSxcbiAgICAgIGxhYmVsOiBwYXJhbXMubGFiZWwsXG4gICAgfTtcblxuICAgIGlmIChwYXJhbXMuZW50ZXJwcmlzZSkge1xuICAgICAgd2FsbGV0UGFyYW1zLmVudGVycHJpc2UgPSBwYXJhbXMuZW50ZXJwcmlzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHNlbGYuYml0Z28ucG9zdChzZWxmLmJpdGdvLnVybCgnL3dhbGxldCcpKS5zZW5kKHdhbGxldFBhcmFtcykucmVzdWx0KCkpXG4gICAgICAudGhlbihjYWxsYmFjaylcbiAgICAgIC5jYXRjaChjYWxsYmFjayk7XG4gIH0pO1xufTtcblxuLyoqXG4gKiBBZGQgYSBuZXcgd2FsbGV0IChhZHZhbmNlZCBtb2RlKS5cbiAqIFRoaXMgYWxsb3dzIHlvdSB0byBtYW51YWxseSBzdWJtaXQgdGhlIGtleWNoYWlucywgdHlwZSwgbSBhbmQgbiBvZiB0aGUgd2FsbGV0XG4gKiBAcGFyYW0ge3N0cmluZ30gbGFiZWwgbGFiZWwgb2YgdGhlIHdhbGxldCB0byBiZSBzaG93biBpbiBVSVxuICogQHBhcmFtIHtudW1iZXJ9IG0gbnVtYmVyIG9mIGtleXMgcmVxdWlyZWQgdG8gdW5sb2NrIHdhbGxldCAoMilcbiAqIEBwYXJhbSB7bnVtYmVyfSBuIG51bWJlciBvZiBrZXlzIGF2YWlsYWJsZSBvbiB0aGUgd2FsbGV0ICgzKVxuICogQHBhcmFtIHthcnJheX0ga2V5Y2hhaW5zIGFycmF5IG9mIGtleWNoYWluIHhwdWJzXG4gKiBAcGFyYW0ge3N0cmluZ30gZW50ZXJwcmlzZSBJRCBvZiB0aGUgZW50ZXJwcmlzZSBlbnRpdHkgdG8gY3JlYXRlIHRoaXMgd2FsbGV0IHVuZGVyLlxuICogQHBhcmFtIHtib29sZWFufSBkaXNhYmxlVHJhbnNhY3Rpb25Ob3RpZmljYXRpb25zIFdoZW4gc2V0IHRvIHRydWUgZGlzYWJsZXMgbm90aWZpY2F0aW9ucyBmb3IgdHJhbnNhY3Rpb25zIG9uIHRoaXMgd2FsbGV0LlxuICovXG5XYWxsZXRzLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbJ2xhYmVsJywgJ2VudGVycHJpc2UnXSwgY2FsbGJhY2spO1xuXG4gIGlmIChBcnJheS5pc0FycmF5KHBhcmFtcy5rZXljaGFpbnMpID09PSBmYWxzZSB8fCAhXy5pc051bWJlcihwYXJhbXMubSkgfHwgIV8uaXNOdW1iZXIocGFyYW1zLm4pKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFyZ3VtZW50Jyk7XG4gIH1cblxuICAvLyBUT0RPOiBzdXBwb3J0IG1vcmUgdHlwZXMgb2YgbXVsdGlzaWdcbiAgaWYgKHBhcmFtcy5tICE9PSAyIHx8IHBhcmFtcy5uICE9PSAzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd1bnN1cHBvcnRlZCBtdWx0aS1zaWcgdHlwZScpO1xuICB9XG5cbiAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gIGNvbnN0IGtleWNoYWlucyA9IHBhcmFtcy5rZXljaGFpbnMubWFwKGZ1bmN0aW9uIChrKSB7XG4gICAgcmV0dXJuIHsgeHB1Yjogay54cHViIH07XG4gIH0pO1xuICBjb25zdCB3YWxsZXRQYXJhbXM6IGFueSA9IHtcbiAgICBsYWJlbDogcGFyYW1zLmxhYmVsLFxuICAgIG06IHBhcmFtcy5tLFxuICAgIG46IHBhcmFtcy5uLFxuICAgIGtleWNoYWluczoga2V5Y2hhaW5zLFxuICB9O1xuXG4gIGlmIChwYXJhbXMuZW50ZXJwcmlzZSkge1xuICAgIHdhbGxldFBhcmFtcy5lbnRlcnByaXNlID0gcGFyYW1zLmVudGVycHJpc2U7XG4gIH1cblxuICBpZiAocGFyYW1zLmRpc2FibGVUcmFuc2FjdGlvbk5vdGlmaWNhdGlvbnMpIHtcbiAgICB3YWxsZXRQYXJhbXMuZGlzYWJsZVRyYW5zYWN0aW9uTm90aWZpY2F0aW9ucyA9IHBhcmFtcy5kaXNhYmxlVHJhbnNhY3Rpb25Ob3RpZmljYXRpb25zO1xuICB9XG5cbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLmJpdGdvLnBvc3QodGhpcy5iaXRnby51cmwoJy93YWxsZXQnKSkuc2VuZCh3YWxsZXRQYXJhbXMpLnJlc3VsdCgpKVxuICAgIC50aGVuKGZ1bmN0aW9uIChib2R5KSB7XG4gICAgICByZXR1cm4gbmV3IFdhbGxldChzZWxmLmJpdGdvLCBib2R5KTtcbiAgICB9KVxuICAgIC50aGVuKGNhbGxiYWNrKVxuICAgIC5jYXRjaChjYWxsYmFjayk7XG59O1xuXG4vL1xuLy8gZ2V0XG4vLyBTaG9ydGhhbmQgdG8gZ2V0V2FsbGV0XG4vLyBQYXJhbWV0ZXJzIGluY2x1ZGU6XG4vLyAgIGlkOiB0aGUgaWQgb2YgdGhlIHdhbGxldFxuLy9cbldhbGxldHMucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHJldHVybiB0aGlzLmdldFdhbGxldChwYXJhbXMsIGNhbGxiYWNrKTtcbn07XG5cbi8vXG4vLyByZW1vdmVcbi8vIFJlbW92ZSBhbiBleGlzdGluZyB3YWxsZXQuXG4vLyBQYXJhbWV0ZXJzIGluY2x1ZGU6XG4vLyAgIGlkOiB0aGUgaWQgb2YgdGhlIHdhbGxldFxuLy9cbldhbGxldHMucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydpZCddLCBbXSwgY2FsbGJhY2spO1xuXG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5iaXRnby5kZWwodGhpcy5iaXRnby51cmwoJy93YWxsZXQvJyArIHBhcmFtcy5pZCkpLnJlc3VsdCgpKVxuICAgIC50aGVuKGNhbGxiYWNrKVxuICAgIC5jYXRjaChjYWxsYmFjayk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFdhbGxldHM7XG4iXX0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../../test/unit/api.ts"],"names":[],"mappings":""}
|