@bitgo-beta/sdk-coin-avaxp 3.2.3-alpha.13 → 3.2.3-alpha.130
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/CHANGELOG.md +450 -0
- package/dist/src/avaxp.d.ts +3 -4
- package/dist/src/avaxp.d.ts.map +1 -1
- package/dist/src/avaxp.js +29 -31
- package/dist/src/iface.d.ts +0 -4
- package/dist/src/iface.d.ts.map +1 -1
- package/dist/src/iface.js +1 -1
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +7 -2
- package/dist/src/lib/atomicInCTransactionBuilder.d.ts +2 -2
- package/dist/src/lib/atomicInCTransactionBuilder.d.ts.map +1 -1
- package/dist/src/lib/atomicInCTransactionBuilder.js +1 -1
- package/dist/src/lib/atomicTransactionBuilder.d.ts +2 -2
- package/dist/src/lib/atomicTransactionBuilder.d.ts.map +1 -1
- package/dist/src/lib/atomicTransactionBuilder.js +5 -5
- package/dist/src/lib/delegatorTxBuilder.d.ts +6 -6
- package/dist/src/lib/delegatorTxBuilder.d.ts.map +1 -1
- package/dist/src/lib/delegatorTxBuilder.js +7 -7
- package/dist/src/lib/deprecatedTransaction.d.ts +100 -0
- package/dist/src/lib/deprecatedTransaction.d.ts.map +1 -0
- package/dist/src/lib/deprecatedTransaction.js +345 -0
- package/dist/src/lib/deprecatedTransactionBuilder.d.ts +115 -0
- package/dist/src/lib/deprecatedTransactionBuilder.d.ts.map +1 -0
- package/dist/src/lib/deprecatedTransactionBuilder.js +210 -0
- package/dist/src/lib/exportInCTxBuilder.d.ts +8 -8
- package/dist/src/lib/exportInCTxBuilder.d.ts.map +1 -1
- package/dist/src/lib/exportInCTxBuilder.js +4 -4
- package/dist/src/lib/exportTxBuilder.d.ts +4 -4
- package/dist/src/lib/exportTxBuilder.d.ts.map +1 -1
- package/dist/src/lib/exportTxBuilder.js +3 -3
- package/dist/src/lib/iface.d.ts +13 -8
- package/dist/src/lib/iface.d.ts.map +1 -1
- package/dist/src/lib/iface.js +1 -1
- package/dist/src/lib/importInCTxBuilder.d.ts +4 -4
- package/dist/src/lib/importInCTxBuilder.d.ts.map +1 -1
- package/dist/src/lib/importInCTxBuilder.js +6 -6
- package/dist/src/lib/importTxBuilder.d.ts +4 -4
- package/dist/src/lib/importTxBuilder.d.ts.map +1 -1
- package/dist/src/lib/importTxBuilder.js +3 -3
- package/dist/src/lib/index.d.ts +2 -0
- package/dist/src/lib/index.d.ts.map +1 -1
- package/dist/src/lib/index.js +11 -3
- package/dist/src/lib/keyPair.js +9 -9
- package/dist/src/lib/permissionlessValidatorTxBuilder.d.ts +154 -0
- package/dist/src/lib/permissionlessValidatorTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/permissionlessValidatorTxBuilder.js +452 -0
- package/dist/src/lib/transaction.d.ts +19 -25
- package/dist/src/lib/transaction.d.ts.map +1 -1
- package/dist/src/lib/transaction.js +67 -113
- package/dist/src/lib/transactionBuilder.d.ts +31 -82
- package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilder.js +65 -151
- package/dist/src/lib/transactionBuilderFactory.d.ts +16 -8
- package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilderFactory.js +78 -19
- package/dist/src/lib/utils.d.ts +22 -7
- package/dist/src/lib/utils.d.ts.map +1 -1
- package/dist/src/lib/utils.js +53 -11
- package/dist/src/lib/utxoEngine.d.ts +10 -1
- package/dist/src/lib/utxoEngine.d.ts.map +1 -1
- package/dist/src/lib/utxoEngine.js +27 -3
- package/dist/src/lib/validatorTxBuilder.d.ts +4 -4
- package/dist/src/lib/validatorTxBuilder.d.ts.map +1 -1
- package/dist/src/lib/validatorTxBuilder.js +2 -2
- package/dist/src/register.d.ts +3 -0
- package/dist/src/register.d.ts.map +1 -0
- package/dist/src/register.js +11 -0
- package/dist/test/resources/avaxp.d.ts +80 -5
- package/dist/test/resources/avaxp.d.ts.map +1 -1
- package/dist/test/resources/avaxp.js +164 -31
- package/dist/test/resources/tx/importP.js +8 -8
- package/dist/test/unit/avaxp.js +94 -102
- package/dist/test/unit/lib/exportC2PTxBuilder.js +6 -2
- package/dist/test/unit/lib/exportP2CTxBuilder.js +10 -10
- package/dist/test/unit/lib/importC2PTxBuilder.js +8 -4
- package/dist/test/unit/lib/importP2CTxBuilder.js +8 -6
- package/dist/test/unit/lib/keyPair.js +6 -2
- package/dist/test/unit/lib/permissionlessValidatorTxBuilder.d.ts +2 -0
- package/dist/test/unit/lib/permissionlessValidatorTxBuilder.d.ts.map +1 -0
- package/dist/test/unit/lib/permissionlessValidatorTxBuilder.js +331 -0
- package/dist/test/unit/lib/transactionBuilderFactory.js +59 -4
- package/dist/test/unit/lib/utils.js +6 -2
- package/dist/test/unit/lib/utxoEngine.js +6 -6
- package/dist/test/unit/lib/validateTxBuilder.js +12 -13
- package/dist/tsconfig.tsbuildinfo +1 -12076
- package/package.json +9 -8
|
@@ -4,17 +4,15 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.TransactionBuilder = void 0;
|
|
7
|
+
const avalanchejs_1 = require("@bitgo-forks/avalanchejs");
|
|
7
8
|
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
8
9
|
const transaction_1 = require("./transaction");
|
|
9
|
-
const keyPair_1 = require("./keyPair");
|
|
10
|
-
const avalanche_1 = require("avalanche");
|
|
11
10
|
const utils_1 = __importDefault(require("./utils"));
|
|
12
|
-
const platformvm_1 = require("avalanche/dist/apis/platformvm");
|
|
13
11
|
class TransactionBuilder extends sdk_core_1.BaseTransactionBuilder {
|
|
14
12
|
constructor(_coinConfig) {
|
|
15
13
|
super(_coinConfig);
|
|
16
|
-
this._signer = [];
|
|
17
14
|
this.recoverSigner = false;
|
|
15
|
+
this._signer = [];
|
|
18
16
|
this._transaction = new transaction_1.Transaction(_coinConfig);
|
|
19
17
|
}
|
|
20
18
|
/**
|
|
@@ -24,48 +22,58 @@ class TransactionBuilder extends sdk_core_1.BaseTransactionBuilder {
|
|
|
24
22
|
* @returns itself
|
|
25
23
|
*/
|
|
26
24
|
initBuilder(tx) {
|
|
27
|
-
const baseTx = tx.
|
|
28
|
-
if (baseTx.
|
|
29
|
-
|
|
25
|
+
const baseTx = tx.tx.baseTx;
|
|
26
|
+
if (baseTx.NetworkId.value() !== this._transaction._networkID ||
|
|
27
|
+
baseTx.BlockchainId.value() !== this._transaction._blockchainID) {
|
|
30
28
|
throw new Error('Network or blockchain is not equals');
|
|
31
29
|
}
|
|
32
|
-
// EVMBaseTx has not memo.
|
|
33
|
-
if ('getMemo' in baseTx) {
|
|
34
|
-
this._transaction._memo = baseTx.getMemo();
|
|
35
|
-
}
|
|
36
30
|
this._transaction.setTransaction(tx);
|
|
37
31
|
return this;
|
|
38
32
|
}
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
33
|
+
// region Validators
|
|
34
|
+
/**
|
|
35
|
+
* Validates the threshold
|
|
36
|
+
* @param threshold
|
|
37
|
+
*/
|
|
38
|
+
validateThreshold(threshold) {
|
|
39
|
+
if (!threshold || threshold !== 2) {
|
|
40
|
+
throw new sdk_core_1.BuildTransactionError('Invalid transaction: threshold must be set to 2');
|
|
41
|
+
}
|
|
45
42
|
}
|
|
46
|
-
/**
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
43
|
+
/**
|
|
44
|
+
* Check the UTXO has expected fields.
|
|
45
|
+
* @param UTXO
|
|
46
|
+
*/
|
|
47
|
+
validateUtxo(value) {
|
|
48
|
+
['outputID', 'amount', 'txid', 'outputidx'].forEach((field) => {
|
|
49
|
+
if (!value.hasOwnProperty(field))
|
|
50
|
+
throw new sdk_core_1.BuildTransactionError(`Utxos required ${field}`);
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Check the list of UTXOS is empty and check each UTXO.
|
|
55
|
+
* @param values
|
|
56
|
+
*/
|
|
57
|
+
validateUtxos(values) {
|
|
58
|
+
if (values.length === 0) {
|
|
59
|
+
throw new sdk_core_1.BuildTransactionError("Utxos can't be empty array");
|
|
52
60
|
}
|
|
53
|
-
|
|
61
|
+
values.forEach(this.validateUtxo);
|
|
54
62
|
}
|
|
55
|
-
// region Getters and Setters
|
|
56
63
|
/**
|
|
57
|
-
*
|
|
58
|
-
*
|
|
59
|
-
* @param {boolean} true if it's recovery signer, default true.
|
|
64
|
+
* Validates locktime
|
|
65
|
+
* @param locktime
|
|
60
66
|
*/
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
67
|
+
validateLocktime(locktime) {
|
|
68
|
+
if (!locktime || locktime < BigInt(0)) {
|
|
69
|
+
throw new sdk_core_1.BuildTransactionError('Invalid transaction: locktime must be 0 or higher');
|
|
70
|
+
}
|
|
64
71
|
}
|
|
72
|
+
// endregion
|
|
65
73
|
/**
|
|
66
74
|
* Threshold is an int that names the number of unique signatures required to spend the output.
|
|
67
75
|
* Must be less than or equal to the length of Addresses.
|
|
68
|
-
* @param {number}
|
|
76
|
+
* @param {number} value
|
|
69
77
|
*/
|
|
70
78
|
threshold(value) {
|
|
71
79
|
this.validateThreshold(value);
|
|
@@ -78,13 +86,22 @@ class TransactionBuilder extends sdk_core_1.BaseTransactionBuilder {
|
|
|
78
86
|
* @param value
|
|
79
87
|
*/
|
|
80
88
|
locktime(value) {
|
|
81
|
-
this.validateLocktime(
|
|
82
|
-
this._transaction._locktime =
|
|
89
|
+
this.validateLocktime(BigInt(value));
|
|
90
|
+
this._transaction._locktime = BigInt(value);
|
|
91
|
+
return this;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* When using recovery key must be set here
|
|
95
|
+
* TODO: STLX-17317 recovery key signing
|
|
96
|
+
* @param {boolean}[recoverSigner=true] whether it's recovery signer
|
|
97
|
+
*/
|
|
98
|
+
recoverMode(recoverSigner = true) {
|
|
99
|
+
this.recoverSigner = recoverSigner;
|
|
83
100
|
return this;
|
|
84
101
|
}
|
|
85
102
|
/**
|
|
86
|
-
* fromPubKey is a list of unique addresses that correspond to the private keys that can be used to spend this output
|
|
87
|
-
* @param {string |
|
|
103
|
+
* fromPubKey is a list of unique addresses that correspond to the private keys that can be used to spend this output
|
|
104
|
+
* @param {string | string[]} senderPubKey
|
|
88
105
|
*/
|
|
89
106
|
fromPubKey(senderPubKey) {
|
|
90
107
|
const pubKeys = senderPubKey instanceof Array ? senderPubKey : [senderPubKey];
|
|
@@ -102,123 +119,20 @@ class TransactionBuilder extends sdk_core_1.BaseTransactionBuilder {
|
|
|
102
119
|
this._transaction._utxos = value;
|
|
103
120
|
return this;
|
|
104
121
|
}
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
this._transaction._memo = utils_1.default.stringToBuffer(value);
|
|
113
|
-
return this;
|
|
114
|
-
}
|
|
115
|
-
/**
|
|
116
|
-
* Getter for know if build should sign
|
|
117
|
-
*/
|
|
118
|
-
get hasSigner() {
|
|
119
|
-
return this._signer !== undefined && this._signer.length > 0;
|
|
120
|
-
}
|
|
122
|
+
// TODO(CR-1073):
|
|
123
|
+
// Implement:
|
|
124
|
+
// buildImplementation
|
|
125
|
+
// signImplementation
|
|
126
|
+
// get transaction
|
|
127
|
+
// set transaction
|
|
128
|
+
// validateRawTransaction
|
|
121
129
|
/** @inheritdoc */
|
|
122
|
-
|
|
130
|
+
fromImplementation(rawTransaction) {
|
|
131
|
+
const [tx] = avalanchejs_1.pvmSerial.AddPermissionlessValidatorTx.fromBytes(Buffer.from(rawTransaction, 'hex'), avalanchejs_1.avmSerial.getAVMManager().getDefaultCodec());
|
|
132
|
+
// TODO(CR-1073): check if initBuilder can only use UnsignedTx and pvmSerial.BaseTx is not required
|
|
133
|
+
this.initBuilder(tx);
|
|
123
134
|
return this._transaction;
|
|
124
135
|
}
|
|
125
|
-
set transaction(transaction) {
|
|
126
|
-
this._transaction = transaction;
|
|
127
|
-
}
|
|
128
|
-
/** @inheritdoc */
|
|
129
|
-
signImplementation({ key }) {
|
|
130
|
-
this._signer.push(new keyPair_1.KeyPair({ prv: key }));
|
|
131
|
-
return this.transaction;
|
|
132
|
-
}
|
|
133
|
-
// endregion
|
|
134
|
-
// region Validators
|
|
135
|
-
/**
|
|
136
|
-
* Validates the threshold
|
|
137
|
-
* @param threshold
|
|
138
|
-
*/
|
|
139
|
-
validateThreshold(threshold) {
|
|
140
|
-
if (!threshold || threshold !== 2) {
|
|
141
|
-
throw new sdk_core_1.BuildTransactionError('Invalid transaction: threshold must be set to 2');
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
/**
|
|
145
|
-
* Validates locktime
|
|
146
|
-
* @param locktime
|
|
147
|
-
*/
|
|
148
|
-
validateLocktime(locktime) {
|
|
149
|
-
if (!locktime || locktime.lt(new avalanche_1.BN(0))) {
|
|
150
|
-
throw new sdk_core_1.BuildTransactionError('Invalid transaction: locktime must be 0 or higher');
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
/** @inheritdoc */
|
|
154
|
-
validateAddress(address, addressFormat) {
|
|
155
|
-
if (!utils_1.default.isValidAddress(address.address)) {
|
|
156
|
-
throw new sdk_core_1.BuildTransactionError('Invalid address');
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
/** @inheritdoc */
|
|
160
|
-
validateKey({ key }) {
|
|
161
|
-
if (!new keyPair_1.KeyPair({ prv: key })) {
|
|
162
|
-
throw new sdk_core_1.BuildTransactionError('Invalid key');
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
/**
|
|
166
|
-
* Check the raw transaction has a valid format in the blockchain context, throw otherwise.
|
|
167
|
-
* It overrides abstract method from BaseTransactionBuilder
|
|
168
|
-
*
|
|
169
|
-
* @param rawTransaction Transaction in any format
|
|
170
|
-
*/
|
|
171
|
-
validateRawTransaction(rawTransaction) {
|
|
172
|
-
utils_1.default.validateRawTransaction(rawTransaction);
|
|
173
|
-
}
|
|
174
|
-
/** @inheritdoc */
|
|
175
|
-
validateTransaction(transaction) {
|
|
176
|
-
// throw new NotImplementedError('validateTransaction not implemented');
|
|
177
|
-
}
|
|
178
|
-
/** @inheritdoc */
|
|
179
|
-
validateValue(value) {
|
|
180
|
-
if (value.isLessThan(0)) {
|
|
181
|
-
throw new sdk_core_1.BuildTransactionError('Value cannot be less than zero');
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
/**
|
|
185
|
-
* Check the list of UTXOS is empty and check each UTXO.
|
|
186
|
-
* @param values
|
|
187
|
-
*/
|
|
188
|
-
validateUtxos(values) {
|
|
189
|
-
if (values.length === 0) {
|
|
190
|
-
throw new sdk_core_1.BuildTransactionError("Utxos can't be empty array");
|
|
191
|
-
}
|
|
192
|
-
values.forEach(this.validateUtxo);
|
|
193
|
-
}
|
|
194
|
-
/**
|
|
195
|
-
* Check the UTXO has expected fields.
|
|
196
|
-
* @param UTXO
|
|
197
|
-
*/
|
|
198
|
-
validateUtxo(value) {
|
|
199
|
-
['outputID', 'amount', 'txid', 'outputidx'].forEach((field) => {
|
|
200
|
-
if (!value.hasOwnProperty(field))
|
|
201
|
-
throw new sdk_core_1.BuildTransactionError(`Utxos required ${field}`);
|
|
202
|
-
});
|
|
203
|
-
}
|
|
204
|
-
/**
|
|
205
|
-
* Check the amount is positive.
|
|
206
|
-
* @param amount
|
|
207
|
-
*/
|
|
208
|
-
validateAmount(amount) {
|
|
209
|
-
if (amount.lten(0)) {
|
|
210
|
-
throw new sdk_core_1.BuildTransactionError('Amount must be greater than 0');
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
/**
|
|
214
|
-
* Check the buffer has 32 byte long.
|
|
215
|
-
* @param chainID
|
|
216
|
-
*/
|
|
217
|
-
validateChainId(chainID) {
|
|
218
|
-
if (chainID.length !== 32) {
|
|
219
|
-
throw new sdk_core_1.BuildTransactionError('Chain id are 32 byte size');
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
136
|
}
|
|
223
137
|
exports.TransactionBuilder = TransactionBuilder;
|
|
224
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb25CdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi90cmFuc2FjdGlvbkJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBRUEsbURBTzhCO0FBQzlCLCtDQUE0QztBQUM1Qyx1Q0FBb0M7QUFDcEMseUNBQXFEO0FBQ3JELG9EQUE0QjtBQUU1QiwrREFBNkQ7QUFFN0QsTUFBc0Isa0JBQW1CLFNBQVEsaUNBQXNCO0lBS3JFLFlBQVksV0FBaUM7UUFDM0MsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBSmQsWUFBTyxHQUFjLEVBQUUsQ0FBQztRQUNyQixrQkFBYSxHQUFHLEtBQUssQ0FBQztRQUk5QixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUkseUJBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxXQUFXLENBQUMsRUFBTTtRQUNoQixNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUMsYUFBYSxFQUFFLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDbkQsSUFDRSxNQUFNLENBQUMsWUFBWSxFQUFFLEtBQUssSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVO1lBQ3RELENBQUMsTUFBTSxDQUFDLGVBQWUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxFQUNqRTtZQUNBLE1BQU0sSUFBSSxLQUFLLENBQUMscUNBQXFDLENBQUMsQ0FBQztTQUN4RDtRQUNELDBCQUEwQjtRQUMxQixJQUFJLFNBQVMsSUFBSSxNQUFNLEVBQUU7WUFDdkIsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO1NBQzVDO1FBQ0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDckMsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQs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RTtZQUN6QixNQUFNLElBQUksZ0NBQXFCLENBQUMsMkJBQTJCLENBQUMsQ0FBQztTQUM5RDtJQUNILENBQUM7Q0FHRjtBQXJQRCxnREFxUEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCYXNlQ29pbiBhcyBDb2luQ29uZmlnIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgQmlnTnVtYmVyIGZyb20gJ2JpZ251bWJlci5qcyc7XG5pbXBvcnQge1xuICBCYXNlQWRkcmVzcyxcbiAgQmFzZUtleSxcbiAgQmFzZVRyYW5zYWN0aW9uQnVpbGRlcixcbiAgVHJhbnNhY3Rpb25UeXBlLFxuICBCdWlsZFRyYW5zYWN0aW9uRXJyb3IsXG4gIEJhc2VUcmFuc2FjdGlvbixcbn0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb24gfSBmcm9tICcuL3RyYW5zYWN0aW9uJztcbmltcG9ydCB7IEtleVBhaXIgfSBmcm9tICcuL2tleVBhaXInO1xuaW1wb3J0IHsgQk4sIEJ1ZmZlciBhcyBCdWZmZXJBdmF4IH0gZnJvbSAnYXZhbGFuY2hlJztcbmltcG9ydCB1dGlscyBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7IERlY29kZWRVdHhvT2JqLCBUeCB9IGZyb20gJy4vaWZhY2UnO1xuaW1wb3J0IHsgVHggYXMgUFZNVHggfSBmcm9tICdhdmFsYW5jaGUvZGlzdC9hcGlzL3BsYXRmb3Jtdm0nO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgVHJhbnNhY3Rpb25CdWlsZGVyIGV4dGVuZHMgQmFzZVRyYW5zYWN0aW9uQnVpbGRlciB7XG4gIHByaXZhdGUgX3RyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbjtcbiAgcHVibGljIF9zaWduZXI6IEtleVBhaXJbXSA9IFtdO1xuICBwcm90ZWN0ZWQgcmVjb3ZlclNpZ25lciA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKF9jb2luQ29uZmlnOiBSZWFkb25seTxDb2luQ29uZmlnPikge1xuICAgIHN1cGVyKF9jb2luQ29uZmlnKTtcbiAgICB0aGlzLl90cmFuc2FjdGlvbiA9IG5ldyBUcmFuc2FjdGlvbihfY29pbkNvbmZpZyk7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSB0aGUgdHJhbnNhY3Rpb24gYnVpbGRlciBmaWVsZHMgdXNpbmcgdGhlIGRlY29kZWQgdHJhbnNhY3Rpb24gZGF0YVxuICAgKlxuICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9ufSB0eCB0aGUgdHJhbnNhY3Rpb24gZGF0YVxuICAgKiBAcmV0dXJucyBpdHNlbGZcbiAgICovXG4gIGluaXRCdWlsZGVyKHR4OiBUeCk6IHRoaXMge1xuICAgIGNvbnN0IGJhc2VUeCA9IHR4LmdldFVuc2lnbmVkVHgoKS5nZXRUcmFuc2FjdGlvbigpO1xuICAgIGlmIChcbiAgICAgIGJhc2VUeC5nZXROZXR3b3JrSUQoKSAhPT0gdGhpcy5fdHJhbnNhY3Rpb24uX25ldHdvcmtJRCB8fFxuICAgICAgIWJhc2VUeC5nZXRCbG9ja2NoYWluSUQoKS5lcXVhbHModGhpcy5fdHJhbnNhY3Rpb24uX2Jsb2NrY2hhaW5JRClcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTmV0d29yayBvciBibG9ja2NoYWluIGlzIG5vdCBlcXVhbHMnKTtcbiAgICB9XG4gICAgLy8gRVZNQmFzZVR4IGhhcyBub3QgbWVtby5cbiAgICBpZiAoJ2dldE1lbW8nIGluIGJhc2VUeCkge1xuICAgICAgdGhpcy5fdHJhbnNhY3Rpb24uX21lbW8gPSBiYXNlVHguZ2V0TWVtbygpO1xuICAgIH1cbiAgICB0aGlzLl90cmFuc2FjdGlvbi5zZXRUcmFuc2FjdGlvbih0eCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgcHJvdGVjdGVkIGZyb21JbXBsZW1lbnRhdGlvbihyYXdUcmFuc2FjdGlvbjogc3RyaW5nKTogVHJhbnNhY3Rpb24ge1xuICAgIGNvbnN0IHR4ID0gbmV3IFBWTVR4KCk7XG4gICAgdHguZnJvbUJ1ZmZlcihCdWZmZXJBdmF4LmZyb20ocmF3VHJhbnNhY3Rpb24sICdoZXgnKSk7XG4gICAgdGhpcy5pbml0QnVpbGRlcih0eCk7XG4gICAgcmV0dXJuIHRoaXMudHJhbnNhY3Rpb247XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGJ1aWxkSW1wbGVtZW50YXRpb24oKTogUHJvbWlzZTxUcmFuc2FjdGlvbj4ge1xuICAgIHRoaXMuYnVpbGRBdmF4VHJhbnNhY3Rpb24oKTtcbiAgICB0aGlzLnRyYW5zYWN0aW9uLnNldFRyYW5zYWN0aW9uVHlwZSh0aGlzLnRyYW5zYWN0aW9uVHlwZSk7XG4gICAgaWYgKHRoaXMuaGFzU2lnbmVyKSB7XG4gICAgICB0aGlzLl9zaWduZXIuZm9yRWFjaCgoa2V5UGFpcikgPT4gdGhpcy50cmFuc2FjdGlvbi5zaWduKGtleVBhaXIpKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudHJhbnNhY3Rpb247XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIHRoZSBhdmF4IHRyYW5zYWN0aW9uLiB0cmFuc2FjdGlvbiBmaWVsZCBpcyBjaGFuZ2VkLlxuICAgKi9cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGJ1aWxkQXZheFRyYW5zYWN0aW9uKCk6IHZvaWQ7XG5cbiAgLy8gcmVnaW9uIEdldHRlcnMgYW5kIFNldHRlcnNcbiAgLyoqXG4gICAqIFdoZW4gdXNpbmcgcmVjb3Zlcnkga2V5IG11c3QgYmUgc2V0IGhlcmVcbiAgICogVE9ETzogU1RMWC0xNzMxNyByZWNvdmVyeSBrZXkgc2lnbmluZ1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHRydWUgaWYgaXQncyByZWNvdmVyeSBzaWduZXIsIGRlZmF1bHQgdHJ1ZS5cbiAgICovXG4gIHB1YmxpYyByZWNvdmVyTW9kZShyZWNvdmVyU2lnbmVyID0gdHJ1ZSk6IHRoaXMge1xuICAgIHRoaXMucmVjb3ZlclNpZ25lciA9IHJlY292ZXJTaWduZXI7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogVGhyZXNob2xkIGlzIGFuIGludCB0aGF0IG5hbWVzIHRoZSBudW1iZXIgb2YgdW5pcXVlIHNpZ25hdHVyZXMgcmVxdWlyZWQgdG8gc3BlbmQgdGhlIG91dHB1dC5cbiAgICogTXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGxlbmd0aCBvZiBBZGRyZXNzZXMuXG4gICAqIEBwYXJhbSB7bnVtYmVyfVxuICAgKi9cbiAgdGhyZXNob2xkKHZhbHVlOiBudW1iZXIpOiB0aGlzIHtcbiAgICB0aGlzLnZhbGlkYXRlVGhyZXNob2xkKHZhbHVlKTtcbiAgICB0aGlzLl90cmFuc2FjdGlvbi5fdGhyZXNob2xkID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogTG9ja3RpbWUgaXMgYSBsb25nIHRoYXQgY29udGFpbnMgdGhlIHVuaXggdGltZXN0YW1wIHRoYXQgdGhpcyBvdXRwdXQgY2FuIGJlIHNwZW50IGFmdGVyLlxuICAgKiBUaGUgdW5peCB0aW1lc3RhbXAgaXMgc3BlY2lmaWMgdG8gdGhlIHNlY29uZC5cbiAgICogQHBhcmFtIHZhbHVlXG4gICAqL1xuICBsb2NrdGltZSh2YWx1ZTogc3RyaW5nIHwgbnVtYmVyKTogdGhpcyB7XG4gICAgdGhpcy52YWxpZGF0ZUxvY2t0aW1lKG5ldyBCTih2YWx1ZSkpO1xuICAgIHRoaXMuX3RyYW5zYWN0aW9uLl9sb2NrdGltZSA9IG5ldyBCTih2YWx1ZSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogZnJvbVB1YktleSBpcyBhIGxpc3Qgb2YgdW5pcXVlIGFkZHJlc3NlcyB0aGF0IGNvcnJlc3BvbmQgdG8gdGhlIHByaXZhdGUga2V5cyB0aGF0IGNhbiBiZSB1c2VkIHRvIHNwZW5kIHRoaXMgb3V0cHV0LlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IHN0aXJuZ1tdfSBzZW5kZXJQdWJLZXlcbiAgICovXG4gIGZyb21QdWJLZXkoc2VuZGVyUHViS2V5OiBzdHJpbmcgfCBzdHJpbmdbXSk6IHRoaXMge1xuICAgIGNvbnN0IHB1YktleXMgPSBzZW5kZXJQdWJLZXkgaW5zdGFuY2VvZiBBcnJheSA/IHNlbmRlclB1YktleSA6IFtzZW5kZXJQdWJLZXldO1xuICAgIHRoaXMuX3RyYW5zYWN0aW9uLl9mcm9tQWRkcmVzc2VzID0gcHViS2V5cy5tYXAodXRpbHMucGFyc2VBZGRyZXNzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0IG9mIFVUWE8gcmVxdWlyZWQgYXMgaW5wdXRzLlxuICAgKiBBIFVUWE8gaXMgYSBzdGFuZGFsb25lIHJlcHJlc2VudGF0aW9uIG9mIGEgdHJhbnNhY3Rpb24gb3V0cHV0LlxuICAgKlxuICAgKiBAcGFyYW0ge0RlY29kZWRVdHhvT2JqW119IGxpc3Qgb2YgVVRYT1NcbiAgICovXG4gIHV0eG9zKHZhbHVlOiBEZWNvZGVkVXR4b09ialtdKTogdGhpcyB7XG4gICAgdGhpcy52YWxpZGF0ZVV0eG9zKHZhbHVlKTtcbiAgICB0aGlzLl90cmFuc2FjdGlvbi5fdXR4b3MgPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIE9wdGlvbmFsIEJ1ZmZlciBmb3IgdGhlIG1lbW9cbiAgICogQHJldHVybnMgdmFsdWUgQnVmZmVyIGZvciB0aGUgbWVtb1xuICAgKiBzZXQgdXNpbmcgQnVmZmVyLmZyb20oXCJtZXNzYWdlXCIpXG4gICAqL1xuICBtZW1vKHZhbHVlOiBzdHJpbmcpOiB0aGlzIHtcbiAgICB0aGlzLl90cmFuc2FjdGlvbi5fbWVtbyA9IHV0aWxzLnN0cmluZ1RvQnVmZmVyKHZhbHVlKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yIGtub3cgaWYgYnVpbGQgc2hvdWxkIHNpZ25cbiAgICovXG4gIGdldCBoYXNTaWduZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3NpZ25lciAhPT0gdW5kZWZpbmVkICYmIHRoaXMuX3NpZ25lci5sZW5ndGggPiAwO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHByb3RlY3RlZCBnZXQgdHJhbnNhY3Rpb24oKTogVHJhbnNhY3Rpb24ge1xuICAgIHJldHVybiB0aGlzLl90cmFuc2FjdGlvbjtcbiAgfVxuXG4gIHByb3RlY3RlZCBzZXQgdHJhbnNhY3Rpb24odHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uKSB7XG4gICAgdGhpcy5fdHJhbnNhY3Rpb24gPSB0cmFuc2FjdGlvbjtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBwcm90ZWN0ZWQgc2lnbkltcGxlbWVudGF0aW9uKHsga2V5IH06IEJhc2VLZXkpOiBCYXNlVHJhbnNhY3Rpb24ge1xuICAgIHRoaXMuX3NpZ25lci5wdXNoKG5ldyBLZXlQYWlyKHsgcHJ2OiBrZXkgfSkpO1xuICAgIHJldHVybiB0aGlzLnRyYW5zYWN0aW9uO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGdldCB0cmFuc2FjdGlvblR5cGUoKTogVHJhbnNhY3Rpb25UeXBlO1xuXG4gIC8vIGVuZHJlZ2lvblxuICAvLyByZWdpb24gVmFsaWRhdG9yc1xuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgdGhlIHRocmVzaG9sZFxuICAgKiBAcGFyYW0gdGhyZXNob2xkXG4gICAqL1xuICB2YWxpZGF0ZVRocmVzaG9sZCh0aHJlc2hvbGQ6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICghdGhyZXNob2xkIHx8IHRocmVzaG9sZCAhPT0gMikge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignSW52YWxpZCB0cmFuc2FjdGlvbjogdGhyZXNob2xkIG11c3QgYmUgc2V0IHRvIDInKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIGxvY2t0aW1lXG4gICAqIEBwYXJhbSBsb2NrdGltZVxuICAgKi9cbiAgdmFsaWRhdGVMb2NrdGltZShsb2NrdGltZTogQk4pOiB2b2lkIHtcbiAgICBpZiAoIWxvY2t0aW1lIHx8IGxvY2t0aW1lLmx0KG5ldyBCTigwKSkpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ0ludmFsaWQgdHJhbnNhY3Rpb246IGxvY2t0aW1lIG11c3QgYmUgMCBvciBoaWdoZXInKTtcbiAgICB9XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgdmFsaWRhdGVBZGRyZXNzKGFkZHJlc3M6IEJhc2VBZGRyZXNzLCBhZGRyZXNzRm9ybWF0Pzogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF1dGlscy5pc1ZhbGlkQWRkcmVzcyhhZGRyZXNzLmFkZHJlc3MpKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdJbnZhbGlkIGFkZHJlc3MnKTtcbiAgICB9XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgdmFsaWRhdGVLZXkoeyBrZXkgfTogQmFzZUtleSk6IHZvaWQge1xuICAgIGlmICghbmV3IEtleVBhaXIoeyBwcnY6IGtleSB9KSkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignSW52YWxpZCBrZXknKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgdGhlIHJhdyB0cmFuc2FjdGlvbiBoYXMgYSB2YWxpZCBmb3JtYXQgaW4gdGhlIGJsb2NrY2hhaW4gY29udGV4dCwgdGhyb3cgb3RoZXJ3aXNlLlxuICAgKiBJdCBvdmVycmlkZXMgYWJzdHJhY3QgbWV0aG9kIGZyb20gQmFzZVRyYW5zYWN0aW9uQnVpbGRlclxuICAgKlxuICAgKiBAcGFyYW0gcmF3VHJhbnNhY3Rpb24gVHJhbnNhY3Rpb24gaW4gYW55IGZvcm1hdFxuICAgKi9cbiAgdmFsaWRhdGVSYXdUcmFuc2FjdGlvbihyYXdUcmFuc2FjdGlvbjogc3RyaW5nKTogdm9pZCB7XG4gICAgdXRpbHMudmFsaWRhdGVSYXdUcmFuc2FjdGlvbihyYXdUcmFuc2FjdGlvbik7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgdmFsaWRhdGVUcmFuc2FjdGlvbih0cmFuc2FjdGlvbj86IFRyYW5zYWN0aW9uKTogdm9pZCB7XG4gICAgLy8gdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoJ3ZhbGlkYXRlVHJhbnNhY3Rpb24gbm90IGltcGxlbWVudGVkJyk7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgdmFsaWRhdGVWYWx1ZSh2YWx1ZTogQmlnTnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHZhbHVlLmlzTGVzc1RoYW4oMCkpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ1ZhbHVlIGNhbm5vdCBiZSBsZXNzIHRoYW4gemVybycpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayB0aGUgbGlzdCBvZiBVVFhPUyBpcyBlbXB0eSBhbmQgY2hlY2sgZWFjaCBVVFhPLlxuICAgKiBAcGFyYW0gdmFsdWVzXG4gICAqL1xuICB2YWxpZGF0ZVV0eG9zKHZhbHVlczogRGVjb2RlZFV0eG9PYmpbXSk6IHZvaWQge1xuICAgIGlmICh2YWx1ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKFwiVXR4b3MgY2FuJ3QgYmUgZW1wdHkgYXJyYXlcIik7XG4gICAgfVxuICAgIHZhbHVlcy5mb3JFYWNoKHRoaXMudmFsaWRhdGVVdHhvKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayB0aGUgVVRYTyBoYXMgZXhwZWN0ZWQgZmllbGRzLlxuICAgKiBAcGFyYW0gVVRYT1xuICAgKi9cbiAgdmFsaWRhdGVVdHhvKHZhbHVlOiBEZWNvZGVkVXR4b09iaik6IHZvaWQge1xuICAgIFsnb3V0cHV0SUQnLCAnYW1vdW50JywgJ3R4aWQnLCAnb3V0cHV0aWR4J10uZm9yRWFjaCgoZmllbGQpID0+IHtcbiAgICAgIGlmICghdmFsdWUuaGFzT3duUHJvcGVydHkoZmllbGQpKSB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKGBVdHhvcyByZXF1aXJlZCAke2ZpZWxkfWApO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIHRoZSBhbW91bnQgaXMgcG9zaXRpdmUuXG4gICAqIEBwYXJhbSBhbW91bnRcbiAgICovXG4gIHZhbGlkYXRlQW1vdW50KGFtb3VudDogQk4pOiB2b2lkIHtcbiAgICBpZiAoYW1vdW50Lmx0ZW4oMCkpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ0Ftb3VudCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIHRoZSBidWZmZXIgaGFzIDMyIGJ5dGUgbG9uZy5cbiAgICogQHBhcmFtIGNoYWluSURcbiAgICovXG4gIHZhbGlkYXRlQ2hhaW5JZChjaGFpbklEOiBCdWZmZXJBdmF4KTogdm9pZCB7XG4gICAgaWYgKGNoYWluSUQubGVuZ3RoICE9PSAzMikge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignQ2hhaW4gaWQgYXJlIDMyIGJ5dGUgc2l6ZScpO1xuICAgIH1cbiAgfVxuXG4gIC8vIGVuZHJlZ2lvblxufVxuIl19
|
|
138
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb25CdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi90cmFuc2FjdGlvbkJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsMERBQTRFO0FBQzVFLG1EQUFxRjtBQUlyRiwrQ0FBNEM7QUFDNUMsb0RBQTRCO0FBRTVCLE1BQXNCLGtCQUFtQixTQUFRLGlDQUFzQjtJQUtyRSxZQUFZLFdBQWlDO1FBQzNDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUpYLGtCQUFhLEdBQUcsS0FBSyxDQUFDO1FBQ3pCLFlBQU8sR0FBYyxFQUFFLENBQUM7UUFJN0IsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLHlCQUFXLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsV0FBVyxDQUFDLEVBQU07UUFDaEIsTUFBTSxNQUFNLEdBQUssRUFBaUIsQ0FBQyxFQUE2QyxDQUFDLE1BQU0sQ0FBQztRQUN4RixJQUNFLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLEtBQUssSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVO1lBQ3pELE1BQU0sQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLEtBQUssSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLEVBQy9EO1lBQ0EsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDO1NBQ3hEO1FBQ0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDckMsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsb0JBQW9CO0lBQ3BCOzs7T0FHRztJQUNILGlCQUFpQixDQUFDLFNBQWlCO1FBQ2pDLElBQUksQ0FBQyxTQUFTLElBQUksU0FBUyxLQUFLLENBQUMsRUFBRTtZQUNqQyxNQUFNLElBQUksZ0NBQXFCLENBQUMsaURBQWlELENBQUMsQ0FBQztTQUNwRjtJQUNI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LFlBQVksQ0FBQztJQUMzQixDQUFDO0NBQ0Y7QUEvSUQsZ0RBK0lDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYXZtU2VyaWFsLCBwdm1TZXJpYWwsIFVuc2lnbmVkVHggfSBmcm9tICdAYml0Z28tZm9ya3MvYXZhbGFuY2hlanMnO1xuaW1wb3J0IHsgQmFzZVRyYW5zYWN0aW9uQnVpbGRlciwgQnVpbGRUcmFuc2FjdGlvbkVycm9yIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgQmFzZUNvaW4gYXMgQ29pbkNvbmZpZyB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuaW1wb3J0IHsgRGVjb2RlZFV0eG9PYmosIFR4IH0gZnJvbSAnLi9pZmFjZSc7XG5pbXBvcnQgeyBLZXlQYWlyIH0gZnJvbSAnLi9rZXlQYWlyJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uIH0gZnJvbSAnLi90cmFuc2FjdGlvbic7XG5pbXBvcnQgdXRpbHMgZnJvbSAnLi91dGlscyc7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBUcmFuc2FjdGlvbkJ1aWxkZXIgZXh0ZW5kcyBCYXNlVHJhbnNhY3Rpb25CdWlsZGVyIHtcbiAgcHJvdGVjdGVkIF90cmFuc2FjdGlvbjogVHJhbnNhY3Rpb247XG4gIHByb3RlY3RlZCByZWNvdmVyU2lnbmVyID0gZmFsc2U7XG4gIHB1YmxpYyBfc2lnbmVyOiBLZXlQYWlyW10gPSBbXTtcblxuICBjb25zdHJ1Y3RvcihfY29pbkNvbmZpZzogUmVhZG9ubHk8Q29pbkNvbmZpZz4pIHtcbiAgICBzdXBlcihfY29pbkNvbmZpZyk7XG4gICAgdGhpcy5fdHJhbnNhY3Rpb24gPSBuZXcgVHJhbnNhY3Rpb24oX2NvaW5Db25maWcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgdGhlIHRyYW5zYWN0aW9uIGJ1aWxkZXIgZmllbGRzIHVzaW5nIHRoZSBkZWNvZGVkIHRyYW5zYWN0aW9uIGRhdGFcbiAgICpcbiAgICogQHBhcmFtIHtUcmFuc2FjdGlvbn0gdHggdGhlIHRyYW5zYWN0aW9uIGRhdGFcbiAgICogQHJldHVybnMgaXRzZWxmXG4gICAqL1xuICBpbml0QnVpbGRlcih0eDogVHgpOiB0aGlzIHtcbiAgICBjb25zdCBiYXNlVHggPSAoKHR4IGFzIFVuc2lnbmVkVHgpLnR4IGFzIHB2bVNlcmlhbC5BZGRQZXJtaXNzaW9ubGVzc1ZhbGlkYXRvclR4KS5iYXNlVHg7XG4gICAgaWYgKFxuICAgICAgYmFzZVR4Lk5ldHdvcmtJZC52YWx1ZSgpICE9PSB0aGlzLl90cmFuc2FjdGlvbi5fbmV0d29ya0lEIHx8XG4gICAgICBiYXNlVHguQmxvY2tjaGFpbklkLnZhbHVlKCkgIT09IHRoaXMuX3RyYW5zYWN0aW9uLl9ibG9ja2NoYWluSURcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTmV0d29yayBvciBibG9ja2NoYWluIGlzIG5vdCBlcXVhbHMnKTtcbiAgICB9XG4gICAgdGhpcy5fdHJhbnNhY3Rpb24uc2V0VHJhbnNhY3Rpb24odHgpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gcmVnaW9uIFZhbGlkYXRvcnNcbiAgLyoqXG4gICAqIFZhbGlkYXRlcyB0aGUgdGhyZXNob2xkXG4gICAqIEBwYXJhbSB0aHJlc2hvbGRcbiAgICovXG4gIHZhbGlkYXRlVGhyZXNob2xkKHRocmVzaG9sZDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKCF0aHJlc2hvbGQgfHwgdGhyZXNob2xkICE9PSAyKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdJbnZhbGlkIHRyYW5zYWN0aW9uOiB0aHJlc2hvbGQgbXVzdCBiZSBzZXQgdG8gMicpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayB0aGUgVVRYTyBoYXMgZXhwZWN0ZWQgZmllbGRzLlxuICAgKiBAcGFyYW0gVVRYT1xuICAgKi9cbiAgdmFsaWRhdGVVdHhvKHZhbHVlOiBEZWNvZGVkVXR4b09iaik6IHZvaWQge1xuICAgIFsnb3V0cHV0SUQnLCAnYW1vdW50JywgJ3R4aWQnLCAnb3V0cHV0aWR4J10uZm9yRWFjaCgoZmllbGQpID0+IHtcbiAgICAgIGlmICghdmFsdWUuaGFzT3duUHJvcGVydHkoZmllbGQpKSB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKGBVdHhvcyByZXF1aXJlZCAke2ZpZWxkfWApO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIHRoZSBsaXN0IG9mIFVUWE9TIGlzIGVtcHR5IGFuZCBjaGVjayBlYWNoIFVUWE8uXG4gICAqIEBwYXJhbSB2YWx1ZXNcbiAgICovXG4gIHZhbGlkYXRlVXR4b3ModmFsdWVzOiBEZWNvZGVkVXR4b09ialtdKTogdm9pZCB7XG4gICAgaWYgKHZhbHVlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoXCJVdHhvcyBjYW4ndCBiZSBlbXB0eSBhcnJheVwiKTtcbiAgICB9XG4gICAgdmFsdWVzLmZvckVhY2godGhpcy52YWxpZGF0ZVV0eG8pO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyBsb2NrdGltZVxuICAgKiBAcGFyYW0gbG9ja3RpbWVcbiAgICovXG4gIHZhbGlkYXRlTG9ja3RpbWUobG9ja3RpbWU6IGJpZ2ludCk6IHZvaWQge1xuICAgIGlmICghbG9ja3RpbWUgfHwgbG9ja3RpbWUgPCBCaWdJbnQoMCkpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ0ludmFsaWQgdHJhbnNhY3Rpb246IGxvY2t0aW1lIG11c3QgYmUgMCBvciBoaWdoZXInKTtcbiAgICB9XG4gIH1cbiAgLy8gZW5kcmVnaW9uXG5cbiAgLyoqXG4gICAqIFRocmVzaG9sZCBpcyBhbiBpbnQgdGhhdCBuYW1lcyB0aGUgbnVtYmVyIG9mIHVuaXF1ZSBzaWduYXR1cmVzIHJlcXVpcmVkIHRvIHNwZW5kIHRoZSBvdXRwdXQuXG4gICAqIE11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBsZW5ndGggb2YgQWRkcmVzc2VzLlxuICAgKiBAcGFyYW0ge251bWJlcn0gdmFsdWVcbiAgICovXG4gIHRocmVzaG9sZCh2YWx1ZTogbnVtYmVyKTogdGhpcyB7XG4gICAgdGhpcy52YWxpZGF0ZVRocmVzaG9sZCh2YWx1ZSk7XG4gICAgdGhpcy5fdHJhbnNhY3Rpb24uX3RocmVzaG9sZCA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIExvY2t0aW1lIGlzIGEgbG9uZyB0aGF0IGNvbnRhaW5zIHRoZSB1bml4IHRpbWVzdGFtcCB0aGF0IHRoaXMgb3V0cHV0IGNhbiBiZSBzcGVudCBhZnRlci5cbiAgICogVGhlIHVuaXggdGltZXN0YW1wIGlzIHNwZWNpZmljIHRvIHRoZSBzZWNvbmQuXG4gICAqIEBwYXJhbSB2YWx1ZVxuICAgKi9cbiAgbG9ja3RpbWUodmFsdWU6IHN0cmluZyB8IG51bWJlcik6IHRoaXMge1xuICAgIHRoaXMudmFsaWRhdGVMb2NrdGltZShCaWdJbnQodmFsdWUpKTtcbiAgICB0aGlzLl90cmFuc2FjdGlvbi5fbG9ja3RpbWUgPSBCaWdJbnQodmFsdWUpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZW4gdXNpbmcgcmVjb3Zlcnkga2V5IG11c3QgYmUgc2V0IGhlcmVcbiAgICogVE9ETzogU1RMWC0xNzMxNyByZWNvdmVyeSBrZXkgc2lnbmluZ1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59W3JlY292ZXJTaWduZXI9dHJ1ZV0gd2hldGhlciBpdCdzIHJlY292ZXJ5IHNpZ25lclxuICAgKi9cbiAgcmVjb3Zlck1vZGUocmVjb3ZlclNpZ25lciA9IHRydWUpOiB0aGlzIHtcbiAgICB0aGlzLnJlY292ZXJTaWduZXIgPSByZWNvdmVyU2lnbmVyO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIGZyb21QdWJLZXkgaXMgYSBsaXN0IG9mIHVuaXF1ZSBhZGRyZXNzZXMgdGhhdCBjb3JyZXNwb25kIHRvIHRoZSBwcml2YXRlIGtleXMgdGhhdCBjYW4gYmUgdXNlZCB0byBzcGVuZCB0aGlzIG91dHB1dFxuICAgKiBAcGFyYW0ge3N0cmluZyB8IHN0cmluZ1tdfSBzZW5kZXJQdWJLZXlcbiAgICovXG4gIGZyb21QdWJLZXkoc2VuZGVyUHViS2V5OiBzdHJpbmcgfCBzdHJpbmdbXSk6IHRoaXMge1xuICAgIGNvbnN0IHB1YktleXMgPSBzZW5kZXJQdWJLZXkgaW5zdGFuY2VvZiBBcnJheSA/IHNlbmRlclB1YktleSA6IFtzZW5kZXJQdWJLZXldO1xuICAgIHRoaXMuX3RyYW5zYWN0aW9uLl9mcm9tQWRkcmVzc2VzID0gcHViS2V5cy5tYXAodXRpbHMucGFyc2VBZGRyZXNzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0IG9mIFVUWE8gcmVxdWlyZWQgYXMgaW5wdXRzLlxuICAgKiBBIFVUWE8gaXMgYSBzdGFuZGFsb25lIHJlcHJlc2VudGF0aW9uIG9mIGEgdHJhbnNhY3Rpb24gb3V0cHV0LlxuICAgKlxuICAgKiBAcGFyYW0ge0RlY29kZWRVdHhvT2JqW119IGxpc3Qgb2YgVVRYT1NcbiAgICovXG4gIHV0eG9zKHZhbHVlOiBEZWNvZGVkVXR4b09ialtdKTogdGhpcyB7XG4gICAgdGhpcy52YWxpZGF0ZVV0eG9zKHZhbHVlKTtcbiAgICB0aGlzLl90cmFuc2FjdGlvbi5fdXR4b3MgPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIFRPRE8oQ1ItMTA3Myk6XG4gIC8vIEltcGxlbWVudDpcbiAgLy8gIGJ1aWxkSW1wbGVtZW50YXRpb25cbiAgLy8gIHNpZ25JbXBsZW1lbnRhdGlvblxuICAvLyAgZ2V0IHRyYW5zYWN0aW9uXG4gIC8vICBzZXQgdHJhbnNhY3Rpb25cbiAgLy8gIHZhbGlkYXRlUmF3VHJhbnNhY3Rpb25cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgcHJvdGVjdGVkIGZyb21JbXBsZW1lbnRhdGlvbihyYXdUcmFuc2FjdGlvbjogc3RyaW5nKTogVHJhbnNhY3Rpb24ge1xuICAgIGNvbnN0IFt0eF0gPSBwdm1TZXJpYWwuQWRkUGVybWlzc2lvbmxlc3NWYWxpZGF0b3JUeC5mcm9tQnl0ZXMoXG4gICAgICBCdWZmZXIuZnJvbShyYXdUcmFuc2FjdGlvbiwgJ2hleCcpLFxuICAgICAgYXZtU2VyaWFsLmdldEFWTU1hbmFnZXIoKS5nZXREZWZhdWx0Q29kZWMoKVxuICAgICk7XG4gICAgLy8gVE9ETyhDUi0xMDczKTogY2hlY2sgaWYgaW5pdEJ1aWxkZXIgY2FuIG9ubHkgdXNlIFVuc2lnbmVkVHggYW5kIHB2bVNlcmlhbC5CYXNlVHggaXMgbm90IHJlcXVpcmVkXG4gICAgdGhpcy5pbml0QnVpbGRlcih0eCk7XG4gICAgcmV0dXJuIHRoaXMuX3RyYW5zYWN0aW9uO1xuICB9XG59XG4iXX0=
|
|
@@ -1,24 +1,32 @@
|
|
|
1
|
-
import { BaseCoin as CoinConfig } from '@bitgo-beta/statics';
|
|
2
1
|
import { BaseTransactionBuilderFactory } from '@bitgo-beta/sdk-core';
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
2
|
+
import { BaseCoin as CoinConfig } from '@bitgo-beta/statics';
|
|
3
|
+
import { DeprecatedTransactionBuilder } from './deprecatedTransactionBuilder';
|
|
4
|
+
import { ExportInCTxBuilder } from './exportInCTxBuilder';
|
|
5
5
|
import { ExportTxBuilder } from './exportTxBuilder';
|
|
6
|
-
import { ImportTxBuilder } from './importTxBuilder';
|
|
7
6
|
import { ImportInCTxBuilder } from './importInCTxBuilder';
|
|
8
|
-
import {
|
|
7
|
+
import { ImportTxBuilder } from './importTxBuilder';
|
|
8
|
+
import { PermissionlessValidatorTxBuilder } from './permissionlessValidatorTxBuilder';
|
|
9
|
+
import { TransactionBuilder } from './transactionBuilder';
|
|
10
|
+
import { ValidatorTxBuilder } from './validatorTxBuilder';
|
|
9
11
|
export declare class TransactionBuilderFactory extends BaseTransactionBuilderFactory {
|
|
10
12
|
protected recoverSigner: boolean;
|
|
11
13
|
constructor(_coinConfig: Readonly<CoinConfig>);
|
|
12
14
|
/** @inheritdoc */
|
|
13
|
-
from(raw: string): TransactionBuilder;
|
|
15
|
+
from(raw: string): TransactionBuilder | DeprecatedTransactionBuilder;
|
|
14
16
|
/** @inheritdoc */
|
|
15
|
-
getTransferBuilder():
|
|
17
|
+
getTransferBuilder(): DeprecatedTransactionBuilder;
|
|
16
18
|
/**
|
|
17
19
|
* Initialize Validator builder
|
|
18
20
|
*
|
|
19
21
|
* @returns {ValidatorTxBuilder} the builder initialized
|
|
20
22
|
*/
|
|
21
23
|
getValidatorBuilder(): ValidatorTxBuilder;
|
|
24
|
+
/**
|
|
25
|
+
* Initialize Permissionless Validator builder
|
|
26
|
+
*
|
|
27
|
+
* @returns {PermissionlessValidatorTxBuilder} the builder initialized
|
|
28
|
+
*/
|
|
29
|
+
getPermissionlessValidatorTxBuilder(): PermissionlessValidatorTxBuilder;
|
|
22
30
|
/**
|
|
23
31
|
* Export Cross chain transfer
|
|
24
32
|
*
|
|
@@ -44,6 +52,6 @@ export declare class TransactionBuilderFactory extends BaseTransactionBuilderFac
|
|
|
44
52
|
*/
|
|
45
53
|
getExportInCBuilder(): ExportInCTxBuilder;
|
|
46
54
|
/** @inheritdoc */
|
|
47
|
-
getWalletInitializationBuilder():
|
|
55
|
+
getWalletInitializationBuilder(): DeprecatedTransactionBuilder;
|
|
48
56
|
}
|
|
49
57
|
//# sourceMappingURL=transactionBuilderFactory.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transactionBuilderFactory.d.ts","sourceRoot":"","sources":["../../../src/lib/transactionBuilderFactory.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"transactionBuilderFactory.d.ts","sourceRoot":"","sources":["../../../src/lib/transactionBuilderFactory.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,6BAA6B,EAAgB,MAAM,sBAAsB,CAAC;AACnF,OAAO,EAAoB,QAAQ,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAI/E,OAAO,EAAE,4BAA4B,EAAE,MAAM,gCAAgC,CAAC;AAC9E,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,gCAAgC,EAAE,MAAM,oCAAoC,CAAC;AACtF,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,qBAAa,yBAA0B,SAAQ,6BAA6B;IAC1E,SAAS,CAAC,aAAa,UAAS;gBACpB,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC;IAI7C,kBAAkB;IAClB,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,kBAAkB,GAAG,4BAA4B;IA6FpE,kBAAkB;IAClB,kBAAkB,IAAI,4BAA4B;IAIlD;;;;OAIG;IACH,mBAAmB,IAAI,kBAAkB;IAIzC;;;;OAIG;IACH,mCAAmC,IAAI,gCAAgC;IAIvE;;;;OAIG;IACH,gBAAgB,IAAI,eAAe;IAInC;;;;OAIG;IACH,gBAAgB,IAAI,eAAe;IAInC;;;;OAIG;IACH,mBAAmB,IAAI,kBAAkB;IAIzC;;;;OAIG;IACH,mBAAmB,IAAI,kBAAkB;IAIzC,kBAAkB;IAClB,8BAA8B,IAAI,4BAA4B;CAG/D"}
|
|
@@ -4,16 +4,18 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.TransactionBuilderFactory = void 0;
|
|
7
|
+
const avalanchejs_1 = require("@bitgo-forks/avalanchejs");
|
|
7
8
|
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
8
|
-
const validatorTxBuilder_1 = require("./validatorTxBuilder");
|
|
9
|
-
const platformvm_1 = require("avalanche/dist/apis/platformvm");
|
|
10
|
-
const evm_1 = require("avalanche/dist/apis/evm");
|
|
11
9
|
const avalanche_1 = require("avalanche");
|
|
12
|
-
const
|
|
10
|
+
const evm_1 = require("avalanche/dist/apis/evm");
|
|
11
|
+
const platformvm_1 = require("avalanche/dist/apis/platformvm");
|
|
12
|
+
const exportInCTxBuilder_1 = require("./exportInCTxBuilder");
|
|
13
13
|
const exportTxBuilder_1 = require("./exportTxBuilder");
|
|
14
|
-
const importTxBuilder_1 = require("./importTxBuilder");
|
|
15
14
|
const importInCTxBuilder_1 = require("./importInCTxBuilder");
|
|
16
|
-
const
|
|
15
|
+
const importTxBuilder_1 = require("./importTxBuilder");
|
|
16
|
+
const permissionlessValidatorTxBuilder_1 = require("./permissionlessValidatorTxBuilder");
|
|
17
|
+
const utils_1 = __importDefault(require("./utils"));
|
|
18
|
+
const validatorTxBuilder_1 = require("./validatorTxBuilder");
|
|
17
19
|
class TransactionBuilderFactory extends sdk_core_1.BaseTransactionBuilderFactory {
|
|
18
20
|
constructor(_coinConfig) {
|
|
19
21
|
super(_coinConfig);
|
|
@@ -21,50 +23,99 @@ class TransactionBuilderFactory extends sdk_core_1.BaseTransactionBuilderFactory
|
|
|
21
23
|
}
|
|
22
24
|
/** @inheritdoc */
|
|
23
25
|
from(raw) {
|
|
26
|
+
var _a;
|
|
24
27
|
utils_1.default.validateRawTransaction(raw);
|
|
25
|
-
raw = utils_1.default.removeHexPrefix(raw);
|
|
26
28
|
let txSource = 'PVM';
|
|
27
|
-
let tx;
|
|
28
29
|
let transactionBuilder = undefined;
|
|
30
|
+
let tx;
|
|
31
|
+
const rawNoHex = utils_1.default.removeHexPrefix(raw);
|
|
29
32
|
try {
|
|
30
33
|
tx = new platformvm_1.Tx();
|
|
31
34
|
// could throw an error if a txType doesn't match.
|
|
32
|
-
tx.fromBuffer(avalanche_1.Buffer.from(
|
|
35
|
+
tx.fromBuffer(avalanche_1.Buffer.from(rawNoHex, 'hex'));
|
|
33
36
|
if (!utils_1.default.isTransactionOf(tx, this._coinConfig.network.blockchainID)) {
|
|
34
|
-
throw new Error('It is not a transaction of this
|
|
37
|
+
throw new Error('It is not a transaction of this platformvm old flow');
|
|
35
38
|
}
|
|
36
39
|
}
|
|
37
|
-
catch {
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
40
|
+
catch (e) {
|
|
41
|
+
try {
|
|
42
|
+
txSource = 'EVM';
|
|
43
|
+
tx = new evm_1.Tx();
|
|
44
|
+
tx.fromBuffer(avalanche_1.Buffer.from(rawNoHex, 'hex'));
|
|
45
|
+
if (!utils_1.default.isTransactionOf(tx, this._coinConfig.network.cChainBlockchainID)) {
|
|
46
|
+
throw new Error('It is not a transaction of this network or C chain EVM');
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
catch (e) {
|
|
50
|
+
try {
|
|
51
|
+
txSource = 'PVM';
|
|
52
|
+
// this should be the last because other PVM functions are still being detected in the new SDK
|
|
53
|
+
const manager = avalanchejs_1.utils.getManagerForVM('PVM');
|
|
54
|
+
const [codec, txBytes] = manager.getCodecFromBuffer(avalanchejs_1.utils.hexToBuffer(raw));
|
|
55
|
+
const unpackedTx = codec.UnpackPrefix(txBytes);
|
|
56
|
+
// A signed transaction includes 4 bytes for the number of credentials as an Int type that is not known by the codec
|
|
57
|
+
// We'll skip those 4 bytes, instead we'll loop until we've parsed all credentials
|
|
58
|
+
// @see https://docs.avax.network/reference/avalanchego/p-chain/txn-format#signed-transaction-example
|
|
59
|
+
const credentials = [];
|
|
60
|
+
let credentialBytes = unpackedTx[1].slice(4);
|
|
61
|
+
let moreCredentials = true;
|
|
62
|
+
do {
|
|
63
|
+
try {
|
|
64
|
+
const [credential, rest] = codec.UnpackPrefix(credentialBytes);
|
|
65
|
+
credentials.push(credential);
|
|
66
|
+
credentialBytes = rest;
|
|
67
|
+
}
|
|
68
|
+
catch (e) {
|
|
69
|
+
moreCredentials = false;
|
|
70
|
+
}
|
|
71
|
+
} while (credentialBytes.length > 0 && moreCredentials);
|
|
72
|
+
const unpacked = codec.UnpackPrefix(txBytes);
|
|
73
|
+
const permissionlessValidatorTx = unpacked[0];
|
|
74
|
+
const outputs = permissionlessValidatorTx.baseTx.outputs;
|
|
75
|
+
const output = outputs[0].output;
|
|
76
|
+
if (outputs[0].getAssetId() !== this._coinConfig.network.avaxAssetID) {
|
|
77
|
+
throw new Error('The Asset ID of the output does not match the transaction');
|
|
78
|
+
}
|
|
79
|
+
const fromAddresses = output.outputOwners.addrs.map((a) => avalanchejs_1.utils.hexToBuffer(a.toHex()));
|
|
80
|
+
const addressMaps = fromAddresses.map((a) => new avalanchejs_1.utils.AddressMap([[new avalanchejs_1.Address(a), 0]]));
|
|
81
|
+
tx = new avalanchejs_1.UnsignedTx(unpacked[0], [], new avalanchejs_1.utils.AddressMaps(addressMaps), credentials);
|
|
82
|
+
}
|
|
83
|
+
catch (e) {
|
|
84
|
+
throw new Error(`The transaction type is not recognized as an old PVM or old EVM transaction. Additionally, parsing of the new PVM AddPermissionlessValidatorTx type failed: ${e.message}`);
|
|
85
|
+
}
|
|
43
86
|
}
|
|
44
87
|
}
|
|
45
88
|
if (txSource === 'PVM') {
|
|
46
|
-
if (
|
|
89
|
+
if (((_a = tx === null || tx === void 0 ? void 0 : tx.tx) === null || _a === void 0 ? void 0 : _a._type) && permissionlessValidatorTxBuilder_1.PermissionlessValidatorTxBuilder.verifyTxType(tx.tx._type)) {
|
|
90
|
+
transactionBuilder = this.getPermissionlessValidatorTxBuilder();
|
|
91
|
+
transactionBuilder.initBuilder(tx);
|
|
92
|
+
}
|
|
93
|
+
else if (validatorTxBuilder_1.ValidatorTxBuilder.verifyTxType(tx.getUnsignedTx().getTransaction())) {
|
|
47
94
|
transactionBuilder = this.getValidatorBuilder();
|
|
95
|
+
transactionBuilder.initBuilder(tx);
|
|
48
96
|
}
|
|
49
97
|
else if (exportTxBuilder_1.ExportTxBuilder.verifyTxType(tx.getUnsignedTx().getTransaction())) {
|
|
50
98
|
transactionBuilder = this.getExportBuilder();
|
|
99
|
+
transactionBuilder.initBuilder(tx);
|
|
51
100
|
}
|
|
52
101
|
else if (importTxBuilder_1.ImportTxBuilder.verifyTxType(tx.getUnsignedTx().getTransaction())) {
|
|
53
102
|
transactionBuilder = this.getImportBuilder();
|
|
103
|
+
transactionBuilder.initBuilder(tx);
|
|
54
104
|
}
|
|
55
105
|
}
|
|
56
106
|
else if (txSource === 'EVM') {
|
|
57
107
|
if (importInCTxBuilder_1.ImportInCTxBuilder.verifyTxType(tx.getUnsignedTx().getTransaction())) {
|
|
58
108
|
transactionBuilder = this.getImportInCBuilder();
|
|
109
|
+
transactionBuilder.initBuilder(tx);
|
|
59
110
|
}
|
|
60
111
|
else if (exportInCTxBuilder_1.ExportInCTxBuilder.verifyTxType(tx.getUnsignedTx().getTransaction())) {
|
|
61
112
|
transactionBuilder = this.getExportInCBuilder();
|
|
113
|
+
transactionBuilder.initBuilder(tx);
|
|
62
114
|
}
|
|
63
115
|
}
|
|
64
116
|
if (transactionBuilder === undefined) {
|
|
65
117
|
throw new sdk_core_1.NotSupported('Transaction cannot be parsed or has an unsupported transaction type');
|
|
66
118
|
}
|
|
67
|
-
transactionBuilder.initBuilder(tx);
|
|
68
119
|
return transactionBuilder;
|
|
69
120
|
}
|
|
70
121
|
/** @inheritdoc */
|
|
@@ -79,6 +130,14 @@ class TransactionBuilderFactory extends sdk_core_1.BaseTransactionBuilderFactory
|
|
|
79
130
|
getValidatorBuilder() {
|
|
80
131
|
return new validatorTxBuilder_1.ValidatorTxBuilder(this._coinConfig);
|
|
81
132
|
}
|
|
133
|
+
/**
|
|
134
|
+
* Initialize Permissionless Validator builder
|
|
135
|
+
*
|
|
136
|
+
* @returns {PermissionlessValidatorTxBuilder} the builder initialized
|
|
137
|
+
*/
|
|
138
|
+
getPermissionlessValidatorTxBuilder() {
|
|
139
|
+
return new permissionlessValidatorTxBuilder_1.PermissionlessValidatorTxBuilder(this._coinConfig);
|
|
140
|
+
}
|
|
82
141
|
/**
|
|
83
142
|
* Export Cross chain transfer
|
|
84
143
|
*
|
|
@@ -117,4 +176,4 @@ class TransactionBuilderFactory extends sdk_core_1.BaseTransactionBuilderFactory
|
|
|
117
176
|
}
|
|
118
177
|
}
|
|
119
178
|
exports.TransactionBuilderFactory = TransactionBuilderFactory;
|
|
120
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvdHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFDQSxtREFBbUY7QUFFbkYsNkRBQTBEO0FBQzFELCtEQUFvRDtBQUNwRCxpREFBc0Q7QUFDdEQseUNBQWlEO0FBQ2pELG9EQUE0QjtBQUM1Qix1REFBb0Q7QUFDcEQsdURBQW9EO0FBQ3BELDZEQUEwRDtBQUMxRCw2REFBMEQ7QUFFMUQsTUFBYSx5QkFBMEIsU0FBUSx3Q0FBNkI7SUFFMUUsWUFBWSxXQUFpQztRQUMzQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7UUFGWCxrQkFBYSxHQUFHLEtBQUssQ0FBQztJQUdoQyxDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLElBQUksQ0FBQyxHQUFXO1FBQ2QsZUFBSyxDQUFDLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2xDLEdBQUcsR0FBRyxlQUFLLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2pDLElBQUksUUFBUSxHQUFrQixLQUFLLENBQUM7UUFDcEMsSUFBSSxFQUFjLENBQUM7UUFDbkIsSUFBSSxrQkFBa0IsR0FBbUMsU0FBUyxDQUFDO1FBRW5FLElBQUk7WUFDRixFQUFFLEdBQUcsSUFBSSxlQUFFLEVBQUUsQ0FBQztZQUNkLGtEQUFrRDtZQUNsRCxFQUFFLENBQUMsVUFBVSxDQUFDLGtCQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBRTNDLElBQUksQ0FBQyxlQUFLLENBQUMsZUFBZSxDQUFDLEVBQUUsRUFBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQTRCLENBQUMsWUFBWSxDQUFDLEVBQUU7Z0JBQzNGLE1BQU0sSUFBSSxLQUFLLENBQUMseUNBQXlDLENBQUMsQ0FBQzthQUM1RDtTQUNGO1FBQUMs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ZW50IjpbImltcG9ydCB7IEF2YWxhbmNoZU5ldHdvcmssIEJhc2VDb2luIGFzIENvaW5Db25maWcgfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcbmltcG9ydCB7IEJhc2VUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5LCBOb3RTdXBwb3J0ZWQgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkJ1aWxkZXIgfSBmcm9tICcuL3RyYW5zYWN0aW9uQnVpbGRlcic7XG5pbXBvcnQgeyBWYWxpZGF0b3JUeEJ1aWxkZXIgfSBmcm9tICcuL3ZhbGlkYXRvclR4QnVpbGRlcic7XG5pbXBvcnQgeyBUeCB9IGZyb20gJ2F2YWxhbmNoZS9kaXN0L2FwaXMvcGxhdGZvcm12bSc7XG5pbXBvcnQgeyBUeCBhcyBFVk1UeCB9IGZyb20gJ2F2YWxhbmNoZS9kaXN0L2FwaXMvZXZtJztcbmltcG9ydCB7IEJ1ZmZlciBhcyBCdWZmZXJBdmF4IH0gZnJvbSAnYXZhbGFuY2hlJztcbmltcG9ydCB1dGlscyBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7IEV4cG9ydFR4QnVpbGRlciB9IGZyb20gJy4vZXhwb3J0VHhCdWlsZGVyJztcbmltcG9ydCB7IEltcG9ydFR4QnVpbGRlciB9IGZyb20gJy4vaW1wb3J0VHhCdWlsZGVyJztcbmltcG9ydCB7IEltcG9ydEluQ1R4QnVpbGRlciB9IGZyb20gJy4vaW1wb3J0SW5DVHhCdWlsZGVyJztcbmltcG9ydCB7IEV4cG9ydEluQ1R4QnVpbGRlciB9IGZyb20gJy4vZXhwb3J0SW5DVHhCdWlsZGVyJztcblxuZXhwb3J0IGNsYXNzIFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkgZXh0ZW5kcyBCYXNlVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeSB7XG4gIHByb3RlY3RlZCByZWNvdmVyU2lnbmVyID0gZmFsc2U7XG4gIGNvbnN0cnVjdG9yKF9jb2luQ29uZmlnOiBSZWFkb25seTxDb2luQ29uZmlnPikge1xuICAgIHN1cGVyKF9jb2luQ29uZmlnKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBmcm9tKHJhdzogc3RyaW5nKTogVHJhbnNhY3Rpb25CdWlsZGVyIHtcbiAgICB1dGlscy52YWxpZGF0ZVJhd1RyYW5zYWN0aW9uKHJhdyk7XG4gICAgcmF3ID0gdXRpbHMucmVtb3ZlSGV4UHJlZml4KHJhdyk7XG4gICAgbGV0IHR4U291cmNlOiAnRVZNJyB8ICdQVk0nID0gJ1BWTSc7XG4gICAgbGV0IHR4OiBUeCB8IEVWTVR4O1xuICAgIGxldCB0cmFuc2FjdGlvbkJ1aWxkZXI6IFRyYW5zYWN0aW9uQnVpbGRlciB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICAgIHRyeSB7XG4gICAgICB0eCA9IG5ldyBUeCgpO1xuICAgICAgLy8gY291bGQgdGhyb3cgYW4gZXJyb3IgaWYgYSB0eFR5cGUgZG9lc24ndCBtYXRjaC5cbiAgICAgIHR4LmZyb21CdWZmZXIoQnVmZmVyQXZheC5mcm9tKHJhdywgJ2hleCcpKTtcblxuICAgICAgaWYgKCF1dGlscy5pc1RyYW5zYWN0aW9uT2YodHgsICh0aGlzLl9jb2luQ29uZmlnLm5ldHdvcmsgYXMgQXZhbGFuY2hlTmV0d29yaykuYmxvY2tjaGFpbklEKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0l0IGlzIG5vdCBhIHRyYW5zYWN0aW9uIG9mIHRoaXMgbmV0d29yaycpO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgdHhTb3VyY2UgPSAnRVZNJztcbiAgICAgIHR4ID0gbmV3IEVWTVR4KCk7XG4gICAgICB0eC5mcm9tQnVmZmVyKEJ1ZmZlckF2YXguZnJvbShyYXcsICdoZXgnKSk7XG5cbiAgICAgIGlmICghdXRpbHMuaXNUcmFuc2FjdGlvbk9mKHR4LCAodGhpcy5fY29pbkNvbmZpZy5uZXR3b3JrIGFzIEF2YWxhbmNoZU5ldHdvcmspLmNDaGFpbkJsb2NrY2hhaW5JRCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJdCBpcyBub3QgYSB0cmFuc2FjdGlvbiBvZiB0aGlzIG5ldHdvcmsgb3IgQyBjaGFpbicpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodHhTb3VyY2UgPT09ICdQVk0nKSB7XG4gICAgICBpZiAoVmFsaWRhdG9yVHhCdWlsZGVyLnZlcmlmeVR4VHlwZSh0eC5nZXRVbnNpZ25lZFR4KCkuZ2V0VHJhbnNhY3Rpb24oKSkpIHtcbiAgICAgICAgdHJhbnNhY3Rpb25CdWlsZGVyID0gdGhpcy5nZXRWYWxpZGF0b3JCdWlsZGVyKCk7XG4gICAgICB9IGVsc2UgaWYgKEV4cG9ydFR4QnVpbGRlci52ZXJpZnlUeFR5cGUodHguZ2V0VW5zaWduZWRUeCgpLmdldFRyYW5zYWN0aW9uKCkpKSB7XG4gICAgICAgIHRyYW5zYWN0aW9uQnVpbGRlciA9IHRoaXMuZ2V0RXhwb3J0QnVpbGRlcigpO1xuICAgICAgfSBlbHNlIGlmIChJbXBvcnRUeEJ1aWxkZXIudmVyaWZ5VHhUeXBlKHR4LmdldFVuc2lnbmVkVHgoKS5nZXRUcmFuc2FjdGlvbigpKSkge1xuICAgICAgICB0cmFuc2FjdGlvbkJ1aWxkZXIgPSB0aGlzLmdldEltcG9ydEJ1aWxkZXIoKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR4U291cmNlID09PSAnRVZNJykge1xuICAgICAgaWYgKEltcG9ydEluQ1R4QnVpbGRlci52ZXJpZnlUeFR5cGUodHguZ2V0VW5zaWduZWRUeCgpLmdldFRyYW5zYWN0aW9uKCkpKSB7XG4gICAgICAgIHRyYW5zYWN0aW9uQnVpbGRlciA9IHRoaXMuZ2V0SW1wb3J0SW5DQnVpbGRlcigpO1xuICAgICAgfSBlbHNlIGlmIChFeHBvcnRJbkNUeEJ1aWxkZXIudmVyaWZ5VHhUeXBlKHR4LmdldFVuc2lnbmVkVHgoKS5nZXRUcmFuc2FjdGlvbigpKSkge1xuICAgICAgICB0cmFuc2FjdGlvbkJ1aWxkZXIgPSB0aGlzLmdldEV4cG9ydEluQ0J1aWxkZXIoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRyYW5zYWN0aW9uQnVpbGRlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkKCdUcmFuc2FjdGlvbiBjYW5ub3QgYmUgcGFyc2VkIG9yIGhhcyBhbiB1bnN1cHBvcnRlZCB0cmFuc2FjdGlvbiB0eXBlJyk7XG4gICAgfVxuICAgIHRyYW5zYWN0aW9uQnVpbGRlci5pbml0QnVpbGRlcih0eCk7XG4gICAgcmV0dXJuIHRyYW5zYWN0aW9uQnVpbGRlcjtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBnZXRUcmFuc2ZlckJ1aWxkZXIoKTogVHJhbnNhY3Rpb25CdWlsZGVyIHtcbiAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkKCdUcmFuc2ZlciBpcyBub3Qgc3VwcG9ydGVkIGluIFAgQ2hhaW4nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIFZhbGlkYXRvciBidWlsZGVyXG4gICAqXG4gICAqIEByZXR1cm5zIHtWYWxpZGF0b3JUeEJ1aWxkZXJ9IHRoZSBidWlsZGVyIGluaXRpYWxpemVkXG4gICAqL1xuICBnZXRWYWxpZGF0b3JCdWlsZGVyKCk6IFZhbGlkYXRvclR4QnVpbGRlciB7XG4gICAgcmV0dXJuIG5ldyBWYWxpZGF0b3JUeEJ1aWxkZXIodGhpcy5fY29pbkNvbmZpZyk7XG4gIH1cblxuICAvKipcbiAgICogRXhwb3J0IENyb3NzIGNoYWluIHRyYW5zZmVyXG4gICAqXG4gICAqIEByZXR1cm5zIHtFeHBvcnRUeEJ1aWxkZXJ9IHRoZSBidWlsZGVyIGluaXRpYWxpemVkXG4gICAqL1xuICBnZXRFeHBvcnRCdWlsZGVyKCk6IEV4cG9ydFR4QnVpbGRlciB7XG4gICAgcmV0dXJuIG5ldyBFeHBvcnRUeEJ1aWxkZXIodGhpcy5fY29pbkNvbmZpZyk7XG4gIH1cblxuICAvKipcbiAgICogSW1wb3J0IENyb3NzIGNoYWluIHRyYW5zZmVyXG4gICAqXG4gICAqIEByZXR1cm5zIHtJbXBvcnRUeEJ1aWxkZXJ9IHRoZSBidWlsZGVyIGluaXRpYWxpemVkXG4gICAqL1xuICBnZXRJbXBvcnRCdWlsZGVyKCk6IEltcG9ydFR4QnVpbGRlciB7XG4gICAgcmV0dXJuIG5ldyBJbXBvcnRUeEJ1aWxkZXIodGhpcy5fY29pbkNvbmZpZyk7XG4gIH1cblxuICAvKipcbiAgICogSW1wb3J0IGluIEMgY2hhaW4gQ3Jvc3MgY2hhaW4gdHJhbnNmZXJcbiAgICpcbiAgICogQHJldHVybnMge0ltcG9ydEluQ1R4QnVpbGRlcn0gdGhlIGJ1aWxkZXIgaW5pdGlhbGl6ZWRcbiAgICovXG4gIGdldEltcG9ydEluQ0J1aWxkZXIoKTogSW1wb3J0SW5DVHhCdWlsZGVyIHtcbiAgICByZXR1cm4gbmV3IEltcG9ydEluQ1R4QnVpbGRlcih0aGlzLl9jb2luQ29uZmlnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBvcnQgaW4gQyBjaGFpbiBDcm9zcyBjaGFpbiB0cmFuc2ZlclxuICAgKlxuICAgKiBAcmV0dXJucyB7RXhwb3J0SW5DVHhCdWlsZGVyfSB0aGUgYnVpbGRlciBpbml0aWFsaXplZFxuICAgKi9cbiAgZ2V0RXhwb3J0SW5DQnVpbGRlcigpOiBFeHBvcnRJbkNUeEJ1aWxkZXIge1xuICAgIHJldHVybiBuZXcgRXhwb3J0SW5DVHhCdWlsZGVyKHRoaXMuX2NvaW5Db25maWcpO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGdldFdhbGxldEluaXRpYWxpemF0aW9uQnVpbGRlcigpOiBUcmFuc2FjdGlvbkJ1aWxkZXIge1xuICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWQoJ1dhbGxldCBpbml0aWFsaXphdGlvbiBpcyBub3QgbmVlZGVkJyk7XG4gIH1cbn1cbiJdfQ==
|
|
179
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvdHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSwwREFPa0M7QUFDbEMsbURBQW1GO0FBRW5GLHlDQUFpRDtBQUNqRCxpREFBc0Q7QUFDdEQsK0RBQTZEO0FBRTdELDZEQUEwRDtBQUMxRCx1REFBb0Q7QUFDcEQsNkRBQTBEO0FBQzFELHVEQUFvRDtBQUNwRCx5RkFBc0Y7QUFFdEYsb0RBQTRCO0FBQzVCLDZEQUEwRDtBQUUxRCxNQUFhLHlCQUEwQixTQUFRLHdDQUE2QjtJQUUxRSxZQUFZLFdBQWlDO1FBQzNDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUZYLGtCQUFhLEdBQUcsS0FBSyxDQUFDO0lBR2hDLENBQUM7SUFFRCxrQkFBa0I7SUFDbEIsSUFBSSxDQUFDLEdBQVc7O1FBQ2QsZUFBSyxDQUFDLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2xDLElBQUksUUFBUSxHQUFrQixLQUFLLENBQUM7UUFDcEMsSUFBSSxrQkFBa0IsR0FBa0UsU0FBUyxDQUFDO1FBQ2xHLElBQUksRUFBOEIsQ0FBQztRQUNuQyxNQUFNLFFBQVEsR0FBRyxlQUFLLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzVDLElBQUk7WUFDRixFQUFFLEdBQUcsSUFBSSxlQUFLLEVBQUUsQ0FBQztZQUNqQixrREFBa0Q7WUFDbEQsRUFBRSxDQUFDLFVBQVUsQ0FBQyxrQkFBVSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUVoRCxJQUFJLENBQUMsZUFBSyxDQUFDLGVBQWUsQ0FBQyxFQUFFLEVBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUE0QixDQUFDLFlBQVksQ0FBQyxFQUFFO2dCQUMzRixNQUFNLElBQUksS0FBSyxDQUFD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LENBQUMsV0FBVyxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxnQkFBZ0I7UUFDZCxPQUFPLElBQUksaUNBQWUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxtQkFBbUI7UUFDakIsT0FBTyxJQUFJLHVDQUFrQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILG1CQUFtQjtRQUNqQixPQUFPLElBQUksdUNBQWtCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRCxrQkFBa0I7SUFDbEIsOEJBQThCO1FBQzVCLE1BQU0sSUFBSSx1QkFBWSxDQUFDLHFDQUFxQyxDQUFDLENBQUM7SUFDaEUsQ0FBQztDQUNGO0FBbktELDhEQW1LQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFkZHJlc3MsXG4gIHV0aWxzIGFzIEF2YXhVdGlscyxcbiAgQ3JlZGVudGlhbCxcbiAgcHZtU2VyaWFsLFxuICBUcmFuc2Zlck91dHB1dCxcbiAgVW5zaWduZWRUeCxcbn0gZnJvbSAnQGJpdGdvLWZvcmtzL2F2YWxhbmNoZWpzJztcbmltcG9ydCB7IEJhc2VUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5LCBOb3RTdXBwb3J0ZWQgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgeyBBdmFsYW5jaGVOZXR3b3JrLCBCYXNlQ29pbiBhcyBDb2luQ29uZmlnIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgeyBCdWZmZXIgYXMgQnVmZmVyQXZheCB9IGZyb20gJ2F2YWxhbmNoZSc7XG5pbXBvcnQgeyBUeCBhcyBFVk1UeCB9IGZyb20gJ2F2YWxhbmNoZS9kaXN0L2FwaXMvZXZtJztcbmltcG9ydCB7IFR4IGFzIFBWTVR4IH0gZnJvbSAnYXZhbGFuY2hlL2Rpc3QvYXBpcy9wbGF0Zm9ybXZtJztcbmltcG9ydCB7IERlcHJlY2F0ZWRUcmFuc2FjdGlvbkJ1aWxkZXIgfSBmcm9tICcuL2RlcHJlY2F0ZWRUcmFuc2FjdGlvbkJ1aWxkZXInO1xuaW1wb3J0IHsgRXhwb3J0SW5DVHhCdWlsZGVyIH0gZnJvbSAnLi9leHBvcnRJbkNUeEJ1aWxkZXInO1xuaW1wb3J0IHsgRXhwb3J0VHhCdWlsZGVyIH0gZnJvbSAnLi9leHBvcnRUeEJ1aWxkZXInO1xuaW1wb3J0IHsgSW1wb3J0SW5DVHhCdWlsZGVyIH0gZnJvbSAnLi9pbXBvcnRJbkNUeEJ1aWxkZXInO1xuaW1wb3J0IHsgSW1wb3J0VHhCdWlsZGVyIH0gZnJvbSAnLi9pbXBvcnRUeEJ1aWxkZXInO1xuaW1wb3J0IHsgUGVybWlzc2lvbmxlc3NWYWxpZGF0b3JUeEJ1aWxkZXIgfSBmcm9tICcuL3Blcm1pc3Npb25sZXNzVmFsaWRhdG9yVHhCdWlsZGVyJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uQnVpbGRlciB9IGZyb20gJy4vdHJhbnNhY3Rpb25CdWlsZGVyJztcbmltcG9ydCB1dGlscyBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7IFZhbGlkYXRvclR4QnVpbGRlciB9IGZyb20gJy4vdmFsaWRhdG9yVHhCdWlsZGVyJztcblxuZXhwb3J0IGNsYXNzIFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkgZXh0ZW5kcyBCYXNlVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeSB7XG4gIHByb3RlY3RlZCByZWNvdmVyU2lnbmVyID0gZmFsc2U7XG4gIGNvbnN0cnVjdG9yKF9jb2luQ29uZmlnOiBSZWFkb25seTxDb2luQ29uZmlnPikge1xuICAgIHN1cGVyKF9jb2luQ29uZmlnKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBmcm9tKHJhdzogc3RyaW5nKTogVHJhbnNhY3Rpb25CdWlsZGVyIHwgRGVwcmVjYXRlZFRyYW5zYWN0aW9uQnVpbGRlciB7XG4gICAgdXRpbHMudmFsaWRhdGVSYXdUcmFuc2FjdGlvbihyYXcpO1xuICAgIGxldCB0eFNvdXJjZTogJ0VWTScgfCAnUFZNJyA9ICdQVk0nO1xuICAgIGxldCB0cmFuc2FjdGlvbkJ1aWxkZXI6IFRyYW5zYWN0aW9uQnVpbGRlciB8IERlcHJlY2F0ZWRUcmFuc2FjdGlvbkJ1aWxkZXIgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgbGV0IHR4OiBQVk1UeCB8IEVWTVR4IHwgVW5zaWduZWRUeDtcbiAgICBjb25zdCByYXdOb0hleCA9IHV0aWxzLnJlbW92ZUhleFByZWZpeChyYXcpO1xuICAgIHRyeSB7XG4gICAgICB0eCA9IG5ldyBQVk1UeCgpO1xuICAgICAgLy8gY291bGQgdGhyb3cgYW4gZXJyb3IgaWYgYSB0eFR5cGUgZG9lc24ndCBtYXRjaC5cbiAgICAgIHR4LmZyb21CdWZmZXIoQnVmZmVyQXZheC5mcm9tKHJhd05vSGV4LCAnaGV4JykpO1xuXG4gICAgICBpZiAoIXV0aWxzLmlzVHJhbnNhY3Rpb25PZih0eCwgKHRoaXMuX2NvaW5Db25maWcubmV0d29yayBhcyBBdmFsYW5jaGVOZXR3b3JrKS5ibG9ja2NoYWluSUQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSXQgaXMgbm90IGEgdHJhbnNhY3Rpb24gb2YgdGhpcyBwbGF0Zm9ybXZtIG9sZCBmbG93Jyk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdHhTb3VyY2UgPSAnRVZNJztcbiAgICAgICAgdHggPSBuZXcgRVZNVHgoKTtcbiAgICAgICAgdHguZnJvbUJ1ZmZlcihCdWZmZXJBdmF4LmZyb20ocmF3Tm9IZXgsICdoZXgnKSk7XG5cbiAgICAgICAgaWYgKCF1dGlscy5pc1RyYW5zYWN0aW9uT2YodHgsICh0aGlzLl9jb2luQ29uZmlnLm5ldHdvcmsgYXMgQXZhbGFuY2hlTmV0d29yaykuY0NoYWluQmxvY2tjaGFpbklEKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSXQgaXMgbm90IGEgdHJhbnNhY3Rpb24gb2YgdGhpcyBuZXR3b3JrIG9yIEMgY2hhaW4gRVZNJyk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0eFNvdXJjZSA9ICdQVk0nO1xuICAgICAgICAgIC8vIHRoaXMgc2hvdWxkIGJlIHRoZSBsYXN0IGJlY2F1c2Ugb3RoZXIgUFZNIGZ1bmN0aW9ucyBhcmUgc3RpbGwgYmVpbmcgZGV0ZWN0ZWQgaW4gdGhlIG5ldyBTREtcbiAgICAgICAgICBjb25zdCBtYW5hZ2VyID0gQXZheFV0aWxzLmdldE1hbmFnZXJGb3JWTSgnUFZNJyk7XG4gICAgICAgICAgY29uc3QgW2NvZGVjLCB0eEJ5dGVzXSA9IG1hbmFnZXIuZ2V0Q29kZWNGcm9tQnVmZmVyKEF2YXhVdGlscy5oZXhUb0J1ZmZlcihyYXcpKTtcbiAgICAgICAgICBjb25zdCB1bnBhY2tlZFR4ID0gY29kZWMuVW5wYWNrUHJlZml4PHB2bVNlcmlhbC5BZGRQZXJtaXNzaW9ubGVzc1ZhbGlkYXRvclR4Pih0eEJ5dGVzKTtcbiAgICAgICAgICAvLyBBIHNpZ25lZCB0cmFuc2FjdGlvbiBpbmNsdWRlcyA0IGJ5dGVzIGZvciB0aGUgbnVtYmVyIG9mIGNyZWRlbnRpYWxzIGFzIGFuIEludCB0eXBlIHRoYXQgaXMgbm90IGtub3duIGJ5IHRoZSBjb2RlY1xuICAgICAgICAgIC8vIFdlJ2xsIHNraXAgdGhvc2UgNCBieXRlcywgaW5zdGVhZCB3ZSdsbCBsb29wIHVudGlsIHdlJ3ZlIHBhcnNlZCBhbGwgY3JlZGVudGlhbHNcbiAgICAgICAgICAvLyBAc2VlIGh0dHBzOi8vZG9jcy5hdmF4Lm5ldHdvcmsvcmVmZXJlbmNlL2F2YWxhbmNoZWdvL3AtY2hhaW4vdHhuLWZvcm1hdCNzaWduZWQtdHJhbnNhY3Rpb24tZXhhbXBsZVxuICAgICAgICAgIGNvbnN0IGNyZWRlbnRpYWxzOiBDcmVkZW50aWFsW10gPSBbXTtcbiAgICAgICAgICBsZXQgY3JlZGVudGlhbEJ5dGVzID0gdW5wYWNrZWRUeFsxXS5zbGljZSg0KTtcbiAgICAgICAgICBsZXQgbW9yZUNyZWRlbnRpYWxzID0gdHJ1ZTtcbiAgICAgICAgICBkbyB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBjb25zdCBbY3JlZGVudGlhbCwgcmVzdF0gPSBjb2RlYy5VbnBhY2tQcmVmaXg8Q3JlZGVudGlhbD4oY3JlZGVudGlhbEJ5dGVzKTtcbiAgICAgICAgICAgICAgY3JlZGVudGlhbHMucHVzaChjcmVkZW50aWFsKTtcbiAgICAgICAgICAgICAgY3JlZGVudGlhbEJ5dGVzID0gcmVzdDtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgbW9yZUNyZWRlbnRpYWxzID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSB3aGlsZSAoY3JlZGVudGlhbEJ5dGVzLmxlbmd0aCA+IDAgJiYgbW9yZUNyZWRlbnRpYWxzKTtcblxuICAgICAgICAgIGNvbnN0IHVucGFja2VkID0gY29kZWMuVW5wYWNrUHJlZml4PHB2bVNlcmlhbC5BZGRQZXJtaXNzaW9ubGVzc1ZhbGlkYXRvclR4Pih0eEJ5dGVzKTtcbiAgICAgICAgICBjb25zdCBwZXJtaXNzaW9ubGVzc1ZhbGlkYXRvclR4ID0gdW5wYWNrZWRbMF0gYXMgcHZtU2VyaWFsLkFkZFBlcm1pc3Npb25sZXNzVmFsaWRhdG9yVHg7XG4gICAgICAgICAgY29uc3Qgb3V0cHV0cyA9IHBlcm1pc3Npb25sZXNzVmFsaWRhdG9yVHguYmFzZVR4Lm91dHB1dHM7XG4gICAgICAgICAgY29uc3Qgb3V0cHV0ID0gb3V0cHV0c1swXS5vdXRwdXQgYXMgVHJhbnNmZXJPdXRwdXQ7XG4gICAgICAgICAgaWYgKG91dHB1dHNbMF0uZ2V0QXNzZXRJZCgpICE9PSAodGhpcy5fY29pbkNvbmZpZy5uZXR3b3JrIGFzIEF2YWxhbmNoZU5ldHdvcmspLmF2YXhBc3NldElEKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBBc3NldCBJRCBvZiB0aGUgb3V0cHV0IGRvZXMgbm90IG1hdGNoIHRoZSB0cmFuc2FjdGlvbicpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBmcm9tQWRkcmVzc2VzID0gb3V0cHV0Lm91dHB1dE93bmVycy5hZGRycy5tYXAoKGEpID0+IEF2YXhVdGlscy5oZXhUb0J1ZmZlcihhLnRvSGV4KCkpKTtcbiAgICAgICAgICBjb25zdCBhZGRyZXNzTWFwcyA9IGZyb21BZGRyZXNzZXMubWFwKChhKSA9PiBuZXcgQXZheFV0aWxzLkFkZHJlc3NNYXAoW1tuZXcgQWRkcmVzcyhhKSwgMF1dKSk7XG4gICAgICAgICAgdHggPSBuZXcgVW5zaWduZWRUeCh1bnBhY2tlZFswXSwgW10sIG5ldyBBdmF4VXRpbHMuQWRkcmVzc01hcHMoYWRkcmVzc01hcHMpLCBjcmVkZW50aWFscyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgVGhlIHRyYW5zYWN0aW9uIHR5cGUgaXMgbm90IHJlY29nbml6ZWQgYXMgYW4gb2xkIFBWTSBvciBvbGQgRVZNIHRyYW5zYWN0aW9uLiBBZGRpdGlvbmFsbHksIHBhcnNpbmcgb2YgdGhlIG5ldyBQVk0gQWRkUGVybWlzc2lvbmxlc3NWYWxpZGF0b3JUeCB0eXBlIGZhaWxlZDogJHtlLm1lc3NhZ2V9YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHhTb3VyY2UgPT09ICdQVk0nKSB7XG4gICAgICBpZiAoKHR4IGFzIFVuc2lnbmVkVHgpPy50eD8uX3R5cGUgJiYgUGVybWlzc2lvbmxlc3NWYWxpZGF0b3JUeEJ1aWxkZXIudmVyaWZ5VHhUeXBlKCh0eCBhcyBVbnNpZ25lZFR4KS50eC5fdHlwZSkpIHtcbiAgICAgICAgdHJhbnNhY3Rpb25CdWlsZGVyID0gdGhpcy5nZXRQZXJtaXNzaW9ubGVzc1ZhbGlkYXRvclR4QnVpbGRlcigpO1xuICAgICAgICB0cmFuc2FjdGlvbkJ1aWxkZXIuaW5pdEJ1aWxkZXIodHgpO1xuICAgICAgfSBlbHNlIGlmIChWYWxpZGF0b3JUeEJ1aWxkZXIudmVyaWZ5VHhUeXBlKCh0eCBhcyBQVk1UeCkuZ2V0VW5zaWduZWRUeCgpLmdldFRyYW5zYWN0aW9uKCkpKSB7XG4gICAgICAgIHRyYW5zYWN0aW9uQnVpbGRlciA9IHRoaXMuZ2V0VmFsaWRhdG9yQnVpbGRlcigpO1xuICAgICAgICB0cmFuc2FjdGlvbkJ1aWxkZXIuaW5pdEJ1aWxkZXIodHggYXMgUFZNVHgpO1xuICAgICAgfSBlbHNlIGlmIChFeHBvcnRUeEJ1aWxkZXIudmVyaWZ5VHhUeXBlKCh0eCBhcyBQVk1UeCkuZ2V0VW5zaWduZWRUeCgpLmdldFRyYW5zYWN0aW9uKCkpKSB7XG4gICAgICAgIHRyYW5zYWN0aW9uQnVpbGRlciA9IHRoaXMuZ2V0RXhwb3J0QnVpbGRlcigpO1xuICAgICAgICB0cmFuc2FjdGlvbkJ1aWxkZXIuaW5pdEJ1aWxkZXIodHggYXMgUFZNVHgpO1xuICAgICAgfSBlbHNlIGlmIChJbXBvcnRUeEJ1aWxkZXIudmVyaWZ5VHhUeXBlKCh0eCBhcyBQVk1UeCkuZ2V0VW5zaWduZWRUeCgpLmdldFRyYW5zYWN0aW9uKCkpKSB7XG4gICAgICAgIHRyYW5zYWN0aW9uQnVpbGRlciA9IHRoaXMuZ2V0SW1wb3J0QnVpbGRlcigpO1xuICAgICAgICB0cmFuc2FjdGlvbkJ1aWxkZXIuaW5pdEJ1aWxkZXIodHggYXMgUFZNVHgpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHhTb3VyY2UgPT09ICdFVk0nKSB7XG4gICAgICBpZiAoSW1wb3J0SW5DVHhCdWlsZGVyLnZlcmlmeVR4VHlwZSgodHggYXMgRVZNVHgpLmdldFVuc2lnbmVkVHgoKS5nZXRUcmFuc2FjdGlvbigpKSkge1xuICAgICAgICB0cmFuc2FjdGlvbkJ1aWxkZXIgPSB0aGlzLmdldEltcG9ydEluQ0J1aWxkZXIoKTtcbiAgICAgICAgdHJhbnNhY3Rpb25CdWlsZGVyLmluaXRCdWlsZGVyKHR4IGFzIEVWTVR4KTtcbiAgICAgIH0gZWxzZSBpZiAoRXhwb3J0SW5DVHhCdWlsZGVyLnZlcmlmeVR4VHlwZSgodHggYXMgRVZNVHgpLmdldFVuc2lnbmVkVHgoKS5nZXRUcmFuc2FjdGlvbigpKSkge1xuICAgICAgICB0cmFuc2FjdGlvbkJ1aWxkZXIgPSB0aGlzLmdldEV4cG9ydEluQ0J1aWxkZXIoKTtcbiAgICAgICAgdHJhbnNhY3Rpb25CdWlsZGVyLmluaXRCdWlsZGVyKHR4IGFzIEVWTVR4KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRyYW5zYWN0aW9uQnVpbGRlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkKCdUcmFuc2FjdGlvbiBjYW5ub3QgYmUgcGFyc2VkIG9yIGhhcyBhbiB1bnN1cHBvcnRlZCB0cmFuc2FjdGlvbiB0eXBlJyk7XG4gICAgfVxuICAgIHJldHVybiB0cmFuc2FjdGlvbkJ1aWxkZXI7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgZ2V0VHJhbnNmZXJCdWlsZGVyKCk6IERlcHJlY2F0ZWRUcmFuc2FjdGlvbkJ1aWxkZXIge1xuICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWQoJ1RyYW5zZmVyIGlzIG5vdCBzdXBwb3J0ZWQgaW4gUCBDaGFpbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgVmFsaWRhdG9yIGJ1aWxkZXJcbiAgICpcbiAgICogQHJldHVybnMge1ZhbGlkYXRvclR4QnVpbGRlcn0gdGhlIGJ1aWxkZXIgaW5pdGlhbGl6ZWRcbiAgICovXG4gIGdldFZhbGlkYXRvckJ1aWxkZXIoKTogVmFsaWRhdG9yVHhCdWlsZGVyIHtcbiAgICByZXR1cm4gbmV3IFZhbGlkYXRvclR4QnVpbGRlcih0aGlzLl9jb2luQ29uZmlnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIFBlcm1pc3Npb25sZXNzIFZhbGlkYXRvciBidWlsZGVyXG4gICAqXG4gICAqIEByZXR1cm5zIHtQZXJtaXNzaW9ubGVzc1ZhbGlkYXRvclR4QnVpbGRlcn0gdGhlIGJ1aWxkZXIgaW5pdGlhbGl6ZWRcbiAgICovXG4gIGdldFBlcm1pc3Npb25sZXNzVmFsaWRhdG9yVHhCdWlsZGVyKCk6IFBlcm1pc3Npb25sZXNzVmFsaWRhdG9yVHhCdWlsZGVyIHtcbiAgICByZXR1cm4gbmV3IFBlcm1pc3Npb25sZXNzVmFsaWRhdG9yVHhCdWlsZGVyKHRoaXMuX2NvaW5Db25maWcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4cG9ydCBDcm9zcyBjaGFpbiB0cmFuc2ZlclxuICAgKlxuICAgKiBAcmV0dXJucyB7RXhwb3J0VHhCdWlsZGVyfSB0aGUgYnVpbGRlciBpbml0aWFsaXplZFxuICAgKi9cbiAgZ2V0RXhwb3J0QnVpbGRlcigpOiBFeHBvcnRUeEJ1aWxkZXIge1xuICAgIHJldHVybiBuZXcgRXhwb3J0VHhCdWlsZGVyKHRoaXMuX2NvaW5Db25maWcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcG9ydCBDcm9zcyBjaGFpbiB0cmFuc2ZlclxuICAgKlxuICAgKiBAcmV0dXJucyB7SW1wb3J0VHhCdWlsZGVyfSB0aGUgYnVpbGRlciBpbml0aWFsaXplZFxuICAgKi9cbiAgZ2V0SW1wb3J0QnVpbGRlcigpOiBJbXBvcnRUeEJ1aWxkZXIge1xuICAgIHJldHVybiBuZXcgSW1wb3J0VHhCdWlsZGVyKHRoaXMuX2NvaW5Db25maWcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcG9ydCBpbiBDIGNoYWluIENyb3NzIGNoYWluIHRyYW5zZmVyXG4gICAqXG4gICAqIEByZXR1cm5zIHtJbXBvcnRJbkNUeEJ1aWxkZXJ9IHRoZSBidWlsZGVyIGluaXRpYWxpemVkXG4gICAqL1xuICBnZXRJbXBvcnRJbkNCdWlsZGVyKCk6IEltcG9ydEluQ1R4QnVpbGRlciB7XG4gICAgcmV0dXJuIG5ldyBJbXBvcnRJbkNUeEJ1aWxkZXIodGhpcy5fY29pbkNvbmZpZyk7XG4gIH1cblxuICAvKipcbiAgICogRXhwb3J0IGluIEMgY2hhaW4gQ3Jvc3MgY2hhaW4gdHJhbnNmZXJcbiAgICpcbiAgICogQHJldHVybnMge0V4cG9ydEluQ1R4QnVpbGRlcn0gdGhlIGJ1aWxkZXIgaW5pdGlhbGl6ZWRcbiAgICovXG4gIGdldEV4cG9ydEluQ0J1aWxkZXIoKTogRXhwb3J0SW5DVHhCdWlsZGVyIHtcbiAgICByZXR1cm4gbmV3IEV4cG9ydEluQ1R4QnVpbGRlcih0aGlzLl9jb2luQ29uZmlnKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBnZXRXYWxsZXRJbml0aWFsaXphdGlvbkJ1aWxkZXIoKTogRGVwcmVjYXRlZFRyYW5zYWN0aW9uQnVpbGRlciB7XG4gICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZCgnV2FsbGV0IGluaXRpYWxpemF0aW9uIGlzIG5vdCBuZWVkZWQnKTtcbiAgfVxufVxuIl19
|