PHP WebShell
Текущая директория: /opt/BitGoJS/modules/sdk-coin-sol/dist/src/lib
Просмотр файла: transferBuilderV2.js
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.TransferBuilderV2 = void 0;
const transactionBuilder_1 = require("./transactionBuilder");
const sdk_core_1 = require("@bitgo/sdk-core");
const utils_1 = require("./utils");
const statics_1 = require("@bitgo/statics");
const assert_1 = __importDefault(require("assert"));
const constants_1 = require("./constants");
const lodash_1 = __importDefault(require("lodash"));
const UNSIGNED_BIGINT_MAX = BigInt('18446744073709551615');
class TransferBuilderV2 extends transactionBuilder_1.TransactionBuilder {
constructor(_coinConfig) {
super(_coinConfig);
this._sendParams = [];
this._createAtaParams = [];
}
get transactionType() {
return sdk_core_1.TransactionType.Send;
}
initBuilder(tx) {
super.initBuilder(tx);
for (const instruction of this._instructionsData) {
if (instruction.type === constants_1.InstructionBuilderTypes.Transfer) {
const transferInstruction = instruction;
this.sender(transferInstruction.params.fromAddress);
this.send({
address: transferInstruction.params.toAddress,
amount: transferInstruction.params.amount,
});
}
else if (instruction.type === constants_1.InstructionBuilderTypes.TokenTransfer) {
const transferInstruction = instruction;
this.sender(transferInstruction.params.fromAddress);
this.send({
address: transferInstruction.params.toAddress,
amount: transferInstruction.params.amount,
tokenName: transferInstruction.params.tokenName,
});
}
else if (instruction.type === constants_1.InstructionBuilderTypes.CreateAssociatedTokenAccount) {
const ataInitInstruction = instruction;
this._createAtaParams.push({
ownerAddress: ataInitInstruction.params.ownerAddress,
tokenName: ataInitInstruction.params.tokenName,
ataAddress: ataInitInstruction.params.ataAddress,
});
}
}
}
/**
* Set a feePayer
* @param payerAddress
*/
feePayer(payerAddress) {
(0, utils_1.validateAddress)(payerAddress, 'address');
this._feePayer = payerAddress;
return this;
}
/**
* Set a transfer
*
* @param {SendParams} sendParams - sendParams
* @returns {TransactionBuilder} This transaction builder
*/
send(sendParams) {
(0, utils_1.validateAddress)(sendParams.address, 'address');
if (!sendParams.amount || !(0, utils_1.isValidAmount)(sendParams.amount)) {
throw new sdk_core_1.BuildTransactionError('Invalid or missing amount, got: ' + sendParams.amount);
}
if (sendParams.tokenName && BigInt(sendParams.amount) > UNSIGNED_BIGINT_MAX) {
throw new sdk_core_1.BuildTransactionError(`input amount ${sendParams.amount} exceeds big int limit ${UNSIGNED_BIGINT_MAX}`);
}
else if (!sendParams.tokenName && BigInt(sendParams.amount) > BigInt(Number.MAX_SAFE_INTEGER)) {
throw new sdk_core_1.BuildTransactionError(`input amount ${sendParams.amount} exceeds max safe int ${Number.MAX_SAFE_INTEGER}`);
}
this._sendParams.push(sendParams);
return this;
}
/**
*
* @param {TokenAssociateRecipient} recipient - recipient of the associated token account creation
* @param {string} recipient.ownerAddress - owner of the associated token account
* @param {string} recipient.tokenName - name of the token that is intended to associate
* @returns {TransactionBuilder} This transaction builder
*/
createAssociatedTokenAccount(recipient) {
(0, utils_1.validateOwnerAddress)(recipient.ownerAddress);
const token = (0, utils_1.getSolTokenFromTokenName)(recipient.tokenName);
if (!token) {
throw new sdk_core_1.BuildTransactionError('Invalid token name, got: ' + recipient.tokenName);
}
(0, utils_1.validateMintAddress)(token.tokenAddress);
this._createAtaParams.push(recipient);
return this;
}
/** @inheritdoc */
async buildImplementation() {
(0, assert_1.default)(this._sender, 'Sender must be set before building the transaction');
const sendInstructions = await Promise.all(this._sendParams.map(async (sendParams) => {
if (sendParams.tokenName) {
const coin = (0, utils_1.getSolTokenFromTokenName)(sendParams.tokenName);
(0, assert_1.default)(coin instanceof statics_1.SolCoin);
const sourceAddress = await (0, utils_1.getAssociatedTokenAccountAddress)(coin.tokenAddress, this._sender);
return {
type: constants_1.InstructionBuilderTypes.TokenTransfer,
params: {
fromAddress: this._sender,
toAddress: sendParams.address,
amount: sendParams.amount,
tokenName: coin.name,
sourceAddress: sourceAddress,
},
};
}
else {
return {
type: constants_1.InstructionBuilderTypes.Transfer,
params: {
fromAddress: this._sender,
toAddress: sendParams.address,
amount: sendParams.amount,
},
};
}
}));
const uniqueCreateAtaParams = lodash_1.default.uniqBy(this._createAtaParams, (recipient) => {
return recipient.ownerAddress + recipient.tokenName;
});
const createAtaInstructions = await Promise.all(uniqueCreateAtaParams.map(async (recipient) => {
const coin = (0, utils_1.getSolTokenFromTokenName)(recipient.tokenName);
(0, assert_1.default)(coin instanceof statics_1.SolCoin);
const recipientTokenAddress = await (0, utils_1.getAssociatedTokenAccountAddress)(coin.tokenAddress, recipient.ownerAddress);
return {
type: constants_1.InstructionBuilderTypes.CreateAssociatedTokenAccount,
params: {
ownerAddress: recipient.ownerAddress,
tokenName: coin.name,
mintAddress: coin.tokenAddress,
ataAddress: recipientTokenAddress,
payerAddress: this._sender,
},
};
}));
let addPriorityFeeInstruction;
// If there are createAtaInstructions, then token is involved and we need to add a priority fee instruction
if (!this._priorityFee || this._priorityFee === Number(0)) {
this._instructionsData = [...createAtaInstructions, ...sendInstructions];
}
else if (createAtaInstructions.length !== 0 ||
sendInstructions.some((instruction) => instruction.type === constants_1.InstructionBuilderTypes.TokenTransfer)) {
addPriorityFeeInstruction = {
type: constants_1.InstructionBuilderTypes.SetPriorityFee,
params: {
fee: this._priorityFee,
},
};
this._instructionsData = [addPriorityFeeInstruction, ...createAtaInstructions, ...sendInstructions];
}
return await super.buildImplementation();
}
}
exports.TransferBuilderV2 = TransferBuilderV2;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmZXJCdWlsZGVyVjIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3RyYW5zZmVyQnVpbGRlclYyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLDZEQUEwRDtBQUMxRCw4Q0FBeUU7QUFFekUsbUNBT2lCO0FBQ2pCLDRDQUFpRTtBQUNqRSxvREFBNEI7QUFFNUIsMkNBQXNEO0FBQ3RELG9EQUF1QjtBQVF2QixNQUFNLG1CQUFtQixHQUFHLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0FBRTNELE1BQWEsaUJBQWtCLFNBQVEsdUNBQWtCO0lBR3ZELFlBQVksV0FBaUM7UUFDM0MsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBSGIsZ0JBQVcsR0FBaUIsRUFBRSxDQUFDO1FBSXJDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVELElBQWMsZUFBZTtRQUMzQixPQUFPLDBCQUFlLENBQUMsSUFBSSxDQUFDO0lBQzlCLENBQUM7SUFFRCxXQUFXLENBQUMsRUFBZTtRQUN6QixLQUFLLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRXRCLEtBQUssTUFBTSxXQUFXLElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDakQsSUFBSSxXQUFXLENBQUMsSUFBSSxLQUFLLG1DQUF1QixDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUMxRCxNQUFNLG1CQUFtQixHQUFhLFdBQVcsQ0FBQztnQkFDbEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQ3BELElBQUksQ0FBQyxJQUFJLENBQUM7b0JBQ1IsT0FBTyxFQUFFLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxTQUFTO29CQUM3QyxNQUFNLEVBQUUsbUJBQW1CLENBQUMsTUFBTSxDQUFDLE1BQU07aUJBQzFDLENBQUMsQ0FBQztZQUNMLENBQUM7aUJBQU0sSUFBSSxXQUFXLENBQUMsSUFBSSxLQUFLLG1DQUF1QixDQUFDLGFBQWEsRUFBRSxDQUFDO2dCQUN0RSxNQUFNLG1CQUFtQixHQUFrQixXQUFXLENBQUM7Z0JBQ3ZELElBQUksQ0FBQyxNQUFNLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUNwRCxJQUFJLENBQUMsSUFBSSxDQUFDO29CQUNSLE9BQU8sRUFBRSxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsU0FBUztvQkFDN0MsTUFBTSxFQUFFLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxNQUFNO29CQUN6QyxTQUFTLEVBQUUsbUJBQW1CLENBQUMsTUFBTSxDQUFDLFNBQVM7aUJBQ2hELENBQUMsQ0FBQztZQUNMLENBQUM7aUJBQU0sSUFBSSxXQUFXLENBQUMsSUFBSSxLQUFLLG1DQUF1QixDQUFDLDRCQUE0QixFQUFFLENBQUM7Z0JBQ3JGLE1BQU0sa0JBQWtCLEdBQVksV0FBVyxDQUFDO2dCQUNoRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDO29CQUN6QixZQUFZLEVBQUUsa0JBQWtCLENBQUMsTUFBTSxDQUFDLFlBQVk7b0JBQ3BELFNBQVMsRUFBRSxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsU0FBUztvQkFDOUMsVUFBVSxFQUFFLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxVQUFVO2lCQUNqRCxDQUFDLENBQUM7WUFDTCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSCxRQUFRLENBQUMsWUFBb0I7UUFDM0IsSUFBQSx1QkFBZSxFQUFDLFlBQVksRUFBRSxTQUFTLENBQUMsQ0FBQztRQUN6QyxJQUFJLENBQUMsU0FBUyxHQUFHLFlBQVksQ0FBQztRQUM5QixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILElBQUksQ0FBQyxVQUFzQjtRQUN6QixJQUFBLHVCQUFlLEVBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQztRQUMvQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUEscUJBQWEsRUFBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUM1RCxNQUFNLElBQUksZ0NBQXFCLENBQUMsa0NBQWtDLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzFGLENBQUM7UUFDRCxJQUFJLFVBQVUsQ0FBQyxTQUFTLElBQUksTUFBTSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsR0FBRyxtQkFBbUIsRUFBRSxDQUFDO1lBQzVFLE1BQU0sSUFBSSxnQ0FBcUIsQ0FBQyxnQkFBZ0IsVUFBVSxDQUFDLE1BQU0sMEJBQTBCLG1CQUFtQixFQUFFLENBQUMsQ0FBQztRQUNwSCxDQUFDO2FBQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLElBQUksTUFBTSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQztZQUNoRyxNQUFNLElBQUksZ0NBQXFCLENBQzdCLGdCQUFnQixVQUFVLENBQUMsTUFBTSx5QkFBeUIsTUFBTSxDQUFDLGdCQUFnQixFQUFFLENBQ3BGLENBQUM7UUFDSixDQUFDO1FBRUQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDbEMsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsNEJBQTRCLENBQUMsU0FBa0M7UUFDN0QsSUFBQSw0QkFBb0IsRUFBQyxTQUFTLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDN0MsTUFBTSxLQUFLLEdBQUcsSUFBQSxnQ0FBd0IsRUFBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDNUQsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ1gsTUFBTSxJQUFJLGdDQUFxQixDQUFDLDJCQUEyQixHQUFHLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNyRixDQUFDO1FBQ0QsSUFBQSwyQkFBbUIsRUFBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7UUFFeEMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN0QyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxrQkFBa0I7SUFDUixLQUFLLENBQUMsbUJBQW1CO1FBQ2pDLElBQUEsZ0JBQU0sRUFBQyxJQUFJLENBQUMsT0FBTyxFQUFFLG9EQUFvRCxDQUFDLENBQUM7UUFDM0UsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQ3hDLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxVQUFzQixFQUFxQyxFQUFFO1lBQ3ZGLElBQUksVUFBVSxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUN6QixNQUFNLElBQUksR0FBRyxJQUFBLGdDQUF3QixFQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDNUQsSUFBQSxnQkFBTSxFQUFDLElBQUksWUFBWSxpQkFBTyxDQUFDLENBQUM7Z0JBQ2hDLE1BQU0sYUFBYSxHQUFHLE1BQU0sSUFBQSx3Q0FBZ0MsRUFBQyxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDOUYsT0FBTztvQkFDTCxJQUFJLEVBQUUsbUNBQXVCLENBQUMsYUFBYTtvQkFDM0MsTUFBTSxFQUFFO3dCQUNOLFdBQVcsRUFBRSxJQUFJLENBQUMsT0FBTzt3QkFDekIsU0FBUyxFQUFFLFVBQVUsQ0FBQyxPQUFPO3dCQUM3QixNQUFNLEVBQUUsVUFBVSxDQUFDLE1BQU07d0JBQ3pCLFNBQVMsRUFBRSxJQUFJLENBQUMsSUFBSTt3QkFDcEIsYUFBYSxFQUFFLGFBQWE7cUJBQzdCO2lCQUNGLENBQUM7WUFDSixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sT0FBTztvQkFDTCxJQUFJLEVBQUUsbUNBQXVCLENBQUMsUUFBUTtvQkFDdEMsTUFBTSxFQUFFO3dCQUNOLFdBQVcsRUFBRSxJQUFJLENBQUMsT0FBTzt3QkFDekIsU0FBUyxFQUFFLFVBQVUsQ0FBQyxPQUFPO3dCQUM3QixNQUFNLEVBQUUsVUFBVSxDQUFDLE1BQU07cUJBQzFCO2lCQUNGLENBQUM7WUFDSixDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQ0gsQ0FBQztRQUNGLE1BQU0scUJBQXFCLEdBQUcsZ0JBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsU0FBa0MsRUFBRSxFQUFFO1lBQ25HLE9BQU8sU0FBUyxDQUFDLFlBQVksR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFDO1FBQ3RELENBQUMsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxxQkFBcUIsR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQzdDLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsU0FBa0MsRUFBb0IsRUFBRTtZQUN2RixNQUFNLElBQUksR0FBRyxJQUFBLGdDQUF3QixFQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUMzRCxJQUFBLGdCQUFNLEVBQUMsSUFBSSxZQUFZLGlCQUFPLENBQUMsQ0FBQztZQUNoQyxNQUFNLHFCQUFxQixHQUFHLE1BQU0sSUFBQSx3Q0FBZ0MsRUFBQyxJQUFJLENBQUMsWUFBWSxFQUFFLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUNoSCxPQUFPO2dCQUNMLElBQUksRUFBRSxtQ0FBdUIsQ0FBQyw0QkFBNEI7Z0JBQzFELE1BQU0sRUFBRTtvQkFDTixZQUFZLEVBQUUsU0FBUyxDQUFDLFlBQVk7b0JBQ3BDLFNBQVMsRUFBRSxJQUFJLENBQUMsSUFBSTtvQkFDcEIsV0FBVyxFQUFFLElBQUksQ0FBQyxZQUFZO29CQUM5QixVQUFVLEVBQUUscUJBQXFCO29CQUNqQyxZQUFZLEVBQUUsSUFBSSxDQUFDLE9BQU87aUJBQzNCO2FBQ0YsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUNILENBQUM7UUFFRixJQUFJLHlCQUF5QyxDQUFDO1FBQzlDLDJHQUEyRztRQUMzRyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsWUFBWSxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQzFELElBQUksQ0FBQyxpQkFBaUIsR0FBRyxDQUFDLEdBQUcscUJBQXFCLEVBQUUsR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQzNFLENBQUM7YUFBTSxJQUNMLHFCQUFxQixDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQ2xDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsV0FBVyxDQUFDLElBQUksS0FBSyxtQ0FBdUIsQ0FBQyxhQUFhLENBQUMsRUFDbEcsQ0FBQztZQUNELHlCQUF5QixHQUFHO2dCQUMxQixJQUFJLEVBQUUsbUNBQXVCLENBQUMsY0FBYztnQkFDNUMsTUFBTSxFQUFFO29CQUNOLEdBQUcsRUFBRSxJQUFJLENBQUMsWUFBWTtpQkFDdkI7YUFDRixDQUFDO1lBQ0YsSUFBSSxDQUFDLGlCQUFpQixHQUFHLENBQUMseUJBQXlCLEVBQUUsR0FBRyxxQkFBcUIsRUFBRSxHQUFHLGdCQUFnQixDQUFDLENBQUM7UUFDdEcsQ0FBQztRQUVELE9BQU8sTUFBTSxLQUFLLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztJQUMzQyxDQUFDO0NBQ0Y7QUFyS0QsOENBcUtDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVHJhbnNhY3Rpb25CdWlsZGVyIH0gZnJvbSAnLi90cmFuc2FjdGlvbkJ1aWxkZXInO1xuaW1wb3J0IHsgQnVpbGRUcmFuc2FjdGlvbkVycm9yLCBUcmFuc2FjdGlvblR5cGUgfSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb24gfSBmcm9tICcuL3RyYW5zYWN0aW9uJztcbmltcG9ydCB7XG4gIGdldEFzc29jaWF0ZWRUb2tlbkFjY291bnRBZGRyZXNzLFxuICBnZXRTb2xUb2tlbkZyb21Ub2tlbk5hbWUsXG4gIGlzVmFsaWRBbW91bnQsXG4gIHZhbGlkYXRlQWRkcmVzcyxcbiAgdmFsaWRhdGVNaW50QWRkcmVzcyxcbiAgdmFsaWRhdGVPd25lckFkZHJlc3MsXG59IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgQmFzZUNvaW4gYXMgQ29pbkNvbmZpZywgU29sQ29pbiB9IGZyb20gJ0BiaXRnby9zdGF0aWNzJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7IEF0YUluaXQsIFRva2VuQXNzb2NpYXRlUmVjaXBpZW50LCBUb2tlblRyYW5zZmVyLCBUcmFuc2ZlciwgU2V0UHJpb3JpdHlGZWUgfSBmcm9tICcuL2lmYWNlJztcbmltcG9ydCB7IEluc3RydWN0aW9uQnVpbGRlclR5cGVzIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcblxuZXhwb3J0IGludGVyZmFjZSBTZW5kUGFyYW1zIHtcbiAgYWRkcmVzczogc3RyaW5nO1xuICBhbW91bnQ6IHN0cmluZztcbiAgdG9rZW5OYW1lPzogc3RyaW5nO1xufVxuXG5jb25zdCBVTlNJR05FRF9CSUdJTlRfTUFYID0gQmlnSW50KCcxODQ0Njc0NDA3MzcwOTU1MTYxNScpO1xuXG5leHBvcnQgY2xhc3MgVHJhbnNmZXJCdWlsZGVyVjIgZXh0ZW5kcyBUcmFuc2FjdGlvbkJ1aWxkZXIge1xuICBwcml2YXRlIF9zZW5kUGFyYW1zOiBTZW5kUGFyYW1zW10gPSBbXTtcbiAgcHJpdmF0ZSBfY3JlYXRlQXRhUGFyYW1zOiBUb2tlbkFzc29jaWF0ZVJlY2lwaWVudFtdO1xuICBjb25zdHJ1Y3RvcihfY29pbkNvbmZpZzogUmVhZG9ubHk8Q29pbkNvbmZpZz4pIHtcbiAgICBzdXBlcihfY29pbkNvbmZpZyk7XG4gICAgdGhpcy5fY3JlYXRlQXRhUGFyYW1zID0gW107XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IHRyYW5zYWN0aW9uVHlwZSgpOiBUcmFuc2FjdGlvblR5cGUge1xuICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGUuU2VuZDtcbiAgfVxuXG4gIGluaXRCdWlsZGVyKHR4OiBUcmFuc2FjdGlvbik6IHZvaWQge1xuICAgIHN1cGVyLmluaXRCdWlsZGVyKHR4KTtcblxuICAgIGZvciAoY29uc3QgaW5zdHJ1Y3Rpb24gb2YgdGhpcy5faW5zdHJ1Y3Rpb25zRGF0YSkge1xuICAgICAgaWYgKGluc3RydWN0aW9uLnR5cGUgPT09IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlRyYW5zZmVyKSB7XG4gICAgICAgIGNvbnN0IHRyYW5zZmVySW5zdHJ1Y3Rpb246IFRyYW5zZmVyID0gaW5zdHJ1Y3Rpb247XG4gICAgICAgIHRoaXMuc2VuZGVyKHRyYW5zZmVySW5zdHJ1Y3Rpb24ucGFyYW1zLmZyb21BZGRyZXNzKTtcbiAgICAgICAgdGhpcy5zZW5kKHtcbiAgICAgICAgICBhZGRyZXNzOiB0cmFuc2Zlckluc3RydWN0aW9uLnBhcmFtcy50b0FkZHJlc3MsXG4gICAgICAgICAgYW1vdW50OiB0cmFuc2Zlckluc3RydWN0aW9uLnBhcmFtcy5hbW91bnQsXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChpbnN0cnVjdGlvbi50eXBlID09PSBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5Ub2tlblRyYW5zZmVyKSB7XG4gICAgICAgIGNvbnN0IHRyYW5zZmVySW5zdHJ1Y3Rpb246IFRva2VuVHJhbnNmZXIgPSBpbnN0cnVjdGlvbjtcbiAgICAgICAgdGhpcy5zZW5kZXIodHJhbnNmZXJJbnN0cnVjdGlvbi5wYXJhbXMuZnJvbUFkZHJlc3MpO1xuICAgICAgICB0aGlzLnNlbmQoe1xuICAgICAgICAgIGFkZHJlc3M6IHRyYW5zZmVySW5zdHJ1Y3Rpb24ucGFyYW1zLnRvQWRkcmVzcyxcbiAgICAgICAgICBhbW91bnQ6IHRyYW5zZmVySW5zdHJ1Y3Rpb24ucGFyYW1zLmFtb3VudCxcbiAgICAgICAgICB0b2tlbk5hbWU6IHRyYW5zZmVySW5zdHJ1Y3Rpb24ucGFyYW1zLnRva2VuTmFtZSxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKGluc3RydWN0aW9uLnR5cGUgPT09IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLkNyZWF0ZUFzc29jaWF0ZWRUb2tlbkFjY291bnQpIHtcbiAgICAgICAgY29uc3QgYXRhSW5pdEluc3RydWN0aW9uOiBBdGFJbml0ID0gaW5zdHJ1Y3Rpb247XG4gICAgICAgIHRoaXMuX2NyZWF0ZUF0YVBhcmFtcy5wdXNoKHtcbiAgICAgICAgICBvd25lckFkZHJlc3M6IGF0YUluaXRJbnN0cnVjdGlvbi5wYXJhbXMub3duZXJBZGRyZXNzLFxuICAgICAgICAgIHRva2VuTmFtZTogYXRhSW5pdEluc3RydWN0aW9uLnBhcmFtcy50b2tlbk5hbWUsXG4gICAgICAgICAgYXRhQWRkcmVzczogYXRhSW5pdEluc3RydWN0aW9uLnBhcmFtcy5hdGFBZGRyZXNzLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0IGEgZmVlUGF5ZXJcbiAgICogQHBhcmFtIHBheWVyQWRkcmVzc1xuICAgKi9cbiAgZmVlUGF5ZXIocGF5ZXJBZGRyZXNzOiBzdHJpbmcpOiB0aGlzIHtcbiAgICB2YWxpZGF0ZUFkZHJlc3MocGF5ZXJBZGRyZXNzLCAnYWRkcmVzcycpO1xuICAgIHRoaXMuX2ZlZVBheWVyID0gcGF5ZXJBZGRyZXNzO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqICBTZXQgYSB0cmFuc2ZlclxuICAgKlxuICAgKiBAcGFyYW0ge1NlbmRQYXJhbXN9IHNlbmRQYXJhbXMgLSBzZW5kUGFyYW1zXG4gICAqIEByZXR1cm5zIHtUcmFuc2FjdGlvbkJ1aWxkZXJ9IFRoaXMgdHJhbnNhY3Rpb24gYnVpbGRlclxuICAgKi9cbiAgc2VuZChzZW5kUGFyYW1zOiBTZW5kUGFyYW1zKTogdGhpcyB7XG4gICAgdmFsaWRhdGVBZGRyZXNzKHNlbmRQYXJhbXMuYWRkcmVzcywgJ2FkZHJlc3MnKTtcbiAgICBpZiAoIXNlbmRQYXJhbXMuYW1vdW50IHx8ICFpc1ZhbGlkQW1vdW50KHNlbmRQYXJhbXMuYW1vdW50KSkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignSW52YWxpZCBvciBtaXNzaW5nIGFtb3VudCwgZ290OiAnICsgc2VuZFBhcmFtcy5hbW91bnQpO1xuICAgIH1cbiAgICBpZiAoc2VuZFBhcmFtcy50b2tlbk5hbWUgJiYgQmlnSW50KHNlbmRQYXJhbXMuYW1vdW50KSA+IFVOU0lHTkVEX0JJR0lOVF9NQVgpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoYGlucHV0IGFtb3VudCAke3NlbmRQYXJhbXMuYW1vdW50fSBleGNlZWRzIGJpZyBpbnQgbGltaXQgJHtVTlNJR05FRF9CSUdJTlRfTUFYfWApO1xuICAgIH0gZWxzZSBpZiAoIXNlbmRQYXJhbXMudG9rZW5OYW1lICYmIEJpZ0ludChzZW5kUGFyYW1zLmFtb3VudCkgPiBCaWdJbnQoTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKFxuICAgICAgICBgaW5wdXQgYW1vdW50ICR7c2VuZFBhcmFtcy5hbW91bnR9IGV4Y2VlZHMgbWF4IHNhZmUgaW50ICR7TnVtYmVyLk1BWF9TQUZFX0lOVEVHRVJ9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLl9zZW5kUGFyYW1zLnB1c2goc2VuZFBhcmFtcyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtUb2tlbkFzc29jaWF0ZVJlY2lwaWVudH0gcmVjaXBpZW50IC0gcmVjaXBpZW50IG9mIHRoZSBhc3NvY2lhdGVkIHRva2VuIGFjY291bnQgY3JlYXRpb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlY2lwaWVudC5vd25lckFkZHJlc3MgLSBvd25lciBvZiB0aGUgYXNzb2NpYXRlZCB0b2tlbiBhY2NvdW50XG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZWNpcGllbnQudG9rZW5OYW1lIC0gbmFtZSBvZiB0aGUgdG9rZW4gdGhhdCBpcyBpbnRlbmRlZCB0byBhc3NvY2lhdGVcbiAgICogQHJldHVybnMge1RyYW5zYWN0aW9uQnVpbGRlcn0gVGhpcyB0cmFuc2FjdGlvbiBidWlsZGVyXG4gICAqL1xuICBjcmVhdGVBc3NvY2lhdGVkVG9rZW5BY2NvdW50KHJlY2lwaWVudDogVG9rZW5Bc3NvY2lhdGVSZWNpcGllbnQpOiB0aGlzIHtcbiAgICB2YWxpZGF0ZU93bmVyQWRkcmVzcyhyZWNpcGllbnQub3duZXJBZGRyZXNzKTtcbiAgICBjb25zdCB0b2tlbiA9IGdldFNvbFRva2VuRnJvbVRva2VuTmFtZShyZWNpcGllbnQudG9rZW5OYW1lKTtcbiAgICBpZiAoIXRva2VuKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdJbnZhbGlkIHRva2VuIG5hbWUsIGdvdDogJyArIHJlY2lwaWVudC50b2tlbk5hbWUpO1xuICAgIH1cbiAgICB2YWxpZGF0ZU1pbnRBZGRyZXNzKHRva2VuLnRva2VuQWRkcmVzcyk7XG5cbiAgICB0aGlzLl9jcmVhdGVBdGFQYXJhbXMucHVzaChyZWNpcGllbnQpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHByb3RlY3RlZCBhc3luYyBidWlsZEltcGxlbWVudGF0aW9uKCk6IFByb21pc2U8VHJhbnNhY3Rpb24+IHtcbiAgICBhc3NlcnQodGhpcy5fc2VuZGVyLCAnU2VuZGVyIG11c3QgYmUgc2V0IGJlZm9yZSBidWlsZGluZyB0aGUgdHJhbnNhY3Rpb24nKTtcbiAgICBjb25zdCBzZW5kSW5zdHJ1Y3Rpb25zID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICB0aGlzLl9zZW5kUGFyYW1zLm1hcChhc3luYyAoc2VuZFBhcmFtczogU2VuZFBhcmFtcyk6IFByb21pc2U8VHJhbnNmZXIgfCBUb2tlblRyYW5zZmVyPiA9PiB7XG4gICAgICAgIGlmIChzZW5kUGFyYW1zLnRva2VuTmFtZSkge1xuICAgICAgICAgIGNvbnN0IGNvaW4gPSBnZXRTb2xUb2tlbkZyb21Ub2tlbk5hbWUoc2VuZFBhcmFtcy50b2tlbk5hbWUpO1xuICAgICAgICAgIGFzc2VydChjb2luIGluc3RhbmNlb2YgU29sQ29pbik7XG4gICAgICAgICAgY29uc3Qgc291cmNlQWRkcmVzcyA9IGF3YWl0IGdldEFzc29jaWF0ZWRUb2tlbkFjY291bnRBZGRyZXNzKGNvaW4udG9rZW5BZGRyZXNzLCB0aGlzLl9zZW5kZXIpO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5Ub2tlblRyYW5zZmVyLFxuICAgICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICAgIGZyb21BZGRyZXNzOiB0aGlzLl9zZW5kZXIsXG4gICAgICAgICAgICAgIHRvQWRkcmVzczogc2VuZFBhcmFtcy5hZGRyZXNzLFxuICAgICAgICAgICAgICBhbW91bnQ6IHNlbmRQYXJhbXMuYW1vdW50LFxuICAgICAgICAgICAgICB0b2tlbk5hbWU6IGNvaW4ubmFtZSxcbiAgICAgICAgICAgICAgc291cmNlQWRkcmVzczogc291cmNlQWRkcmVzcyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuVHJhbnNmZXIsXG4gICAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgICAgZnJvbUFkZHJlc3M6IHRoaXMuX3NlbmRlcixcbiAgICAgICAgICAgICAgdG9BZGRyZXNzOiBzZW5kUGFyYW1zLmFkZHJlc3MsXG4gICAgICAgICAgICAgIGFtb3VudDogc2VuZFBhcmFtcy5hbW91bnQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgICBjb25zdCB1bmlxdWVDcmVhdGVBdGFQYXJhbXMgPSBfLnVuaXFCeSh0aGlzLl9jcmVhdGVBdGFQYXJhbXMsIChyZWNpcGllbnQ6IFRva2VuQXNzb2NpYXRlUmVjaXBpZW50KSA9PiB7XG4gICAgICByZXR1cm4gcmVjaXBpZW50Lm93bmVyQWRkcmVzcyArIHJlY2lwaWVudC50b2tlbk5hbWU7XG4gICAgfSk7XG4gICAgY29uc3QgY3JlYXRlQXRhSW5zdHJ1Y3Rpb25zID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICB1bmlxdWVDcmVhdGVBdGFQYXJhbXMubWFwKGFzeW5jIChyZWNpcGllbnQ6IFRva2VuQXNzb2NpYXRlUmVjaXBpZW50KTogUHJvbWlzZTxBdGFJbml0PiA9PiB7XG4gICAgICAgIGNvbnN0IGNvaW4gPSBnZXRTb2xUb2tlbkZyb21Ub2tlbk5hbWUocmVjaXBpZW50LnRva2VuTmFtZSk7XG4gICAgICAgIGFzc2VydChjb2luIGluc3RhbmNlb2YgU29sQ29pbik7XG4gICAgICAgIGNvbnN0IHJlY2lwaWVudFRva2VuQWRkcmVzcyA9IGF3YWl0IGdldEFzc29jaWF0ZWRUb2tlbkFjY291bnRBZGRyZXNzKGNvaW4udG9rZW5BZGRyZXNzLCByZWNpcGllbnQub3duZXJBZGRyZXNzKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5DcmVhdGVBc3NvY2lhdGVkVG9rZW5BY2NvdW50LFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgb3duZXJBZGRyZXNzOiByZWNpcGllbnQub3duZXJBZGRyZXNzLFxuICAgICAgICAgICAgdG9rZW5OYW1lOiBjb2luLm5hbWUsXG4gICAgICAgICAgICBtaW50QWRkcmVzczogY29pbi50b2tlbkFkZHJlc3MsXG4gICAgICAgICAgICBhdGFBZGRyZXNzOiByZWNpcGllbnRUb2tlbkFkZHJlc3MsXG4gICAgICAgICAgICBwYXllckFkZHJlc3M6IHRoaXMuX3NlbmRlcixcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgbGV0IGFkZFByaW9yaXR5RmVlSW5zdHJ1Y3Rpb246IFNldFByaW9yaXR5RmVlO1xuICAgIC8vIElmIHRoZXJlIGFyZSBjcmVhdGVBdGFJbnN0cnVjdGlvbnMsIHRoZW4gdG9rZW4gaXMgaW52b2x2ZWQgYW5kIHdlIG5lZWQgdG8gYWRkIGEgcHJpb3JpdHkgZmVlIGluc3RydWN0aW9uXG4gICAgaWYgKCF0aGlzLl9wcmlvcml0eUZlZSB8fCB0aGlzLl9wcmlvcml0eUZlZSA9PT0gTnVtYmVyKDApKSB7XG4gICAgICB0aGlzLl9pbnN0cnVjdGlvbnNEYXRhID0gWy4uLmNyZWF0ZUF0YUluc3RydWN0aW9ucywgLi4uc2VuZEluc3RydWN0aW9uc107XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIGNyZWF0ZUF0YUluc3RydWN0aW9ucy5sZW5ndGggIT09IDAgfHxcbiAgICAgIHNlbmRJbnN0cnVjdGlvbnMuc29tZSgoaW5zdHJ1Y3Rpb24pID0+IGluc3RydWN0aW9uLnR5cGUgPT09IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlRva2VuVHJhbnNmZXIpXG4gICAgKSB7XG4gICAgICBhZGRQcmlvcml0eUZlZUluc3RydWN0aW9uID0ge1xuICAgICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5TZXRQcmlvcml0eUZlZSxcbiAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgZmVlOiB0aGlzLl9wcmlvcml0eUZlZSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICB0aGlzLl9pbnN0cnVjdGlvbnNEYXRhID0gW2FkZFByaW9yaXR5RmVlSW5zdHJ1Y3Rpb24sIC4uLmNyZWF0ZUF0YUluc3RydWN0aW9ucywgLi4uc2VuZEluc3RydWN0aW9uc107XG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IHN1cGVyLmJ1aWxkSW1wbGVtZW50YXRpb24oKTtcbiAgfVxufVxuIl19Выполнить команду
Для локальной разработки. Не используйте в интернете!