PHP WebShell

Текущая директория: /usr/lib/node_modules/bitgo/node_modules/@bitgo/sdk-coin-sol/dist/src/lib

Просмотр файла: solInstructionFactory.js

"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
    return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.solInstructionFactory = solInstructionFactory;
const public_types_1 = require("@bitgo/public-types");
const statics_1 = require("@bitgo/statics");
const spl_token_1 = require("@solana/spl-token");
const web3_js_1 = require("@solana/web3.js");
const assert_1 = __importDefault(require("assert"));
const bignumber_js_1 = __importDefault(require("bignumber.js"));
const constants_1 = require("./constants");
const utils_1 = require("./utils");
const jitoStakePoolOperations_1 = require("./jitoStakePoolOperations");
/**
 * Construct Solana instructions from instructions params
 *
 * @param {InstructionParams} instructionToBuild - the data containing the instruction params
 * @returns {TransactionInstruction[]} An array containing supported Solana instructions
 */
function solInstructionFactory(instructionToBuild) {
    switch (instructionToBuild.type) {
        case constants_1.InstructionBuilderTypes.NonceAdvance:
            return advanceNonceInstruction(instructionToBuild);
        case constants_1.InstructionBuilderTypes.Memo:
            return memoInstruction(instructionToBuild);
        case constants_1.InstructionBuilderTypes.Transfer:
            return transferInstruction(instructionToBuild);
        case constants_1.InstructionBuilderTypes.TokenTransfer:
            return tokenTransferInstruction(instructionToBuild);
        case constants_1.InstructionBuilderTypes.Approve:
            return approveInstruction(instructionToBuild);
        case constants_1.InstructionBuilderTypes.CreateNonceAccount:
            return createNonceAccountInstruction(instructionToBuild);
        case constants_1.InstructionBuilderTypes.StakingActivate:
            return stakingInitializeInstruction(instructionToBuild);
        case constants_1.InstructionBuilderTypes.StakingDeactivate:
            return stakingDeactivateInstruction(instructionToBuild);
        case constants_1.InstructionBuilderTypes.StakingWithdraw:
            return stakingWithdrawInstruction(instructionToBuild);
        case constants_1.InstructionBuilderTypes.CreateAssociatedTokenAccount:
            return createATAInstruction(instructionToBuild);
        case constants_1.InstructionBuilderTypes.CloseAssociatedTokenAccount:
            return closeATAInstruction(instructionToBuild);
        case constants_1.InstructionBuilderTypes.StakingAuthorize:
            return stakingAuthorizeInstruction(instructionToBuild);
        case constants_1.InstructionBuilderTypes.StakingDelegate:
            return stakingDelegateInstruction(instructionToBuild);
        case constants_1.InstructionBuilderTypes.SetPriorityFee:
            return fetchPriorityFeeInstruction(instructionToBuild);
        case constants_1.InstructionBuilderTypes.MintTo:
            return mintToInstruction(instructionToBuild);
        case constants_1.InstructionBuilderTypes.Burn:
            return burnInstruction(instructionToBuild);
        case constants_1.InstructionBuilderTypes.CustomInstruction:
            return customInstruction(instructionToBuild);
        default:
            throw new Error(`Invalid instruction type or not supported`);
    }
}
/**
 * Construct Advance Nonce Solana instructions
 *
 * @param {Nonce} data - the data to build the instruction
 * @returns {TransactionInstruction[]} An array containing Advance Nonce Solana instruction
 */
function advanceNonceInstruction(data) {
    const { params: { authWalletAddress, walletNonceAddress }, } = data;
    (0, assert_1.default)(authWalletAddress, 'Missing authWalletAddress param');
    (0, assert_1.default)(walletNonceAddress, 'Missing walletNonceAddress param');
    const nonceInstruction = web3_js_1.SystemProgram.nonceAdvance({
        noncePubkey: new web3_js_1.PublicKey(walletNonceAddress),
        authorizedPubkey: new web3_js_1.PublicKey(authWalletAddress),
    });
    return [nonceInstruction];
}
function fetchPriorityFeeInstruction(instructionToBuild) {
    const addPriorityFee = web3_js_1.ComputeBudgetProgram.setComputeUnitPrice({
        microLamports: instructionToBuild.params.fee,
    });
    return [addPriorityFee];
}
/**
 * Construct Memo Solana instructions
 *
 * @param {Memo} data - the data to build the instruction
 * @returns {TransactionInstruction[]} An array containing Memo Solana instruction
 */
function memoInstruction(data) {
    const { params: { memo }, } = data;
    (0, assert_1.default)(memo, 'Missing memo param');
    const memoInstruction = new web3_js_1.TransactionInstruction({
        keys: [],
        programId: new web3_js_1.PublicKey(constants_1.MEMO_PROGRAM_PK),
        data: Buffer.from(memo),
    });
    return [memoInstruction];
}
/**
 * Construct Transfer Solana instructions
 *
 * @param {Transfer} data - the data to build the instruction
 * @returns {TransactionInstruction[]} An array containing Transfer Solana instruction
 */
function transferInstruction(data) {
    const { params: { fromAddress, toAddress, amount }, } = data;
    (0, assert_1.default)(fromAddress, 'Missing fromAddress param');
    (0, assert_1.default)(toAddress, 'Missing toAddress param');
    (0, assert_1.default)(amount, 'Missing toAddress param');
    const transferInstruction = web3_js_1.SystemProgram.transfer({
        fromPubkey: new web3_js_1.PublicKey(fromAddress),
        toPubkey: new web3_js_1.PublicKey(toAddress),
        lamports: parseInt(amount, 10),
    });
    return [transferInstruction];
}
/**
 * Construct Transfer Solana instructions
 *
 * @param {Transfer} data - the data to build the instruction
 * @returns {TransactionInstruction[]} An array containing Transfer Solana instruction
 */
function tokenTransferInstruction(data) {
    const { params: { fromAddress, toAddress, amount, tokenName, sourceAddress }, } = data;
    (0, assert_1.default)(fromAddress, 'Missing fromAddress (owner) param');
    (0, assert_1.default)(toAddress, 'Missing toAddress param');
    (0, assert_1.default)(amount, 'Missing amount param');
    (0, assert_1.default)(tokenName, 'Missing token name');
    (0, assert_1.default)(sourceAddress, 'Missing ata address');
    const token = (0, utils_1.getSolTokenFromTokenName)(data.params.tokenName);
    let tokenAddress;
    let programId;
    let decimalPlaces;
    if (data.params.tokenAddress && data.params.decimalPlaces) {
        tokenAddress = data.params.tokenAddress;
        decimalPlaces = data.params.decimalPlaces;
        programId = data.params.programId;
    }
    else if (token) {
        (0, assert_1.default)(token instanceof statics_1.SolCoin);
        tokenAddress = token.tokenAddress;
        decimalPlaces = token.decimalPlaces;
        programId = token.programId;
    }
    else {
        throw new Error('Invalid token name, got:' + data.params.tokenName);
    }
    let transferInstruction;
    if (programId === spl_token_1.TOKEN_2022_PROGRAM_ID.toString()) {
        transferInstruction = (0, spl_token_1.createTransferCheckedInstruction)(new web3_js_1.PublicKey(sourceAddress), new web3_js_1.PublicKey(tokenAddress), new web3_js_1.PublicKey(toAddress), new web3_js_1.PublicKey(fromAddress), BigInt(amount), decimalPlaces, [], spl_token_1.TOKEN_2022_PROGRAM_ID);
    }
    else {
        transferInstruction = (0, spl_token_1.createTransferCheckedInstruction)(new web3_js_1.PublicKey(sourceAddress), new web3_js_1.PublicKey(tokenAddress), new web3_js_1.PublicKey(toAddress), new web3_js_1.PublicKey(fromAddress), BigInt(amount), decimalPlaces);
    }
    return [transferInstruction];
}
/**
 * Construct Transfer Solana instructions
 *
 * @param {Transfer} data - the data to build the instruction
 * @returns {TransactionInstruction[]} An array containing Transfer Solana instruction
 */
function approveInstruction(data) {
    const { params: { accountAddress, delegateAddress, ownerAddress, amount, programId }, } = data;
    (0, assert_1.default)(accountAddress, 'Missing fromAddress (owner) param');
    (0, assert_1.default)(delegateAddress, 'Missing toAddress param');
    (0, assert_1.default)(ownerAddress, 'Missing ownerAddress param');
    (0, assert_1.default)(programId, 'Missing programId param');
    (0, assert_1.default)(amount, 'Missing amount param');
    return [
        (0, spl_token_1.createApproveInstruction)(new web3_js_1.PublicKey(accountAddress), new web3_js_1.PublicKey(delegateAddress), new web3_js_1.PublicKey(ownerAddress), BigInt(amount), undefined, programId === undefined ? undefined : new web3_js_1.PublicKey(programId)),
    ];
}
/**
 * Construct Create and Initialize Nonce Solana instructions
 *
 * @param {WalletInit} data - the data to build the instruction
 * @returns {TransactionInstruction[]} An array containing Create and Initialize Nonce Solana instruction
 */
function createNonceAccountInstruction(data) {
    const { params: { fromAddress, nonceAddress, authAddress, amount }, } = data;
    (0, assert_1.default)(fromAddress, 'Missing fromAddress param');
    (0, assert_1.default)(nonceAddress, 'Missing nonceAddress param');
    (0, assert_1.default)(authAddress, 'Missing authAddress param');
    (0, assert_1.default)(amount, 'Missing amount param');
    const nonceAccountInstruction = web3_js_1.SystemProgram.createNonceAccount({
        fromPubkey: new web3_js_1.PublicKey(fromAddress),
        noncePubkey: new web3_js_1.PublicKey(nonceAddress),
        authorizedPubkey: new web3_js_1.PublicKey(authAddress),
        lamports: new bignumber_js_1.default(amount).toNumber(),
    });
    return nonceAccountInstruction.instructions;
}
/**
 * Construct Create Staking Account and Delegate Solana instructions
 *
 * @param {StakingActivate} data - the data to build the instruction
 * @returns {TransactionInstruction[]} An array containing Create Staking Account and Delegate Solana instructions
 */
function stakingInitializeInstruction(data) {
    const { params: { fromAddress, stakingAddress, amount, validator, stakingType, extraParams }, } = data;
    (0, assert_1.default)(fromAddress, 'Missing fromAddress param');
    (0, assert_1.default)(stakingAddress, 'Missing stakingAddress param');
    (0, assert_1.default)(amount, 'Missing amount param');
    (0, assert_1.default)(validator, 'Missing validator param');
    const fromPubkey = new web3_js_1.PublicKey(fromAddress);
    const stakePubkey = new web3_js_1.PublicKey(stakingAddress);
    const validatorPubkey = new web3_js_1.PublicKey(validator);
    const tx = new web3_js_1.Transaction();
    switch (stakingType) {
        case public_types_1.SolStakingTypeEnum.JITO: {
            (0, assert_1.default)(extraParams !== undefined, 'Missing extraParams param');
            const instructions = (0, jitoStakePoolOperations_1.depositSolInstructions)({
                stakePoolAddress: stakePubkey,
                from: fromPubkey,
                lamports: BigInt(amount),
            }, extraParams.stakePoolData);
            tx.add(...instructions);
            break;
        }
        case public_types_1.SolStakingTypeEnum.MARINADE: {
            const walletInitStaking = web3_js_1.StakeProgram.createAccount({
                fromPubkey,
                stakePubkey,
                authorized: new web3_js_1.Authorized(validatorPubkey, fromPubkey), // staker and withdrawer
                lockup: new web3_js_1.Lockup(0, 0, fromPubkey), // No minimum epoch to withdraw
                lamports: new bignumber_js_1.default(amount).toNumber(),
            });
            tx.add(walletInitStaking);
            break;
        }
        case public_types_1.SolStakingTypeEnum.NATIVE: {
            const walletInitStaking = web3_js_1.StakeProgram.createAccount({
                fromPubkey,
                stakePubkey,
                authorized: new web3_js_1.Authorized(fromPubkey, fromPubkey), // staker and withdrawer
                lockup: new web3_js_1.Lockup(0, 0, fromPubkey), // No minimum epoch to withdraw
                lamports: new bignumber_js_1.default(amount).toNumber(),
            });
            tx.add(walletInitStaking);
            const delegateStaking = web3_js_1.StakeProgram.delegate({
                stakePubkey: new web3_js_1.PublicKey(stakingAddress),
                authorizedPubkey: new web3_js_1.PublicKey(fromAddress),
                votePubkey: new web3_js_1.PublicKey(validator),
            });
            tx.add(delegateStaking);
            break;
        }
        default: {
            const unreachable = stakingType;
            throw new Error(`Unknown staking type ${unreachable}`);
        }
    }
    return tx.instructions;
}
/**
 * Construct staking deactivate Solana instructions
 *
 * @param {StakingDeactivate} data - the data to build the instruction
 * @returns {TransactionInstruction[]} An array containing staking deactivate instruction
 */
function stakingDeactivateInstruction(data) {
    const { params: { fromAddress, stakingAddress, amount, unstakingAddress, recipients, stakingType, extraParams }, } = data;
    (0, assert_1.default)(fromAddress, 'Missing fromAddress param');
    switch (stakingType) {
        case public_types_1.SolStakingTypeEnum.JITO: {
            (0, assert_1.default)(stakingAddress, 'Missing stakingAddress param');
            (0, assert_1.default)(unstakingAddress, 'Missing unstakingAddress param');
            (0, assert_1.default)(amount, 'Missing amount param');
            (0, assert_1.default)(extraParams, 'Missing extraParams param');
            const tx = new web3_js_1.Transaction();
            tx.add(...(0, jitoStakePoolOperations_1.withdrawStakeInstructions)({
                stakePoolAddress: new web3_js_1.PublicKey(stakingAddress),
                tokenOwner: new web3_js_1.PublicKey(fromAddress),
                destinationStakeAccount: new web3_js_1.PublicKey(unstakingAddress),
                validatorAddress: new web3_js_1.PublicKey(extraParams.validatorAddress),
                transferAuthority: new web3_js_1.PublicKey(extraParams.transferAuthorityAddress),
                poolAmount: amount,
            }, extraParams.stakePoolData));
            return tx.instructions;
        }
        case public_types_1.SolStakingTypeEnum.MARINADE: {
            (0, assert_1.default)(recipients, 'Missing recipients param');
            const tx = new web3_js_1.Transaction();
            const toPubkeyAddress = new web3_js_1.PublicKey(recipients[0].address || '');
            const transferInstruction = web3_js_1.SystemProgram.transfer({
                fromPubkey: new web3_js_1.PublicKey(fromAddress),
                toPubkey: toPubkeyAddress,
                lamports: parseInt(recipients[0].amount, 10),
            });
            tx.add(transferInstruction);
            return tx.instructions;
        }
        case public_types_1.SolStakingTypeEnum.NATIVE: {
            (0, assert_1.default)(stakingAddress, 'Missing stakingAddress param');
            if (data.params.amount && data.params.unstakingAddress) {
                const tx = new web3_js_1.Transaction();
                const unstakingAddress = new web3_js_1.PublicKey(data.params.unstakingAddress);
                const allocateAccount = web3_js_1.SystemProgram.allocate({
                    accountPubkey: unstakingAddress,
                    space: web3_js_1.StakeProgram.space,
                });
                tx.add(allocateAccount);
                const assignAccount = web3_js_1.SystemProgram.assign({
                    accountPubkey: unstakingAddress,
                    programId: web3_js_1.StakeProgram.programId,
                });
                tx.add(assignAccount);
                const splitStake = web3_js_1.StakeProgram.split({
                    stakePubkey: new web3_js_1.PublicKey(stakingAddress),
                    authorizedPubkey: new web3_js_1.PublicKey(fromAddress),
                    splitStakePubkey: unstakingAddress,
                    lamports: new bignumber_js_1.default(data.params.amount).toNumber(),
                }, 0);
                tx.add(splitStake.instructions[1]);
                const deactivateStaking = web3_js_1.StakeProgram.deactivate({
                    stakePubkey: unstakingAddress,
                    authorizedPubkey: new web3_js_1.PublicKey(fromAddress),
                });
                tx.add(deactivateStaking);
                return tx.instructions;
            }
            else {
                const deactivateStaking = web3_js_1.StakeProgram.deactivate({
                    stakePubkey: new web3_js_1.PublicKey(stakingAddress),
                    authorizedPubkey: new web3_js_1.PublicKey(fromAddress),
                });
                return deactivateStaking.instructions;
            }
        }
        default: {
            const unreachable = stakingType;
            throw new Error(`Unknown staking type ${unreachable}`);
        }
    }
}
/**
 * Construct Staking Withdraw Solana instructions
 *
 * @param {StakingWithdraw} data - the data to build the instruction
 * @returns {TransactionInstruction[]} An array containing Staking Withdraw  Solana instructions
 */
function stakingWithdrawInstruction(data) {
    const { params: { fromAddress, stakingAddress, amount }, } = data;
    (0, assert_1.default)(fromAddress, 'Missing fromAddress param');
    (0, assert_1.default)(stakingAddress, 'Missing stakingAddress param');
    (0, assert_1.default)(amount, 'Missing amount param');
    const withdrawStaking = web3_js_1.StakeProgram.withdraw({
        stakePubkey: new web3_js_1.PublicKey(stakingAddress),
        authorizedPubkey: new web3_js_1.PublicKey(fromAddress),
        toPubkey: new web3_js_1.PublicKey(fromAddress),
        lamports: new bignumber_js_1.default(amount).toNumber(),
    });
    return withdrawStaking.instructions;
}
/**
 * Construct Create and Initialize Nonce Solana instructions
 *
 * @param {WalletInit} data - the data to build the instruction
 * @returns {TransactionInstruction[]} An array containing Create and Initialize Nonce Solana instruction
 */
function createATAInstruction(data) {
    const { params: { mintAddress, ataAddress, ownerAddress, payerAddress, programId }, } = data;
    (0, assert_1.default)(mintAddress, 'Missing mintAddress param');
    (0, assert_1.default)(ataAddress, 'Missing ataAddress param');
    (0, assert_1.default)(ownerAddress, 'Missing ownerAddress param');
    (0, assert_1.default)(payerAddress, 'Missing payerAddress param');
    let associatedTokenAccountInstruction;
    if (programId && programId === spl_token_1.TOKEN_2022_PROGRAM_ID.toString()) {
        associatedTokenAccountInstruction = (0, spl_token_1.createAssociatedTokenAccountInstruction)(new web3_js_1.PublicKey(payerAddress), new web3_js_1.PublicKey(ataAddress), new web3_js_1.PublicKey(ownerAddress), new web3_js_1.PublicKey(mintAddress), spl_token_1.TOKEN_2022_PROGRAM_ID);
    }
    else {
        associatedTokenAccountInstruction = (0, spl_token_1.createAssociatedTokenAccountInstruction)(new web3_js_1.PublicKey(payerAddress), new web3_js_1.PublicKey(ataAddress), new web3_js_1.PublicKey(ownerAddress), new web3_js_1.PublicKey(mintAddress));
    }
    return [associatedTokenAccountInstruction];
}
/**
 * Construct Close ATA Solana instructions
 *
 * @param {WalletInit} data - the data to build the instruction
 * @returns {TransactionInstruction[]} An array containing Close ATA Solana instruction
 */
function closeATAInstruction(data) {
    const { params: { accountAddress, destinationAddress, authorityAddress }, } = data;
    (0, assert_1.default)(accountAddress, 'Missing accountAddress param');
    (0, assert_1.default)(destinationAddress, 'Missing destinationAddress param');
    (0, assert_1.default)(authorityAddress, 'Missing authorityAddress param');
    const closeAssociatedTokenAccountInstruction = (0, spl_token_1.createCloseAccountInstruction)(new web3_js_1.PublicKey(accountAddress), new web3_js_1.PublicKey(destinationAddress), new web3_js_1.PublicKey(authorityAddress));
    return [closeAssociatedTokenAccountInstruction];
}
/**
 * Construct Staking Account Authorize Solana instructions
 *
 * @param {StakingAuthorize} data - the data to build the instruction
 * @returns {TransactionInstruction[]} An array containing Staking Account Authorize instructions
 */
function stakingAuthorizeInstruction(data) {
    const { params: { stakingAddress, oldAuthorizeAddress, newAuthorizeAddress, newWithdrawAddress }, } = data;
    (0, assert_1.default)(stakingAddress, 'Missing stakingAddress param');
    (0, assert_1.default)(oldAuthorizeAddress, 'Missing oldAuthorizeAddress param');
    (0, assert_1.default)(newAuthorizeAddress, 'Missing newAuthorizeAddress param');
    (0, assert_1.default)(newWithdrawAddress, 'Missing newWithdrawAddress param');
    const tx = new web3_js_1.Transaction();
    const authorizeStaking = web3_js_1.StakeProgram.authorize({
        stakePubkey: new web3_js_1.PublicKey(stakingAddress),
        authorizedPubkey: new web3_js_1.PublicKey(oldAuthorizeAddress),
        newAuthorizedPubkey: new web3_js_1.PublicKey(newAuthorizeAddress),
        stakeAuthorizationType: web3_js_1.StakeAuthorizationLayout.Staker,
    });
    const authorizeWithdraw = web3_js_1.StakeProgram.authorize({
        stakePubkey: new web3_js_1.PublicKey(stakingAddress),
        authorizedPubkey: new web3_js_1.PublicKey(oldAuthorizeAddress),
        newAuthorizedPubkey: new web3_js_1.PublicKey(newAuthorizeAddress),
        stakeAuthorizationType: web3_js_1.StakeAuthorizationLayout.Withdrawer,
        custodianPubkey: new web3_js_1.PublicKey(newWithdrawAddress),
    });
    tx.add(authorizeStaking);
    tx.add(authorizeWithdraw);
    return tx.instructions;
}
/**
 * Construct Delegate Solana instructions
 *
 * @param {StakingActivate} data - the data to build the instruction
 * @returns {TransactionInstruction[]} An array containing Delegate Solana instructions
 */
function stakingDelegateInstruction(data) {
    const { params: { fromAddress, stakingAddress, validator }, } = data;
    (0, assert_1.default)(fromAddress, 'Missing fromAddress param');
    (0, assert_1.default)(stakingAddress, 'Missing stakingAddress param');
    (0, assert_1.default)(validator, 'Missing validator param');
    const tx = new web3_js_1.Transaction();
    const delegateStaking = web3_js_1.StakeProgram.delegate({
        stakePubkey: new web3_js_1.PublicKey(stakingAddress),
        authorizedPubkey: new web3_js_1.PublicKey(fromAddress),
        votePubkey: new web3_js_1.PublicKey(validator),
    });
    tx.add(delegateStaking);
    return tx.instructions;
}
/**
 * Construct MintTo Solana instructions
 *
 * @param {MintTo} data - the data to build the instruction
 * @returns {TransactionInstruction[]} An array containing MintTo Solana instructions
 */
function mintToInstruction(data) {
    const { params: { mintAddress, destinationAddress, authorityAddress, amount, programId }, } = data;
    (0, assert_1.default)(mintAddress, 'Missing mintAddress param');
    (0, assert_1.default)(destinationAddress, 'Missing destinationAddress param');
    (0, assert_1.default)(authorityAddress, 'Missing authorityAddress param');
    (0, assert_1.default)(amount, 'Missing amount param');
    const mint = new web3_js_1.PublicKey(mintAddress);
    const destination = new web3_js_1.PublicKey(destinationAddress);
    const authority = new web3_js_1.PublicKey(authorityAddress);
    let mintToInstr;
    if (programId && programId === spl_token_1.TOKEN_2022_PROGRAM_ID.toString()) {
        mintToInstr = (0, spl_token_1.createMintToInstruction)(mint, destination, authority, BigInt(amount), [], spl_token_1.TOKEN_2022_PROGRAM_ID);
    }
    else {
        mintToInstr = (0, spl_token_1.createMintToInstruction)(mint, destination, authority, BigInt(amount));
    }
    return [mintToInstr];
}
/**
 * Construct Burn Solana instructions
 *
 * @param {Burn} data - the data to build the instruction
 * @returns {TransactionInstruction[]} An array containing Burn Solana instructions
 */
function burnInstruction(data) {
    const { params: { mintAddress, accountAddress, authorityAddress, amount, programId }, } = data;
    (0, assert_1.default)(mintAddress, 'Missing mintAddress param');
    (0, assert_1.default)(accountAddress, 'Missing accountAddress param');
    (0, assert_1.default)(authorityAddress, 'Missing authorityAddress param');
    (0, assert_1.default)(amount, 'Missing amount param');
    const mint = new web3_js_1.PublicKey(mintAddress);
    const account = new web3_js_1.PublicKey(accountAddress);
    const authority = new web3_js_1.PublicKey(authorityAddress);
    let burnInstr;
    if (programId && programId === spl_token_1.TOKEN_2022_PROGRAM_ID.toString()) {
        burnInstr = (0, spl_token_1.createBurnInstruction)(account, mint, authority, BigInt(amount), [], spl_token_1.TOKEN_2022_PROGRAM_ID);
    }
    else {
        burnInstr = (0, spl_token_1.createBurnInstruction)(account, mint, authority, BigInt(amount));
    }
    return [burnInstr];
}
/**
 * Process custom instruction - converts to TransactionInstruction
 * Handles conversion from string-based format to TransactionInstruction format
 *
 * @param {CustomInstruction} data - the data containing the custom instruction
 * @returns {TransactionInstruction[]} An array containing the custom instruction
 */
function customInstruction(data) {
    const { params } = data;
    (0, assert_1.default)(params.programId, 'Missing programId in custom instruction');
    (0, assert_1.default)(params.keys && Array.isArray(params.keys), 'Missing or invalid keys in custom instruction');
    (0, assert_1.default)(params.data !== undefined, 'Missing data in custom instruction');
    // Convert string data to Buffer
    let dataBuffer;
    if ((0, utils_1.isValidBase64)(params.data)) {
        dataBuffer = Buffer.from(params.data, 'base64');
    }
    else if ((0, utils_1.isValidHex)(params.data)) {
        dataBuffer = Buffer.from(params.data, 'hex');
    }
    else {
        // Fallback to UTF-8
        dataBuffer = Buffer.from(params.data, 'utf8');
    }
    // Create a new TransactionInstruction with the converted data
    const convertedInstruction = new web3_js_1.TransactionInstruction({
        programId: new web3_js_1.PublicKey(params.programId),
        keys: params.keys.map((key) => ({
            pubkey: new web3_js_1.PublicKey(key.pubkey),
            isSigner: key.isSigner,
            isWritable: key.isWritable,
        })),
        data: dataBuffer,
    });
    return [convertedInstruction];
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29sSW5zdHJ1Y3Rpb25GYWN0b3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9zb2xJbnN0cnVjdGlvbkZhY3RvcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFzREEsc0RBdUNDO0FBN0ZELHNEQUF5RDtBQUN6RCw0Q0FBeUM7QUFDekMsaURBUTJCO0FBQzNCLDZDQVV5QjtBQUN6QixvREFBNEI7QUFDNUIsZ0VBQXFDO0FBQ3JDLDJDQUF1RTtBQXFCdkUsbUNBQThFO0FBQzlFLHVFQUE4RjtBQUU5Rjs7Ozs7R0FLRztBQUNILFNBQWdCLHFCQUFxQixDQUFDLGtCQUFxQztJQUN6RSxRQUFRLGtCQUFrQixDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2hDLEtBQUssbUNBQXVCLENBQUMsWUFBWTtZQUN2QyxPQUFPLHVCQUF1QixDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDckQsS0FBSyxtQ0FBdUIsQ0FBQyxJQUFJO1lBQy9CLE9BQU8sZUFBZSxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDN0MsS0FBSyxtQ0FBdUIsQ0FBQyxRQUFRO1lBQ25DLE9BQU8sbUJBQW1CLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUNqRCxLQUFLLG1DQUF1QixDQUFDLGFBQWE7WUFDeEMsT0FBTyx3QkFBd0IsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQ3RELEtBQUssbUNBQXVCLENBQUMsT0FBTztZQUNsQyxPQUFPLGtCQUFrQixDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDaEQsS0FBSyxtQ0FBdUIsQ0FBQyxrQkFBa0I7WUFDN0MsT0FBTyw2QkFBNkIsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQzNELEtBQUssbUNBQXVCLENBQUMsZUFBZTtZQUMxQyxPQUFPLDRCQUE0QixDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDMUQsS0FBSyxtQ0FBdUIsQ0FBQyxpQkFBaUI7WUFDNUMsT0FBTyw0QkFBNEIsQ0FBQyxrQkFBa0IsQ0FB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QyxRQUFRO1lBQ3RCLFVBQVUsRUFBRSxHQUFHLENBQUMsVUFBVTtTQUMzQixDQUFDLENBQUM7UUFDSCxJQUFJLEVBQUUsVUFBVTtLQUNqQixDQUFDLENBQUM7SUFFSCxPQUFPLENBQUMsb0JBQW9CLENBQUMsQ0FBQztBQUNoQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU29sU3Rha2luZ1R5cGVFbnVtIH0gZnJvbSAnQGJpdGdvL3B1YmxpYy10eXBlcyc7XG5pbXBvcnQgeyBTb2xDb2luIH0gZnJvbSAnQGJpdGdvL3N0YXRpY3MnO1xuaW1wb3J0IHtcbiAgY3JlYXRlQXNzb2NpYXRlZFRva2VuQWNjb3VudEluc3RydWN0aW9uLFxuICBjcmVhdGVDbG9zZUFjY291bnRJbnN0cnVjdGlvbixcbiAgY3JlYXRlTWludFRvSW5zdHJ1Y3Rpb24sXG4gIGNyZWF0ZUJ1cm5JbnN0cnVjdGlvbixcbiAgY3JlYXRlVHJhbnNmZXJDaGVja2VkSW5zdHJ1Y3Rpb24sXG4gIFRPS0VOXzIwMjJfUFJPR1JBTV9JRCxcbiAgY3JlYXRlQXBwcm92ZUluc3RydWN0aW9uLFxufSBmcm9tICdAc29sYW5hL3NwbC10b2tlbic7XG5pbXBvcnQge1xuICBBdXRob3JpemVkLFxuICBMb2NrdXAsXG4gIFB1YmxpY0tleSxcbiAgU3Rha2VBdXRob3JpemF0aW9uTGF5b3V0LFxuICBTdGFrZVByb2dyYW0sXG4gIFN5c3RlbVByb2dyYW0sXG4gIFRyYW5zYWN0aW9uLFxuICBUcmFuc2FjdGlvbkluc3RydWN0aW9uLFxuICBDb21wdXRlQnVkZ2V0UHJvZ3JhbSxcbn0gZnJvbSAnQHNvbGFuYS93ZWIzLmpzJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCBCaWdOdW1iZXIgZnJvbSAnYmlnbnVtYmVyLmpzJztcbmltcG9ydCB7IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLCBNRU1PX1BST0dSQU1fUEsgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQge1xuICBBdGFDbG9zZSxcbiAgQXRhSW5pdCxcbiAgSW5zdHJ1Y3Rpb25QYXJhbXMsXG4gIE1lbW8sXG4gIE1pbnRUbyxcbiAgQnVybixcbiAgTm9uY2UsXG4gIFN0YWtpbmdBY3RpdmF0ZSxcbiAgU3Rha2luZ0F1dGhvcml6ZSxcbiAgU3Rha2luZ0RlYWN0aXZhdGUsXG4gIFN0YWtpbmdEZWxlZ2F0ZSxcbiAgU3Rha2luZ1dpdGhkcmF3LFxuICBUb2tlblRyYW5zZmVyLFxuICBUcmFuc2ZlcixcbiAgV2FsbGV0SW5pdCxcbiAgU2V0UHJpb3JpdHlGZWUsXG4gIEN1c3RvbUluc3RydWN0aW9uLFxuICBBcHByb3ZlLFxufSBmcm9tICcuL2lmYWNlJztcbmltcG9ydCB7IGdldFNvbFRva2VuRnJvbVRva2VuTmFtZSwgaXNWYWxpZEJhc2U2NCwgaXNWYWxpZEhleCB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgZGVwb3NpdFNvbEluc3RydWN0aW9ucywgd2l0aGRyYXdTdGFrZUluc3RydWN0aW9ucyB9IGZyb20gJy4vaml0b1N0YWtlUG9vbE9wZXJhdGlvbnMnO1xuXG4vKipcbiAqIENvbnN0cnVjdCBTb2xhbmEgaW5zdHJ1Y3Rpb25zIGZyb20gaW5zdHJ1Y3Rpb25zIHBhcmFtc1xuICpcbiAqIEBwYXJhbSB7SW5zdHJ1Y3Rpb25QYXJhbXN9IGluc3RydWN0aW9uVG9CdWlsZCAtIHRoZSBkYXRhIGNvbnRhaW5pbmcgdGhlIGluc3RydWN0aW9uIHBhcmFtc1xuICogQHJldHVybnMge1RyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXX0gQW4gYXJyYXkgY29udGFpbmluZyBzdXBwb3J0ZWQgU29sYW5hIGluc3RydWN0aW9uc1xuICovXG5leHBvcnQgZnVuY3Rpb24gc29sSW5zdHJ1Y3Rpb25GYWN0b3J5KGluc3RydWN0aW9uVG9CdWlsZDogSW5zdHJ1Y3Rpb25QYXJhbXMpOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uW10ge1xuICBzd2l0Y2ggKGluc3RydWN0aW9uVG9CdWlsZC50eXBlKSB7XG4gICAgY2FzZSBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5Ob25jZUFkdmFuY2U6XG4gICAgICByZXR1cm4gYWR2YW5jZU5vbmNlSW5zdHJ1Y3Rpb24oaW5zdHJ1Y3Rpb25Ub0J1aWxkKTtcbiAgICBjYXNlIEluc3RydWN0aW9uQnVpbGRlclR5cGVzLk1lbW86XG4gICAgICByZXR1cm4gbWVtb0luc3RydWN0aW9uKGluc3RydWN0aW9uVG9CdWlsZCk7XG4gICAgY2FzZSBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5UcmFuc2ZlcjpcbiAgICAgIHJldHVybiB0cmFuc2Zlckluc3RydWN0aW9uKGluc3RydWN0aW9uVG9CdWlsZCk7XG4gICAgY2FzZSBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5Ub2tlblRyYW5zZmVyOlxuICAgICAgcmV0dXJuIHRva2VuVHJhbnNmZXJJbnN0cnVjdGlvbihpbnN0cnVjdGlvblRvQnVpbGQpO1xuICAgIGNhc2UgSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuQXBwcm92ZTpcbiAgICAgIHJldHVybiBhcHByb3ZlSW5zdHJ1Y3Rpb24oaW5zdHJ1Y3Rpb25Ub0J1aWxkKTtcbiAgICBjYXNlIEluc3RydWN0aW9uQnVpbGRlclR5cGVzLkNyZWF0ZU5vbmNlQWNjb3VudDpcbiAgICAgIHJldHVybiBjcmVhdGVOb25jZUFjY291bnRJbnN0cnVjdGlvbihpbnN0cnVjdGlvblRvQnVpbGQpO1xuICAgIGNhc2UgSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuU3Rha2luZ0FjdGl2YXRlOlxuICAgICAgcmV0dXJuIHN0YWtpbmdJbml0aWFsaXplSW5zdHJ1Y3Rpb24oaW5zdHJ1Y3Rpb25Ub0J1aWxkKTtcbiAgICBjYXNlIEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlN0YWtpbmdEZWFjdGl2YXRlOlxuICAgICAgcmV0dXJuIHN0YWtpbmdEZWFjdGl2YXRlSW5zdHJ1Y3Rpb24oaW5zdHJ1Y3Rpb25Ub0J1aWxkKTtcbiAgICBjYXNlIEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlN0YWtpbmdXaXRoZHJhdzpcbiAgICAgIHJldHVybiBzdGFraW5nV2l0aGRyYXdJbnN0cnVjdGlvbihpbnN0cnVjdGlvblRvQnVpbGQpO1xuICAgIGNhc2UgSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuQ3JlYXRlQXNzb2NpYXRlZFRva2VuQWNjb3VudDpcbiAgICAgIHJldHVybiBjcmVhdGVBVEFJbnN0cnVjdGlvbihpbnN0cnVjdGlvblRvQnVpbGQpO1xuICAgIGNhc2UgSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuQ2xvc2VBc3NvY2lhdGVkVG9rZW5BY2NvdW50OlxuICAgICAgcmV0dXJuIGNsb3NlQVRBSW5zdHJ1Y3Rpb24oaW5zdHJ1Y3Rpb25Ub0J1aWxkKTtcbiAgICBjYXNlIEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlN0YWtpbmdBdXRob3JpemU6XG4gICAgICByZXR1cm4gc3Rha2luZ0F1dGhvcml6ZUluc3RydWN0aW9uKGluc3RydWN0aW9uVG9CdWlsZCk7XG4gICAgY2FzZSBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5TdGFraW5nRGVsZWdhdGU6XG4gICAgICByZXR1cm4gc3Rha2luZ0RlbGVnYXRlSW5zdHJ1Y3Rpb24oaW5zdHJ1Y3Rpb25Ub0J1aWxkKTtcbiAgICBjYXNlIEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlNldFByaW9yaXR5RmVlOlxuICAgICAgcmV0dXJuIGZldGNoUHJpb3JpdHlGZWVJbnN0cnVjdGlvbihpbnN0cnVjdGlvblRvQnVpbGQpO1xuICAgIGNhc2UgSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuTWludFRvOlxuICAgICAgcmV0dXJuIG1pbnRUb0luc3RydWN0aW9uKGluc3RydWN0aW9uVG9CdWlsZCk7XG4gICAgY2FzZSBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5CdXJuOlxuICAgICAgcmV0dXJuIGJ1cm5JbnN0cnVjdGlvbihpbnN0cnVjdGlvblRvQnVpbGQpO1xuICAgIGNhc2UgSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuQ3VzdG9tSW5zdHJ1Y3Rpb246XG4gICAgICByZXR1cm4gY3VzdG9tSW5zdHJ1Y3Rpb24oaW5zdHJ1Y3Rpb25Ub0J1aWxkKTtcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGluc3RydWN0aW9uIHR5cGUgb3Igbm90IHN1cHBvcnRlZGApO1xuICB9XG59XG5cbi8qKlxuICogQ29uc3RydWN0IEFkdmFuY2UgTm9uY2UgU29sYW5hIGluc3RydWN0aW9uc1xuICpcbiAqIEBwYXJhbSB7Tm9uY2V9IGRhdGEgLSB0aGUgZGF0YSB0byBidWlsZCB0aGUgaW5zdHJ1Y3Rpb25cbiAqIEByZXR1cm5zIHtUcmFuc2FjdGlvbkluc3RydWN0aW9uW119IEFuIGFycmF5IGNvbnRhaW5pbmcgQWR2YW5jZSBOb25jZSBTb2xhbmEgaW5zdHJ1Y3Rpb25cbiAqL1xuZnVuY3Rpb24gYWR2YW5jZU5vbmNlSW5zdHJ1Y3Rpb24oZGF0YTogTm9uY2UpOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uW10ge1xuICBjb25zdCB7XG4gICAgcGFyYW1zOiB7IGF1dGhXYWxsZXRBZGRyZXNzLCB3YWxsZXROb25jZUFkZHJlc3MgfSxcbiAgfSA9IGRhdGE7XG4gIGFzc2VydChhdXRoV2FsbGV0QWRkcmVzcywgJ01pc3NpbmcgYXV0aFdhbGxldEFkZHJlc3MgcGFyYW0nKTtcbiAgYXNzZXJ0KHdhbGxldE5vbmNlQWRkcmVzcywgJ01pc3Npbmcgd2FsbGV0Tm9uY2VBZGRyZXNzIHBhcmFtJyk7XG4gIGNvbnN0IG5vbmNlSW5zdHJ1Y3Rpb24gPSBTeXN0ZW1Qcm9ncmFtLm5vbmNlQWR2YW5jZSh7XG4gICAgbm9uY2VQdWJrZXk6IG5ldyBQdWJsaWNLZXkod2FsbGV0Tm9uY2VBZGRyZXNzKSxcbiAgICBhdXRob3JpemVkUHVia2V5OiBuZXcgUHVibGljS2V5KGF1dGhXYWxsZXRBZGRyZXNzKSxcbiAgfSk7XG4gIHJldHVybiBbbm9uY2VJbnN0cnVjdGlvbl07XG59XG5cbmZ1bmN0aW9uIGZldGNoUHJpb3JpdHlGZWVJbnN0cnVjdGlvbihpbnN0cnVjdGlvblRvQnVpbGQ6IFNldFByaW9yaXR5RmVlKTogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdIHtcbiAgY29uc3QgYWRkUHJpb3JpdHlGZWUgPSBDb21wdXRlQnVkZ2V0UHJvZ3JhbS5zZXRDb21wdXRlVW5pdFByaWNlKHtcbiAgICBtaWNyb0xhbXBvcnRzOiBpbnN0cnVjdGlvblRvQnVpbGQucGFyYW1zLmZlZSxcbiAgfSk7XG5cbiAgcmV0dXJuIFthZGRQcmlvcml0eUZlZV07XG59XG5cbi8qKlxuICogQ29uc3RydWN0IE1lbW8gU29sYW5hIGluc3RydWN0aW9uc1xuICpcbiAqIEBwYXJhbSB7TWVtb30gZGF0YSAtIHRoZSBkYXRhIHRvIGJ1aWxkIHRoZSBpbnN0cnVjdGlvblxuICogQHJldHVybnMge1RyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXX0gQW4gYXJyYXkgY29udGFpbmluZyBNZW1vIFNvbGFuYSBpbnN0cnVjdGlvblxuICovXG5mdW5jdGlvbiBtZW1vSW5zdHJ1Y3Rpb24oZGF0YTogTWVtbyk6IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXSB7XG4gIGNvbnN0IHtcbiAgICBwYXJhbXM6IHsgbWVtbyB9LFxuICB9ID0gZGF0YTtcbiAgYXNzZXJ0KG1lbW8sICdNaXNzaW5nIG1lbW8gcGFyYW0nKTtcbiAgY29uc3QgbWVtb0luc3RydWN0aW9uID0gbmV3IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24oe1xuICAgIGtleXM6IFtdLFxuICAgIHByb2dyYW1JZDogbmV3IFB1YmxpY0tleShNRU1PX1BST0dSQU1fUEspLFxuICAgIGRhdGE6IEJ1ZmZlci5mcm9tKG1lbW8pLFxuICB9KTtcbiAgcmV0dXJuIFttZW1vSW5zdHJ1Y3Rpb25dO1xufVxuXG4vKipcbiAqIENvbnN0cnVjdCBUcmFuc2ZlciBTb2xhbmEgaW5zdHJ1Y3Rpb25zXG4gKlxuICogQHBhcmFtIHtUcmFuc2Zlcn0gZGF0YSAtIHRoZSBkYXRhIHRvIGJ1aWxkIHRoZSBpbnN0cnVjdGlvblxuICogQHJldHVybnMge1RyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXX0gQW4gYXJyYXkgY29udGFpbmluZyBUcmFuc2ZlciBTb2xhbmEgaW5zdHJ1Y3Rpb25cbiAqL1xuZnVuY3Rpb24gdHJhbnNmZXJJbnN0cnVjdGlvbihkYXRhOiBUcmFuc2Zlcik6IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXSB7XG4gIGNvbnN0IHtcbiAgICBwYXJhbXM6IHsgZnJvbUFkZHJlc3MsIHRvQWRkcmVzcywgYW1vdW50IH0sXG4gIH0gPSBkYXRhO1xuICBhc3NlcnQoZnJvbUFkZHJlc3MsICdNaXNzaW5nIGZyb21BZGRyZXNzIHBhcmFtJyk7XG4gIGFzc2VydCh0b0FkZHJlc3MsICdNaXNzaW5nIHRvQWRkcmVzcyBwYXJhbScpO1xuICBhc3NlcnQoYW1vdW50LCAnTWlzc2luZyB0b0FkZHJlc3MgcGFyYW0nKTtcbiAgY29uc3QgdHJhbnNmZXJJbnN0cnVjdGlvbiA9IFN5c3RlbVByb2dyYW0udHJhbnNmZXIoe1xuICAgIGZyb21QdWJrZXk6IG5ldyBQdWJsaWNLZXkoZnJvbUFkZHJlc3MpLFxuICAgIHRvUHVia2V5OiBuZXcgUHVibGljS2V5KHRvQWRkcmVzcyksXG4gICAgbGFtcG9ydHM6IHBhcnNlSW50KGFtb3VudCwgMTApLFxuICB9KTtcbiAgcmV0dXJuIFt0cmFuc2Zlckluc3RydWN0aW9uXTtcbn1cblxuLyoqXG4gKiBDb25zdHJ1Y3QgVHJhbnNmZXIgU29sYW5hIGluc3RydWN0aW9uc1xuICpcbiAqIEBwYXJhbSB7VHJhbnNmZXJ9IGRhdGEgLSB0aGUgZGF0YSB0byBidWlsZCB0aGUgaW5zdHJ1Y3Rpb25cbiAqIEByZXR1cm5zIHtUcmFuc2FjdGlvbkluc3RydWN0aW9uW119IEFuIGFycmF5IGNvbnRhaW5pbmcgVHJhbnNmZXIgU29sYW5hIGluc3RydWN0aW9uXG4gKi9cbmZ1bmN0aW9uIHRva2VuVHJhbnNmZXJJbnN0cnVjdGlvbihkYXRhOiBUb2tlblRyYW5zZmVyKTogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdIHtcbiAgY29uc3Qge1xuICAgIHBhcmFtczogeyBmcm9tQWRkcmVzcywgdG9BZGRyZXNzLCBhbW91bnQsIHRva2VuTmFtZSwgc291cmNlQWRkcmVzcyB9LFxuICB9ID0gZGF0YTtcbiAgYXNzZXJ0KGZyb21BZGRyZXNzLCAnTWlzc2luZyBmcm9tQWRkcmVzcyAob3duZXIpIHBhcmFtJyk7XG4gIGFzc2VydCh0b0FkZHJlc3MsICdNaXNzaW5nIHRvQWRkcmVzcyBwYXJhbScpO1xuICBhc3NlcnQoYW1vdW50LCAnTWlzc2luZyBhbW91bnQgcGFyYW0nKTtcbiAgYXNzZXJ0KHRva2VuTmFtZSwgJ01pc3NpbmcgdG9rZW4gbmFtZScpO1xuICBhc3NlcnQoc291cmNlQWRkcmVzcywgJ01pc3NpbmcgYXRhIGFkZHJlc3MnKTtcbiAgY29uc3QgdG9rZW4gPSBnZXRTb2xUb2tlbkZyb21Ub2tlbk5hbWUoZGF0YS5wYXJhbXMudG9rZW5OYW1lKTtcbiAgbGV0IHRva2VuQWRkcmVzczogc3RyaW5nO1xuICBsZXQgcHJvZ3JhbUlkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGxldCBkZWNpbWFsUGxhY2VzOiBudW1iZXI7XG4gIGlmIChkYXRhLnBhcmFtcy50b2tlbkFkZHJlc3MgJiYgZGF0YS5wYXJhbXMuZGVjaW1hbFBsYWNlcykge1xuICAgIHRva2VuQWRkcmVzcyA9IGRhdGEucGFyYW1zLnRva2VuQWRkcmVzcztcbiAgICBkZWNpbWFsUGxhY2VzID0gZGF0YS5wYXJhbXMuZGVjaW1hbFBsYWNlcztcbiAgICBwcm9ncmFtSWQgPSBkYXRhLnBhcmFtcy5wcm9ncmFtSWQ7XG4gIH0gZWxzZSBpZiAodG9rZW4pIHtcbiAgICBhc3NlcnQodG9rZW4gaW5zdGFuY2VvZiBTb2xDb2luKTtcbiAgICB0b2tlbkFkZHJlc3MgPSB0b2tlbi50b2tlbkFkZHJlc3M7XG4gICAgZGVjaW1hbFBsYWNlcyA9IHRva2VuLmRlY2ltYWxQbGFjZXM7XG4gICAgcHJvZ3JhbUlkID0gdG9rZW4ucHJvZ3JhbUlkO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB0b2tlbiBuYW1lLCBnb3Q6JyArIGRhdGEucGFyYW1zLnRva2VuTmFtZSk7XG4gIH1cblxuICBsZXQgdHJhbnNmZXJJbnN0cnVjdGlvbjogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbjtcbiAgaWYgKHByb2dyYW1JZCA9PT0gVE9LRU5fMjAyMl9QUk9HUkFNX0lELnRvU3RyaW5nKCkpIHtcbiAgICB0cmFuc2Zlckluc3RydWN0aW9uID0gY3JlYXRlVHJhbnNmZXJDaGVja2VkSW5zdHJ1Y3Rpb24oXG4gICAgICBuZXcgUHVibGljS2V5KHNvdXJjZUFkZHJlc3MpLFxuICAgICAgbmV3IFB1YmxpY0tleSh0b2tlbkFkZHJlc3MpLFxuICAgICAgbmV3IFB1YmxpY0tleSh0b0FkZHJlc3MpLFxuICAgICAgbmV3IFB1YmxpY0tleShmcm9tQWRkcmVzcyksXG4gICAgICBCaWdJbnQoYW1vdW50KSxcbiAgICAgIGRlY2ltYWxQbGFjZXMsXG4gICAgICBbXSxcbiAgICAgIFRPS0VOXzIwMjJfUFJPR1JBTV9JRFxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgdHJhbnNmZXJJbnN0cnVjdGlvbiA9IGNyZWF0ZVRyYW5zZmVyQ2hlY2tlZEluc3RydWN0aW9uKFxuICAgICAgbmV3IFB1YmxpY0tleShzb3VyY2VBZGRyZXNzKSxcbiAgICAgIG5ldyBQdWJsaWNLZXkodG9rZW5BZGRyZXNzKSxcbiAgICAgIG5ldyBQdWJsaWNLZXkodG9BZGRyZXNzKSxcbiAgICAgIG5ldyBQdWJsaWNLZXkoZnJvbUFkZHJlc3MpLFxuICAgICAgQmlnSW50KGFtb3VudCksXG4gICAgICBkZWNpbWFsUGxhY2VzXG4gICAgKTtcbiAgfVxuICByZXR1cm4gW3RyYW5zZmVySW5zdHJ1Y3Rpb25dO1xufVxuXG4vKipcbiAqIENvbnN0cnVjdCBUcmFuc2ZlciBTb2xhbmEgaW5zdHJ1Y3Rpb25zXG4gKlxuICogQHBhcmFtIHtUcmFuc2Zlcn0gZGF0YSAtIHRoZSBkYXRhIHRvIGJ1aWxkIHRoZSBpbnN0cnVjdGlvblxuICogQHJldHVybnMge1RyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXX0gQW4gYXJyYXkgY29udGFpbmluZyBUcmFuc2ZlciBTb2xhbmEgaW5zdHJ1Y3Rpb25cbiAqL1xuZnVuY3Rpb24gYXBwcm92ZUluc3RydWN0aW9uKGRhdGE6IEFwcHJvdmUpOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uW10ge1xuICBjb25zdCB7XG4gICAgcGFyYW1zOiB7IGFjY291bnRBZGRyZXNzLCBkZWxlZ2F0ZUFkZHJlc3MsIG93bmVyQWRkcmVzcywgYW1vdW50LCBwcm9ncmFtSWQgfSxcbiAgfSA9IGRhdGE7XG4gIGFzc2VydChhY2NvdW50QWRkcmVzcywgJ01pc3NpbmcgZnJvbUFkZHJlc3MgKG93bmVyKSBwYXJhbScpO1xuICBhc3NlcnQoZGVsZWdhdGVBZGRyZXNzLCAnTWlzc2luZyB0b0FkZHJlc3MgcGFyYW0nKTtcbiAgYXNzZXJ0KG93bmVyQWRkcmVzcywgJ01pc3Npbmcgb3duZXJBZGRyZXNzIHBhcmFtJyk7XG4gIGFzc2VydChwcm9ncmFtSWQsICdNaXNzaW5nIHByb2dyYW1JZCBwYXJhbScpO1xuICBhc3NlcnQoYW1vdW50LCAnTWlzc2luZyBhbW91bnQgcGFyYW0nKTtcbiAgcmV0dXJuIFtcbiAgICBjcmVhdGVBcHByb3ZlSW5zdHJ1Y3Rpb24oXG4gICAgICBuZXcgUHVibGljS2V5KGFjY291bnRBZGRyZXNzKSxcbiAgICAgIG5ldyBQdWJsaWNLZXkoZGVsZWdhdGVBZGRyZXNzKSxcbiAgICAgIG5ldyBQdWJsaWNLZXkob3duZXJBZGRyZXNzKSxcbiAgICAgIEJpZ0ludChhbW91bnQpLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgcHJvZ3JhbUlkID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBuZXcgUHVibGljS2V5KHByb2dyYW1JZClcbiAgICApLFxuICBdO1xufVxuXG4vKipcbiAqIENvbnN0cnVjdCBDcmVhdGUgYW5kIEluaXRpYWxpemUgTm9uY2UgU29sYW5hIGluc3RydWN0aW9uc1xuICpcbiAqIEBwYXJhbSB7V2FsbGV0SW5pdH0gZGF0YSAtIHRoZSBkYXRhIHRvIGJ1aWxkIHRoZSBpbnN0cnVjdGlvblxuICogQHJldHVybnMge1RyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXX0gQW4gYXJyYXkgY29udGFpbmluZyBDcmVhdGUgYW5kIEluaXRpYWxpemUgTm9uY2UgU29sYW5hIGluc3RydWN0aW9uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZU5vbmNlQWNjb3VudEluc3RydWN0aW9uKGRhdGE6IFdhbGxldEluaXQpOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uW10ge1xuICBjb25zdCB7XG4gICAgcGFyYW1zOiB7IGZyb21BZGRyZXNzLCBub25jZUFkZHJlc3MsIGF1dGhBZGRyZXNzLCBhbW91bnQgfSxcbiAgfSA9IGRhdGE7XG4gIGFzc2VydChmcm9tQWRkcmVzcywgJ01pc3NpbmcgZnJvbUFkZHJlc3MgcGFyYW0nKTtcbiAgYXNzZXJ0KG5vbmNlQWRkcmVzcywgJ01pc3Npbmcgbm9uY2VBZGRyZXNzIHBhcmFtJyk7XG4gIGFzc2VydChhdXRoQWRkcmVzcywgJ01pc3NpbmcgYXV0aEFkZHJlc3MgcGFyYW0nKTtcbiAgYXNzZXJ0KGFtb3VudCwgJ01pc3NpbmcgYW1vdW50IHBhcmFtJyk7XG4gIGNvbnN0IG5vbmNlQWNjb3VudEluc3RydWN0aW9uID0gU3lzdGVtUHJvZ3JhbS5jcmVhdGVOb25jZUFjY291bnQoe1xuICAgIGZyb21QdWJrZXk6IG5ldyBQdWJsaWNLZXkoZnJvbUFkZHJlc3MpLFxuICAgIG5vbmNlUHVia2V5OiBuZXcgUHVibGljS2V5KG5vbmNlQWRkcmVzcyksXG4gICAgYXV0aG9yaXplZFB1YmtleTogbmV3IFB1YmxpY0tleShhdXRoQWRkcmVzcyksXG4gICAgbGFtcG9ydHM6IG5ldyBCaWdOdW1iZXIoYW1vdW50KS50b051bWJlcigpLFxuICB9KTtcbiAgcmV0dXJuIG5vbmNlQWNjb3VudEluc3RydWN0aW9uLmluc3RydWN0aW9ucztcbn1cblxuLyoqXG4gKiBDb25zdHJ1Y3QgQ3JlYXRlIFN0YWtpbmcgQWNjb3VudCBhbmQgRGVsZWdhdGUgU29sYW5hIGluc3RydWN0aW9uc1xuICpcbiAqIEBwYXJhbSB7U3Rha2luZ0FjdGl2YXRlfSBkYXRhIC0gdGhlIGRhdGEgdG8gYnVpbGQgdGhlIGluc3RydWN0aW9uXG4gKiBAcmV0dXJucyB7VHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdfSBBbiBhcnJheSBjb250YWluaW5nIENyZWF0ZSBTdGFraW5nIEFjY291bnQgYW5kIERlbGVnYXRlIFNvbGFuYSBpbnN0cnVjdGlvbnNcbiAqL1xuZnVuY3Rpb24gc3Rha2luZ0luaXRpYWxpemVJbnN0cnVjdGlvbihkYXRhOiBTdGFraW5nQWN0aXZhdGUpOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uW10ge1xuICBjb25zdCB7XG4gICAgcGFyYW1zOiB7IGZyb21BZGRyZXNzLCBzdGFraW5nQWRkcmVzcywgYW1vdW50LCB2YWxpZGF0b3IsIHN0YWtpbmdUeXBlLCBleHRyYVBhcmFtcyB9LFxuICB9ID0gZGF0YTtcbiAgYXNzZXJ0KGZyb21BZGRyZXNzLCAnTWlzc2luZyBmcm9tQWRkcmVzcyBwYXJhbScpO1xuICBhc3NlcnQoc3Rha2luZ0FkZHJlc3MsICdNaXNzaW5nIHN0YWtpbmdBZGRyZXNzIHBhcmFtJyk7XG4gIGFzc2VydChhbW91bnQsICdNaXNzaW5nIGFtb3VudCBwYXJhbScpO1xuICBhc3NlcnQodmFsaWRhdG9yLCAnTWlzc2luZyB2YWxpZGF0b3IgcGFyYW0nKTtcblxuICBjb25zdCBmcm9tUHVia2V5ID0gbmV3IFB1YmxpY0tleShmcm9tQWRkcmVzcyk7XG4gIGNvbnN0IHN0YWtlUHVia2V5ID0gbmV3IFB1YmxpY0tleShzdGFraW5nQWRkcmVzcyk7XG4gIGNvbnN0IHZhbGlkYXRvclB1YmtleSA9IG5ldyBQdWJsaWNLZXkodmFsaWRhdG9yKTtcbiAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oKTtcblxuICBzd2l0Y2ggKHN0YWtpbmdUeXBlKSB7XG4gICAgY2FzZSBTb2xTdGFraW5nVHlwZUVudW0uSklUTzoge1xuICAgICAgYXNzZXJ0KGV4dHJhUGFyYW1zICE9PSB1bmRlZmluZWQsICdNaXNzaW5nIGV4dHJhUGFyYW1zIHBhcmFtJyk7XG4gICAgICBjb25zdCBpbnN0cnVjdGlvbnMgPSBkZXBvc2l0U29sSW5zdHJ1Y3Rpb25zKFxuICAgICAgICB7XG4gICAgICAgICAgc3Rha2VQb29sQWRkcmVzczogc3Rha2VQdWJrZXksXG4gICAgICAgICAgZnJvbTogZnJvbVB1YmtleSxcbiAgICAgICAgICBsYW1wb3J0czogQmlnSW50KGFtb3VudCksXG4gICAgICAgIH0sXG4gICAgICAgIGV4dHJhUGFyYW1zLnN0YWtlUG9vbERhdGFcbiAgICAgICk7XG4gICAgICB0eC5hZGQoLi4uaW5zdHJ1Y3Rpb25zKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGNhc2UgU29sU3Rha2luZ1R5cGVFbnVtLk1BUklOQURFOiB7XG4gICAgICBjb25zdCB3YWxsZXRJbml0U3Rha2luZyA9IFN0YWtlUHJvZ3JhbS5jcmVhdGVBY2NvdW50KHtcbiAgICAgICAgZnJvbVB1YmtleSxcbiAgICAgICAgc3Rha2VQdWJrZXksXG4gICAgICAgIGF1dGhvcml6ZWQ6IG5ldyBBdXRob3JpemVkKHZhbGlkYXRvclB1YmtleSwgZnJvbVB1YmtleSksIC8vIHN0YWtlciBhbmQgd2l0aGRyYXdlclxuICAgICAgICBsb2NrdXA6IG5ldyBMb2NrdXAoMCwgMCwgZnJvbVB1YmtleSksIC8vIE5vIG1pbmltdW0gZXBvY2ggdG8gd2l0aGRyYXdcbiAgICAgICAgbGFtcG9ydHM6IG5ldyBCaWdOdW1iZXIoYW1vdW50KS50b051bWJlcigpLFxuICAgICAgfSk7XG4gICAgICB0eC5hZGQod2FsbGV0SW5pdFN0YWtpbmcpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgY2FzZSBTb2xTdGFraW5nVHlwZUVudW0uTkFUSVZFOiB7XG4gICAgICBjb25zdCB3YWxsZXRJbml0U3Rha2luZyA9IFN0YWtlUHJvZ3JhbS5jcmVhdGVBY2NvdW50KHtcbiAgICAgICAgZnJvbVB1YmtleSxcbiAgICAgICAgc3Rha2VQdWJrZXksXG4gICAgICAgIGF1dGhvcml6ZWQ6IG5ldyBBdXRob3JpemVkKGZyb21QdWJrZXksIGZyb21QdWJrZXkpLCAvLyBzdGFrZXIgYW5kIHdpdGhkcmF3ZXJcbiAgICAgICAgbG9ja3VwOiBuZXcgTG9ja3VwKDAsIDAsIGZyb21QdWJrZXkpLCAvLyBObyBtaW5pbXVtIGVwb2NoIHRvIHdpdGhkcmF3XG4gICAgICAgIGxhbXBvcnRzOiBuZXcgQmlnTnVtYmVyKGFtb3VudCkudG9OdW1iZXIoKSxcbiAgICAgIH0pO1xuICAgICAgdHguYWRkKHdhbGxldEluaXRTdGFraW5nKTtcblxuICAgICAgY29uc3QgZGVsZWdhdGVTdGFraW5nID0gU3Rha2VQcm9ncmFtLmRlbGVnYXRlKHtcbiAgICAgICAgc3Rha2VQdWJrZXk6IG5ldyBQdWJsaWNLZXkoc3Rha2luZ0FkZHJlc3MpLFxuICAgICAgICBhdXRob3JpemVkUHVia2V5OiBuZXcgUHVibGljS2V5KGZyb21BZGRyZXNzKSxcbiAgICAgICAgdm90ZVB1YmtleTogbmV3IFB1YmxpY0tleSh2YWxpZGF0b3IpLFxuICAgICAgfSk7XG4gICAgICB0eC5hZGQoZGVsZWdhdGVTdGFraW5nKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIGNvbnN0IHVucmVhY2hhYmxlOiBuZXZlciA9IHN0YWtpbmdUeXBlO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHN0YWtpbmcgdHlwZSAke3VucmVhY2hhYmxlfWApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0eC5pbnN0cnVjdGlvbnM7XG59XG5cbi8qKlxuICogQ29uc3RydWN0IHN0YWtpbmcgZGVhY3RpdmF0ZSBTb2xhbmEgaW5zdHJ1Y3Rpb25zXG4gKlxuICogQHBhcmFtIHtTdGFraW5nRGVhY3RpdmF0ZX0gZGF0YSAtIHRoZSBkYXRhIHRvIGJ1aWxkIHRoZSBpbnN0cnVjdGlvblxuICogQHJldHVybnMge1RyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXX0gQW4gYXJyYXkgY29udGFpbmluZyBzdGFraW5nIGRlYWN0aXZhdGUgaW5zdHJ1Y3Rpb25cbiAqL1xuZnVuY3Rpb24gc3Rha2luZ0RlYWN0aXZhdGVJbnN0cnVjdGlvbihkYXRhOiBTdGFraW5nRGVhY3RpdmF0ZSk6IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXSB7XG4gIGNvbnN0IHtcbiAgICBwYXJhbXM6IHsgZnJvbUFkZHJlc3MsIHN0YWtpbmdBZGRyZXNzLCBhbW91bnQsIHVuc3Rha2luZ0FkZHJlc3MsIHJlY2lwaWVudHMsIHN0YWtpbmdUeXBlLCBleHRyYVBhcmFtcyB9LFxuICB9ID0gZGF0YTtcbiAgYXNzZXJ0KGZyb21BZGRyZXNzLCAnTWlzc2luZyBmcm9tQWRkcmVzcyBwYXJhbScpO1xuXG4gIHN3aXRjaCAoc3Rha2luZ1R5cGUpIHtcbiAgICBjYXNlIFNvbFN0YWtpbmdUeXBlRW51bS5KSVRPOiB7XG4gICAgICBhc3NlcnQoc3Rha2luZ0FkZHJlc3MsICdNaXNzaW5nIHN0YWtpbmdBZGRyZXNzIHBhcmFtJyk7XG4gICAgICBhc3NlcnQodW5zdGFraW5nQWRkcmVzcywgJ01pc3NpbmcgdW5zdGFraW5nQWRkcmVzcyBwYXJhbScpO1xuICAgICAgYXNzZXJ0KGFtb3VudCwgJ01pc3NpbmcgYW1vdW50IHBhcmFtJyk7XG4gICAgICBhc3NlcnQoZXh0cmFQYXJhbXMsICdNaXNzaW5nIGV4dHJhUGFyYW1zIHBhcmFtJyk7XG5cbiAgICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKCk7XG4gICAgICB0eC5hZGQoXG4gICAgICAgIC4uLndpdGhkcmF3U3Rha2VJbnN0cnVjdGlvbnMoXG4gICAgICAgICAge1xuICAgICAgICAgICAgc3Rha2VQb29sQWRkcmVzczogbmV3IFB1YmxpY0tleShzdGFraW5nQWRkcmVzcyksXG4gICAgICAgICAgICB0b2tlbk93bmVyOiBuZXcgUHVibGljS2V5KGZyb21BZGRyZXNzKSxcbiAgICAgICAgICAgIGRlc3RpbmF0aW9uU3Rha2VBY2NvdW50OiBuZXcgUHVibGljS2V5KHVuc3Rha2luZ0FkZHJlc3MpLFxuICAgICAgICAgICAgdmFsaWRhdG9yQWRkcmVzczogbmV3IFB1YmxpY0tleShleHRyYVBhcmFtcy52YWxpZGF0b3JBZGRyZXNzKSxcbiAgICAgICAgICAgIHRyYW5zZmVyQXV0aG9yaXR5OiBuZXcgUHVibGljS2V5KGV4dHJhUGFyYW1zLnRyYW5zZmVyQXV0aG9yaXR5QWRkcmVzcyksXG4gICAgICAgICAgICBwb29sQW1vdW50OiBhbW91bnQsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBleHRyYVBhcmFtcy5zdGFrZVBvb2xEYXRhXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgICByZXR1cm4gdHguaW5zdHJ1Y3Rpb25zO1xuICAgIH1cblxuICAgIGNhc2UgU29sU3Rha2luZ1R5cGVFbnVtLk1BUklOQURFOiB7XG4gICAgICBhc3NlcnQocmVjaXBpZW50cywgJ01pc3NpbmcgcmVjaXBpZW50cyBwYXJhbScpO1xuXG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbigpO1xuICAgICAgY29uc3QgdG9QdWJrZXlBZGRyZXNzID0gbmV3IFB1YmxpY0tleShyZWNpcGllbnRzWzBdLmFkZHJlc3MgfHwgJycpO1xuICAgICAgY29uc3QgdHJhbnNmZXJJbnN0cnVjdGlvbiA9IFN5c3RlbVByb2dyYW0udHJhbnNmZXIoe1xuICAgICAgICBmcm9tUHVia2V5OiBuZXcgUHVibGljS2V5KGZyb21BZGRyZXNzKSxcbiAgICAgICAgdG9QdWJrZXk6IHRvUHVia2V5QWRkcmVzcyxcbiAgICAgICAgbGFtcG9ydHM6IHBhcnNlSW50KHJlY2lwaWVudHNbMF0uYW1vdW50LCAxMCksXG4gICAgICB9KTtcblxuICAgICAgdHguYWRkKHRyYW5zZmVySW5zdHJ1Y3Rpb24pO1xuICAgICAgcmV0dXJuIHR4Lmluc3RydWN0aW9ucztcbiAgICB9XG5cbiAgICBjYXNlIFNvbFN0YWtpbmdUeXBlRW51bS5OQVRJVkU6IHtcbiAgICAgIGFzc2VydChzdGFraW5nQWRkcmVzcywgJ01pc3Npbmcgc3Rha2luZ0FkZHJlc3MgcGFyYW0nKTtcblxuICAgICAgaWYgKGRhdGEucGFyYW1zLmFtb3VudCAmJiBkYXRhLnBhcmFtcy51bnN0YWtpbmdBZGRyZXNzKSB7XG4gICAgICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKCk7XG4gICAgICAgIGNvbnN0IHVuc3Rha2luZ0FkZHJlc3MgPSBuZXcgUHVibGljS2V5KGRhdGEucGFyYW1zLnVuc3Rha2luZ0FkZHJlc3MpO1xuXG4gICAgICAgIGNvbnN0IGFsbG9jYXRlQWNjb3VudCA9IFN5c3RlbVByb2dyYW0uYWxsb2NhdGUoe1xuICAgICAgICAgIGFjY291bnRQdWJrZXk6IHVuc3Rha2luZ0FkZHJlc3MsXG4gICAgICAgICAgc3BhY2U6IFN0YWtlUHJvZ3JhbS5zcGFjZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHR4LmFkZChhbGxvY2F0ZUFjY291bnQpO1xuXG4gICAgICAgIGNvbnN0IGFzc2lnbkFjY291bnQgPSBTeXN0ZW1Qcm9ncmFtLmFzc2lnbih7XG4gICAgICAgICAgYWNjb3VudFB1YmtleTogdW5zdGFraW5nQWRkcmVzcyxcbiAgICAgICAgICBwcm9ncmFtSWQ6IFN0YWtlUHJvZ3JhbS5wcm9ncmFtSWQsXG4gICAgICAgIH0pO1xuICAgICAgICB0eC5hZGQoYXNzaWduQWNjb3VudCk7XG5cbiAgICAgICAgY29uc3Qgc3BsaXRTdGFrZSA9IFN0YWtlUHJvZ3JhbS5zcGxpdChcbiAgICAgICAgICB7XG4gICAgICAgICAgICBzdGFrZVB1YmtleTogbmV3IFB1YmxpY0tleShzdGFraW5nQWRkcmVzcyksXG4gICAgICAgICAgICBhdXRob3JpemVkUHVia2V5OiBuZXcgUHVibGljS2V5KGZyb21BZGRyZXNzKSxcbiAgICAgICAgICAgIHNwbGl0U3Rha2VQdWJrZXk6IHVuc3Rha2luZ0FkZHJlc3MsXG4gICAgICAgICAgICBsYW1wb3J0czogbmV3IEJpZ051bWJlcihkYXRhLnBhcmFtcy5hbW91bnQpLnRvTnVtYmVyKCksXG4gICAgICAgICAgfSxcbiAgICAgICAgICAwXG4gICAgICAgICk7XG4gICAgICAgIHR4LmFkZChzcGxpdFN0YWtlLmluc3RydWN0aW9uc1sxXSk7XG5cbiAgICAgICAgY29uc3QgZGVhY3RpdmF0ZVN0YWtpbmcgPSBTdGFrZVByb2dyYW0uZGVhY3RpdmF0ZSh7XG4gICAgICAgICAgc3Rha2VQdWJrZXk6IHVuc3Rha2luZ0FkZHJlc3MsXG4gICAgICAgICAgYXV0aG9yaXplZFB1YmtleTogbmV3IFB1YmxpY0tleShmcm9tQWRkcmVzcyksXG4gICAgICAgIH0pO1xuICAgICAgICB0eC5hZGQoZGVhY3RpdmF0ZVN0YWtpbmcpO1xuXG4gICAgICAgIHJldHVybiB0eC5pbnN0cnVjdGlvbnM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBkZWFjdGl2YXRlU3Rha2luZyA9IFN0YWtlUHJvZ3JhbS5kZWFjdGl2YXRlKHtcbiAgICAgICAgICBzdGFrZVB1YmtleTogbmV3IFB1YmxpY0tleShzdGFraW5nQWRkcmVzcyksXG4gICAgICAgICAgYXV0aG9yaXplZFB1YmtleTogbmV3IFB1YmxpY0tleShmcm9tQWRkcmVzcyksXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBkZWFjdGl2YXRlU3Rha2luZy5pbnN0cnVjdGlvbnM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZGVmYXVsdDoge1xuICAgICAgY29uc3QgdW5yZWFjaGFibGU6IG5ldmVyID0gc3Rha2luZ1R5cGU7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gc3Rha2luZyB0eXBlICR7dW5yZWFjaGFibGV9YCk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQ29uc3RydWN0IFN0YWtpbmcgV2l0aGRyYXcgU29sYW5hIGluc3RydWN0aW9uc1xuICpcbiAqIEBwYXJhbSB7U3Rha2luZ1dpdGhkcmF3fSBkYXRhIC0gdGhlIGRhdGEgdG8gYnVpbGQgdGhlIGluc3RydWN0aW9uXG4gKiBAcmV0dXJucyB7VHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdfSBBbiBhcnJheSBjb250YWluaW5nIFN0YWtpbmcgV2l0aGRyYXcgIFNvbGFuYSBpbnN0cnVjdGlvbnNcbiAqL1xuZnVuY3Rpb24gc3Rha2luZ1dpdGhkcmF3SW5zdHJ1Y3Rpb24oZGF0YTogU3Rha2luZ1dpdGhkcmF3KTogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdIHtcbiAgY29uc3Qge1xuICAgIHBhcmFtczogeyBmcm9tQWRkcmVzcywgc3Rha2luZ0FkZHJlc3MsIGFtb3VudCB9LFxuICB9ID0gZGF0YTtcbiAgYXNzZXJ0KGZyb21BZGRyZXNzLCAnTWlzc2luZyBmcm9tQWRkcmVzcyBwYXJhbScpO1xuICBhc3NlcnQoc3Rha2luZ0FkZHJlc3MsICdNaXNzaW5nIHN0YWtpbmdBZGRyZXNzIHBhcmFtJyk7XG4gIGFzc2VydChhbW91bnQsICdNaXNzaW5nIGFtb3VudCBwYXJhbScpO1xuXG4gIGNvbnN0IHdpdGhkcmF3U3Rha2luZyA9IFN0YWtlUHJvZ3JhbS53aXRoZHJhdyh7XG4gICAgc3Rha2VQdWJrZXk6IG5ldyBQdWJsaWNLZXkoc3Rha2luZ0FkZHJlc3MpLFxuICAgIGF1dGhvcml6ZWRQdWJrZXk6IG5ldyBQdWJsaWNLZXkoZnJvbUFkZHJlc3MpLFxuICAgIHRvUHVia2V5OiBuZXcgUHVibGljS2V5KGZyb21BZGRyZXNzKSxcbiAgICBsYW1wb3J0czogbmV3IEJpZ051bWJlcihhbW91bnQpLnRvTnVtYmVyKCksXG4gIH0pO1xuXG4gIHJldHVybiB3aXRoZHJhd1N0YWtpbmcuaW5zdHJ1Y3Rpb25zO1xufVxuXG4vKipcbiAqIENvbnN0cnVjdCBDcmVhdGUgYW5kIEluaXRpYWxpemUgTm9uY2UgU29sYW5hIGluc3RydWN0aW9uc1xuICpcbiAqIEBwYXJhbSB7V2FsbGV0SW5pdH0gZGF0YSAtIHRoZSBkYXRhIHRvIGJ1aWxkIHRoZSBpbnN0cnVjdGlvblxuICogQHJldHVybnMge1RyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXX0gQW4gYXJyYXkgY29udGFpbmluZyBDcmVhdGUgYW5kIEluaXRpYWxpemUgTm9uY2UgU29sYW5hIGluc3RydWN0aW9uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUFUQUluc3RydWN0aW9uKGRhdGE6IEF0YUluaXQpOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uW10ge1xuICBjb25zdCB7XG4gICAgcGFyYW1zOiB7IG1pbnRBZGRyZXNzLCBhdGFBZGRyZXNzLCBvd25lckFkZHJlc3MsIHBheWVyQWRkcmVzcywgcHJvZ3JhbUlkIH0sXG4gIH0gPSBkYXRhO1xuICBhc3NlcnQobWludEFkZHJlc3MsICdNaXNzaW5nIG1pbnRBZGRyZXNzIHBhcmFtJyk7XG4gIGFzc2VydChhdGFBZGRyZXNzLCAnTWlzc2luZyBhdGFBZGRyZXNzIHBhcmFtJyk7XG4gIGFzc2VydChvd25lckFkZHJlc3MsICdNaXNzaW5nIG93bmVyQWRkcmVzcyBwYXJhbScpO1xuICBhc3NlcnQocGF5ZXJBZGRyZXNzLCAnTWlzc2luZyBwYXllckFkZHJlc3MgcGFyYW0nKTtcblxuICBsZXQgYXNzb2NpYXRlZFRva2VuQWNjb3VudEluc3RydWN0aW9uOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uO1xuICBpZiAocHJvZ3JhbUlkICYmIHByb2dyYW1JZCA9PT0gVE9LRU5fMjAyMl9QUk9HUkFNX0lELnRvU3RyaW5nKCkpIHtcbiAgICBhc3NvY2lhdGVkVG9rZW5BY2NvdW50SW5zdHJ1Y3Rpb24gPSBjcmVhdGVBc3NvY2lhdGVkVG9rZW5BY2NvdW50SW5zdHJ1Y3Rpb24oXG4gICAgICBuZXcgUHVibGljS2V5KHBheWVyQWRkcmVzcyksXG4gICAgICBuZXcgUHVibGljS2V5KGF0YUFkZHJlc3MpLFxuICAgICAgbmV3IFB1YmxpY0tleShvd25lckFkZHJlc3MpLFxuICAgICAgbmV3IFB1YmxpY0tleShtaW50QWRkcmVzcyksXG4gICAgICBUT0tFTl8yMDIyX1BST0dSQU1fSURcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIGFzc29jaWF0ZWRUb2tlbkFjY291bnRJbnN0cnVjdGlvbiA9IGNyZWF0ZUFzc29jaWF0ZWRUb2tlbkFjY291bnRJbnN0cnVjdGlvbihcbiAgICAgIG5ldyBQdWJsaWNLZXkocGF5ZXJBZGRyZXNzKSxcbiAgICAgIG5ldyBQdWJsaWNLZXkoYXRhQWRkcmVzcyksXG4gICAgICBuZXcgUHVibGljS2V5KG93bmVyQWRkcmVzcyksXG4gICAgICBuZXcgUHVibGljS2V5KG1pbnRBZGRyZXNzKVxuICAgICk7XG4gIH1cbiAgcmV0dXJuIFthc3NvY2lhdGVkVG9rZW5BY2NvdW50SW5zdHJ1Y3Rpb25dO1xufVxuXG4vKipcbiAqIENvbnN0cnVjdCBDbG9zZSBBVEEgU29sYW5hIGluc3RydWN0aW9uc1xuICpcbiAqIEBwYXJhbSB7V2FsbGV0SW5pdH0gZGF0YSAtIHRoZSBkYXRhIHRvIGJ1aWxkIHRoZSBpbnN0cnVjdGlvblxuICogQHJldHVybnMge1RyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXX0gQW4gYXJyYXkgY29udGFpbmluZyBDbG9zZSBBVEEgU29sYW5hIGluc3RydWN0aW9uXG4gKi9cbmZ1bmN0aW9uIGNsb3NlQVRBSW5zdHJ1Y3Rpb24oZGF0YTogQXRhQ2xvc2UpOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uW10ge1xuICBjb25zdCB7XG4gICAgcGFyYW1zOiB7IGFjY291bnRBZGRyZXNzLCBkZXN0aW5hdGlvbkFkZHJlc3MsIGF1dGhvcml0eUFkZHJlc3MgfSxcbiAgfSA9IGRhdGE7XG4gIGFzc2VydChhY2NvdW50QWRkcmVzcywgJ01pc3NpbmcgYWNjb3VudEFkZHJlc3MgcGFyYW0nKTtcbiAgYXNzZXJ0KGRlc3RpbmF0aW9uQWRkcmVzcywgJ01pc3NpbmcgZGVzdGluYXRpb25BZGRyZXNzIHBhcmFtJyk7XG4gIGFzc2VydChhdXRob3JpdHlBZGRyZXNzLCAnTWlzc2luZyBhdXRob3JpdHlBZGRyZXNzIHBhcmFtJyk7XG5cbiAgY29uc3QgY2xvc2VBc3NvY2lhdGVkVG9rZW5BY2NvdW50SW5zdHJ1Y3Rpb24gPSBjcmVhdGVDbG9zZUFjY291bnRJbnN0cnVjdGlvbihcbiAgICBuZXcgUHVibGljS2V5KGFjY291bnRBZGRyZXNzKSxcbiAgICBuZXcgUHVibGljS2V5KGRlc3RpbmF0aW9uQWRkcmVzcyksXG4gICAgbmV3IFB1YmxpY0tleShhdXRob3JpdHlBZGRyZXNzKVxuICApO1xuICByZXR1cm4gW2Nsb3NlQXNzb2NpYXRlZFRva2VuQWNjb3VudEluc3RydWN0aW9uXTtcbn1cblxuLyoqXG4gKiBDb25zdHJ1Y3QgU3Rha2luZyBBY2NvdW50IEF1dGhvcml6ZSBTb2xhbmEgaW5zdHJ1Y3Rpb25zXG4gKlxuICogQHBhcmFtIHtTdGFraW5nQXV0aG9yaXplfSBkYXRhIC0gdGhlIGRhdGEgdG8gYnVpbGQgdGhlIGluc3RydWN0aW9uXG4gKiBAcmV0dXJucyB7VHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdfSBBbiBhcnJheSBjb250YWluaW5nIFN0YWtpbmcgQWNjb3VudCBBdXRob3JpemUgaW5zdHJ1Y3Rpb25zXG4gKi9cbmZ1bmN0aW9uIHN0YWtpbmdBdXRob3JpemVJbnN0cnVjdGlvbihkYXRhOiBTdGFraW5nQXV0aG9yaXplKTogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdIHtcbiAgY29uc3Qge1xuICAgIHBhcmFtczogeyBzdGFraW5nQWRkcmVzcywgb2xkQXV0aG9yaXplQWRkcmVzcywgbmV3QXV0aG9yaXplQWRkcmVzcywgbmV3V2l0aGRyYXdBZGRyZXNzIH0sXG4gIH0gPSBkYXRhO1xuICBhc3NlcnQoc3Rha2luZ0FkZHJlc3MsICdNaXNzaW5nIHN0YWtpbmdBZGRyZXNzIHBhcmFtJyk7XG4gIGFzc2VydChvbGRBdXRob3JpemVBZGRyZXNzLCAnTWlzc2luZyBvbGRBdXRob3JpemVBZGRyZXNzIHBhcmFtJyk7XG4gIGFzc2VydChuZXdBdXRob3JpemVBZGRyZXNzLCAnTWlzc2luZyBuZXdBdXRob3JpemVBZGRyZXNzIHBhcmFtJyk7XG4gIGFzc2VydChuZXdXaXRoZHJhd0FkZHJlc3MsICdNaXNzaW5nIG5ld1dpdGhkcmF3QWRkcmVzcyBwYXJhbScpO1xuXG4gIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKCk7XG5cbiAgY29uc3QgYXV0aG9yaXplU3Rha2luZyA9IFN0YWtlUHJvZ3JhbS5hdXRob3JpemUoe1xuICAgIHN0YWtlUHVia2V5OiBuZXcgUHVibGljS2V5KHN0YWtpbmdBZGRyZXNzKSxcbiAgICBhdXRob3JpemVkUHVia2V5OiBuZXcgUHVibGljS2V5KG9sZEF1dGhvcml6ZUFkZHJlc3MpLFxuICAgIG5ld0F1dGhvcml6ZWRQdWJrZXk6IG5ldyBQdWJsaWNLZXkobmV3QXV0aG9yaXplQWRkcmVzcyksXG4gICAgc3Rha2VBdXRob3JpemF0aW9uVHlwZTogU3Rha2VBdXRob3JpemF0aW9uTGF5b3V0LlN0YWtlcixcbiAgfSk7XG5cbiAgY29uc3QgYXV0aG9yaXplV2l0aGRyYXcgPSBTdGFrZVByb2dyYW0uYXV0aG9yaXplKHtcbiAgICBzdGFrZVB1YmtleTogbmV3IFB1YmxpY0tleShzdGFraW5nQWRkcmVzcyksXG4gICAgYXV0aG9yaXplZFB1YmtleTogbmV3IFB1YmxpY0tleShvbGRBdXRob3JpemVBZGRyZXNzKSxcbiAgICBuZXdBdXRob3JpemVkUHVia2V5OiBuZXcgUHVibGljS2V5KG5ld0F1dGhvcml6ZUFkZHJlc3MpLFxuICAgIHN0YWtlQXV0aG9yaXphdGlvblR5cGU6IFN0YWtlQXV0aG9yaXphdGlvbkxheW91dC5XaXRoZHJhd2VyLFxuICAgIGN1c3RvZGlhblB1YmtleTogbmV3IFB1YmxpY0tleShuZXdXaXRoZHJhd0FkZHJlc3MpLFxuICB9KTtcbiAgdHguYWRkKGF1dGhvcml6ZVN0YWtpbmcpO1xuICB0eC5hZGQoYXV0aG9yaXplV2l0aGRyYXcpO1xuXG4gIHJldHVybiB0eC5pbnN0cnVjdGlvbnM7XG59XG5cbi8qKlxuICogQ29uc3RydWN0IERlbGVnYXRlIFNvbGFuYSBpbnN0cnVjdGlvbnNcbiAqXG4gKiBAcGFyYW0ge1N0YWtpbmdBY3RpdmF0ZX0gZGF0YSAtIHRoZSBkYXRhIHRvIGJ1aWxkIHRoZSBpbnN0cnVjdGlvblxuICogQHJldHVybnMge1RyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXX0gQW4gYXJyYXkgY29udGFpbmluZyBEZWxlZ2F0ZSBTb2xhbmEgaW5zdHJ1Y3Rpb25zXG4gKi9cbmZ1bmN0aW9uIHN0YWtpbmdEZWxlZ2F0ZUluc3RydWN0aW9uKGRhdGE6IFN0YWtpbmdEZWxlZ2F0ZSk6IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXSB7XG4gIGNvbnN0IHtcbiAgICBwYXJhbXM6IHsgZnJvbUFkZHJlc3MsIHN0YWtpbmdBZGRyZXNzLCB2YWxpZGF0b3IgfSxcbiAgfSA9IGRhdGE7XG4gIGFzc2VydChmcm9tQWRkcmVzcywgJ01pc3NpbmcgZnJvbUFkZHJlc3MgcGFyYW0nKTtcbiAgYXNzZXJ0KHN0YWtpbmdBZGRyZXNzLCAnTWlzc2luZyBzdGFraW5nQWRkcmVzcyBwYXJhbScpO1xuICBhc3NlcnQodmFsaWRhdG9yLCAnTWlzc2luZyB2YWxpZGF0b3IgcGFyYW0nKTtcbiAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oKTtcbiAgY29uc3QgZGVsZWdhdGVTdGFraW5nID0gU3Rha2VQcm9ncmFtLmRlbGVnYXRlKHtcbiAgICBzdGFrZVB1YmtleTogbmV3IFB1YmxpY0tleShzdGFraW5nQWRkcmVzcyksXG4gICAgYXV0aG9yaXplZFB1YmtleTogbmV3IFB1YmxpY0tleShmcm9tQWRkcmVzcyksXG4gICAgdm90ZVB1YmtleTogbmV3IFB1YmxpY0tleSh2YWxpZGF0b3IpLFxuICB9KTtcbiAgdHguYWRkKGRlbGVnYXRlU3Rha2luZyk7XG5cbiAgcmV0dXJuIHR4Lmluc3RydWN0aW9ucztcbn1cblxuLyoqXG4gKiBDb25zdHJ1Y3QgTWludFRvIFNvbGFuYSBpbnN0cnVjdGlvbnNcbiAqXG4gKiBAcGFyYW0ge01pbnRUb30gZGF0YSAtIHRoZSBkYXRhIHRvIGJ1aWxkIHRoZSBpbnN0cnVjdGlvblxuICogQHJldHVybnMge1RyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXX0gQW4gYXJyYXkgY29udGFpbmluZyBNaW50VG8gU29sYW5hIGluc3RydWN0aW9uc1xuICovXG5mdW5jdGlvbiBtaW50VG9JbnN0cnVjdGlvbihkYXRhOiBNaW50VG8pOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uW10ge1xuICBjb25zdCB7XG4gICAgcGFyYW1zOiB7IG1pbnRBZGRyZXNzLCBkZXN0aW5hdGlvbkFkZHJlc3MsIGF1dGhvcml0eUFkZHJlc3MsIGFtb3VudCwgcHJvZ3JhbUlkIH0sXG4gIH0gPSBkYXRhO1xuICBhc3NlcnQobWludEFkZHJlc3MsICdNaXNzaW5nIG1pbnRBZGRyZXNzIHBhcmFtJyk7XG4gIGFzc2VydChkZXN0aW5hdGlvbkFkZHJlc3MsICdNaXNzaW5nIGRlc3RpbmF0aW9uQWRkcmVzcyBwYXJhbScpO1xuICBhc3NlcnQoYXV0aG9yaXR5QWRkcmVzcywgJ01pc3NpbmcgYXV0aG9yaXR5QWRkcmVzcyBwYXJhbScpO1xuICBhc3NlcnQoYW1vdW50LCAnTWlzc2luZyBhbW91bnQgcGFyYW0nKTtcblxuICBjb25zdCBtaW50ID0gbmV3IFB1YmxpY0tleShtaW50QWRkcmVzcyk7XG4gIGNvbnN0IGRlc3RpbmF0aW9uID0gbmV3IFB1YmxpY0tleShkZXN0aW5hdGlvbkFkZHJlc3MpO1xuICBjb25zdCBhdXRob3JpdHkgPSBuZXcgUHVibGljS2V5KGF1dGhvcml0eUFkZHJlc3MpO1xuXG4gIGxldCBtaW50VG9JbnN0cjogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbjtcbiAgaWYgKHByb2dyYW1JZCAmJiBwcm9ncmFtSWQgPT09IFRPS0VOXzIwMjJfUFJPR1JBTV9JRC50b1N0cmluZygpKSB7XG4gICAgbWludFRvSW5zdHIgPSBjcmVhdGVNaW50VG9JbnN0cnVjdGlvbihtaW50LCBkZXN0aW5hdGlvbiwgYXV0aG9yaXR5LCBCaWdJbnQoYW1vdW50KSwgW10sIFRPS0VOXzIwMjJfUFJPR1JBTV9JRCk7XG4gIH0gZWxzZSB7XG4gICAgbWludFRvSW5zdHIgPSBjcmVhdGVNaW50VG9JbnN0cnVjdGlvbihtaW50LCBkZXN0aW5hdGlvbiwgYXV0aG9yaXR5LCBCaWdJbnQoYW1vdW50KSk7XG4gIH1cblxuICByZXR1cm4gW21pbnRUb0luc3RyXTtcbn1cblxuLyoqXG4gKiBDb25zdHJ1Y3QgQnVybiBTb2xhbmEgaW5zdHJ1Y3Rpb25zXG4gKlxuICogQHBhcmFtIHtCdXJufSBkYXRhIC0gdGhlIGRhdGEgdG8gYnVpbGQgdGhlIGluc3RydWN0aW9uXG4gKiBAcmV0dXJucyB7VHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdfSBBbiBhcnJheSBjb250YWluaW5nIEJ1cm4gU29sYW5hIGluc3RydWN0aW9uc1xuICovXG5mdW5jdGlvbiBidXJuSW5zdHJ1Y3Rpb24oZGF0YTogQnVybik6IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXSB7XG4gIGNvbnN0IHtcbiAgICBwYXJhbXM6IHsgbWludEFkZHJlc3MsIGFjY291bnRBZGRyZXNzLCBhdXRob3JpdHlBZGRyZXNzLCBhbW91bnQsIHByb2dyYW1JZCB9LFxuICB9ID0gZGF0YTtcbiAgYXNzZXJ0KG1pbnRBZGRyZXNzLCAnTWlzc2luZyBtaW50QWRkcmVzcyBwYXJhbScpO1xuICBhc3NlcnQoYWNjb3VudEFkZHJlc3MsICdNaXNzaW5nIGFjY291bnRBZGRyZXNzIHBhcmFtJyk7XG4gIGFzc2VydChhdXRob3JpdHlBZGRyZXNzLCAnTWlzc2luZyBhdXRob3JpdHlBZGRyZXNzIHBhcmFtJyk7XG4gIGFzc2VydChhbW91bnQsICdNaXNzaW5nIGFtb3VudCBwYXJhbScpO1xuXG4gIGNvbnN0IG1pbnQgPSBuZXcgUHVibGljS2V5KG1pbnRBZGRyZXNzKTtcbiAgY29uc3QgYWNjb3VudCA9IG5ldyBQdWJsaWNLZXkoYWNjb3VudEFkZHJlc3MpO1xuICBjb25zdCBhdXRob3JpdHkgPSBuZXcgUHVibGljS2V5KGF1dGhvcml0eUFkZHJlc3MpO1xuXG4gIGxldCBidXJuSW5zdHI6IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb247XG4gIGlmIChwcm9ncmFtSWQgJiYgcHJvZ3JhbUlkID09PSBUT0tFTl8yMDIyX1BST0dSQU1fSUQudG9TdHJpbmcoKSkge1xuICAgIGJ1cm5JbnN0ciA9IGNyZWF0ZUJ1cm5JbnN0cnVjdGlvbihhY2NvdW50LCBtaW50LCBhdXRob3JpdHksIEJpZ0ludChhbW91bnQpLCBbXSwgVE9LRU5fMjAyMl9QUk9HUkFNX0lEKTtcbiAgfSBlbHNlIHtcbiAgICBidXJuSW5zdHIgPSBjcmVhdGVCdXJuSW5zdHJ1Y3Rpb24oYWNjb3VudCwgbWludCwgYXV0aG9yaXR5LCBCaWdJbnQoYW1vdW50KSk7XG4gIH1cblxuICByZXR1cm4gW2J1cm5JbnN0cl07XG59XG5cbi8qKlxuICogUHJvY2VzcyBjdXN0b20gaW5zdHJ1Y3Rpb24gLSBjb252ZXJ0cyB0byBUcmFuc2FjdGlvbkluc3RydWN0aW9uXG4gKiBIYW5kbGVzIGNvbnZlcnNpb24gZnJvbSBzdHJpbmctYmFzZWQgZm9ybWF0IHRvIFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24gZm9ybWF0XG4gKlxuICogQHBhcmFtIHtDdXN0b21JbnN0cnVjdGlvbn0gZGF0YSAtIHRoZSBkYXRhIGNvbnRhaW5pbmcgdGhlIGN1c3RvbSBpbnN0cnVjdGlvblxuICogQHJldHVybnMge1RyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXX0gQW4gYXJyYXkgY29udGFpbmluZyB0aGUgY3VzdG9tIGluc3RydWN0aW9uXG4gKi9cbmZ1bmN0aW9uIGN1c3RvbUluc3RydWN0aW9uKGRhdGE6IEluc3RydWN0aW9uUGFyYW1zKTogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdIHtcbiAgY29uc3QgeyBwYXJhbXMgfSA9IGRhdGEgYXMgQ3VzdG9tSW5zdHJ1Y3Rpb247XG4gIGFzc2VydChwYXJhbXMucHJvZ3JhbUlkLCAnTWlzc2luZyBwcm9ncmFtSWQgaW4gY3VzdG9tIGluc3RydWN0aW9uJyk7XG4gIGFzc2VydChwYXJhbXMua2V5cyAmJiBBcnJheS5pc0FycmF5KHBhcmFtcy5rZXlzKSwgJ01pc3Npbmcgb3IgaW52YWxpZCBrZXlzIGluIGN1c3RvbSBpbnN0cnVjdGlvbicpO1xuICBhc3NlcnQocGFyYW1zLmRhdGEgIT09IHVuZGVmaW5lZCwgJ01pc3NpbmcgZGF0YSBpbiBjdXN0b20gaW5zdHJ1Y3Rpb24nKTtcblxuICAvLyBDb252ZXJ0IHN0cmluZyBkYXRhIHRvIEJ1ZmZlclxuICBsZXQgZGF0YUJ1ZmZlcjogQnVmZmVyO1xuXG4gIGlmIChpc1ZhbGlkQmFzZTY0KHBhcmFtcy5kYXRhKSkge1xuICAgIGRhdGFCdWZmZXIgPSBCdWZmZXIuZnJvbShwYXJhbXMuZGF0YSwgJ2Jhc2U2NCcpO1xuICB9IGVsc2UgaWYgKGlzVmFsaWRIZXgocGFyYW1zLmRhdGEpKSB7XG4gICAgZGF0YUJ1ZmZlciA9IEJ1ZmZlci5mcm9tKHBhcmFtcy5kYXRhLCAnaGV4Jyk7XG4gIH0gZWxzZSB7XG4gICAgLy8gRmFsbGJhY2sgdG8gVVRGLThcbiAgICBkYXRhQnVmZmVyID0gQnVmZmVyLmZyb20ocGFyYW1zLmRhdGEsICd1dGY4Jyk7XG4gIH1cblxuICAvLyBDcmVhdGUgYSBuZXcgVHJhbnNhY3Rpb25JbnN0cnVjdGlvbiB3aXRoIHRoZSBjb252ZXJ0ZWQgZGF0YVxuICBjb25zdCBjb252ZXJ0ZWRJbnN0cnVjdGlvbiA9IG5ldyBUcmFuc2FjdGlvbkluc3RydWN0aW9uKHtcbiAgICBwcm9ncmFtSWQ6IG5ldyBQdWJsaWNLZXkocGFyYW1zLnByb2dyYW1JZCksXG4gICAga2V5czogcGFyYW1zLmtleXMubWFwKChrZXkpID0+ICh7XG4gICAgICBwdWJrZXk6IG5ldyBQdWJsaWNLZXkoa2V5LnB1YmtleSksXG4gICAgICBpc1NpZ25lcjoga2V5LmlzU2lnbmVyLFxuICAgICAgaXNXcml0YWJsZToga2V5LmlzV3JpdGFibGUsXG4gICAgfSkpLFxuICAgIGRhdGE6IGRhdGFCdWZmZXIsXG4gIH0pO1xuXG4gIHJldHVybiBbY29udmVydGVkSW5zdHJ1Y3Rpb25dO1xufVxuIl19

Выполнить команду


Для локальной разработки. Не используйте в интернете!