@bitgo-beta/sdk-coin-sol 2.4.3-beta.57 → 2.4.3-beta.570
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 +804 -0
- package/dist/src/index.js +6 -2
- package/dist/src/lib/ataInitializationBuilder.js +16 -12
- package/dist/src/lib/closeAtaBuilder.d.ts +19 -0
- package/dist/src/lib/closeAtaBuilder.d.ts.map +1 -0
- package/dist/src/lib/closeAtaBuilder.js +69 -0
- package/dist/src/lib/constants.d.ts +29 -7
- package/dist/src/lib/constants.d.ts.map +1 -1
- package/dist/src/lib/constants.js +31 -7
- package/dist/src/lib/iface.d.ts +45 -3
- package/dist/src/lib/iface.d.ts.map +1 -1
- package/dist/src/lib/iface.js +1 -1
- package/dist/src/lib/index.d.ts +11 -7
- package/dist/src/lib/index.d.ts.map +1 -1
- package/dist/src/lib/index.js +27 -15
- package/dist/src/lib/instructionParamsFactory.d.ts.map +1 -1
- package/dist/src/lib/instructionParamsFactory.js +272 -32
- package/dist/src/lib/keyPair.js +5 -5
- package/dist/src/lib/solInstructionFactory.d.ts.map +1 -1
- package/dist/src/lib/solInstructionFactory.js +105 -35
- package/dist/src/lib/stakingActivateBuilder.d.ts +2 -2
- package/dist/src/lib/stakingActivateBuilder.js +10 -10
- package/dist/src/lib/stakingAuthorizeBuilder.d.ts +43 -0
- package/dist/src/lib/stakingAuthorizeBuilder.d.ts.map +1 -0
- package/dist/src/lib/stakingAuthorizeBuilder.js +89 -0
- package/dist/src/lib/stakingDeactivateBuilder.d.ts +10 -0
- package/dist/src/lib/stakingDeactivateBuilder.d.ts.map +1 -1
- package/dist/src/lib/stakingDeactivateBuilder.js +71 -24
- package/dist/src/lib/stakingDelegateBuilder.d.ts +42 -0
- package/dist/src/lib/stakingDelegateBuilder.d.ts.map +1 -0
- package/dist/src/lib/stakingDelegateBuilder.js +120 -0
- package/dist/src/lib/stakingRawMsgAuthorizeBuilder.d.ts +33 -0
- package/dist/src/lib/stakingRawMsgAuthorizeBuilder.d.ts.map +1 -0
- package/dist/src/lib/stakingRawMsgAuthorizeBuilder.js +110 -0
- package/dist/src/lib/stakingWithdrawBuilder.js +6 -6
- package/dist/src/lib/tokenTransferBuilder.js +13 -13
- package/dist/src/lib/transaction.d.ts +4 -2
- package/dist/src/lib/transaction.d.ts.map +1 -1
- package/dist/src/lib/transaction.js +94 -12
- package/dist/src/lib/transactionBuilder.d.ts +1 -0
- package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilder.js +16 -16
- package/dist/src/lib/transactionBuilderFactory.d.ts +36 -7
- package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilderFactory.js +56 -7
- package/dist/src/lib/transferBuilder.js +4 -4
- package/dist/src/lib/transferBuilderV2.d.ts +11 -1
- package/dist/src/lib/transferBuilderV2.d.ts.map +1 -1
- package/dist/src/lib/transferBuilderV2.js +56 -10
- package/dist/src/lib/utils.d.ts +13 -4
- package/dist/src/lib/utils.d.ts.map +1 -1
- package/dist/src/lib/utils.js +87 -20
- package/dist/src/lib/walletInitializationBuilder.js +6 -6
- package/dist/src/sol.d.ts +67 -24
- package/dist/src/sol.d.ts.map +1 -1
- package/dist/src/sol.js +577 -68
- package/package.json +10 -9
|
@@ -10,11 +10,13 @@ const utils_1 = require("./utils");
|
|
|
10
10
|
const statics_1 = require("@bitgo-beta/statics");
|
|
11
11
|
const assert_1 = __importDefault(require("assert"));
|
|
12
12
|
const constants_1 = require("./constants");
|
|
13
|
+
const lodash_1 = __importDefault(require("lodash"));
|
|
13
14
|
const UNSIGNED_BIGINT_MAX = BigInt('18446744073709551615');
|
|
14
15
|
class TransferBuilderV2 extends transactionBuilder_1.TransactionBuilder {
|
|
15
16
|
constructor(_coinConfig) {
|
|
16
17
|
super(_coinConfig);
|
|
17
18
|
this._sendParams = [];
|
|
19
|
+
this._createAtaParams = [];
|
|
18
20
|
}
|
|
19
21
|
get transactionType() {
|
|
20
22
|
return sdk_core_1.TransactionType.Send;
|
|
@@ -39,6 +41,13 @@ class TransferBuilderV2 extends transactionBuilder_1.TransactionBuilder {
|
|
|
39
41
|
tokenName: transferInstruction.params.tokenName,
|
|
40
42
|
});
|
|
41
43
|
}
|
|
44
|
+
else if (instruction.type === constants_1.InstructionBuilderTypes.CreateAssociatedTokenAccount) {
|
|
45
|
+
const ataInitInstruction = instruction;
|
|
46
|
+
this._createAtaParams.push({
|
|
47
|
+
ownerAddress: ataInitInstruction.params.ownerAddress,
|
|
48
|
+
tokenName: ataInitInstruction.params.tokenName,
|
|
49
|
+
});
|
|
50
|
+
}
|
|
42
51
|
}
|
|
43
52
|
}
|
|
44
53
|
/**
|
|
@@ -46,7 +55,7 @@ class TransferBuilderV2 extends transactionBuilder_1.TransactionBuilder {
|
|
|
46
55
|
* @param payerAddress
|
|
47
56
|
*/
|
|
48
57
|
feePayer(payerAddress) {
|
|
49
|
-
utils_1.validateAddress(payerAddress, 'address');
|
|
58
|
+
(0, utils_1.validateAddress)(payerAddress, 'address');
|
|
50
59
|
this._feePayer = payerAddress;
|
|
51
60
|
return this;
|
|
52
61
|
}
|
|
@@ -57,8 +66,8 @@ class TransferBuilderV2 extends transactionBuilder_1.TransactionBuilder {
|
|
|
57
66
|
* @returns {TransactionBuilder} This transaction builder
|
|
58
67
|
*/
|
|
59
68
|
send(sendParams) {
|
|
60
|
-
utils_1.validateAddress(sendParams.address, 'address');
|
|
61
|
-
if (!sendParams.amount || !utils_1.isValidAmount(sendParams.amount)) {
|
|
69
|
+
(0, utils_1.validateAddress)(sendParams.address, 'address');
|
|
70
|
+
if (!sendParams.amount || !(0, utils_1.isValidAmount)(sendParams.amount)) {
|
|
62
71
|
throw new sdk_core_1.BuildTransactionError('Invalid or missing amount, got: ' + sendParams.amount);
|
|
63
72
|
}
|
|
64
73
|
if (sendParams.tokenName && BigInt(sendParams.amount) > UNSIGNED_BIGINT_MAX) {
|
|
@@ -70,21 +79,38 @@ class TransferBuilderV2 extends transactionBuilder_1.TransactionBuilder {
|
|
|
70
79
|
this._sendParams.push(sendParams);
|
|
71
80
|
return this;
|
|
72
81
|
}
|
|
82
|
+
/**
|
|
83
|
+
*
|
|
84
|
+
* @param {TokenAssociateRecipient} recipient - recipient of the associated token account creation
|
|
85
|
+
* @param {string} recipient.ownerAddress - owner of the associated token account
|
|
86
|
+
* @param {string} recipient.tokenName - name of the token that is intended to associate
|
|
87
|
+
* @returns {TransactionBuilder} This transaction builder
|
|
88
|
+
*/
|
|
89
|
+
createAssociatedTokenAccount(recipient) {
|
|
90
|
+
(0, utils_1.validateOwnerAddress)(recipient.ownerAddress);
|
|
91
|
+
const token = (0, utils_1.getSolTokenFromTokenName)(recipient.tokenName);
|
|
92
|
+
if (!token) {
|
|
93
|
+
throw new sdk_core_1.BuildTransactionError('Invalid token name, got: ' + recipient.tokenName);
|
|
94
|
+
}
|
|
95
|
+
(0, utils_1.validateMintAddress)(token.tokenAddress);
|
|
96
|
+
this._createAtaParams.push(recipient);
|
|
97
|
+
return this;
|
|
98
|
+
}
|
|
73
99
|
/** @inheritdoc */
|
|
74
100
|
async buildImplementation() {
|
|
75
|
-
assert_1.default(this._sender, 'Sender must be set before building the transaction');
|
|
76
|
-
|
|
101
|
+
(0, assert_1.default)(this._sender, 'Sender must be set before building the transaction');
|
|
102
|
+
const sendInstructions = await Promise.all(this._sendParams.map(async (sendParams) => {
|
|
77
103
|
if (sendParams.tokenName) {
|
|
78
|
-
const coin = utils_1.getSolTokenFromTokenName(sendParams.tokenName);
|
|
79
|
-
assert_1.default(coin instanceof statics_1.SolCoin);
|
|
80
|
-
const sourceAddress = await utils_1.getAssociatedTokenAccountAddress(coin.tokenAddress, this._sender);
|
|
104
|
+
const coin = (0, utils_1.getSolTokenFromTokenName)(sendParams.tokenName);
|
|
105
|
+
(0, assert_1.default)(coin instanceof statics_1.SolCoin);
|
|
106
|
+
const sourceAddress = await (0, utils_1.getAssociatedTokenAccountAddress)(coin.tokenAddress, this._sender);
|
|
81
107
|
return {
|
|
82
108
|
type: constants_1.InstructionBuilderTypes.TokenTransfer,
|
|
83
109
|
params: {
|
|
84
110
|
fromAddress: this._sender,
|
|
85
111
|
toAddress: sendParams.address,
|
|
86
112
|
amount: sendParams.amount,
|
|
87
|
-
tokenName:
|
|
113
|
+
tokenName: coin.name,
|
|
88
114
|
sourceAddress: sourceAddress,
|
|
89
115
|
},
|
|
90
116
|
};
|
|
@@ -100,8 +126,28 @@ class TransferBuilderV2 extends transactionBuilder_1.TransactionBuilder {
|
|
|
100
126
|
};
|
|
101
127
|
}
|
|
102
128
|
}));
|
|
129
|
+
const uniqueCreateAtaParams = lodash_1.default.uniqBy(this._createAtaParams, (recipient) => {
|
|
130
|
+
return recipient.ownerAddress + recipient.tokenName;
|
|
131
|
+
});
|
|
132
|
+
const createAtaInstructions = await Promise.all(uniqueCreateAtaParams.map(async (recipient) => {
|
|
133
|
+
const coin = (0, utils_1.getSolTokenFromTokenName)(recipient.tokenName);
|
|
134
|
+
(0, assert_1.default)(coin instanceof statics_1.SolCoin);
|
|
135
|
+
const recipientTokenAddress = await (0, utils_1.getAssociatedTokenAccountAddress)(coin.tokenAddress, recipient.ownerAddress);
|
|
136
|
+
return {
|
|
137
|
+
type: constants_1.InstructionBuilderTypes.CreateAssociatedTokenAccount,
|
|
138
|
+
params: {
|
|
139
|
+
ownerAddress: recipient.ownerAddress,
|
|
140
|
+
tokenName: coin.name,
|
|
141
|
+
mintAddress: coin.tokenAddress,
|
|
142
|
+
ataAddress: recipientTokenAddress,
|
|
143
|
+
payerAddress: this._sender,
|
|
144
|
+
},
|
|
145
|
+
};
|
|
146
|
+
}));
|
|
147
|
+
// order is important, createAtaInstructions must be before sendInstructions
|
|
148
|
+
this._instructionsData = [...createAtaInstructions, ...sendInstructions];
|
|
103
149
|
return await super.buildImplementation();
|
|
104
150
|
}
|
|
105
151
|
}
|
|
106
152
|
exports.TransferBuilderV2 = TransferBuilderV2;
|
|
107
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmZXJCdWlsZGVyVjIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3RyYW5zZmVyQnVpbGRlclYyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLDZEQUEwRDtBQUMxRCxtREFBOEU7QUFDOUUsbUNBQXFIO0FBQ3JILGlEQUFzRTtBQUV0RSxvREFBNEI7QUFFNUIsMkNBQXNEO0FBUXRELE1BQU0sbUJBQW1CLEdBQUcsTUFBTSxDQUFDLHNCQUFzQixDQUFDLENBQUM7QUFFM0QsTUFBYSxpQkFBa0IsU0FBUSx1Q0FBa0I7SUFHdkQsWUFBWSxXQUFpQztRQUMzQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7UUFIYixnQkFBVyxHQUFpQixFQUFFLENBQUM7SUFJdkMsQ0FBQztJQUVELElBQWMsZUFBZTtRQUMzQixPQUFPLDBCQUFlLENBQUMsSUFBSSxDQUFDO0lBQzlCLENBQUM7SUFFRCxXQUFXLENBQUMsRUFBZTtRQUN6QixLQUFLLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRXRCLEtBQUssTUFBTSxXQUFXLElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFO1lBQ2hELElBQUksV0FBVyxDQUFDLElBQUksS0FBSyxtQ0FBdUIsQ0FBQyxRQUFRLEVBQUU7Z0JBQ3pELE1BQU0sbUJBQW1CLEdBQWEsV0FBVyxDQUFDO2dCQUNsRCxJQUFJLENBQUMsTUFBTSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDcEQsSUFBSSxDQUFDLElBQUksQ0FBQztvQkFDUixPQUFPLEVBQUUsbUJBQW1CLENBQUMsTUFBTSxDQUFDLFNBQVM7b0JBQzdDLE1BQU0sRUFBRSxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsTUFBTTtpQkFDMUMsQ0FBQyxDQUFDO2FBQ0o7aUJBQU0sSUFBSSxXQUFXLENBQUMsSUFBSSxLQUFLLG1DQUF1QixDQUFDLGFBQWEsRUFBRTtnQkFDckUsTUFB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QUMsUUFBUTtvQkFDdEMsTUFBTSxFQUFFO3dCQUNOLFdBQVcsRUFBRSxJQUFJLENBQUMsT0FBTzt3QkFDekIsU0FBUyxFQUFFLFVBQVUsQ0FBQyxPQUFPO3dCQUM3QixNQUFNLEVBQUUsVUFBVSxDQUFDLE1BQU07cUJBQzFCO2lCQUNGLENBQUM7YUFDSDtRQUNILENBQUMsQ0FBQyxDQUNILENBQUM7UUFFRixPQUFPLE1BQU0sS0FBSyxDQUFDLG1CQUFtQixFQUFFLENBQUM7SUFDM0MsQ0FBQztDQUNGO0FBdEdELDhDQXNHQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFRyYW5zYWN0aW9uQnVpbGRlciB9IGZyb20gJy4vdHJhbnNhY3Rpb25CdWlsZGVyJztcbmltcG9ydCB7IEJ1aWxkVHJhbnNhY3Rpb25FcnJvciwgVHJhbnNhY3Rpb25UeXBlIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgZ2V0QXNzb2NpYXRlZFRva2VuQWNjb3VudEFkZHJlc3MsIGdldFNvbFRva2VuRnJvbVRva2VuTmFtZSwgaXNWYWxpZEFtb3VudCwgdmFsaWRhdGVBZGRyZXNzIH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgeyBCYXNlQ29pbiBhcyBDb2luQ29uZmlnLCBTb2xDb2luIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbiB9IGZyb20gJy4vdHJhbnNhY3Rpb24nO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHsgVG9rZW5UcmFuc2ZlciwgVHJhbnNmZXIgfSBmcm9tICcuL2lmYWNlJztcbmltcG9ydCB7IEluc3RydWN0aW9uQnVpbGRlclR5cGVzIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNlbmRQYXJhbXMge1xuICBhZGRyZXNzOiBzdHJpbmc7XG4gIGFtb3VudDogc3RyaW5nO1xuICB0b2tlbk5hbWU/OiBzdHJpbmc7XG59XG5cbmNvbnN0IFVOU0lHTkVEX0JJR0lOVF9NQVggPSBCaWdJbnQoJzE4NDQ2NzQ0MDczNzA5NTUxNjE1Jyk7XG5cbmV4cG9ydCBjbGFzcyBUcmFuc2ZlckJ1aWxkZXJWMiBleHRlbmRzIFRyYW5zYWN0aW9uQnVpbGRlciB7XG4gIHByaXZhdGUgX3NlbmRQYXJhbXM6IFNlbmRQYXJhbXNbXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKF9jb2luQ29uZmlnOiBSZWFkb25seTxDb2luQ29uZmlnPikge1xuICAgIHN1cGVyKF9jb2luQ29uZmlnKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgdHJhbnNhY3Rpb25UeXBlKCk6IFRyYW5zYWN0aW9uVHlwZSB7XG4gICAgcmV0dXJuIFRyYW5zYWN0aW9uVHlwZS5TZW5kO1xuICB9XG5cbiAgaW5pdEJ1aWxkZXIodHg6IFRyYW5zYWN0aW9uKTogdm9pZCB7XG4gICAgc3VwZXIuaW5pdEJ1aWxkZXIodHgpO1xuXG4gICAgZm9yIChjb25zdCBpbnN0cnVjdGlvbiBvZiB0aGlzLl9pbnN0cnVjdGlvbnNEYXRhKSB7XG4gICAgICBpZiAoaW5zdHJ1Y3Rpb24udHlwZSA9PT0gSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuVHJhbnNmZXIpIHtcbiAgICAgICAgY29uc3QgdHJhbnNmZXJJbnN0cnVjdGlvbjogVHJhbnNmZXIgPSBpbnN0cnVjdGlvbjtcbiAgICAgICAgdGhpcy5zZW5kZXIodHJhbnNmZXJJbnN0cnVjdGlvbi5wYXJhbXMuZnJvbUFkZHJlc3MpO1xuICAgICAgICB0aGlzLnNlbmQoe1xuICAgICAgICAgIGFkZHJlc3M6IHRyYW5zZmVySW5zdHJ1Y3Rpb24ucGFyYW1zLnRvQWRkcmVzcyxcbiAgICAgICAgICBhbW91bnQ6IHRyYW5zZmVySW5zdHJ1Y3Rpb24ucGFyYW1zLmFtb3VudCxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKGluc3RydWN0aW9uLnR5cGUgPT09IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlRva2VuVHJhbnNmZXIpIHtcbiAgICAgICAgY29uc3QgdHJhbnNmZXJJbnN0cnVjdGlvbjogVG9rZW5UcmFuc2ZlciA9IGluc3RydWN0aW9uO1xuICAgICAgICB0aGlzLnNlbmRlcih0cmFuc2Zlckluc3RydWN0aW9uLnBhcmFtcy5mcm9tQWRkcmVzcyk7XG4gICAgICAgIHRoaXMuc2VuZCh7XG4gICAgICAgICAgYWRkcmVzczogdHJhbnNmZXJJbnN0cnVjdGlvbi5wYXJhbXMudG9BZGRyZXNzLFxuICAgICAgICAgIGFtb3VudDogdHJhbnNmZXJJbnN0cnVjdGlvbi5wYXJhbXMuYW1vdW50LFxuICAgICAgICAgIHRva2VuTmFtZTogdHJhbnNmZXJJbnN0cnVjdGlvbi5wYXJhbXMudG9rZW5OYW1lLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0IGEgZmVlUGF5ZXJcbiAgICogQHBhcmFtIHBheWVyQWRkcmVzc1xuICAgKi9cbiAgZmVlUGF5ZXIocGF5ZXJBZGRyZXNzOiBzdHJpbmcpOiB0aGlzIHtcbiAgICB2YWxpZGF0ZUFkZHJlc3MocGF5ZXJBZGRyZXNzLCAnYWRkcmVzcycpO1xuICAgIHRoaXMuX2ZlZVBheWVyID0gcGF5ZXJBZGRyZXNzO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqICBTZXQgYSB0cmFuc2ZlclxuICAgKlxuICAgKiBAcGFyYW0ge1NlbmRQYXJhbXN9IHNlbmRQYXJhbXMgLSBzZW5kUGFyYW1zXG4gICAqIEByZXR1cm5zIHtUcmFuc2FjdGlvbkJ1aWxkZXJ9IFRoaXMgdHJhbnNhY3Rpb24gYnVpbGRlclxuICAgKi9cbiAgc2VuZChzZW5kUGFyYW1zOiBTZW5kUGFyYW1zKTogdGhpcyB7XG4gICAgdmFsaWRhdGVBZGRyZXNzKHNlbmRQYXJhbXMuYWRkcmVzcywgJ2FkZHJlc3MnKTtcbiAgICBpZiAoIXNlbmRQYXJhbXMuYW1vdW50IHx8ICFpc1ZhbGlkQW1vdW50KHNlbmRQYXJhbXMuYW1vdW50KSkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignSW52YWxpZCBvciBtaXNzaW5nIGFtb3VudCwgZ290OiAnICsgc2VuZFBhcmFtcy5hbW91bnQpO1xuICAgIH1cbiAgICBpZiAoc2VuZFBhcmFtcy50b2tlbk5hbWUgJiYgQmlnSW50KHNlbmRQYXJhbXMuYW1vdW50KSA+IFVOU0lHTkVEX0JJR0lOVF9NQVgpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoYGlucHV0IGFtb3VudCAke3NlbmRQYXJhbXMuYW1vdW50fSBleGNlZWRzIGJpZyBpbnQgbGltaXQgJHtVTlNJR05FRF9CSUdJTlRfTUFYfWApO1xuICAgIH0gZWxzZSBpZiAoIXNlbmRQYXJhbXMudG9rZW5OYW1lICYmIEJpZ0ludChzZW5kUGFyYW1zLmFtb3VudCkgPiBCaWdJbnQoTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKFxuICAgICAgICBgaW5wdXQgYW1vdW50ICR7c2VuZFBhcmFtcy5hbW91bnR9IGV4Y2VlZHMgbWF4IHNhZmUgaW50ICR7TnVtYmVyLk1BWF9TQUZFX0lOVEVHRVJ9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLl9zZW5kUGFyYW1zLnB1c2goc2VuZFBhcmFtcyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGJ1aWxkSW1wbGVtZW50YXRpb24oKTogUHJvbWlzZTxUcmFuc2FjdGlvbj4ge1xuICAgIGFzc2VydCh0aGlzLl9zZW5kZXIsICdTZW5kZXIgbXVzdCBiZSBzZXQgYmVmb3JlIGJ1aWxkaW5nIHRoZSB0cmFuc2FjdGlvbicpO1xuXG4gICAgdGhpcy5faW5zdHJ1Y3Rpb25zRGF0YSA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgdGhpcy5fc2VuZFBhcmFtcy5tYXAoYXN5bmMgKHNlbmRQYXJhbXM6IFNlbmRQYXJhbXMpOiBQcm9taXNlPFRyYW5zZmVyIHwgVG9rZW5UcmFuc2Zlcj4gPT4ge1xuICAgICAgICBpZiAoc2VuZFBhcmFtcy50b2tlbk5hbWUpIHtcbiAgICAgICAgICBjb25zdCBjb2luID0gZ2V0U29sVG9rZW5Gcm9tVG9rZW5OYW1lKHNlbmRQYXJhbXMudG9rZW5OYW1lKTtcbiAgICAgICAgICBhc3NlcnQoY29pbiBpbnN0YW5jZW9mIFNvbENvaW4pO1xuICAgICAgICAgIGNvbnN0IHNvdXJjZUFkZHJlc3MgPSBhd2FpdCBnZXRBc3NvY2lhdGVkVG9rZW5BY2NvdW50QWRkcmVzcyhjb2luLnRva2VuQWRkcmVzcywgdGhpcy5fc2VuZGVyKTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuVG9rZW5UcmFuc2ZlcixcbiAgICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgICBmcm9tQWRkcmVzczogdGhpcy5fc2VuZGVyLFxuICAgICAgICAgICAgICB0b0FkZHJlc3M6IHNlbmRQYXJhbXMuYWRkcmVzcyxcbiAgICAgICAgICAgICAgYW1vdW50OiBzZW5kUGFyYW1zLmFtb3VudCxcbiAgICAgICAgICAgICAgdG9rZW5OYW1lOiBzZW5kUGFyYW1zLnRva2VuTmFtZSxcbiAgICAgICAgICAgICAgc291cmNlQWRkcmVzczogc291cmNlQWRkcmVzcyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuVHJhbnNmZXIsXG4gICAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgICAgZnJvbUFkZHJlc3M6IHRoaXMuX3NlbmRlcixcbiAgICAgICAgICAgICAgdG9BZGRyZXNzOiBzZW5kUGFyYW1zLmFkZHJlc3MsXG4gICAgICAgICAgICAgIGFtb3VudDogc2VuZFBhcmFtcy5hbW91bnQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcblxuICAgIHJldHVybiBhd2FpdCBzdXBlci5idWlsZEltcGxlbWVudGF0aW9uKCk7XG4gIH1cbn1cbiJdfQ==
|
|
153
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmZXJCdWlsZGVyVjIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3RyYW5zZmVyQnVpbGRlclYyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLDZEQUEwRDtBQUMxRCxtREFBOEU7QUFFOUUsbUNBT2lCO0FBQ2pCLGlEQUFzRTtBQUN0RSxvREFBNEI7QUFFNUIsMkNBQXNEO0FBQ3RELG9EQUF1QjtBQVF2QixNQUFNLG1CQUFtQixHQUFHLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0FBRTNELE1BQWEsaUJBQWtCLFNBQVEsdUNBQWtCO0lBR3ZELFlBQVksV0FBaUM7UUFDM0MsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBSGIsZ0JBQVcsR0FBaUIsRUFBRSxDQUFDO1FBSXJDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVELElBQWMsZUFBZTtRQUMzQixPQUFPLDBCQUFlLENBQUMsSUFBSSxDQUFDO0lBQzlCLENBQUM7SUFFRCxXQUFXLENBQUMsRUFBZTtRQUN6QixLQUFLLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRXRCLEtBQUssTUFBTSxXQUFXLElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFO1lBQ2hELElBQUksV0FBVyxDQUFDLElBQUksS0FBSyxtQ0FBdUIsQ0FBQyxRQUFRLEVBQUU7Z0JBQ3pELE1BQU0sbUJBQW1CLEdBQWEsV0FBVyxDQUFDO2dCQUNsRCxJQUFJLENBQUMsTUFBTSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDcEQsSUFBSSxDQUFDLElBQUksQ0FBQztvQkFDUixPQUFPLEVBQUUsbUJBQW1CLENBQUMsTUFBTSxDQUFDLFNBQVM7b0JBQzdDLE1BQU0sRUFBRSxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsTUFBTTtpQkFDMUMsQ0FBQyxDQUFDO2FBQ0o7aUJBQU0sSUFBSSxX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LENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsU0FBa0MsRUFBRSxFQUFFO1lBQ25HLE9BQU8sU0FBUyxDQUFDLFlBQVksR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFDO1FBQ3RELENBQUMsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxxQkFBcUIsR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQzdDLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsU0FBa0MsRUFBb0IsRUFBRTtZQUN2RixNQUFNLElBQUksR0FBRyxJQUFBLGdDQUF3QixFQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUMzRCxJQUFBLGdCQUFNLEVBQUMsSUFBSSxZQUFZLGlCQUFPLENBQUMsQ0FBQztZQUNoQyxNQUFNLHFCQUFxQixHQUFHLE1BQU0sSUFBQSx3Q0FBZ0MsRUFBQyxJQUFJLENBQUMsWUFBWSxFQUFFLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUNoSCxPQUFPO2dCQUNMLElBQUksRUFBRSxtQ0FBdUIsQ0FBQyw0QkFBNEI7Z0JBQzFELE1BQU0sRUFBRTtvQkFDTixZQUFZLEVBQUUsU0FBUyxDQUFDLFlBQVk7b0JBQ3BDLFNBQVMsRUFBRSxJQUFJLENBQUMsSUFBSTtvQkFDcEIsV0FBVyxFQUFFLElBQUksQ0FBQyxZQUFZO29CQUM5QixVQUFVLEVBQUUscUJBQXFCO29CQUNqQyxZQUFZLEVBQUUsSUFBSSxDQUFDLE9BQU87aUJBQzNCO2FBQ0YsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUNILENBQUM7UUFDRiw0RUFBNEU7UUFDNUUsSUFBSSxDQUFDLGlCQUFpQixHQUFHLENBQUMsR0FBRyxxQkFBcUIsRUFBRSxHQUFHLGdCQUFnQixDQUFDLENBQUM7UUFDekUsT0FBTyxNQUFNLEtBQUssQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO0lBQzNDLENBQUM7Q0FDRjtBQXBKRCw4Q0FvSkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUcmFuc2FjdGlvbkJ1aWxkZXIgfSBmcm9tICcuL3RyYW5zYWN0aW9uQnVpbGRlcic7XG5pbXBvcnQgeyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IsIFRyYW5zYWN0aW9uVHlwZSB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uIH0gZnJvbSAnLi90cmFuc2FjdGlvbic7XG5pbXBvcnQge1xuICBnZXRBc3NvY2lhdGVkVG9rZW5BY2NvdW50QWRkcmVzcyxcbiAgZ2V0U29sVG9rZW5Gcm9tVG9rZW5OYW1lLFxuICBpc1ZhbGlkQW1vdW50LFxuICB2YWxpZGF0ZUFkZHJlc3MsXG4gIHZhbGlkYXRlTWludEFkZHJlc3MsXG4gIHZhbGlkYXRlT3duZXJBZGRyZXNzLFxufSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7IEJhc2VDb2luIGFzIENvaW5Db25maWcsIFNvbENvaW4gfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7IEF0YUluaXQsIFRva2VuQXNzb2NpYXRlUmVjaXBpZW50LCBUb2tlblRyYW5zZmVyLCBUcmFuc2ZlciB9IGZyb20gJy4vaWZhY2UnO1xuaW1wb3J0IHsgSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNlbmRQYXJhbXMge1xuICBhZGRyZXNzOiBzdHJpbmc7XG4gIGFtb3VudDogc3RyaW5nO1xuICB0b2tlbk5hbWU/OiBzdHJpbmc7XG59XG5cbmNvbnN0IFVOU0lHTkVEX0JJR0lOVF9NQVggPSBCaWdJbnQoJzE4NDQ2NzQ0MDczNzA5NTUxNjE1Jyk7XG5cbmV4cG9ydCBjbGFzcyBUcmFuc2ZlckJ1aWxkZXJWMiBleHRlbmRzIFRyYW5zYWN0aW9uQnVpbGRlciB7XG4gIHByaXZhdGUgX3NlbmRQYXJhbXM6IFNlbmRQYXJhbXNbXSA9IFtdO1xuICBwcml2YXRlIF9jcmVhdGVBdGFQYXJhbXM6IFRva2VuQXNzb2NpYXRlUmVjaXBpZW50W107XG4gIGNvbnN0cnVjdG9yKF9jb2luQ29uZmlnOiBSZWFkb25seTxDb2luQ29uZmlnPikge1xuICAgIHN1cGVyKF9jb2luQ29uZmlnKTtcbiAgICB0aGlzLl9jcmVhdGVBdGFQYXJhbXMgPSBbXTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgdHJhbnNhY3Rpb25UeXBlKCk6IFRyYW5zYWN0aW9uVHlwZSB7XG4gICAgcmV0dXJuIFRyYW5zYWN0aW9uVHlwZS5TZW5kO1xuICB9XG5cbiAgaW5pdEJ1aWxkZXIodHg6IFRyYW5zYWN0aW9uKTogdm9pZCB7XG4gICAgc3VwZXIuaW5pdEJ1aWxkZXIodHgpO1xuXG4gICAgZm9yIChjb25zdCBpbnN0cnVjdGlvbiBvZiB0aGlzLl9pbnN0cnVjdGlvbnNEYXRhKSB7XG4gICAgICBpZiAoaW5zdHJ1Y3Rpb24udHlwZSA9PT0gSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuVHJhbnNmZXIpIHtcbiAgICAgICAgY29uc3QgdHJhbnNmZXJJbnN0cnVjdGlvbjogVHJhbnNmZXIgPSBpbnN0cnVjdGlvbjtcbiAgICAgICAgdGhpcy5zZW5kZXIodHJhbnNmZXJJbnN0cnVjdGlvbi5wYXJhbXMuZnJvbUFkZHJlc3MpO1xuICAgICAgICB0aGlzLnNlbmQoe1xuICAgICAgICAgIGFkZHJlc3M6IHRyYW5zZmVySW5zdHJ1Y3Rpb24ucGFyYW1zLnRvQWRkcmVzcyxcbiAgICAgICAgICBhbW91bnQ6IHRyYW5zZmVySW5zdHJ1Y3Rpb24ucGFyYW1zLmFtb3VudCxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKGluc3RydWN0aW9uLnR5cGUgPT09IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlRva2VuVHJhbnNmZXIpIHtcbiAgICAgICAgY29uc3QgdHJhbnNmZXJJbnN0cnVjdGlvbjogVG9rZW5UcmFuc2ZlciA9IGluc3RydWN0aW9uO1xuICAgICAgICB0aGlzLnNlbmRlcih0cmFuc2Zlckluc3RydWN0aW9uLnBhcmFtcy5mcm9tQWRkcmVzcyk7XG4gICAgICAgIHRoaXMuc2VuZCh7XG4gICAgICAgICAgYWRkcmVzczogdHJhbnNmZXJJbnN0cnVjdGlvbi5wYXJhbXMudG9BZGRyZXNzLFxuICAgICAgICAgIGFtb3VudDogdHJhbnNmZXJJbnN0cnVjdGlvbi5wYXJhbXMuYW1vdW50LFxuICAgICAgICAgIHRva2VuTmFtZTogdHJhbnNmZXJJbnN0cnVjdGlvbi5wYXJhbXMudG9rZW5OYW1lLFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAoaW5zdHJ1Y3Rpb24udHlwZSA9PT0gSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuQ3JlYXRlQXNzb2NpYXRlZFRva2VuQWNjb3VudCkge1xuICAgICAgICBjb25zdCBhdGFJbml0SW5zdHJ1Y3Rpb246IEF0YUluaXQgPSBpbnN0cnVjdGlvbjtcbiAgICAgICAgdGhpcy5fY3JlYXRlQXRhUGFyYW1zLnB1c2goe1xuICAgICAgICAgIG93bmVyQWRkcmVzczogYXRhSW5pdEluc3RydWN0aW9uLnBhcmFtcy5vd25lckFkZHJlc3MsXG4gICAgICAgICAgdG9rZW5OYW1lOiBhdGFJbml0SW5zdHJ1Y3Rpb24ucGFyYW1zLnRva2VuTmFtZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldCBhIGZlZVBheWVyXG4gICAqIEBwYXJhbSBwYXllckFkZHJlc3NcbiAgICovXG4gIGZlZVBheWVyKHBheWVyQWRkcmVzczogc3RyaW5nKTogdGhpcyB7XG4gICAgdmFsaWRhdGVBZGRyZXNzKHBheWVyQWRkcmVzcywgJ2FkZHJlc3MnKTtcbiAgICB0aGlzLl9mZWVQYXllciA9IHBheWVyQWRkcmVzcztcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiAgU2V0IGEgdHJhbnNmZXJcbiAgICpcbiAgICogQHBhcmFtIHtTZW5kUGFyYW1zfSBzZW5kUGFyYW1zIC0gc2VuZFBhcmFtc1xuICAgKiBAcmV0dXJucyB7VHJhbnNhY3Rpb25CdWlsZGVyfSBUaGlzIHRyYW5zYWN0aW9uIGJ1aWxkZXJcbiAgICovXG4gIHNlbmQoc2VuZFBhcmFtczogU2VuZFBhcmFtcyk6IHRoaXMge1xuICAgIHZhbGlkYXRlQWRkcmVzcyhzZW5kUGFyYW1zLmFkZHJlc3MsICdhZGRyZXNzJyk7XG4gICAgaWYgKCFzZW5kUGFyYW1zLmFtb3VudCB8fCAhaXNWYWxpZEFtb3VudChzZW5kUGFyYW1zLmFtb3VudCkpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ0ludmFsaWQgb3IgbWlzc2luZyBhbW91bnQsIGdvdDogJyArIHNlbmRQYXJhbXMuYW1vdW50KTtcbiAgICB9XG4gICAgaWYgKHNlbmRQYXJhbXMudG9rZW5OYW1lICYmIEJpZ0ludChzZW5kUGFyYW1zLmFtb3VudCkgPiBVTlNJR05FRF9CSUdJTlRfTUFYKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKGBpbnB1dCBhbW91bnQgJHtzZW5kUGFyYW1zLmFtb3VudH0gZXhjZWVkcyBiaWcgaW50IGxpbWl0ICR7VU5TSUdORURfQklHSU5UX01BWH1gKTtcbiAgICB9IGVsc2UgaWYgKCFzZW5kUGFyYW1zLnRva2VuTmFtZSAmJiBCaWdJbnQoc2VuZFBhcmFtcy5hbW91bnQpID4gQmlnSW50KE51bWJlci5NQVhfU0FGRV9JTlRFR0VSKSkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihcbiAgICAgICAgYGlucHV0IGFtb3VudCAke3NlbmRQYXJhbXMuYW1vdW50fSBleGNlZWRzIG1heCBzYWZlIGludCAke051bWJlci5NQVhfU0FGRV9JTlRFR0VSfWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5fc2VuZFBhcmFtcy5wdXNoKHNlbmRQYXJhbXMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7VG9rZW5Bc3NvY2lhdGVSZWNpcGllbnR9IHJlY2lwaWVudCAtIHJlY2lwaWVudCBvZiB0aGUgYXNzb2NpYXRlZCB0b2tlbiBhY2NvdW50IGNyZWF0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZWNpcGllbnQub3duZXJBZGRyZXNzIC0gb3duZXIgb2YgdGhlIGFzc29jaWF0ZWQgdG9rZW4gYWNjb3VudFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVjaXBpZW50LnRva2VuTmFtZSAtIG5hbWUgb2YgdGhlIHRva2VuIHRoYXQgaXMgaW50ZW5kZWQgdG8gYXNzb2NpYXRlXG4gICAqIEByZXR1cm5zIHtUcmFuc2FjdGlvbkJ1aWxkZXJ9IFRoaXMgdHJhbnNhY3Rpb24gYnVpbGRlclxuICAgKi9cbiAgY3JlYXRlQXNzb2NpYXRlZFRva2VuQWNjb3VudChyZWNpcGllbnQ6IFRva2VuQXNzb2NpYXRlUmVjaXBpZW50KTogdGhpcyB7XG4gICAgdmFsaWRhdGVPd25lckFkZHJlc3MocmVjaXBpZW50Lm93bmVyQWRkcmVzcyk7XG4gICAgY29uc3QgdG9rZW4gPSBnZXRTb2xUb2tlbkZyb21Ub2tlbk5hbWUocmVjaXBpZW50LnRva2VuTmFtZSk7XG4gICAgaWYgKCF0b2tlbikge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignSW52YWxpZCB0b2tlbiBuYW1lLCBnb3Q6ICcgKyByZWNpcGllbnQudG9rZW5OYW1lKTtcbiAgICB9XG4gICAgdmFsaWRhdGVNaW50QWRkcmVzcyh0b2tlbi50b2tlbkFkZHJlc3MpO1xuXG4gICAgdGhpcy5fY3JlYXRlQXRhUGFyYW1zLnB1c2gocmVjaXBpZW50KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgYnVpbGRJbXBsZW1lbnRhdGlvbigpOiBQcm9taXNlPFRyYW5zYWN0aW9uPiB7XG4gICAgYXNzZXJ0KHRoaXMuX3NlbmRlciwgJ1NlbmRlciBtdXN0IGJlIHNldCBiZWZvcmUgYnVpbGRpbmcgdGhlIHRyYW5zYWN0aW9uJyk7XG4gICAgY29uc3Qgc2VuZEluc3RydWN0aW9ucyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgdGhpcy5fc2VuZFBhcmFtcy5tYXAoYXN5bmMgKHNlbmRQYXJhbXM6IFNlbmRQYXJhbXMpOiBQcm9taXNlPFRyYW5zZmVyIHwgVG9rZW5UcmFuc2Zlcj4gPT4ge1xuICAgICAgICBpZiAoc2VuZFBhcmFtcy50b2tlbk5hbWUpIHtcbiAgICAgICAgICBjb25zdCBjb2luID0gZ2V0U29sVG9rZW5Gcm9tVG9rZW5OYW1lKHNlbmRQYXJhbXMudG9rZW5OYW1lKTtcbiAgICAgICAgICBhc3NlcnQoY29pbiBpbnN0YW5jZW9mIFNvbENvaW4pO1xuICAgICAgICAgIGNvbnN0IHNvdXJjZUFkZHJlc3MgPSBhd2FpdCBnZXRBc3NvY2lhdGVkVG9rZW5BY2NvdW50QWRkcmVzcyhjb2luLnRva2VuQWRkcmVzcywgdGhpcy5fc2VuZGVyKTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuVG9rZW5UcmFuc2ZlcixcbiAgICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgICBmcm9tQWRkcmVzczogdGhpcy5fc2VuZGVyLFxuICAgICAgICAgICAgICB0b0FkZHJlc3M6IHNlbmRQYXJhbXMuYWRkcmVzcyxcbiAgICAgICAgICAgICAgYW1vdW50OiBzZW5kUGFyYW1zLmFtb3VudCxcbiAgICAgICAgICAgICAgdG9rZW5OYW1lOiBjb2luLm5hbWUsXG4gICAgICAgICAgICAgIHNvdXJjZUFkZHJlc3M6IHNvdXJjZUFkZHJlc3MsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlRyYW5zZmVyLFxuICAgICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICAgIGZyb21BZGRyZXNzOiB0aGlzLl9zZW5kZXIsXG4gICAgICAgICAgICAgIHRvQWRkcmVzczogc2VuZFBhcmFtcy5hZGRyZXNzLFxuICAgICAgICAgICAgICBhbW91bnQ6IHNlbmRQYXJhbXMuYW1vdW50LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gICAgY29uc3QgdW5pcXVlQ3JlYXRlQXRhUGFyYW1zID0gXy51bmlxQnkodGhpcy5fY3JlYXRlQXRhUGFyYW1zLCAocmVjaXBpZW50OiBUb2tlbkFzc29jaWF0ZVJlY2lwaWVudCkgPT4ge1xuICAgICAgcmV0dXJuIHJlY2lwaWVudC5vd25lckFkZHJlc3MgKyByZWNpcGllbnQudG9rZW5OYW1lO1xuICAgIH0pO1xuICAgIGNvbnN0IGNyZWF0ZUF0YUluc3RydWN0aW9ucyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgdW5pcXVlQ3JlYXRlQXRhUGFyYW1zLm1hcChhc3luYyAocmVjaXBpZW50OiBUb2tlbkFzc29jaWF0ZVJlY2lwaWVudCk6IFByb21pc2U8QXRhSW5pdD4gPT4ge1xuICAgICAgICBjb25zdCBjb2luID0gZ2V0U29sVG9rZW5Gcm9tVG9rZW5OYW1lKHJlY2lwaWVudC50b2tlbk5hbWUpO1xuICAgICAgICBhc3NlcnQoY29pbiBpbnN0YW5jZW9mIFNvbENvaW4pO1xuICAgICAgICBjb25zdCByZWNpcGllbnRUb2tlbkFkZHJlc3MgPSBhd2FpdCBnZXRBc3NvY2lhdGVkVG9rZW5BY2NvdW50QWRkcmVzcyhjb2luLnRva2VuQWRkcmVzcywgcmVjaXBpZW50Lm93bmVyQWRkcmVzcyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuQ3JlYXRlQXNzb2NpYXRlZFRva2VuQWNjb3VudCxcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIG93bmVyQWRkcmVzczogcmVjaXBpZW50Lm93bmVyQWRkcmVzcyxcbiAgICAgICAgICAgIHRva2VuTmFtZTogY29pbi5uYW1lLFxuICAgICAgICAgICAgbWludEFkZHJlc3M6IGNvaW4udG9rZW5BZGRyZXNzLFxuICAgICAgICAgICAgYXRhQWRkcmVzczogcmVjaXBpZW50VG9rZW5BZGRyZXNzLFxuICAgICAgICAgICAgcGF5ZXJBZGRyZXNzOiB0aGlzLl9zZW5kZXIsXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgIH0pXG4gICAgKTtcbiAgICAvLyBvcmRlciBpcyBpbXBvcnRhbnQsIGNyZWF0ZUF0YUluc3RydWN0aW9ucyBtdXN0IGJlIGJlZm9yZSBzZW5kSW5zdHJ1Y3Rpb25zXG4gICAgdGhpcy5faW5zdHJ1Y3Rpb25zRGF0YSA9IFsuLi5jcmVhdGVBdGFJbnN0cnVjdGlvbnMsIC4uLnNlbmRJbnN0cnVjdGlvbnNdO1xuICAgIHJldHVybiBhd2FpdCBzdXBlci5idWlsZEltcGxlbWVudGF0aW9uKCk7XG4gIH1cbn1cbiJdfQ==
|
package/dist/src/lib/utils.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { SignaturePubkeyPair, Transaction as SolTransaction, TransactionInstruction } from '@solana/web3.js';
|
|
2
1
|
import { TransactionType } from '@bitgo-beta/sdk-core';
|
|
3
|
-
import { ValidInstructionTypes } from './iface';
|
|
4
2
|
import { BaseCoin, BaseNetwork, SolCoin } from '@bitgo-beta/statics';
|
|
3
|
+
import { SignaturePubkeyPair, Transaction as SolTransaction, TransactionInstruction } from '@solana/web3.js';
|
|
4
|
+
import { ValidInstructionTypes } from './iface';
|
|
5
5
|
/** @inheritdoc */
|
|
6
6
|
export declare function isValidAddress(address: string): boolean;
|
|
7
7
|
/** @inheritdoc */
|
|
@@ -39,9 +39,11 @@ export declare function isValidMemo(memo: string): boolean;
|
|
|
39
39
|
* Checks if raw transaction can be deserialized
|
|
40
40
|
*
|
|
41
41
|
* @param {string} rawTransaction - transaction in base64 string format
|
|
42
|
+
* @param {boolean} requireAllSignatures - require all signatures to be present
|
|
43
|
+
* @param {boolean} verifySignatures - verify signatures
|
|
42
44
|
* @returns {boolean} - the validation result
|
|
43
45
|
*/
|
|
44
|
-
export declare function isValidRawTransaction(rawTransaction: string): boolean;
|
|
46
|
+
export declare function isValidRawTransaction(rawTransaction: string, requireAllSignatures?: boolean, verifySignatures?: boolean): boolean;
|
|
45
47
|
/**
|
|
46
48
|
* Verifies if signature for message is valid.
|
|
47
49
|
*
|
|
@@ -112,12 +114,19 @@ export declare function getInstructionType(instruction: TransactionInstruction):
|
|
|
112
114
|
* @returns {void}
|
|
113
115
|
*/
|
|
114
116
|
export declare function validateIntructionTypes(instructions: TransactionInstruction[]): void;
|
|
117
|
+
/**
|
|
118
|
+
* Validate solana instructions match raw msg authorize transaction
|
|
119
|
+
*
|
|
120
|
+
* @param {TransactionInstruction} instructions - a solana instruction
|
|
121
|
+
* @returns {boolean} true if the instructions match the raw msg authorize transaction
|
|
122
|
+
*/
|
|
123
|
+
export declare function validateRawMsgInstruction(instructions: TransactionInstruction[]): boolean;
|
|
115
124
|
/**
|
|
116
125
|
* Check the raw transaction has a valid format in the blockchain context, throw otherwise.
|
|
117
126
|
*
|
|
118
127
|
* @param {string} rawTransaction - Transaction in base64 string format
|
|
119
128
|
*/
|
|
120
|
-
export declare function validateRawTransaction(rawTransaction: string): void;
|
|
129
|
+
export declare function validateRawTransaction(rawTransaction: string, requireAllSignatures?: boolean, verifySignatures?: boolean): void;
|
|
121
130
|
/**
|
|
122
131
|
* Validates address to check if it exists and is a valid Solana public key
|
|
123
132
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/lib/utils.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/lib/utils.ts"],"names":[],"mappings":"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"}
|
package/dist/src/lib/utils.js
CHANGED
|
@@ -3,16 +3,16 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.validateOwnerAddress = exports.validateMintAddress = exports.getAssociatedTokenAccountAddress = exports.getSolTokenFromTokenName = exports.getSolTokenFromAddress = exports.validateAddress = exports.validateRawTransaction = exports.validateIntructionTypes = exports.getInstructionType = exports.getTransactionType = exports.matchTransactionTypeByInstructionsOrder = exports.requiresAllSignatures = exports.countNotNullSignatures = exports.Uint8ArrayTobase58 = exports.base58ToUint8Array = exports.verifySignature = exports.isValidRawTransaction = exports.isValidMemo = exports.isValidStakingAmount = exports.isValidAmount = exports.isValidTransactionId = exports.isValidSignature = exports.isValidPublicKey = exports.isValidPrivateKey = exports.isValidBlockId = exports.isValidAddress = void 0;
|
|
7
|
-
const web3_js_1 = require("@solana/web3.js");
|
|
8
|
-
const bs58_1 = __importDefault(require("bs58"));
|
|
9
|
-
const bignumber_js_1 = __importDefault(require("bignumber.js"));
|
|
10
|
-
const constants_1 = require("./constants");
|
|
6
|
+
exports.validateOwnerAddress = exports.validateMintAddress = exports.getAssociatedTokenAccountAddress = exports.getSolTokenFromTokenName = exports.getSolTokenFromAddress = exports.validateAddress = exports.validateRawTransaction = exports.validateRawMsgInstruction = exports.validateIntructionTypes = exports.getInstructionType = exports.getTransactionType = exports.matchTransactionTypeByInstructionsOrder = exports.requiresAllSignatures = exports.countNotNullSignatures = exports.Uint8ArrayTobase58 = exports.base58ToUint8Array = exports.verifySignature = exports.isValidRawTransaction = exports.isValidMemo = exports.isValidStakingAmount = exports.isValidAmount = exports.isValidTransactionId = exports.isValidSignature = exports.isValidPublicKey = exports.isValidPrivateKey = exports.isValidBlockId = exports.isValidAddress = void 0;
|
|
11
7
|
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
12
|
-
const tweetnacl_1 = __importDefault(require("tweetnacl"));
|
|
13
|
-
const spl_token_1 = require("@solana/spl-token");
|
|
14
8
|
const statics_1 = require("@bitgo-beta/statics");
|
|
9
|
+
const spl_token_1 = require("@solana/spl-token");
|
|
10
|
+
const web3_js_1 = require("@solana/web3.js");
|
|
15
11
|
const assert_1 = __importDefault(require("assert"));
|
|
12
|
+
const bignumber_js_1 = __importDefault(require("bignumber.js"));
|
|
13
|
+
const bs58_1 = __importDefault(require("bs58"));
|
|
14
|
+
const tweetnacl_1 = __importDefault(require("tweetnacl"));
|
|
15
|
+
const constants_1 = require("./constants");
|
|
16
16
|
const DECODED_BLOCK_HASH_LENGTH = 32; // https://docs.solana.com/developing/programming-model/transactions#blockhash-format
|
|
17
17
|
const DECODED_SIGNATURE_LENGTH = 64; // https://docs.solana.com/terminology#signature
|
|
18
18
|
const BASE_58_ENCONDING_REGEX = '[1-9A-HJ-NP-Za-km-z]';
|
|
@@ -45,7 +45,7 @@ exports.isValidPrivateKey = isValidPrivateKey;
|
|
|
45
45
|
/** @inheritdoc */
|
|
46
46
|
function isValidPublicKey(pubKey) {
|
|
47
47
|
try {
|
|
48
|
-
if (sdk_core_1.isValidXpub(pubKey))
|
|
48
|
+
if ((0, sdk_core_1.isValidXpub)(pubKey))
|
|
49
49
|
return true;
|
|
50
50
|
new web3_js_1.PublicKey(pubKey);
|
|
51
51
|
return true;
|
|
@@ -107,12 +107,14 @@ exports.isValidMemo = isValidMemo;
|
|
|
107
107
|
* Checks if raw transaction can be deserialized
|
|
108
108
|
*
|
|
109
109
|
* @param {string} rawTransaction - transaction in base64 string format
|
|
110
|
+
* @param {boolean} requireAllSignatures - require all signatures to be present
|
|
111
|
+
* @param {boolean} verifySignatures - verify signatures
|
|
110
112
|
* @returns {boolean} - the validation result
|
|
111
113
|
*/
|
|
112
|
-
function isValidRawTransaction(rawTransaction) {
|
|
114
|
+
function isValidRawTransaction(rawTransaction, requireAllSignatures = false, verifySignatures = false) {
|
|
113
115
|
try {
|
|
114
116
|
const tx = web3_js_1.Transaction.from(Buffer.from(rawTransaction, 'base64'));
|
|
115
|
-
tx.serialize({ requireAllSignatures
|
|
117
|
+
tx.serialize({ requireAllSignatures, verifySignatures });
|
|
116
118
|
return true;
|
|
117
119
|
}
|
|
118
120
|
catch (e) {
|
|
@@ -225,12 +227,18 @@ exports.matchTransactionTypeByInstructionsOrder = matchTransactionTypeByInstruct
|
|
|
225
227
|
*/
|
|
226
228
|
function getTransactionType(transaction) {
|
|
227
229
|
const { instructions } = transaction;
|
|
230
|
+
if (validateRawMsgInstruction(instructions)) {
|
|
231
|
+
return sdk_core_1.TransactionType.StakingAuthorizeRaw;
|
|
232
|
+
}
|
|
228
233
|
validateIntructionTypes(instructions);
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
instructionType
|
|
233
|
-
|
|
234
|
+
// check if deactivate instruction does not exist because deactivate can be include a transfer instruction
|
|
235
|
+
if (instructions.filter((instruction) => getInstructionType(instruction) === 'Deactivate').length == 0) {
|
|
236
|
+
for (const instruction of instructions) {
|
|
237
|
+
const instructionType = getInstructionType(instruction);
|
|
238
|
+
if (instructionType === constants_1.ValidInstructionTypesEnum.Transfer ||
|
|
239
|
+
instructionType === constants_1.ValidInstructionTypesEnum.TokenTransfer) {
|
|
240
|
+
return sdk_core_1.TransactionType.Send;
|
|
241
|
+
}
|
|
234
242
|
}
|
|
235
243
|
}
|
|
236
244
|
if (matchTransactionTypeByInstructionsOrder(instructions, constants_1.walletInitInstructionIndexes)) {
|
|
@@ -239,6 +247,12 @@ function getTransactionType(transaction) {
|
|
|
239
247
|
else if (matchTransactionTypeByInstructionsOrder(instructions, constants_1.stakingActivateInstructionsIndexes)) {
|
|
240
248
|
return sdk_core_1.TransactionType.StakingActivate;
|
|
241
249
|
}
|
|
250
|
+
else if (matchTransactionTypeByInstructionsOrder(instructions, constants_1.stakingAuthorizeInstructionsIndexes)) {
|
|
251
|
+
return sdk_core_1.TransactionType.StakingAuthorize;
|
|
252
|
+
}
|
|
253
|
+
else if (matchTransactionTypeByInstructionsOrder(instructions, constants_1.stakingDelegateInstructionsIndexes)) {
|
|
254
|
+
return sdk_core_1.TransactionType.StakingDelegate;
|
|
255
|
+
}
|
|
242
256
|
else if (matchTransactionTypeByInstructionsOrder(instructions, constants_1.stakingDeactivateInstructionsIndexes) ||
|
|
243
257
|
matchTransactionTypeByInstructionsOrder(instructions, constants_1.stakingPartialDeactivateInstructionsIndexes)) {
|
|
244
258
|
return sdk_core_1.TransactionType.StakingDeactivate;
|
|
@@ -249,6 +263,9 @@ function getTransactionType(transaction) {
|
|
|
249
263
|
else if (matchTransactionTypeByInstructionsOrder(instructions, constants_1.ataInitInstructionIndexes)) {
|
|
250
264
|
return sdk_core_1.TransactionType.AssociatedTokenAccountInitialization;
|
|
251
265
|
}
|
|
266
|
+
else if (matchTransactionTypeByInstructionsOrder(instructions, constants_1.ataCloseInstructionIndexes)) {
|
|
267
|
+
return sdk_core_1.TransactionType.CloseAssociatedTokenAccount;
|
|
268
|
+
}
|
|
252
269
|
else {
|
|
253
270
|
throw new sdk_core_1.NotSupported('Invalid transaction, transaction not supported or invalid');
|
|
254
271
|
}
|
|
@@ -268,6 +285,16 @@ function getInstructionType(instruction) {
|
|
|
268
285
|
case web3_js_1.SystemProgram.programId.toString():
|
|
269
286
|
return web3_js_1.SystemInstruction.decodeInstructionType(instruction);
|
|
270
287
|
case spl_token_1.TOKEN_PROGRAM_ID.toString():
|
|
288
|
+
try {
|
|
289
|
+
const decodedInstruction = (0, spl_token_1.decodeCloseAccountInstruction)(instruction);
|
|
290
|
+
if (decodedInstruction && decodedInstruction.data.instruction === 9) {
|
|
291
|
+
return 'CloseAssociatedTokenAccount';
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
catch (e) {
|
|
295
|
+
// ignore error and default to TokenTransfer
|
|
296
|
+
return 'TokenTransfer';
|
|
297
|
+
}
|
|
271
298
|
return 'TokenTransfer';
|
|
272
299
|
case web3_js_1.StakeProgram.programId.toString():
|
|
273
300
|
return web3_js_1.StakeInstruction.decodeInstructionType(instruction);
|
|
@@ -299,16 +326,56 @@ function validateIntructionTypes(instructions) {
|
|
|
299
326
|
}
|
|
300
327
|
}
|
|
301
328
|
exports.validateIntructionTypes = validateIntructionTypes;
|
|
329
|
+
/**
|
|
330
|
+
* Validate solana instructions match raw msg authorize transaction
|
|
331
|
+
*
|
|
332
|
+
* @param {TransactionInstruction} instructions - a solana instruction
|
|
333
|
+
* @returns {boolean} true if the instructions match the raw msg authorize transaction
|
|
334
|
+
*/
|
|
335
|
+
function validateRawMsgInstruction(instructions) {
|
|
336
|
+
// as web3.js cannot decode authorize instruction from CLI, we need to check it manually first
|
|
337
|
+
if (instructions.length === 2) {
|
|
338
|
+
const programId1 = instructions[0].programId.toString();
|
|
339
|
+
const programId2 = instructions[1].programId.toString();
|
|
340
|
+
if (programId1 === web3_js_1.SystemProgram.programId.toString() && programId2 === web3_js_1.StakeProgram.programId.toString()) {
|
|
341
|
+
const instructionName1 = web3_js_1.SystemInstruction.decodeInstructionType(instructions[0]);
|
|
342
|
+
const data = instructions[1].data.toString('hex');
|
|
343
|
+
if (instructionName1 === constants_1.nonceAdvanceInstruction &&
|
|
344
|
+
(data === constants_1.validInstructionData || data === constants_1.validInstructionData2)) {
|
|
345
|
+
return true;
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
if (instructions.length === 3) {
|
|
350
|
+
const programId1 = instructions[0].programId.toString();
|
|
351
|
+
const programId2 = instructions[1].programId.toString();
|
|
352
|
+
const programId3 = instructions[2].programId.toString();
|
|
353
|
+
if (programId1 === web3_js_1.SystemProgram.programId.toString() &&
|
|
354
|
+
programId2 === web3_js_1.StakeProgram.programId.toString() &&
|
|
355
|
+
programId3 === web3_js_1.StakeProgram.programId.toString()) {
|
|
356
|
+
const instructionName1 = web3_js_1.SystemInstruction.decodeInstructionType(instructions[0]);
|
|
357
|
+
const data = instructions[1].data.toString('hex');
|
|
358
|
+
const data2 = instructions[2].data.toString('hex');
|
|
359
|
+
if (instructionName1 === constants_1.nonceAdvanceInstruction &&
|
|
360
|
+
(data === constants_1.validInstructionData || data === constants_1.validInstructionData2) &&
|
|
361
|
+
(data2 === constants_1.validInstructionData || data2 === constants_1.validInstructionData2)) {
|
|
362
|
+
return true;
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
return false;
|
|
367
|
+
}
|
|
368
|
+
exports.validateRawMsgInstruction = validateRawMsgInstruction;
|
|
302
369
|
/**
|
|
303
370
|
* Check the raw transaction has a valid format in the blockchain context, throw otherwise.
|
|
304
371
|
*
|
|
305
372
|
* @param {string} rawTransaction - Transaction in base64 string format
|
|
306
373
|
*/
|
|
307
|
-
function validateRawTransaction(rawTransaction) {
|
|
374
|
+
function validateRawTransaction(rawTransaction, requireAllSignatures = false, verifySignatures = false) {
|
|
308
375
|
if (!rawTransaction) {
|
|
309
376
|
throw new sdk_core_1.ParseTransactionError('Invalid raw transaction: Undefined');
|
|
310
377
|
}
|
|
311
|
-
if (!isValidRawTransaction(rawTransaction)) {
|
|
378
|
+
if (!isValidRawTransaction(rawTransaction, requireAllSignatures, verifySignatures)) {
|
|
312
379
|
throw new sdk_core_1.ParseTransactionError('Invalid raw transaction');
|
|
313
380
|
}
|
|
314
381
|
}
|
|
@@ -342,7 +409,7 @@ function getSolTokenFromAddress(tokenAddress, network) {
|
|
|
342
409
|
const tokensArray = tokens.map((token) => token);
|
|
343
410
|
if (tokensArray.length >= 1) {
|
|
344
411
|
// there should never be two tokens with the same contract address, so we assert that here
|
|
345
|
-
assert_1.default(tokensArray.length === 1);
|
|
412
|
+
(0, assert_1.default)(tokensArray.length === 1);
|
|
346
413
|
return tokensArray[0];
|
|
347
414
|
}
|
|
348
415
|
return undefined;
|
|
@@ -380,7 +447,7 @@ async function getAssociatedTokenAccountAddress(tokenAddress, ownerAddress) {
|
|
|
380
447
|
if (!web3_js_1.PublicKey.isOnCurve(ownerPublicKey.toBuffer())) {
|
|
381
448
|
throw new sdk_core_1.UtilsError('Invalid ownerAddress - address off ed25519 curve, got: ' + ownerAddress);
|
|
382
449
|
}
|
|
383
|
-
const ataAddress = await spl_token_1.getAssociatedTokenAddress(new web3_js_1.PublicKey(tokenAddress), ownerPublicKey);
|
|
450
|
+
const ataAddress = await (0, spl_token_1.getAssociatedTokenAddress)(new web3_js_1.PublicKey(tokenAddress), ownerPublicKey);
|
|
384
451
|
return ataAddress.toString();
|
|
385
452
|
}
|
|
386
453
|
exports.getAssociatedTokenAccountAddress = getAssociatedTokenAccountAddress;
|
|
@@ -396,4 +463,4 @@ function validateOwnerAddress(ownerAddress) {
|
|
|
396
463
|
}
|
|
397
464
|
}
|
|
398
465
|
exports.validateOwnerAddress = validateOwnerAddress;
|
|
399
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLDZDQVV5QjtBQUN6QixnREFBd0I7QUFDeEIsZ0VBQXFDO0FBQ3JDLDJDQVdxQjtBQUNyQixtREFPOEI7QUFFOUIsMERBQTZCO0FBQzdCLGlEQUE2RztBQUM3RyxpREFBaUc7QUFDakcsb0RBQTRCO0FBRTVCLE1BQU0seUJBQXlCLEdBQUcsRUFBRSxDQUFDLENBQUMscUZBQXFGO0FBQzNILE1BQU0sd0JBQXdCLEdBQUcsRUFBRSxDQUFDLENBQUMsZ0RBQWdEO0FBQ3JGLE1BQU0sdUJBQXVCLEdBQUcsc0JBQXNCLENBQUM7QUFFdkQsa0JBQWtCO0FBQ2xCLFNBQWdCLGNBQWMsQ0FBQyxPQUFlO0lBQzVDLE9BQU8sZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDbkMsQ0FBQztBQUZELHdDQUVDO0FBRUQsa0JBQWtCO0FBQ2xCLFNBQWdCLGNBQWMsQ0FBQyxJQUFZO0lBQ3pDLElBQUk7UUFDRixPQUFPLENBQ0wsQ0FBQyxDQUFDLElBQUksSUFBSSxJQUFJLE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxjQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sS0FBSyx5QkFBeUIsQ0FDbkgsQ0FBQztLQUNIO0lBQUMsT0FBTyxDQUFDLEVBQUU7UUFDVixPQUFPLEtBQUssQ0FBQztLQUNkO0FBQ0gsQ0FBQztBQVJELHdDQVFDO0FBRUQsa0JBQWtCO0FBQ2xCLFNBQWdCLGlCQUFpQixDQUFDLE1BQTJCO0lBQzNELElBQUk7UUFDRixNQUFNLEdBQUcsR0FBZSxPQUFPLE1BQU0sS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFDekYsT0FBTyxD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LEdBQUcsV0FBVyxDQUFDLENBQUM7S0FDeEY7QUFDSCxDQUFDO0FBSkQsa0RBSUM7QUFFRCxTQUFnQixvQkFBb0IsQ0FBQyxZQUFvQjtJQUN2RCxJQUFJLENBQUMsWUFBWSxJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxFQUFFO1FBQ2xELE1BQU0sSUFBSSxnQ0FBcUIsQ0FBQyx3Q0FBd0MsR0FBRyxZQUFZLENBQUMsQ0FBQztLQUMxRjtBQUNILENBQUM7QUFKRCxvREFJQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEtleXBhaXIsXG4gIFB1YmxpY0tleSxcbiAgU2lnbmF0dXJlUHVia2V5UGFpcixcbiAgU3Rha2VJbnN0cnVjdGlvbixcbiAgU3Rha2VQcm9ncmFtLFxuICBTeXN0ZW1JbnN0cnVjdGlvbixcbiAgU3lzdGVtUHJvZ3JhbSxcbiAgVHJhbnNhY3Rpb24gYXMgU29sVHJhbnNhY3Rpb24sXG4gIFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24sXG59IGZyb20gJ0Bzb2xhbmEvd2ViMy5qcyc7XG5pbXBvcnQgYnM1OCBmcm9tICdiczU4JztcbmltcG9ydCBCaWdOdW1iZXIgZnJvbSAnYmlnbnVtYmVyLmpzJztcbmltcG9ydCB7XG4gIGF0YUluaXRJbnN0cnVjdGlvbkluZGV4ZXMsXG4gIE1BWF9NRU1PX0xFTkdUSCxcbiAgTUVNT19QUk9HUkFNX1BLLFxuICBzdGFraW5nQWN0aXZhdGVJbnN0cnVjdGlvbnNJbmRleGVzLFxuICBzdGFraW5nRGVhY3RpdmF0ZUluc3RydWN0aW9uc0luZGV4ZXMsXG4gIHN0YWtpbmdQYXJ0aWFsRGVhY3RpdmF0ZUluc3RydWN0aW9uc0luZGV4ZXMsXG4gIHN0YWtpbmdXaXRoZHJhd0luc3RydWN0aW9uc0luZGV4ZXMsXG4gIFZBTElEX1NZU1RFTV9JTlNUUlVDVElPTl9UWVBFUyxcbiAgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bSxcbiAgd2FsbGV0SW5pdEluc3RydWN0aW9uSW5kZXhlcyxcbn0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHtcbiAgQnVpbGRUcmFuc2FjdGlvbkVycm9yLFxuICBpc1ZhbGlkWHB1YixcbiAgTm90U3VwcG9ydGVkLFxuICBQYXJzZVRyYW5zYWN0aW9uRXJyb3IsXG4gIFRyYW5zYWN0aW9uVHlwZSxcbiAgVXRpbHNFcnJvcixcbn0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgVmFsaWRJbnN0cnVjdGlvblR5cGVzIH0gZnJvbSAnLi9pZmFjZSc7XG5pbXBvcnQgbmFjbCBmcm9tICd0d2VldG5hY2wnO1xuaW1wb3J0IHsgQVNTT0NJQVRFRF9UT0tFTl9QUk9HUkFNX0lELCBUT0tFTl9QUk9HUkFNX0lELCBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzIH0gZnJvbSAnQHNvbGFuYS9zcGwtdG9rZW4nO1xuaW1wb3J0IHsgQmFzZUNvaW4sIEJhc2VOZXR3b3JrLCBDb2luTm90RGVmaW5lZEVycm9yLCBjb2lucywgU29sQ29pbiB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5jb25zdCBERUNPREVEX0JMT0NLX0hBU0hfTEVOR1RIID0gMzI7IC8vIGh0dHBzOi8vZG9jcy5zb2xhbmEuY29tL2RldmVsb3BpbmcvcHJvZ3JhbW1pbmctbW9kZWwvdHJhbnNhY3Rpb25zI2Jsb2NraGFzaC1mb3JtYXRcbmNvbnN0IERFQ09ERURfU0lHTkFUVVJFX0xFTkdUSCA9IDY0OyAvLyBodHRwczovL2RvY3Muc29sYW5hLmNvbS90ZXJtaW5vbG9neSNzaWduYXR1cmVcbmNvbnN0IEJBU0VfNThfRU5DT05ESU5HX1JFR0VYID0gJ1sxLTlBLUhKLU5QLVphLWttLXpdJztcblxuLyoqIEBpbmhlcml0ZG9jICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZEFkZHJlc3MoYWRkcmVzczogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBpc1ZhbGlkUHVibGljS2V5KGFkZHJlc3MpO1xufVxuXG4vKiogQGluaGVyaXRkb2MgKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkQmxvY2tJZChoYXNoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gKFxuICAgICAgISFoYXNoICYmIG5ldyBSZWdFeHAoQkFTRV81OF9FTkNPTkRJTkdfUkVHRVgpLnRlc3QoaGFzaCkgJiYgYnM1OC5kZWNvZGUoaGFzaCkubGVuZ3RoID09PSBERUNPREVEX0JMT0NLX0hBU0hfTEVOR1RIXG4gICAgKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKiogQGluaGVyaXRkb2MgKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkUHJpdmF0ZUtleShwcnZLZXk6IHN0cmluZyB8IFVpbnQ4QXJyYXkpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBrZXk6IFVpbnQ4QXJyYXkgPSB0eXBlb2YgcHJ2S2V5ID09PSAnc3RyaW5nJyA/IGJhc2U1OFRvVWludDhBcnJheShwcnZLZXkpIDogcHJ2S2V5O1xuICAgIHJldHVybiAhIUtleXBhaXIuZnJvbVNlY3JldEtleShrZXkpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKiBAaW5oZXJpdGRvYyAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRQdWJsaWNLZXkocHViS2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICBpZiAoaXNWYWxpZFhwdWIocHViS2V5KSkgcmV0dXJuIHRydWU7XG4gICAgbmV3IFB1YmxpY0tleShwdWJLZXkpO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqIEBpbmhlcml0ZG9jICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZFNpZ25hdHVyZShzaWduYXR1cmU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIHJldHVybiAhIXNpZ25hdHVyZSAmJiBiczU4LmRlY29kZShzaWduYXR1cmUpLmxlbmd0aCA9PT0gREVDT0RFRF9TSUdOQVRVUkVfTEVOR1RIO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKiBAaW5oZXJpdGRvYyAqL1xuLy8gVHJhbnNhY3Rpb25JZCBhcmUgdGhlIGZpcnN0IHNpZ25hdHVyZSBvbiBhIFRyYW5zYWN0aW9uXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZFRyYW5zYWN0aW9uSWQodHhJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBpc1ZhbGlkU2lnbmF0dXJlKHR4SWQpO1xufVxuXG4vKipcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHN0cmluZyBpcyBhIHZhbGlkIGFtb3VudCBvZiBsYW1wb3J0cyBudW1iZXJcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYW1vdW50IC0gdGhlIHN0cmluZyB0byB2YWxpZGF0ZVxuICogQHJldHVybnMge2Jvb2xlYW59IC0gdGhlIHZhbGlkYXRpb24gcmVzdWx0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkQW1vdW50KGFtb3VudDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IGJpZ051bWJlckFtb3VudCA9IG5ldyBCaWdOdW1iZXIoYW1vdW50KTtcbiAgcmV0dXJuIGJpZ051bWJlckFtb3VudC5pc0ludGVnZXIoKSAmJiBiaWdOdW1iZXJBbW91bnQuaXNHcmVhdGVyVGhhbk9yRXF1YWxUbygwKTtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiB0aGUgc3RyaW5nIGlzIGEgdmFsaWQgYW1vdW50IG9mIGxhbXBvcnRzIG51bWJlciBvbiBzdGFraW5nXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGFtb3VudCAtIHRoZSBzdHJpbmcgdG8gdmFsaWRhdGVcbiAqIEByZXR1cm5zIHtib29sZWFufSAtIHRoZSB2YWxpZGF0aW9uIHJlc3VsdFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZFN0YWtpbmdBbW91bnQoYW1vdW50OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgYmlnTnVtYmVyQW1vdW50ID0gbmV3IEJpZ051bWJlcihhbW91bnQpO1xuICByZXR1cm4gYmlnTnVtYmVyQW1vdW50LmlzSW50ZWdlcigpICYmIGJpZ051bWJlckFtb3VudC5pc0dyZWF0ZXJUaGFuKDApO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIHRoaXMgaXMgYSB2YWxpZCBtZW1vIG9yIG5vdC5cbiAqXG4gKiBAcGFyYW0gbWVtbyAtIHRoZSBtZW1vIHN0cmluZ1xuICogQHJldHVybnMge2Jvb2xlYW59IC0gdGhlIHZhbGlkYXRpb24gcmVzdWx0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkTWVtbyhtZW1vOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIEJ1ZmZlci5mcm9tKG1lbW8pLmxlbmd0aCA8PSBNQVhfTUVNT19MRU5HVEg7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHJhdyB0cmFuc2FjdGlvbiBjYW4gYmUgZGVzZXJpYWxpemVkXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHJhd1RyYW5zYWN0aW9uIC0gdHJhbnNhY3Rpb24gaW4gYmFzZTY0IHN0cmluZyBmb3JtYXRcbiAqIEByZXR1cm5zIHtib29sZWFufSAtIHRoZSB2YWxpZGF0aW9uIHJlc3VsdFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZFJhd1RyYW5zYWN0aW9uKHJhd1RyYW5zYWN0aW9uOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICBjb25zdCB0eCA9IFNvbFRyYW5zYWN0aW9uLmZyb20oQnVmZmVyLmZyb20ocmF3VHJhbnNhY3Rpb24sICdiYXNlNjQnKSk7XG4gICAgdHguc2VyaWFsaXplKHsgcmVxdWlyZUFsbFNpZ25hdHVyZXM6IGZhbHNlLCB2ZXJpZnlTaWduYXR1cmVzOiBmYWxzZSB9KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIFZlcmlmaWVzIGlmIHNpZ25hdHVyZSBmb3IgbWVzc2FnZSBpcyB2YWxpZC5cbiAqXG4gKiBAcGFyYW0ge0J1ZmZlcn0gc2VyaWFsaXplZFR4IC0gdHggYXMgYSBiYXNlNjQgc3RyaW5nXG4gKiBAcGFyYW0ge3N0cmluZ30gc2lnbmF0dXJlIC0gc2lnbmF0dXJlIGFzIGEgc3RyaW5nXG4gKiBAcGFyYW0ge3N0cmluZ30gcHVibGljS2V5IC0gcHVibGljIGtleSBhcyBiYXNlIDU4XG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiBzaWduYXR1cmUgaXMgdmFsaWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2ZXJpZnlTaWduYXR1cmUoc2VyaWFsaXplZFR4OiBzdHJpbmcsIHNpZ25hdHVyZTogc3RyaW5nLCBwdWJsaWNLZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAoIWlzVmFsaWRSYXdUcmFuc2FjdGlvbihzZXJpYWxpemVkVHgpKSB7XG4gICAgdGhyb3cgbmV3IFV0aWxzRXJyb3IoJ0ludmFsaWQgc2VyaWFsaXplZFR4Jyk7XG4gIH1cbiAgaWYgKCFpc1ZhbGlkUHVibGljS2V5KHB1YmxpY0tleSkpIHtcbiAgICB0aHJvdyBuZXcgVXRpbHNFcnJvcignSW52YWxpZCBwdWJsaWNLZXknKTtcbiAgfVxuICBpZiAoIWlzVmFsaWRTaWduYXR1cmUoc2lnbmF0dXJlKSkge1xuICAgIHRocm93IG5ldyBVdGlsc0Vycm9yKCdJbnZhbGlkIHNpZ25hdHVyZScpO1xuICB9XG4gIGNvbnN0IG1zZyA9IFNvbFRyYW5zYWN0aW9uLmZyb20oQnVmZmVyLmZyb20oc2VyaWFsaXplZFR4LCAnYmFzZTY0JykpLnNlcmlhbGl6ZU1lc3NhZ2UoKTtcbiAgY29uc3Qgc2lnID0gYmFzZTU4VG9VaW50OEFycmF5KHNpZ25hdHVyZSk7XG4gIGNvbnN0IHB1YiA9IG5ldyBQdWJsaWNLZXkocHVibGljS2V5KTtcbiAgcmV0dXJuIG5hY2wuc2lnbi5kZXRhY2hlZC52ZXJpZnkobXNnLCBzaWcsIHB1Yi50b0J1ZmZlcigpKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIGJhc2U1OCBzdHJpbmcgaW50byBhIFVpbnQ4QXJyYXkuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGlucHV0IC0gYSBzdHJpbmcgaW4gYmFzZTU4XG4gKiBAcmV0dXJucyB7VWludDhBcnJheX0gLSBhbiBVaW50OEFycmF5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiYXNlNThUb1VpbnQ4QXJyYXkoaW5wdXQ6IHN0cmluZyk6IFVpbnQ4QXJyYXkge1xuICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoYnM1OC5kZWNvZGUoaW5wdXQpKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIFVpbnQ4QXJyYXkgdG8gYSBiYXNlNTggc3RyaW5nLlxuICpcbiAqIEBwYXJhbSB7VWludDhBcnJheX0gaW5wdXQgLSBhbiBVaW50OEFycmF5XG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIGEgc3RyaW5nIGluIGJhc2U1OFxuICovXG5leHBvcnQgZnVuY3Rpb24gVWludDhBcnJheVRvYmFzZTU4KGlucHV0OiBVaW50OEFycmF5KTogc3RyaW5nIHtcbiAgcmV0dXJuIGJzNTguZW5jb2RlKGlucHV0KTtcbn1cblxuLyoqXG4gKiBDb3VudCB0aGUgYW1vdW50IG9mIHNpZ25hdHVyZXMgYXJlIG5vdCBudWxsLlxuICpcbiAqIEBwYXJhbSB7U2lnbmF0dXJlUHVia2V5UGFpcltdfSBzaWduYXR1cmVzIC0gYW4gYXJyYXkgb2YgU2lnbmF0dXJlUHVia2V5UGFpclxuICogQHJldHVybnMge251bWJlcn0gLSB0aGUgYW1vdW50IG9mIHZhbGlkIHNpZ25hdHVyZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvdW50Tm90TnVsbFNpZ25hdHVyZXMoc2lnbmF0dXJlczogU2lnbmF0dXJlUHVia2V5UGFpcltdKTogbnVtYmVyIHtcbiAgcmV0dXJuIHNpZ25hdHVyZXMuZmlsdGVyKChzaWcpID0+ICEhc2lnLnNpZ25hdHVyZSkubGVuZ3RoO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIGFsbCBzaWduYXR1cmVzIGFyZSBjb21wbGV0ZWQuXG4gKlxuICogQHBhcmFtIHtTaWduYXR1cmVQdWJrZXlQYWlyW119IHNpZ25hdHVyZXMgLSBzaWduYXR1cmVzXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcXVpcmVzQWxsU2lnbmF0dXJlcyhzaWduYXR1cmVzOiBTaWduYXR1cmVQdWJrZXlQYWlyW10pOiBib29sZWFuIHtcbiAgcmV0dXJuIHNpZ25hdHVyZXMubGVuZ3RoID4gMCAmJiBjb3VudE5vdE51bGxTaWduYXR1cmVzKHNpZ25hdHVyZXMpID09PSBzaWduYXR1cmVzLmxlbmd0aDtcbn1cblxuLyoqXG4gKiBDaGVjayB0aGUgdHJhbnNhY3Rpb24gdHlwZSBtYXRjaGluZyBpbnN0cnVjdGlvbnMgYnkgb3JkZXIuIE1lbW8gYW5kIEFkdmFuY2VOb25jZUFjY291bnQgaW5zdHJ1Y3Rpb25zXG4gKiBhcmUgaWdub3JlZC5cbiAqXG4gKiBAcGFyYW0ge1RyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXX0gaW5zdHJ1Y3Rpb25zIC0gdGhlIGFycmF5IG9mIHN1cHBvcnRlZCBTb2xhbmEgaW5zdHJ1Y3Rpb25zIHRvIGJlIHBhcnNlZFxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBudW1iZXI+fSBpbnN0cnVjdGlvbkluZGV4ZXMgLSB0aGUgaW5zdHJ1Y3Rpb25zIGluZGV4ZXMgb2YgdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb25cbiAqIEByZXR1cm5zIHRydWUgaWYgaXQgbWF0Y2hlcyBieSBvcmRlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hdGNoVHJhbnNhY3Rpb25UeXBlQnlJbnN0cnVjdGlvbnNPcmRlcihcbiAgaW5zdHJ1Y3Rpb25zOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uW10sXG4gIGluc3RydWN0aW9uSW5kZXhlczogUmVjb3JkPHN0cmluZywgbnVtYmVyPlxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IGluc3RydWN0aW9uc0NvcHkgPSBbLi4uaW5zdHJ1Y3Rpb25zXTsgLy8gTWFrZSBhIGNvcHkgc2luY2Ugd2UgbWF5IG1vZGlmeSB0aGUgYXJyYXkgYmVsb3dcbiAgLy8gQWR2YW5jZU5vbmNlQWNjb3VudCBpcyBvcHRpb25hbCBhbmQgdGhlIGZpcnN0IGluc3RydWN0aW9uIGFkZGVkLCBpdCBkb2VzIG5vdCBtYXR0ZXIgdG8gbWF0Y2ggdGhlIHR5cGVcbiAgaWYgKGluc3RydWN0aW9uc0NvcHkubGVuZ3RoID4gMCkge1xuICAgIGlmIChnZXRJbnN0cnVjdGlvblR5cGUoaW5zdHJ1Y3Rpb25zWzBdKSA9PT0gJ0FkdmFuY2VOb25jZUFjY291bnQnKSB7XG4gICAgICBpbnN0cnVjdGlvbnNDb3B5LnNoaWZ0KCk7XG4gICAgfVxuICB9XG5cbiAgLy8gTWVtbyBpcyBvcHRpb25hbCBhbmQgdGhlIGxhc3QgaW5zdHJ1Y3Rpb24gYWRkZWQsIGl0IGRvZXMgbm90IG1hdHRlciB0byBtYXRjaCB0aGUgdHlwZVxuICAvLyBXaHkgaGF2ZSBpdCBpbiBpbnN0cnVjdGlvbktleXMgaWYgd2UgYXJlIGdvaW5nIHRvIGlnbm9yZSBpdD9cbiAgY29uc3QgaW5zdHJ1Y3Rpb25zS2V5cyA9IE9iamVjdC5rZXlzKGluc3RydWN0aW9uSW5kZXhlcyk7XG4gIGlmIChpbnN0cnVjdGlvbnNLZXlzW2luc3RydWN0aW9uc0tleXMubGVuZ3RoIC0gMV0gPT09ICdNZW1vJykge1xuICAgIGluc3RydWN0aW9uc0tleXMucG9wKCk7XG4gIH1cblxuICAvLyBDaGVjayBpbnN0cnVjdGlvbnMgYnkgb3JkZXIgdXNpbmcgdGhlIGluZGV4LlxuICBmb3IgKGNvbnN0IGtleU5hbWUgb2YgaW5zdHJ1Y3Rpb25zS2V5cykge1xuICAgIGNvbnN0IHJlc3VsdCA9IGdldEluc3RydWN0aW9uVHlwZShpbnN0cnVjdGlvbnNDb3B5W2luc3RydWN0aW9uSW5kZXhlc1trZXlOYW1lXV0pO1xuICAgIGlmIChyZXN1bHQgIT09IGtleU5hbWUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgdHJhbnNhY3Rpb24gVHlwZSBiYXNlZCBvbiB0aGUgIHRyYW5zYWN0aW9uIGluc3RydWN0aW9ucy5cbiAqIFdhbGxldCBpbml0aWFsaXphdGlvbiwgVHJhbnNmZXIgYW5kIFN0YWtpbmcgdHJhbnNhY3Rpb25zIGFyZSBzdXBwb3J0ZWQuXG4gKlxuICogQHBhcmFtIHtTb2xUcmFuc2FjdGlvbn0gdHJhbnNhY3Rpb24gLSB0aGUgc29sYW5hIHRyYW5zYWN0aW9uXG4gKiBAcmV0dXJucyB7VHJhbnNhY3Rpb25UeXBlfSAtIHRoZSB0eXBlIG9mIHRyYW5zYWN0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUcmFuc2FjdGlvblR5cGUodHJhbnNhY3Rpb246IFNvbFRyYW5zYWN0aW9uKTogVHJhbnNhY3Rpb25UeXBlIHtcbiAgY29uc3QgeyBpbnN0cnVjdGlvbnMgfSA9IHRyYW5zYWN0aW9uO1xuICB2YWxpZGF0ZUludHJ1Y3Rpb25UeXBlcyhpbnN0cnVjdGlvbnMpO1xuICBmb3IgKGNvbnN0IGluc3RydWN0aW9uIG9mIGluc3RydWN0aW9ucykge1xuICAgIGNvbnN0IGluc3RydWN0aW9uVHlwZSA9IGdldEluc3RydWN0aW9uVHlwZShpbnN0cnVjdGlvbik7XG4gICAgaWYgKFxuICAgICAgaW5zdHJ1Y3Rpb25UeXBlID09PSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLlRyYW5zZmVyIHx8XG4gICAgICBpbnN0cnVjdGlvblR5cGUgPT09IFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uVG9rZW5UcmFuc2ZlclxuICAgICkge1xuICAgICAgcmV0dXJuIFRyYW5zYWN0aW9uVHlwZS5TZW5kO1xuICAgIH1cbiAgfVxuICBpZiAobWF0Y2hUcmFuc2FjdGlvblR5cGVCeUluc3RydWN0aW9uc09yZGVyKGluc3RydWN0aW9ucywgd2FsbGV0SW5pdEluc3RydWN0aW9uSW5kZXhlcykpIHtcbiAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlLldhbGxldEluaXRpYWxpemF0aW9uO1xuICB9IGVsc2UgaWYgKG1hdGNoVHJhbnNhY3Rpb25UeXBlQnlJbnN0cnVjdGlvbnNPcmRlcihpbnN0cnVjdGlvbnMsIHN0YWtpbmdBY3RpdmF0ZUluc3RydWN0aW9uc0luZGV4ZXMpKSB7XG4gICAgcmV0dXJuIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nQWN0aXZhdGU7XG4gIH0gZWxzZSBpZiAoXG4gICAgbWF0Y2hUcmFuc2FjdGlvblR5cGVCeUluc3RydWN0aW9uc09yZGVyKGluc3RydWN0aW9ucywgc3Rha2luZ0RlYWN0aXZhdGVJbnN0cnVjdGlvbnNJbmRleGVzKSB8fFxuICAgIG1hdGNoVHJhbnNhY3Rpb25UeXBlQnlJbnN0cnVjdGlvbnNPcmRlcihpbnN0cnVjdGlvbnMsIHN0YWtpbmdQYXJ0aWFsRGVhY3RpdmF0ZUluc3RydWN0aW9uc0luZGV4ZXMpXG4gICkge1xuICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0RlYWN0aXZhdGU7XG4gIH0gZWxzZSBpZiAobWF0Y2hUcmFuc2FjdGlvblR5cGVCeUluc3RydWN0aW9uc09yZGVyKGluc3RydWN0aW9ucywgc3Rha2luZ1dpdGhkcmF3SW5zdHJ1Y3Rpb25zSW5kZXhlcykpIHtcbiAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdXaXRoZHJhdztcbiAgfSBlbHNlIGlmIChtYXRjaFRyYW5zYWN0aW9uVHlwZUJ5SW5zdHJ1Y3Rpb25zT3JkZXIoaW5zdHJ1Y3Rpb25zLCBhdGFJbml0SW5zdHJ1Y3Rpb25JbmRleGVzKSkge1xuICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGUuQXNzb2NpYXRlZFRva2VuQWNjb3VudEluaXRpYWxpemF0aW9uO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWQoJ0ludmFsaWQgdHJhbnNhY3Rpb24sIHRyYW5zYWN0aW9uIG5vdCBzdXBwb3J0ZWQgb3IgaW52YWxpZCcpO1xuICB9XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgaW5zdHJ1Y3Rpb24gVHlwZSBiYXNlZCBvbiB0aGUgc29sYW5hIGluc3RydWN0aW9ucy5cbiAqIFRocm93cyBpZiB0aGUgc29sYW5hIGluc3RydWN0aW9uIHByb2dyYW0gaXMgbm90IHN1cHBvcnRlZFxuICpcbiAqIEBwYXJhbSB7VHJhbnNhY3Rpb25JbnN0cnVjdGlvbn0gaW5zdHJ1Y3Rpb24gLSBhIHNvbGFuYSBpbnN0cnVjdGlvblxuICogQHJldHVybnMge1ZhbGlkSW5zdHJ1Y3Rpb25UeXBlc30gLSBhIHNvbGFuYSBpbnN0cnVjdGlvbiB0eXBlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbnN0cnVjdGlvblR5cGUoaW5zdHJ1Y3Rpb246IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24pOiBWYWxpZEluc3RydWN0aW9uVHlwZXMge1xuICBzd2l0Y2ggKGluc3RydWN0aW9uLnByb2dyYW1JZC50b1N0cmluZygpKSB7XG4gICAgY2FzZSBuZXcgUHVibGljS2V5KE1FTU9fUFJPR1JBTV9QSykudG9TdHJpbmcoKTpcbiAgICAgIHJldHVybiAnTWVtbyc7XG4gICAgY2FzZSBTeXN0ZW1Qcm9ncmFtLnByb2dyYW1JZC50b1N0cmluZygpOlxuICAgICAgcmV0dXJuIFN5c3RlbUluc3RydWN0aW9uLmRlY29kZUluc3RydWN0aW9uVHlwZShpbnN0cnVjdGlvbik7XG4gICAgY2FzZSBUT0tFTl9QUk9HUkFNX0lELnRvU3RyaW5nKCk6XG4gICAgICByZXR1cm4gJ1Rva2VuVHJhbnNmZXInO1xuICAgIGNhc2UgU3Rha2VQcm9ncmFtLnByb2dyYW1JZC50b1N0cmluZygpOlxuICAgICAgcmV0dXJuIFN0YWtlSW5zdHJ1Y3Rpb24uZGVjb2RlSW5zdHJ1Y3Rpb25UeXBlKGluc3RydWN0aW9uKTtcbiAgICBjYXNlIEFTU09DSUFURURfVE9LRU5fUFJPR1JBTV9JRC50b1N0cmluZygpOlxuICAgICAgLy8gVE9ETzogY2hhbmdlIHRoaXMgd2hlbiBAc3BsLXRva2VuIHN1cHBvcnRzIGRlY29kaW5nIGFzc29jaWF0ZWQgdG9rZW4gaW5zdHJ1Y3Rpb25zXG4gICAgICBpZiAoaW5zdHJ1Y3Rpb24uZGF0YS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuICdJbml0aWFsaXplQXNzb2NpYXRlZFRva2VuQWNjb3VudCc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkKFxuICAgICAgICAgICdJbnZhbGlkIHRyYW5zYWN0aW9uLCBpbnN0cnVjdGlvbiBwcm9ncmFtIGlkIG5vdCBzdXBwb3J0ZWQ6ICcgKyBpbnN0cnVjdGlvbi5wcm9ncmFtSWQudG9TdHJpbmcoKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkKFxuICAgICAgICAnSW52YWxpZCB0cmFuc2FjdGlvbiwgaW5zdHJ1Y3Rpb24gcHJvZ3JhbSBpZCBub3Qgc3VwcG9ydGVkOiAnICsgaW5zdHJ1Y3Rpb24ucHJvZ3JhbUlkLnRvU3RyaW5nKClcbiAgICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSBzb2xhbmEgaW5zdHJ1Y3Rpb25zIHR5cGVzIHRvIHNlZSBpZiB0aGV5IGFyZSBzdXBwb3J0ZWQgYnkgdGhlIGJ1aWxkZXIuXG4gKiBUaHJvd3MgaWYgdGhlIGluc3RydWN0aW9uIHR5cGUgaXMgaW52YWxpZC5cbiAqXG4gKiBAcGFyYW0ge1RyYW5zYWN0aW9uSW5zdHJ1Y3Rpb259IGluc3RydWN0aW9ucyAtIGEgc29sYW5hIGluc3RydWN0aW9uXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlSW50cnVjdGlvblR5cGVzKGluc3RydWN0aW9uczogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdKTogdm9pZCB7XG4gIGZvciAoY29uc3QgaW5zdHJ1Y3Rpb24gb2YgaW5zdHJ1Y3Rpb25zKSB7XG4gICAgaWYgKCFWQUxJRF9TWVNURU1fSU5TVFJVQ1RJT05fVFlQRVMuaW5jbHVkZXMoZ2V0SW5zdHJ1Y3Rpb25UeXBlKGluc3RydWN0aW9uKSkpIHtcbiAgICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWQoJ0ludmFsaWQgdHJhbnNhY3Rpb24sIGluc3RydWN0aW9uIHR5cGUgbm90IHN1cHBvcnRlZDogJyArIGdldEluc3RydWN0aW9uVHlwZShpbnN0cnVjdGlvbikpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIENoZWNrIHRoZSByYXcgdHJhbnNhY3Rpb24gaGFzIGEgdmFsaWQgZm9ybWF0IGluIHRoZSBibG9ja2NoYWluIGNvbnRleHQsIHRocm93IG90aGVyd2lzZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcmF3VHJhbnNhY3Rpb24gLSBUcmFuc2FjdGlvbiBpbiBiYXNlNjQgc3RyaW5nICBmb3JtYXRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlUmF3VHJhbnNhY3Rpb24ocmF3VHJhbnNhY3Rpb246IHN0cmluZyk6IHZvaWQge1xuICBpZiAoIXJhd1RyYW5zYWN0aW9uKSB7XG4gICAgdGhyb3cgbmV3IFBhcnNlVHJhbnNhY3Rpb25FcnJvcignSW52YWxpZCByYXcgdHJhbnNhY3Rpb246IFVuZGVmaW5lZCcpO1xuICB9XG4gIGlmICghaXNWYWxpZFJhd1RyYW5zYWN0aW9uKHJhd1RyYW5zYWN0aW9uKSkge1xuICAgIHRocm93IG5ldyBQYXJzZVRyYW5zYWN0aW9uRXJyb3IoJ0ludmFsaWQgcmF3IHRyYW5zYWN0aW9uJyk7XG4gIH1cbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgYWRkcmVzcyB0byBjaGVjayBpZiBpdCBleGlzdHMgYW5kIGlzIGEgdmFsaWQgU29sYW5hIHB1YmxpYyBrZXlcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYWRkcmVzcyBUaGUgYWRkcmVzcyB0byBiZSB2YWxpZGF0ZWRcbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWVsZE5hbWUgTmFtZSBvZiB0aGUgZmllbGQgdG8gdmFsaWRhdGUsIGl0cyBuZWVkZWQgdG8gcmV0dXJuIHdoaWNoIGZpZWxkIGlzIGZhaWxpbmcgb24gY2FzZSBvZiBlcnJvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlQWRkcmVzcyhhZGRyZXNzOiBzdHJpbmcsIGZpZWxkTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gIGlmICghYWRkcmVzcyB8fCAhaXNWYWxpZFB1YmxpY0tleShhZGRyZXNzKSkge1xuICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoYEludmFsaWQgb3IgbWlzc2luZyAke2ZpZWxkTmFtZX0sIGdvdDogJHthZGRyZXNzfWApO1xuICB9XG59XG5cbi8qKlxuICogR2V0IHRoZSBzdGF0aWNzIGNvaW4gb2JqZWN0IG1hdGNoaW5nIGEgZ2l2ZW4gU29sYW5hIHRva2VuIGFkZHJlc3MgaWYgaXQgZXhpc3RzXG4gKlxuICogQHBhcmFtIHRva2VuQWRkcmVzcyBUaGUgdG9rZW4gYWRkcmVzcyB0byBtYXRjaCBhZ2FpbnN0XG4gKiBAcGFyYW0gbmV0d29yayBTb2xhbmEgTWFpbm5ldCBvciBUZXN0bmV0XG4gKiBAcmV0dXJucyBzdGF0aWNzIEJhc2VDb2luIG9iamVjdCBmb3IgdGhlIG1hdGNoaW5nIHRva2VuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTb2xUb2tlbkZyb21BZGRyZXNzKHRva2VuQWRkcmVzczogc3RyaW5nLCBuZXR3b3JrOiBCYXNlTmV0d29yayk6IFJlYWRvbmx5PEJhc2VDb2luPiB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHRva2VucyA9IGNvaW5zLmZpbHRlcigoY29pbikgPT4ge1xuICAgIGlmIChjb2luIGluc3RhbmNlb2YgU29sQ29pbikge1xuICAgICAgcmV0dXJuIGNvaW4ubmV0d29yay50eXBlID09PSBuZXR3b3JrLnR5cGUgJiYgY29pbi50b2tlbkFkZHJlc3MudG9Mb3dlckNhc2UoKSA9PT0gdG9rZW5BZGRyZXNzLnRvTG93ZXJDYXNlKCk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfSk7XG4gIGNvbnN0IHRva2Vuc0FycmF5ID0gdG9rZW5zLm1hcCgodG9rZW4pID0+IHRva2VuKTtcbiAgaWYgKHRva2Vuc0FycmF5Lmxlbmd0aCA+PSAxKSB7XG4gICAgLy8gdGhlcmUgc2hvdWxkIG5ldmVyIGJlIHR3byB0b2tlbnMgd2l0aCB0aGUgc2FtZSBjb250cmFjdCBhZGRyZXNzLCBzbyB3ZSBhc3NlcnQgdGhhdCBoZXJlXG4gICAgYXNzZXJ0KHRva2Vuc0FycmF5Lmxlbmd0aCA9PT0gMSk7XG4gICAgcmV0dXJuIHRva2Vuc0FycmF5WzBdO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogR2V0IHRoZSBzb2xhbmEgdG9rZW4gb2JqZWN0IGZyb20gdG9rZW4gbmFtZVxuICogQHBhcmFtIHRva2VuTmFtZSBUaGUgdG9rZW4gbmFtZSB0byBtYXRjaCBhZ2FpbnN0XG4gKiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNvbFRva2VuRnJvbVRva2VuTmFtZSh0b2tlbk5hbWU6IHN0cmluZyk6IFJlYWRvbmx5PFNvbENvaW4+IHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICBjb25zdCB0b2tlbiA9IGNvaW5zLmdldCh0b2tlbk5hbWUpO1xuICAgIGlmICghKHRva2VuLmlzVG9rZW4gJiYgdG9rZW4gaW5zdGFuY2VvZiBTb2xDb2luKSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIHRva2VuO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKCEoZSBpbnN0YW5jZW9mIENvaW5Ob3REZWZpbmVkRXJyb3IpKSB7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogR2V0IHRoZSBzb2xhbmEgYXNzb2NpYXRlZCB0b2tlbiBhY2NvdW50IGFkZHJlc3NcbiAqIEBwYXJhbSB0b2tlbkFkZHJlc3MgVGhlIHRva2VuIGFkZHJlc3NcbiAqIEBwYXJhbSBvd25lckFkZHJlc3MgVGhlIG93bmVyIG9mIHRoZSBhc3NvY2lhdGVkIHRva2VuIGFjY291bnRcbiAqIEByZXR1cm5zIFRoZSBhc3NvY2lhdGVkIHRva2VuIGFjY291bnQgYWRkcmVzc1xuICogKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRBc3NvY2lhdGVkVG9rZW5BY2NvdW50QWRkcmVzcyh0b2tlbkFkZHJlc3M6IHN0cmluZywgb3duZXJBZGRyZXNzOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBvd25lclB1YmxpY0tleSA9IG5ldyBQdWJsaWNLZXkob3duZXJBZGRyZXNzKTtcblxuICAvLyB0b2tlbkFkZHJlc3MgYXJlIG5vdCBvbiBlZDI1NTE5IGN1cnZlLCBzbyB0aGV5IGNhbid0IGJlIHVzZWQgYXMgb3duZXJBZGRyZXNzXG4gIGlmICghUHVibGljS2V5LmlzT25DdXJ2ZShvd25lclB1YmxpY0tleS50b0J1ZmZlcigpKSkge1xuICAgIHRocm93IG5ldyBVdGlsc0Vycm9yKCdJbnZhbGlkIG93bmVyQWRkcmVzcyAtIGFkZHJlc3Mgb2ZmIGVkMjU1MTkgY3VydmUsIGdvdDogJyArIG93bmVyQWRkcmVzcyk7XG4gIH1cbiAgY29uc3QgYXRhQWRkcmVzcyA9IGF3YWl0IGdldEFzc29jaWF0ZWRUb2tlbkFkZHJlc3MobmV3IFB1YmxpY0tleSh0b2tlbkFkZHJlc3MpLCBvd25lclB1YmxpY0tleSk7XG4gIHJldHVybiBhdGFBZGRyZXNzLnRvU3RyaW5nKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZU1pbnRBZGRyZXNzKG1pbnRBZGRyZXNzOiBzdHJpbmcpIHtcbiAgaWYgKCFtaW50QWRkcmVzcyB8fCAhaXNWYWxpZEFkZHJlc3MobWludEFkZHJlc3MpKSB7XG4gICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignSW52YWxpZCBvciBtaXNzaW5nIG1pbnRBZGRyZXNzLCBnb3Q6ICcgKyBtaW50QWRkcmVzcyk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlT3duZXJBZGRyZXNzKG93bmVyQWRkcmVzczogc3RyaW5nKSB7XG4gIGlmICghb3duZXJBZGRyZXNzIHx8ICFpc1ZhbGlkQWRkcmVzcyhvd25lckFkZHJlc3MpKSB7XG4gICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignSW52YWxpZCBvciBtaXNzaW5nIG93bmVyQWRkcmVzcywgZ290OiAnICsgb3duZXJBZGRyZXNzKTtcbiAgfVxufVxuIl19
|
|
466
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLG1EQU84QjtBQUM5QixpREFBaUc7QUFDakcsaURBSzJCO0FBQzNCLDZDQVV5QjtBQUN6QixvREFBNEI7QUFDNUIsZ0VBQXFDO0FBQ3JDLGdEQUF3QjtBQUN4QiwwREFBNkI7QUFDN0IsMkNBaUJxQjtBQUdyQixNQUFNLHlCQUF5QixHQUFHLEVBQUUsQ0FBQyxDQUFDLHFGQUFxRjtBQUMzSCxNQUFNLHdCQUF3QixHQUFHLEVBQUUsQ0FBQyxDQUFDLGdEQUFnRDtBQUNyRixNQUFNLHVCQUF1QixHQUFHLHNCQUFzQixDQUFDO0FBRXZELGtCQUFrQjtBQUNsQixTQUFnQixjQUFjLENBQUMsT0FBZTtJQUM1QyxPQUFPLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ25DLENBQUM7QUFGRCx3Q0FFQztBQUVELGtCQUFrQjtBQUNsQixTQUFnQixjQUFjLENBQUMsSUFBWTtJQUN6QyxJQUFJO1FBQ0YsT0FBTyxDQUNMLENBQUMsQ0FBQyxJQUFJLElBQUksSUFBSSxNQUFNLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksY0FBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEtBQUsseUJBQXlCLENBQ25ILENBQUM7S0FDSDtJQUFDLE9BQU8sQ0FBQyxFQUFFO1FBQ1YsT0FBTyxLQUFLLENBQUM7S0FDZDtBQUNILENBQUM7QUFSRCx3Q0FRQztBQUVELGtCQUFrQjtBQUNsQixTQUFnQixpQkFBaUIsQ0FBQyxNQUEyQjtJQUMzRCxJQUFJO1FBQ0YsTUFBTSxHQUFHLEdBQWUsT0FBTyxNQUFNLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO1FBQ3pGLE9BQU8s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LDREQWFDO0FBRUQ7Ozs7O0tBS0s7QUFDRSxLQUFLLFVBQVUsZ0NBQWdDLENBQUMsWUFBb0IsRUFBRSxZQUFvQjtJQUMvRixNQUFNLGNBQWMsR0FBRyxJQUFJLG1CQUFTLENBQUMsWUFBWSxDQUFDLENBQUM7SUFFbkQsK0VBQStFO0lBQy9FLElBQUksQ0FBQyxtQkFBUyxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRTtRQUNuRCxNQUFNLElBQUkscUJBQVUsQ0FBQyx5REFBeUQsR0FBRyxZQUFZLENBQUMsQ0FBQztLQUNoRztJQUNELE1BQU0sVUFBVSxHQUFHLE1BQU0sSUFBQSxxQ0FBeUIsRUFBQyxJQUFJLG1CQUFTLENBQUMsWUFBWSxDQUFDLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDaEcsT0FBTyxVQUFVLENBQUMsUUFBUSxFQUFFLENBQUM7QUFDL0IsQ0FBQztBQVRELDRFQVNDO0FBRUQsU0FBZ0IsbUJBQW1CLENBQUMsV0FBbUI7SUFDckQsSUFBSSxDQUFDLFdBQVcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsRUFBRTtRQUNoRCxNQUFNLElBQUksZ0NBQXFCLENBQUMsdUNBQXVDLEdBQUcsV0FBVyxDQUFDLENBQUM7S0FDeEY7QUFDSCxDQUFDO0FBSkQsa0RBSUM7QUFFRCxTQUFnQixvQkFBb0IsQ0FBQyxZQUFvQjtJQUN2RCxJQUFJLENBQUMsWUFBWSxJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxFQUFFO1FBQ2xELE1BQU0sSUFBSSxnQ0FBcUIsQ0FBQyx3Q0FBd0MsR0FBRyxZQUFZLENBQUMsQ0FBQztLQUMxRjtBQUNILENBQUM7QUFKRCxvREFJQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEJ1aWxkVHJhbnNhY3Rpb25FcnJvcixcbiAgaXNWYWxpZFhwdWIsXG4gIE5vdFN1cHBvcnRlZCxcbiAgUGFyc2VUcmFuc2FjdGlvbkVycm9yLFxuICBUcmFuc2FjdGlvblR5cGUsXG4gIFV0aWxzRXJyb3IsXG59IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IEJhc2VDb2luLCBCYXNlTmV0d29yaywgQ29pbk5vdERlZmluZWRFcnJvciwgY29pbnMsIFNvbENvaW4gfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcbmltcG9ydCB7XG4gIEFTU09DSUFURURfVE9LRU5fUFJPR1JBTV9JRCxcbiAgZGVjb2RlQ2xvc2VBY2NvdW50SW5zdHJ1Y3Rpb24sXG4gIGdldEFzc29jaWF0ZWRUb2tlbkFkZHJlc3MsXG4gIFRPS0VOX1BST0dSQU1fSUQsXG59IGZyb20gJ0Bzb2xhbmEvc3BsLXRva2VuJztcbmltcG9ydCB7XG4gIEtleXBhaXIsXG4gIFB1YmxpY0tleSxcbiAgU2lnbmF0dXJlUHVia2V5UGFpcixcbiAgVHJhbnNhY3Rpb24gYXMgU29sVHJhbnNhY3Rpb24sXG4gIFN0YWtlSW5zdHJ1Y3Rpb24sXG4gIFN0YWtlUHJvZ3JhbSxcbiAgU3lzdGVtSW5zdHJ1Y3Rpb24sXG4gIFN5c3RlbVByb2dyYW0sXG4gIFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24sXG59IGZyb20gJ0Bzb2xhbmEvd2ViMy5qcyc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgQmlnTnVtYmVyIGZyb20gJ2JpZ251bWJlci5qcyc7XG5pbXBvcnQgYnM1OCBmcm9tICdiczU4JztcbmltcG9ydCBuYWNsIGZyb20gJ3R3ZWV0bmFjbCc7XG5pbXBvcnQge1xuICBhdGFDbG9zZUluc3RydWN0aW9uSW5kZXhlcyxcbiAgYXRhSW5pdEluc3RydWN0aW9uSW5kZXhlcyxcbiAgTUFYX01FTU9fTEVOR1RILFxuICBNRU1PX1BST0dSQU1fUEssXG4gIG5vbmNlQWR2YW5jZUluc3RydWN0aW9uLFxuICBzdGFraW5nQWN0aXZhdGVJbnN0cnVjdGlvbnNJbmRleGVzLFxuICBzdGFraW5nQXV0aG9yaXplSW5zdHJ1Y3Rpb25zSW5kZXhlcyxcbiAgc3Rha2luZ0RlYWN0aXZhdGVJbnN0cnVjdGlvbnNJbmRleGVzLFxuICBzdGFraW5nRGVsZWdhdGVJbnN0cnVjdGlvbnNJbmRleGVzLFxuICBzdGFraW5nUGFydGlhbERlYWN0aXZhdGVJbnN0cnVjdGlvbnNJbmRleGVzLFxuICBzdGFraW5nV2l0aGRyYXdJbnN0cnVjdGlvbnNJbmRleGVzLFxuICBWQUxJRF9TWVNURU1fSU5TVFJVQ1RJT05fVFlQRVMsXG4gIHZhbGlkSW5zdHJ1Y3Rpb25EYXRhLFxuICB2YWxpZEluc3RydWN0aW9uRGF0YTIsXG4gIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0sXG4gIHdhbGxldEluaXRJbnN0cnVjdGlvbkluZGV4ZXMsXG59IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7IFZhbGlkSW5zdHJ1Y3Rpb25UeXBlcyB9IGZyb20gJy4vaWZhY2UnO1xuXG5jb25zdCBERUNPREVEX0JMT0NLX0hBU0hfTEVOR1RIID0gMzI7IC8vIGh0dHBzOi8vZG9jcy5zb2xhbmEuY29tL2RldmVsb3BpbmcvcHJvZ3JhbW1pbmctbW9kZWwvdHJhbnNhY3Rpb25zI2Jsb2NraGFzaC1mb3JtYXRcbmNvbnN0IERFQ09ERURfU0lHTkFUVVJFX0xFTkdUSCA9IDY0OyAvLyBodHRwczovL2RvY3Muc29sYW5hLmNvbS90ZXJtaW5vbG9neSNzaWduYXR1cmVcbmNvbnN0IEJBU0VfNThfRU5DT05ESU5HX1JFR0VYID0gJ1sxLTlBLUhKLU5QLVphLWttLXpdJztcblxuLyoqIEBpbmhlcml0ZG9jICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZEFkZHJlc3MoYWRkcmVzczogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBpc1ZhbGlkUHVibGljS2V5KGFkZHJlc3MpO1xufVxuXG4vKiogQGluaGVyaXRkb2MgKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkQmxvY2tJZChoYXNoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gKFxuICAgICAgISFoYXNoICYmIG5ldyBSZWdFeHAoQkFTRV81OF9FTkNPTkRJTkdfUkVHRVgpLnRlc3QoaGFzaCkgJiYgYnM1OC5kZWNvZGUoaGFzaCkubGVuZ3RoID09PSBERUNPREVEX0JMT0NLX0hBU0hfTEVOR1RIXG4gICAgKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKiogQGluaGVyaXRkb2MgKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkUHJpdmF0ZUtleShwcnZLZXk6IHN0cmluZyB8IFVpbnQ4QXJyYXkpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBrZXk6IFVpbnQ4QXJyYXkgPSB0eXBlb2YgcHJ2S2V5ID09PSAnc3RyaW5nJyA/IGJhc2U1OFRvVWludDhBcnJheShwcnZLZXkpIDogcHJ2S2V5O1xuICAgIHJldHVybiAhIUtleXBhaXIuZnJvbVNlY3JldEtleShrZXkpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKiBAaW5oZXJpdGRvYyAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRQdWJsaWNLZXkocHViS2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICBpZiAoaXNWYWxpZFhwdWIocHViS2V5KSkgcmV0dXJuIHRydWU7XG4gICAgbmV3IFB1YmxpY0tleShwdWJLZXkpO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqIEBpbmhlcml0ZG9jICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZFNpZ25hdHVyZShzaWduYXR1cmU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIHJldHVybiAhIXNpZ25hdHVyZSAmJiBiczU4LmRlY29kZShzaWduYXR1cmUpLmxlbmd0aCA9PT0gREVDT0RFRF9TSUdOQVRVUkVfTEVOR1RIO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKiBAaW5oZXJpdGRvYyAqL1xuLy8gVHJhbnNhY3Rpb25JZCBhcmUgdGhlIGZpcnN0IHNpZ25hdHVyZSBvbiBhIFRyYW5zYWN0aW9uXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZFRyYW5zYWN0aW9uSWQodHhJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBpc1ZhbGlkU2lnbmF0dXJlKHR4SWQpO1xufVxuXG4vKipcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHN0cmluZyBpcyBhIHZhbGlkIGFtb3VudCBvZiBsYW1wb3J0cyBudW1iZXJcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYW1vdW50IC0gdGhlIHN0cmluZyB0byB2YWxpZGF0ZVxuICogQHJldHVybnMge2Jvb2xlYW59IC0gdGhlIHZhbGlkYXRpb24gcmVzdWx0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkQW1vdW50KGFtb3VudDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IGJpZ051bWJlckFtb3VudCA9IG5ldyBCaWdOdW1iZXIoYW1vdW50KTtcbiAgcmV0dXJuIGJpZ051bWJlckFtb3VudC5pc0ludGVnZXIoKSAmJiBiaWdOdW1iZXJBbW91bnQuaXNHcmVhdGVyVGhhbk9yRXF1YWxUbygwKTtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiB0aGUgc3RyaW5nIGlzIGEgdmFsaWQgYW1vdW50IG9mIGxhbXBvcnRzIG51bWJlciBvbiBzdGFraW5nXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGFtb3VudCAtIHRoZSBzdHJpbmcgdG8gdmFsaWRhdGVcbiAqIEByZXR1cm5zIHtib29sZWFufSAtIHRoZSB2YWxpZGF0aW9uIHJlc3VsdFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZFN0YWtpbmdBbW91bnQoYW1vdW50OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgYmlnTnVtYmVyQW1vdW50ID0gbmV3IEJpZ051bWJlcihhbW91bnQpO1xuICByZXR1cm4gYmlnTnVtYmVyQW1vdW50LmlzSW50ZWdlcigpICYmIGJpZ051bWJlckFtb3VudC5pc0dyZWF0ZXJUaGFuKDApO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIHRoaXMgaXMgYSB2YWxpZCBtZW1vIG9yIG5vdC5cbiAqXG4gKiBAcGFyYW0gbWVtbyAtIHRoZSBtZW1vIHN0cmluZ1xuICogQHJldHVybnMge2Jvb2xlYW59IC0gdGhlIHZhbGlkYXRpb24gcmVzdWx0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkTWVtbyhtZW1vOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIEJ1ZmZlci5mcm9tKG1lbW8pLmxlbmd0aCA8PSBNQVhfTUVNT19MRU5HVEg7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHJhdyB0cmFuc2FjdGlvbiBjYW4gYmUgZGVzZXJpYWxpemVkXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHJhd1RyYW5zYWN0aW9uIC0gdHJhbnNhY3Rpb24gaW4gYmFzZTY0IHN0cmluZyBmb3JtYXRcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gcmVxdWlyZUFsbFNpZ25hdHVyZXMgLSByZXF1aXJlIGFsbCBzaWduYXR1cmVzIHRvIGJlIHByZXNlbnRcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gdmVyaWZ5U2lnbmF0dXJlcyAtIHZlcmlmeSBzaWduYXR1cmVzXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSB0aGUgdmFsaWRhdGlvbiByZXN1bHRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRSYXdUcmFuc2FjdGlvbihcbiAgcmF3VHJhbnNhY3Rpb246IHN0cmluZyxcbiAgcmVxdWlyZUFsbFNpZ25hdHVyZXMgPSBmYWxzZSxcbiAgdmVyaWZ5U2lnbmF0dXJlcyA9IGZhbHNlXG4pOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICBjb25zdCB0eCA9IFNvbFRyYW5zYWN0aW9uLmZyb20oQnVmZmVyLmZyb20ocmF3VHJhbnNhY3Rpb24sICdiYXNlNjQnKSk7XG4gICAgdHguc2VyaWFsaXplKHsgcmVxdWlyZUFsbFNpZ25hdHVyZXMsIHZlcmlmeVNpZ25hdHVyZXMgfSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBWZXJpZmllcyBpZiBzaWduYXR1cmUgZm9yIG1lc3NhZ2UgaXMgdmFsaWQuXG4gKlxuICogQHBhcmFtIHtCdWZmZXJ9IHNlcmlhbGl6ZWRUeCAtIHR4IGFzIGEgYmFzZTY0IHN0cmluZ1xuICogQHBhcmFtIHtzdHJpbmd9IHNpZ25hdHVyZSAtIHNpZ25hdHVyZSBhcyBhIHN0cmluZ1xuICogQHBhcmFtIHtzdHJpbmd9IHB1YmxpY0tleSAtIHB1YmxpYyBrZXkgYXMgYmFzZSA1OFxuICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgc2lnbmF0dXJlIGlzIHZhbGlkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdmVyaWZ5U2lnbmF0dXJlKHNlcmlhbGl6ZWRUeDogc3RyaW5nLCBzaWduYXR1cmU6IHN0cmluZywgcHVibGljS2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKCFpc1ZhbGlkUmF3VHJhbnNhY3Rpb24oc2VyaWFsaXplZFR4KSkge1xuICAgIHRocm93IG5ldyBVdGlsc0Vycm9yKCdJbnZhbGlkIHNlcmlhbGl6ZWRUeCcpO1xuICB9XG4gIGlmICghaXNWYWxpZFB1YmxpY0tleShwdWJsaWNLZXkpKSB7XG4gICAgdGhyb3cgbmV3IFV0aWxzRXJyb3IoJ0ludmFsaWQgcHVibGljS2V5Jyk7XG4gIH1cbiAgaWYgKCFpc1ZhbGlkU2lnbmF0dXJlKHNpZ25hdHVyZSkpIHtcbiAgICB0aHJvdyBuZXcgVXRpbHNFcnJvcignSW52YWxpZCBzaWduYXR1cmUnKTtcbiAgfVxuICBjb25zdCBtc2cgPSBTb2xUcmFuc2FjdGlvbi5mcm9tKEJ1ZmZlci5mcm9tKHNlcmlhbGl6ZWRUeCwgJ2Jhc2U2NCcpKS5zZXJpYWxpemVNZXNzYWdlKCk7XG4gIGNvbnN0IHNpZyA9IGJhc2U1OFRvVWludDhBcnJheShzaWduYXR1cmUpO1xuICBjb25zdCBwdWIgPSBuZXcgUHVibGljS2V5KHB1YmxpY0tleSk7XG4gIHJldHVybiBuYWNsLnNpZ24uZGV0YWNoZWQudmVyaWZ5KG1zZywgc2lnLCBwdWIudG9CdWZmZXIoKSk7XG59XG5cbi8qKlxuICogQ29udmVydHMgYSBiYXNlNTggc3RyaW5nIGludG8gYSBVaW50OEFycmF5LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBpbnB1dCAtIGEgc3RyaW5nIGluIGJhc2U1OFxuICogQHJldHVybnMge1VpbnQ4QXJyYXl9IC0gYW4gVWludDhBcnJheVxuICovXG5leHBvcnQgZnVuY3Rpb24gYmFzZTU4VG9VaW50OEFycmF5KGlucHV0OiBzdHJpbmcpOiBVaW50OEFycmF5IHtcbiAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGJzNTguZGVjb2RlKGlucHV0KSk7XG59XG5cbi8qKlxuICogQ29udmVydHMgYSBVaW50OEFycmF5IHRvIGEgYmFzZTU4IHN0cmluZy5cbiAqXG4gKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGlucHV0IC0gYW4gVWludDhBcnJheVxuICogQHJldHVybnMge3N0cmluZ30gLSBhIHN0cmluZyBpbiBiYXNlNThcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFVpbnQ4QXJyYXlUb2Jhc2U1OChpbnB1dDogVWludDhBcnJheSk6IHN0cmluZyB7XG4gIHJldHVybiBiczU4LmVuY29kZShpbnB1dCk7XG59XG5cbi8qKlxuICogQ291bnQgdGhlIGFtb3VudCBvZiBzaWduYXR1cmVzIGFyZSBub3QgbnVsbC5cbiAqXG4gKiBAcGFyYW0ge1NpZ25hdHVyZVB1YmtleVBhaXJbXX0gc2lnbmF0dXJlcyAtIGFuIGFycmF5IG9mIFNpZ25hdHVyZVB1YmtleVBhaXJcbiAqIEByZXR1cm5zIHtudW1iZXJ9IC0gdGhlIGFtb3VudCBvZiB2YWxpZCBzaWduYXR1cmVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb3VudE5vdE51bGxTaWduYXR1cmVzKHNpZ25hdHVyZXM6IFNpZ25hdHVyZVB1YmtleVBhaXJbXSk6IG51bWJlciB7XG4gIHJldHVybiBzaWduYXR1cmVzLmZpbHRlcigoc2lnKSA9PiAhIXNpZy5zaWduYXR1cmUpLmxlbmd0aDtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBhbGwgc2lnbmF0dXJlcyBhcmUgY29tcGxldGVkLlxuICpcbiAqIEBwYXJhbSB7U2lnbmF0dXJlUHVia2V5UGFpcltdfSBzaWduYXR1cmVzIC0gc2lnbmF0dXJlc1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXF1aXJlc0FsbFNpZ25hdHVyZXMoc2lnbmF0dXJlczogU2lnbmF0dXJlUHVia2V5UGFpcltdKTogYm9vbGVhbiB7XG4gIHJldHVybiBzaWduYXR1cmVzLmxlbmd0aCA+IDAgJiYgY291bnROb3ROdWxsU2lnbmF0dXJlcyhzaWduYXR1cmVzKSA9PT0gc2lnbmF0dXJlcy5sZW5ndGg7XG59XG5cbi8qKlxuICogQ2hlY2sgdGhlIHRyYW5zYWN0aW9uIHR5cGUgbWF0Y2hpbmcgaW5zdHJ1Y3Rpb25zIGJ5IG9yZGVyLiBNZW1vIGFuZCBBZHZhbmNlTm9uY2VBY2NvdW50IGluc3RydWN0aW9uc1xuICogYXJlIGlnbm9yZWQuXG4gKlxuICogQHBhcmFtIHtUcmFuc2FjdGlvbkluc3RydWN0aW9uW119IGluc3RydWN0aW9ucyAtIHRoZSBhcnJheSBvZiBzdXBwb3J0ZWQgU29sYW5hIGluc3RydWN0aW9ucyB0byBiZSBwYXJzZWRcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgbnVtYmVyPn0gaW5zdHJ1Y3Rpb25JbmRleGVzIC0gdGhlIGluc3RydWN0aW9ucyBpbmRleGVzIG9mIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uXG4gKiBAcmV0dXJucyB0cnVlIGlmIGl0IG1hdGNoZXMgYnkgb3JkZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXRjaFRyYW5zYWN0aW9uVHlwZUJ5SW5zdHJ1Y3Rpb25zT3JkZXIoXG4gIGluc3RydWN0aW9uczogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdLFxuICBpbnN0cnVjdGlvbkluZGV4ZXM6IFJlY29yZDxzdHJpbmcsIG51bWJlcj5cbik6IGJvb2xlYW4ge1xuICBjb25zdCBpbnN0cnVjdGlvbnNDb3B5ID0gWy4uLmluc3RydWN0aW9uc107IC8vIE1ha2UgYSBjb3B5IHNpbmNlIHdlIG1heSBtb2RpZnkgdGhlIGFycmF5IGJlbG93XG4gIC8vIEFkdmFuY2VOb25jZUFjY291bnQgaXMgb3B0aW9uYWwgYW5kIHRoZSBmaXJzdCBpbnN0cnVjdGlvbiBhZGRlZCwgaXQgZG9lcyBub3QgbWF0dGVyIHRvIG1hdGNoIHRoZSB0eXBlXG4gIGlmIChpbnN0cnVjdGlvbnNDb3B5Lmxlbmd0aCA+IDApIHtcbiAgICBpZiAoZ2V0SW5zdHJ1Y3Rpb25UeXBlKGluc3RydWN0aW9uc1swXSkgPT09ICdBZHZhbmNlTm9uY2VBY2NvdW50Jykge1xuICAgICAgaW5zdHJ1Y3Rpb25zQ29weS5zaGlmdCgpO1xuICAgIH1cbiAgfVxuXG4gIC8vIE1lbW8gaXMgb3B0aW9uYWwgYW5kIHRoZSBsYXN0IGluc3RydWN0aW9uIGFkZGVkLCBpdCBkb2VzIG5vdCBtYXR0ZXIgdG8gbWF0Y2ggdGhlIHR5cGVcbiAgLy8gV2h5IGhhdmUgaXQgaW4gaW5zdHJ1Y3Rpb25LZXlzIGlmIHdlIGFyZSBnb2luZyB0byBpZ25vcmUgaXQ/XG4gIGNvbnN0IGluc3RydWN0aW9uc0tleXMgPSBPYmplY3Qua2V5cyhpbnN0cnVjdGlvbkluZGV4ZXMpO1xuICBpZiAoaW5zdHJ1Y3Rpb25zS2V5c1tpbnN0cnVjdGlvbnNLZXlzLmxlbmd0aCAtIDFdID09PSAnTWVtbycpIHtcbiAgICBpbnN0cnVjdGlvbnNLZXlzLnBvcCgpO1xuICB9XG5cbiAgLy8gQ2hlY2sgaW5zdHJ1Y3Rpb25zIGJ5IG9yZGVyIHVzaW5nIHRoZSBpbmRleC5cbiAgZm9yIChjb25zdCBrZXlOYW1lIG9mIGluc3RydWN0aW9uc0tleXMpIHtcbiAgICBjb25zdCByZXN1bHQgPSBnZXRJbnN0cnVjdGlvblR5cGUoaW5zdHJ1Y3Rpb25zQ29weVtpbnN0cnVjdGlvbkluZGV4ZXNba2V5TmFtZV1dKTtcbiAgICBpZiAocmVzdWx0ICE9PSBrZXlOYW1lKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHRyYW5zYWN0aW9uIFR5cGUgYmFzZWQgb24gdGhlICB0cmFuc2FjdGlvbiBpbnN0cnVjdGlvbnMuXG4gKiBXYWxsZXQgaW5pdGlhbGl6YXRpb24sIFRyYW5zZmVyIGFuZCBTdGFraW5nIHRyYW5zYWN0aW9ucyBhcmUgc3VwcG9ydGVkLlxuICpcbiAqIEBwYXJhbSB7U29sVHJhbnNhY3Rpb259IHRyYW5zYWN0aW9uIC0gdGhlIHNvbGFuYSB0cmFuc2FjdGlvblxuICogQHJldHVybnMge1RyYW5zYWN0aW9uVHlwZX0gLSB0aGUgdHlwZSBvZiB0cmFuc2FjdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHJhbnNhY3Rpb25UeXBlKHRyYW5zYWN0aW9uOiBTb2xUcmFuc2FjdGlvbik6IFRyYW5zYWN0aW9uVHlwZSB7XG4gIGNvbnN0IHsgaW5zdHJ1Y3Rpb25zIH0gPSB0cmFuc2FjdGlvbjtcbiAgaWYgKHZhbGlkYXRlUmF3TXNnSW5zdHJ1Y3Rpb24oaW5zdHJ1Y3Rpb25zKSkge1xuICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0F1dGhvcml6ZVJhdztcbiAgfVxuICB2YWxpZGF0ZUludHJ1Y3Rpb25UeXBlcyhpbnN0cnVjdGlvbnMpO1xuICAvLyBjaGVjayBpZiBkZWFjdGl2YXRlIGluc3RydWN0aW9uIGRvZXMgbm90IGV4aXN0IGJlY2F1c2UgZGVhY3RpdmF0ZSBjYW4gYmUgaW5jbHVkZSBhIHRyYW5zZmVyIGluc3RydWN0aW9uXG4gIGlmIChpbnN0cnVjdGlvbnMuZmlsdGVyKChpbnN0cnVjdGlvbikgPT4gZ2V0SW5zdHJ1Y3Rpb25UeXBlKGluc3RydWN0aW9uKSA9PT0gJ0RlYWN0aXZhdGUnKS5sZW5ndGggPT0gMCkge1xuICAgIGZvciAoY29uc3QgaW5zdHJ1Y3Rpb24gb2YgaW5zdHJ1Y3Rpb25zKSB7XG4gICAgICBjb25zdCBpbnN0cnVjdGlvblR5cGUgPSBnZXRJbnN0cnVjdGlvblR5cGUoaW5zdHJ1Y3Rpb24pO1xuICAgICAgaWYgKFxuICAgICAgICBpbnN0cnVjdGlvblR5cGUgPT09IFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uVHJhbnNmZXIgfHxcbiAgICAgICAgaW5zdHJ1Y3Rpb25UeXBlID09PSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLlRva2VuVHJhbnNmZXJcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlLlNlbmQ7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmIChtYXRjaFRyYW5zYWN0aW9uVHlwZUJ5SW5zdHJ1Y3Rpb25zT3JkZXIoaW5zdHJ1Y3Rpb25zLCB3YWxsZXRJbml0SW5zdHJ1Y3Rpb25JbmRleGVzKSkge1xuICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGUuV2FsbGV0SW5pdGlhbGl6YXRpb247XG4gIH0gZWxzZSBpZiAobWF0Y2hUcmFuc2FjdGlvblR5cGVCeUluc3RydWN0aW9uc09yZGVyKGluc3RydWN0aW9ucywgc3Rha2luZ0FjdGl2YXRlSW5zdHJ1Y3Rpb25zSW5kZXhlcykpIHtcbiAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdBY3RpdmF0ZTtcbiAgfSBlbHNlIGlmIChtYXRjaFRyYW5zYWN0aW9uVHlwZUJ5SW5zdHJ1Y3Rpb25zT3JkZXIoaW5zdHJ1Y3Rpb25zLCBzdGFraW5nQXV0aG9yaXplSW5zdHJ1Y3Rpb25zSW5kZXhlcykpIHtcbiAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdBdXRob3JpemU7XG4gIH0gZWxzZSBpZiAobWF0Y2hUcmFuc2FjdGlvblR5cGVCeUluc3RydWN0aW9uc09yZGVyKGluc3RydWN0aW9ucywgc3Rha2luZ0RlbGVnYXRlSW5zdHJ1Y3Rpb25zSW5kZXhlcykpIHtcbiAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdEZWxlZ2F0ZTtcbiAgfSBlbHNlIGlmIChcbiAgICBtYXRjaFRyYW5zYWN0aW9uVHlwZUJ5SW5zdHJ1Y3Rpb25zT3JkZXIoaW5zdHJ1Y3Rpb25zLCBzdGFraW5nRGVhY3RpdmF0ZUluc3RydWN0aW9uc0luZGV4ZXMpIHx8XG4gICAgbWF0Y2hUcmFuc2FjdGlvblR5cGVCeUluc3RydWN0aW9uc09yZGVyKGluc3RydWN0aW9ucywgc3Rha2luZ1BhcnRpYWxEZWFjdGl2YXRlSW5zdHJ1Y3Rpb25zSW5kZXhlcylcbiAgKSB7XG4gICAgcmV0dXJuIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nRGVhY3RpdmF0ZTtcbiAgfSBlbHNlIGlmIChtYXRjaFRyYW5zYWN0aW9uVHlwZUJ5SW5zdHJ1Y3Rpb25zT3JkZXIoaW5zdHJ1Y3Rpb25zLCBzdGFraW5nV2l0aGRyYXdJbnN0cnVjdGlvbnNJbmRleGVzKSkge1xuICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ1dpdGhkcmF3O1xuICB9IGVsc2UgaWYgKG1hdGNoVHJhbnNhY3Rpb25UeXBlQnlJbnN0cnVjdGlvbnNPcmRlcihpbnN0cnVjdGlvbnMsIGF0YUluaXRJbnN0cnVjdGlvbkluZGV4ZXMpKSB7XG4gICAgcmV0dXJuIFRyYW5zYWN0aW9uVHlwZS5Bc3NvY2lhdGVkVG9rZW5BY2NvdW50SW5pdGlhbGl6YXRpb247XG4gIH0gZWxzZSBpZiAobWF0Y2hUcmFuc2FjdGlvblR5cGVCeUluc3RydWN0aW9uc09yZGVyKGluc3RydWN0aW9ucywgYXRhQ2xvc2VJbnN0cnVjdGlvbkluZGV4ZXMpKSB7XG4gICAgcmV0dXJuIFRyYW5zYWN0aW9uVHlwZS5DbG9zZUFzc29jaWF0ZWRUb2tlbkFjY291bnQ7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZCgnSW52YWxpZCB0cmFuc2FjdGlvbiwgdHJhbnNhY3Rpb24gbm90IHN1cHBvcnRlZCBvciBpbnZhbGlkJyk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBpbnN0cnVjdGlvbiBUeXBlIGJhc2VkIG9uIHRoZSBzb2xhbmEgaW5zdHJ1Y3Rpb25zLlxuICogVGhyb3dzIGlmIHRoZSBzb2xhbmEgaW5zdHJ1Y3Rpb24gcHJvZ3JhbSBpcyBub3Qgc3VwcG9ydGVkXG4gKlxuICogQHBhcmFtIHtUcmFuc2FjdGlvbkluc3RydWN0aW9ufSBpbnN0cnVjdGlvbiAtIGEgc29sYW5hIGluc3RydWN0aW9uXG4gKiBAcmV0dXJucyB7VmFsaWRJbnN0cnVjdGlvblR5cGVzfSAtIGEgc29sYW5hIGluc3RydWN0aW9uIHR5cGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEluc3RydWN0aW9uVHlwZShpbnN0cnVjdGlvbjogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbik6IFZhbGlkSW5zdHJ1Y3Rpb25UeXBlcyB7XG4gIHN3aXRjaCAoaW5zdHJ1Y3Rpb24ucHJvZ3JhbUlkLnRvU3RyaW5nKCkpIHtcbiAgICBjYXNlIG5ldyBQdWJsaWNLZXkoTUVNT19QUk9HUkFNX1BLKS50b1N0cmluZygpOlxuICAgICAgcmV0dXJuICdNZW1vJztcbiAgICBjYXNlIFN5c3RlbVByb2dyYW0ucHJvZ3JhbUlkLnRvU3RyaW5nKCk6XG4gICAgICByZXR1cm4gU3lzdGVtSW5zdHJ1Y3Rpb24uZGVjb2RlSW5zdHJ1Y3Rpb25UeXBlKGluc3RydWN0aW9uKTtcbiAgICBjYXNlIFRPS0VOX1BST0dSQU1fSUQudG9TdHJpbmcoKTpcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGRlY29kZWRJbnN0cnVjdGlvbiA9IGRlY29kZUNsb3NlQWNjb3VudEluc3RydWN0aW9uKGluc3RydWN0aW9uKTtcbiAgICAgICAgaWYgKGRlY29kZWRJbnN0cnVjdGlvbiAmJiBkZWNvZGVkSW5zdHJ1Y3Rpb24uZGF0YS5pbnN0cnVjdGlvbiA9PT0gOSkge1xuICAgICAgICAgIHJldHVybiAnQ2xvc2VBc3NvY2lhdGVkVG9rZW5BY2NvdW50JztcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBpZ25vcmUgZXJyb3IgYW5kIGRlZmF1bHQgdG8gVG9rZW5UcmFuc2ZlclxuICAgICAgICByZXR1cm4gJ1Rva2VuVHJhbnNmZXInO1xuICAgICAgfVxuICAgICAgcmV0dXJuICdUb2tlblRyYW5zZmVyJztcbiAgICBjYXNlIFN0YWtlUHJvZ3JhbS5wcm9ncmFtSWQudG9TdHJpbmcoKTpcbiAgICAgIHJldHVybiBTdGFrZUluc3RydWN0aW9uLmRlY29kZUluc3RydWN0aW9uVHlwZShpbnN0cnVjdGlvbik7XG4gICAgY2FzZSBBU1NPQ0lBVEVEX1RPS0VOX1BST0dSQU1fSUQudG9TdHJpbmcoKTpcbiAgICAgIC8vIFRPRE86IGNoYW5nZSB0aGlzIHdoZW4gQHNwbC10b2tlbiBzdXBwb3J0cyBkZWNvZGluZyBhc3NvY2lhdGVkIHRva2VuIGluc3RydWN0aW9uc1xuICAgICAgaWYgKGluc3RydWN0aW9uLmRhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiAnSW5pdGlhbGl6ZUFzc29jaWF0ZWRUb2tlbkFjY291bnQnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZChcbiAgICAgICAgICAnSW52YWxpZCB0cmFuc2FjdGlvbiwgaW5zdHJ1Y3Rpb24gcHJvZ3JhbSBpZCBub3Qgc3VwcG9ydGVkOiAnICsgaW5zdHJ1Y3Rpb24ucHJvZ3JhbUlkLnRvU3RyaW5nKClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZChcbiAgICAgICAgJ0ludmFsaWQgdHJhbnNhY3Rpb24sIGluc3RydWN0aW9uIHByb2dyYW0gaWQgbm90IHN1cHBvcnRlZDogJyArIGluc3RydWN0aW9uLnByb2dyYW1JZC50b1N0cmluZygpXG4gICAgICApO1xuICB9XG59XG5cbi8qKlxuICogVmFsaWRhdGUgc29sYW5hIGluc3RydWN0aW9ucyB0eXBlcyB0byBzZWUgaWYgdGhleSBhcmUgc3VwcG9ydGVkIGJ5IHRoZSBidWlsZGVyLlxuICogVGhyb3dzIGlmIHRoZSBpbnN0cnVjdGlvbiB0eXBlIGlzIGludmFsaWQuXG4gKlxuICogQHBhcmFtIHtUcmFuc2FjdGlvbkluc3RydWN0aW9ufSBpbnN0cnVjdGlvbnMgLSBhIHNvbGFuYSBpbnN0cnVjdGlvblxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUludHJ1Y3Rpb25UeXBlcyhpbnN0cnVjdGlvbnM6IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXSk6IHZvaWQge1xuICBmb3IgKGNvbnN0IGluc3RydWN0aW9uIG9mIGluc3RydWN0aW9ucykge1xuICAgIGlmICghVkFMSURfU1lTVEVNX0lOU1RSVUNUSU9OX1RZUEVTLmluY2x1ZGVzKGdldEluc3RydWN0aW9uVHlwZShpbnN0cnVjdGlvbikpKSB7XG4gICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkKCdJbnZhbGlkIHRyYW5zYWN0aW9uLCBpbnN0cnVjdGlvbiB0eXBlIG5vdCBzdXBwb3J0ZWQ6ICcgKyBnZXRJbnN0cnVjdGlvblR5cGUoaW5zdHJ1Y3Rpb24pKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSBzb2xhbmEgaW5zdHJ1Y3Rpb25zIG1hdGNoIHJhdyBtc2cgYXV0aG9yaXplIHRyYW5zYWN0aW9uXG4gKlxuICogQHBhcmFtIHtUcmFuc2FjdGlvbkluc3RydWN0aW9ufSBpbnN0cnVjdGlvbnMgLSBhIHNvbGFuYSBpbnN0cnVjdGlvblxuICogQHJldHVybnMge2Jvb2xlYW59IHRydWUgaWYgdGhlIGluc3RydWN0aW9ucyBtYXRjaCB0aGUgcmF3IG1zZyBhdXRob3JpemUgdHJhbnNhY3Rpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlUmF3TXNnSW5zdHJ1Y3Rpb24oaW5zdHJ1Y3Rpb25zOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uW10pOiBib29sZWFuIHtcbiAgLy8gYXMgd2ViMy5qcyBjYW5ub3QgZGVjb2RlIGF1dGhvcml6ZSBpbnN0cnVjdGlvbiBmcm9tIENMSSwgd2UgbmVlZCB0byBjaGVjayBpdCBtYW51YWxseSBmaXJzdFxuICBpZiAoaW5zdHJ1Y3Rpb25zLmxlbmd0aCA9PT0gMikge1xuICAgIGNvbnN0IHByb2dyYW1JZDEgPSBpbnN0cnVjdGlvbnNbMF0ucHJvZ3JhbUlkLnRvU3RyaW5nKCk7XG4gICAgY29uc3QgcHJvZ3JhbUlkMiA9IGluc3RydWN0aW9uc1sxXS5wcm9ncmFtSWQudG9TdHJpbmcoKTtcbiAgICBpZiAocHJvZ3JhbUlkMSA9PT0gU3lzdGVtUHJvZ3JhbS5wcm9ncmFtSWQudG9TdHJpbmcoKSAmJiBwcm9ncmFtSWQyID09PSBTdGFrZVByb2dyYW0ucHJvZ3JhbUlkLnRvU3RyaW5nKCkpIHtcbiAgICAgIGNvbnN0IGluc3RydWN0aW9uTmFtZTEgPSBTeXN0ZW1JbnN0cnVjdGlvbi5kZWNvZGVJbnN0cnVjdGlvblR5cGUoaW5zdHJ1Y3Rpb25zWzBdKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBpbnN0cnVjdGlvbnNbMV0uZGF0YS50b1N0cmluZygnaGV4Jyk7XG4gICAgICBpZiAoXG4gICAgICAgIGluc3RydWN0aW9uTmFtZTEgPT09IG5vbmNlQWR2YW5jZUluc3RydWN0aW9uICYmXG4gICAgICAgIChkYXRhID09PSB2YWxpZEluc3RydWN0aW9uRGF0YSB8fCBkYXRhID09PSB2YWxpZEluc3RydWN0aW9uRGF0YTIpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmIChpbnN0cnVjdGlvbnMubGVuZ3RoID09PSAzKSB7XG4gICAgY29uc3QgcHJvZ3JhbUlkMSA9IGluc3RydWN0aW9uc1swXS5wcm9ncmFtSWQudG9TdHJpbmcoKTtcbiAgICBjb25zdCBwcm9ncmFtSWQyID0gaW5zdHJ1Y3Rpb25zWzFdLnByb2dyYW1JZC50b1N0cmluZygpO1xuICAgIGNvbnN0IHByb2dyYW1JZDMgPSBpbnN0cnVjdGlvbnNbMl0ucHJvZ3JhbUlkLnRvU3RyaW5nKCk7XG4gICAgaWYgKFxuICAgICAgcHJvZ3JhbUlkMSA9PT0gU3lzdGVtUHJvZ3JhbS5wcm9ncmFtSWQudG9TdHJpbmcoKSAmJlxuICAgICAgcHJvZ3JhbUlkMiA9PT0gU3Rha2VQcm9ncmFtLnByb2dyYW1JZC50b1N0cmluZygpICYmXG4gICAgICBwcm9ncmFtSWQzID09PSBTdGFrZVByb2dyYW0ucHJvZ3JhbUlkLnRvU3RyaW5nKClcbiAgICApIHtcbiAgICAgIGNvbnN0IGluc3RydWN0aW9uTmFtZTEgPSBTeXN0ZW1JbnN0cnVjdGlvbi5kZWNvZGVJbnN0cnVjdGlvblR5cGUoaW5zdHJ1Y3Rpb25zWzBdKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBpbnN0cnVjdGlvbnNbMV0uZGF0YS50b1N0cmluZygnaGV4Jyk7XG4gICAgICBjb25zdCBkYXRhMiA9IGluc3RydWN0aW9uc1syXS5kYXRhLnRvU3RyaW5nKCdoZXgnKTtcbiAgICAgIGlmIChcbiAgICAgICAgaW5zdHJ1Y3Rpb25OYW1lMSA9PT0gbm9uY2VBZHZhbmNlSW5zdHJ1Y3Rpb24gJiZcbiAgICAgICAgKGRhdGEgPT09IHZhbGlkSW5zdHJ1Y3Rpb25EYXRhIHx8IGRhdGEgPT09IHZhbGlkSW5zdHJ1Y3Rpb25EYXRhMikgJiZcbiAgICAgICAgKGRhdGEyID09PSB2YWxpZEluc3RydWN0aW9uRGF0YSB8fCBkYXRhMiA9PT0gdmFsaWRJbnN0cnVjdGlvbkRhdGEyKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG4vKipcbiAqIENoZWNrIHRoZSByYXcgdHJhbnNhY3Rpb24gaGFzIGEgdmFsaWQgZm9ybWF0IGluIHRoZSBibG9ja2NoYWluIGNvbnRleHQsIHRocm93IG90aGVyd2lzZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcmF3VHJhbnNhY3Rpb24gLSBUcmFuc2FjdGlvbiBpbiBiYXNlNjQgc3RyaW5nICBmb3JtYXRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlUmF3VHJhbnNhY3Rpb24oXG4gIHJhd1RyYW5zYWN0aW9uOiBzdHJpbmcsXG4gIHJlcXVpcmVBbGxTaWduYXR1cmVzID0gZmFsc2UsXG4gIHZlcmlmeVNpZ25hdHVyZXMgPSBmYWxzZVxuKTogdm9pZCB7XG4gIGlmICghcmF3VHJhbnNhY3Rpb24pIHtcbiAgICB0aHJvdyBuZXcgUGFyc2VUcmFuc2FjdGlvbkVycm9yKCdJbnZhbGlkIHJhdyB0cmFuc2FjdGlvbjogVW5kZWZpbmVkJyk7XG4gIH1cbiAgaWYgKCFpc1ZhbGlkUmF3VHJhbnNhY3Rpb24ocmF3VHJhbnNhY3Rpb24sIHJlcXVpcmVBbGxTaWduYXR1cmVzLCB2ZXJpZnlTaWduYXR1cmVzKSkge1xuICAgIHRocm93IG5ldyBQYXJzZVRyYW5zYWN0aW9uRXJyb3IoJ0ludmFsaWQgcmF3IHRyYW5zYWN0aW9uJyk7XG4gIH1cbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgYWRkcmVzcyB0byBjaGVjayBpZiBpdCBleGlzdHMgYW5kIGlzIGEgdmFsaWQgU29sYW5hIHB1YmxpYyBrZXlcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYWRkcmVzcyBUaGUgYWRkcmVzcyB0byBiZSB2YWxpZGF0ZWRcbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWVsZE5hbWUgTmFtZSBvZiB0aGUgZmllbGQgdG8gdmFsaWRhdGUsIGl0cyBuZWVkZWQgdG8gcmV0dXJuIHdoaWNoIGZpZWxkIGlzIGZhaWxpbmcgb24gY2FzZSBvZiBlcnJvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlQWRkcmVzcyhhZGRyZXNzOiBzdHJpbmcsIGZpZWxkTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gIGlmICghYWRkcmVzcyB8fCAhaXNWYWxpZFB1YmxpY0tleShhZGRyZXNzKSkge1xuICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoYEludmFsaWQgb3IgbWlzc2luZyAke2ZpZWxkTmFtZX0sIGdvdDogJHthZGRyZXNzfWApO1xuICB9XG59XG5cbi8qKlxuICogR2V0IHRoZSBzdGF0aWNzIGNvaW4gb2JqZWN0IG1hdGNoaW5nIGEgZ2l2ZW4gU29sYW5hIHRva2VuIGFkZHJlc3MgaWYgaXQgZXhpc3RzXG4gKlxuICogQHBhcmFtIHRva2VuQWRkcmVzcyBUaGUgdG9rZW4gYWRkcmVzcyB0byBtYXRjaCBhZ2FpbnN0XG4gKiBAcGFyYW0gbmV0d29yayBTb2xhbmEgTWFpbm5ldCBvciBUZXN0bmV0XG4gKiBAcmV0dXJucyBzdGF0aWNzIEJhc2VDb2luIG9iamVjdCBmb3IgdGhlIG1hdGNoaW5nIHRva2VuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTb2xUb2tlbkZyb21BZGRyZXNzKHRva2VuQWRkcmVzczogc3RyaW5nLCBuZXR3b3JrOiBCYXNlTmV0d29yayk6IFJlYWRvbmx5PEJhc2VDb2luPiB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHRva2VucyA9IGNvaW5zLmZpbHRlcigoY29pbikgPT4ge1xuICAgIGlmIChjb2luIGluc3RhbmNlb2YgU29sQ29pbikge1xuICAgICAgcmV0dXJuIGNvaW4ubmV0d29yay50eXBlID09PSBuZXR3b3JrLnR5cGUgJiYgY29pbi50b2tlbkFkZHJlc3MudG9Mb3dlckNhc2UoKSA9PT0gdG9rZW5BZGRyZXNzLnRvTG93ZXJDYXNlKCk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfSk7XG4gIGNvbnN0IHRva2Vuc0FycmF5ID0gdG9rZW5zLm1hcCgodG9rZW4pID0+IHRva2VuKTtcbiAgaWYgKHRva2Vuc0FycmF5Lmxlbmd0aCA+PSAxKSB7XG4gICAgLy8gdGhlcmUgc2hvdWxkIG5ldmVyIGJlIHR3byB0b2tlbnMgd2l0aCB0aGUgc2FtZSBjb250cmFjdCBhZGRyZXNzLCBzbyB3ZSBhc3NlcnQgdGhhdCBoZXJlXG4gICAgYXNzZXJ0KHRva2Vuc0FycmF5Lmxlbmd0aCA9PT0gMSk7XG4gICAgcmV0dXJuIHRva2Vuc0FycmF5WzBdO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogR2V0IHRoZSBzb2xhbmEgdG9rZW4gb2JqZWN0IGZyb20gdG9rZW4gbmFtZVxuICogQHBhcmFtIHRva2VuTmFtZSBUaGUgdG9rZW4gbmFtZSB0byBtYXRjaCBhZ2FpbnN0XG4gKiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNvbFRva2VuRnJvbVRva2VuTmFtZSh0b2tlbk5hbWU6IHN0cmluZyk6IFJlYWRvbmx5PFNvbENvaW4+IHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICBjb25zdCB0b2tlbiA9IGNvaW5zLmdldCh0b2tlbk5hbWUpO1xuICAgIGlmICghKHRva2VuLmlzVG9rZW4gJiYgdG9rZW4gaW5zdGFuY2VvZiBTb2xDb2luKSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIHRva2VuO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKCEoZSBpbnN0YW5jZW9mIENvaW5Ob3REZWZpbmVkRXJyb3IpKSB7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogR2V0IHRoZSBzb2xhbmEgYXNzb2NpYXRlZCB0b2tlbiBhY2NvdW50IGFkZHJlc3NcbiAqIEBwYXJhbSB0b2tlbkFkZHJlc3MgVGhlIHRva2VuIGFkZHJlc3NcbiAqIEBwYXJhbSBvd25lckFkZHJlc3MgVGhlIG93bmVyIG9mIHRoZSBhc3NvY2lhdGVkIHRva2VuIGFjY291bnRcbiAqIEByZXR1cm5zIFRoZSBhc3NvY2lhdGVkIHRva2VuIGFjY291bnQgYWRkcmVzc1xuICogKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRBc3NvY2lhdGVkVG9rZW5BY2NvdW50QWRkcmVzcyh0b2tlbkFkZHJlc3M6IHN0cmluZywgb3duZXJBZGRyZXNzOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBvd25lclB1YmxpY0tleSA9IG5ldyBQdWJsaWNLZXkob3duZXJBZGRyZXNzKTtcblxuICAvLyB0b2tlbkFkZHJlc3MgYXJlIG5vdCBvbiBlZDI1NTE5IGN1cnZlLCBzbyB0aGV5IGNhbid0IGJlIHVzZWQgYXMgb3duZXJBZGRyZXNzXG4gIGlmICghUHVibGljS2V5LmlzT25DdXJ2ZShvd25lclB1YmxpY0tleS50b0J1ZmZlcigpKSkge1xuICAgIHRocm93IG5ldyBVdGlsc0Vycm9yKCdJbnZhbGlkIG93bmVyQWRkcmVzcyAtIGFkZHJlc3Mgb2ZmIGVkMjU1MTkgY3VydmUsIGdvdDogJyArIG93bmVyQWRkcmVzcyk7XG4gIH1cbiAgY29uc3QgYXRhQWRkcmVzcyA9IGF3YWl0IGdldEFzc29jaWF0ZWRUb2tlbkFkZHJlc3MobmV3IFB1YmxpY0tleSh0b2tlbkFkZHJlc3MpLCBvd25lclB1YmxpY0tleSk7XG4gIHJldHVybiBhdGFBZGRyZXNzLnRvU3RyaW5nKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZU1pbnRBZGRyZXNzKG1pbnRBZGRyZXNzOiBzdHJpbmcpIHtcbiAgaWYgKCFtaW50QWRkcmVzcyB8fCAhaXNWYWxpZEFkZHJlc3MobWludEFkZHJlc3MpKSB7XG4gICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignSW52YWxpZCBvciBtaXNzaW5nIG1pbnRBZGRyZXNzLCBnb3Q6ICcgKyBtaW50QWRkcmVzcyk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlT3duZXJBZGRyZXNzKG93bmVyQWRkcmVzczogc3RyaW5nKSB7XG4gIGlmICghb3duZXJBZGRyZXNzIHx8ICFpc1ZhbGlkQWRkcmVzcyhvd25lckFkZHJlc3MpKSB7XG4gICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignSW52YWxpZCBvciBtaXNzaW5nIG93bmVyQWRkcmVzcywgZ290OiAnICsgb3duZXJBZGRyZXNzKTtcbiAgfVxufVxuIl19
|