@bitgo/utxo-bin
Version:
Command-line utility for BitGo UTXO transactions
162 lines • 22.7 kB
JavaScript
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.cmdParseTx = void 0;
exports.getTxParser = getTxParser;
const utxolib = __importStar(require("@bitgo/utxo-lib"));
const args_1 = require("../args");
const TxParser_1 = require("../TxParser");
const fetch_1 = require("../fetch");
const ParserTx_1 = require("../ParserTx");
const parseUnknown_1 = require("../parseUnknown");
const Parser_1 = require("../Parser");
const formatString_1 = require("./formatString");
const prevTx_1 = require("../prevTx");
function getTxParser(argv) {
if (argv.all) {
return new TxParser_1.TxParser({ ...argv, ...TxParser_1.TxParser.PARSE_ALL });
}
return new TxParser_1.TxParser({
...argv,
parseSignatureData: {
script: argv.parseSignatureData,
ecdsa: argv.parseSignatureData,
schnorr: argv.parseSignatureData,
},
});
}
exports.cmdParseTx = {
command: 'parseTx [path]',
aliases: ['parse', 'tx'],
describe: 'Display transaction components in human-readable form. ' +
'Supported formats are Partially Signed Bitcoin Transaction (PSBT), ' +
'bitcoinjs-lib encoding (Legacy) or fully signed transaction. ' +
'Bytes must be encoded in hex or base64 format.',
builder(b) {
return b
.options(args_1.readStringOptions)
.options((0, args_1.getNetworkOptionsDemand)())
.option('txid', { type: 'string' })
.option('prevTx', { type: 'string', description: 'previous transaction hex or base64 string', array: true })
.option('blockHeight', { type: 'number' })
.option('txIndex', { type: 'number' })
.option('fetchAll', { type: 'boolean', default: false })
.option('fetchStatus', { type: 'boolean', default: false })
.option('fetchInputs', { type: 'boolean', default: false })
.option('fetchSpends', { type: 'boolean', default: false })
.option('parseScriptAsm', { alias: 'scriptasm', type: 'boolean', default: false })
.option('parseScriptData', { alias: 'scriptdata', type: 'boolean', default: false })
.option('parseSignatureData', { alias: 'sigdata', type: 'boolean', default: false })
.option('parseOutputScript', { type: 'boolean', default: false })
.option('parseAsUnknown', {
type: 'boolean',
default: false,
description: 'show plain Javascript object without any post-processing',
})
.option('maxOutputs', { type: 'number' })
.option('vin', { type: 'number' })
.array('vin')
.option('vout', { type: 'number' })
.array('vout')
.option('finalize', {
type: 'boolean',
default: false,
description: 'finalize PSBT and parse result instead of PSBT',
})
.option('all', { type: 'boolean', default: false })
.option('cache', {
type: 'boolean',
default: false,
description: 'use local cache for http responses',
})
.option('format', args_1.formatTreeOrJson)
.option('parseError', { choices: ['continue', 'throw'], default: 'continue' });
},
async handler(argv) {
let data;
const httpClient = await (0, fetch_1.getClient)({ cache: argv.cache });
if (argv.txid || argv.blockHeight !== undefined || argv.txIndex !== undefined) {
data = await (0, fetch_1.fetchTransactionHex)(httpClient, {
txid: argv.txid,
blockHeight: argv.blockHeight,
txIndex: argv.txIndex,
}, argv.network);
}
const string = await (0, args_1.argToString)(argv, data);
if (!string) {
throw new Error(`no txdata`);
}
function decodeBytes(bytes) {
return utxolib.bitgo.isPsbt(bytes)
? utxolib.bitgo.createPsbtFromBuffer(bytes, argv.network)
: utxolib.bitgo.createTransactionFromBuffer(bytes, argv.network, { amountType: 'bigint' });
}
const bytes = (0, args_1.stringToBuffer)(string, ['hex', 'base64']);
let tx = decodeBytes(bytes);
const { id: txid } = (0, ParserTx_1.getParserTxProperties)(tx, undefined);
if (tx instanceof utxolib.bitgo.UtxoTransaction) {
if (argv.txid && txid !== argv.txid) {
throw new Error(`computed txid does not match txid argument`);
}
}
else if (argv.finalize) {
tx.finalizeAllInputs();
tx = tx.extractTransaction();
}
const prevTxs = (argv.prevTx ?? []).map((s) => {
const buf = (0, args_1.stringToBuffer)(s, ['hex', 'base64']);
return decodeBytes(buf);
});
if (argv.parseAsUnknown) {
console.log((0, formatString_1.formatString)((0, parseUnknown_1.parseUnknown)(new Parser_1.Parser(), 'tx', tx), argv));
return;
}
if (argv.fetchAll) {
argv.fetchStatus = true;
argv.fetchInputs = true;
argv.fetchSpends = true;
}
const parsed = getTxParser(argv).parse(tx, {
status: argv.fetchStatus && txid ? await (0, fetch_1.fetchTransactionStatus)(httpClient, txid, argv.network) : undefined,
prevOutputs: argv.fetchInputs ? await (0, fetch_1.fetchPrevOutputs)(httpClient, tx) : (0, prevTx_1.getPrevOutputsFromPrevTxs)(tx, prevTxs),
prevOutputSpends: argv.fetchSpends ? await (0, fetch_1.fetchPrevOutputSpends)(httpClient, tx) : undefined,
outputSpends: argv.fetchSpends && tx instanceof utxolib.bitgo.UtxoTransaction
? await (0, fetch_1.fetchOutputSpends)(httpClient, tx)
: undefined,
});
console.log((0, formatString_1.formatString)(parsed, argv));
},
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY21kUGFyc2VUeC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21tYW5kcy9jbWRQYXJzZVR4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQStDQSxrQ0FZQztBQTNERCx5REFBMkM7QUFHM0Msa0NBUWlCO0FBQ2pCLDBDQUFxRDtBQUNyRCxvQ0FPa0I7QUFDbEIsMENBQThEO0FBQzlELGtEQUErQztBQUMvQyxzQ0FBbUM7QUFFbkMsaURBQThDO0FBQzlDLHNDQUFzRDtBQXFCdEQsU0FBZ0IsV0FBVyxDQUFDLElBQTBCO0lBQ3BELElBQUksSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ2IsT0FBTyxJQUFJLG1CQUFRLENBQUMsRUFBRSxHQUFHLElBQUksRUFBRSxHQUFHLG1CQUFRLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBQ0QsT0FBTyxJQUFJLG1CQUFRLENBQUM7UUFDbEIsR0FBRyxJQUFJO1FBQ1Asa0JBQWtCLEVBQUU7WUFDbEIsTUFBTSxFQUFFLElBQUksQ0FBQyxrQkFBa0I7WUFDL0IsS0FBSyxFQUFFLElBQUksQ0FBQyxrQkFBa0I7WUFDOUIsT0FBTyxFQUFFLElBQUksQ0FBQyxrQkFBa0I7U0FDakM7S0FDRixDQUFDLENBQUM7QUFDTCxDQUFDO0FBRVksUUFBQSxVQUFVLEdBQUc7SUFDeEIsT0FBTyxFQUFFLGdCQUFnQjtJQUN6QixPQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDO0lBQ3hCLFFBQVEsRUFDTix5REFBeUQ7UUFDekQscUVBQXFFO1FBQ3JFLCtEQUErRDtRQUMvRCxnREFBZ0Q7SUFFbEQsT0FBTyxDQUFDLENBQXNCO1FBQzVCLE9BQU8sQ0FBQzthQUNMLE9BQU8sQ0FBQyx3QkFBaUIsQ0FBQzthQUMxQixPQUFPLENBQUMsSUFBQSw4QkFBdUIsR0FBRSxDQUFDO2FBQ2xDLE1BQU0sQ0FB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QztRQUVELE1BQU0sTUFBTSxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFO1lBQ3pDLE1BQU0sRUFBRSxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxJQUFBLDhCQUFzQixFQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTO1lBQzNHLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUEsd0JBQWdCLEVBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFBLGtDQUF5QixFQUFDLEVBQUUsRUFBRSxPQUFPLENBQUM7WUFDL0csZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsTUFBTSxJQUFBLDZCQUFxQixFQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUztZQUM1RixZQUFZLEVBQ1YsSUFBSSxDQUFDLFdBQVcsSUFBSSxFQUFFLFlBQVksT0FBTyxDQUFDLEtBQUssQ0FBQyxlQUFlO2dCQUM3RCxDQUFDLENBQUMsTUFBTSxJQUFBLHlCQUFpQixFQUFDLFVBQVUsRUFBRSxFQUFFLENBQUM7Z0JBQ3pDLENBQUMsQ0FBQyxTQUFTO1NBQ2hCLENBQUMsQ0FBQztRQUVILE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBQSwyQkFBWSxFQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQzFDLENBQUM7Q0FDTyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgdXR4b2xpYiBmcm9tICdAYml0Z28vdXR4by1saWInO1xuaW1wb3J0ICogYXMgeWFyZ3MgZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQge1xuICBhcmdUb1N0cmluZyxcbiAgZm9ybWF0VHJlZU9ySnNvbixcbiAgZ2V0TmV0d29ya09wdGlvbnNEZW1hbmQsXG4gIEZvcm1hdFRyZWVPckpzb24sXG4gIFJlYWRTdHJpbmdPcHRpb25zLFxuICByZWFkU3RyaW5nT3B0aW9ucyxcbiAgc3RyaW5nVG9CdWZmZXIsXG59IGZyb20gJy4uL2FyZ3MnO1xuaW1wb3J0IHsgVHhQYXJzZXIsIFR4UGFyc2VyQXJncyB9IGZyb20gJy4uL1R4UGFyc2VyJztcbmltcG9ydCB7XG4gIGZldGNoT3V0cHV0U3BlbmRzLFxuICBmZXRjaFByZXZPdXRwdXRzLFxuICBmZXRjaFByZXZPdXRwdXRTcGVuZHMsXG4gIGZldGNoVHJhbnNhY3Rpb25IZXgsXG4gIGZldGNoVHJhbnNhY3Rpb25TdGF0dXMsXG4gIGdldENsaWVudCxcbn0gZnJvbSAnLi4vZmV0Y2gnO1xuaW1wb3J0IHsgZ2V0UGFyc2VyVHhQcm9wZXJ0aWVzLCBQYXJzZXJUeCB9IGZyb20gJy4uL1BhcnNlclR4JztcbmltcG9ydCB7IHBhcnNlVW5rbm93biB9IGZyb20gJy4uL3BhcnNlVW5rbm93bic7XG5pbXBvcnQgeyBQYXJzZXIgfSBmcm9tICcuLi9QYXJzZXInO1xuXG5pbXBvcnQgeyBmb3JtYXRTdHJpbmcgfSBmcm9tICcuL2Zvcm1hdFN0cmluZyc7XG5pbXBvcnQgeyBnZXRQcmV2T3V0cHV0c0Zyb21QcmV2VHhzIH0gZnJvbSAnLi4vcHJldlR4JztcblxuZXhwb3J0IHR5cGUgQXJnc1BhcnNlVHJhbnNhY3Rpb24gPSBSZWFkU3RyaW5nT3B0aW9ucyAmIHtcbiAgbmV0d29yazogdXR4b2xpYi5OZXR3b3JrO1xuICB0eGlkPzogc3RyaW5nO1xuICBwcmV2VHg/OiBzdHJpbmdbXTtcbiAgYmxvY2tIZWlnaHQ/OiBudW1iZXI7XG4gIHR4SW5kZXg/OiBudW1iZXI7XG4gIGFsbDogYm9vbGVhbjtcbiAgY2FjaGU6IGJvb2xlYW47XG4gIGZvcm1hdDogRm9ybWF0VHJlZU9ySnNvbjtcbiAgZmV0Y2hBbGw6IGJvb2xlYW47XG4gIGZldGNoU3RhdHVzOiBib29sZWFuO1xuICBmZXRjaElucHV0czogYm9vbGVhbjtcbiAgZmV0Y2hTcGVuZHM6IGJvb2xlYW47XG4gIGZpbmFsaXplOiBib29sZWFuO1xuICBwYXJzZVNpZ25hdHVyZURhdGE6IGJvb2xlYW47XG4gIHBhcnNlQXNVbmtub3duOiBib29sZWFuO1xuICBwYXJzZUVycm9yOiAndGhyb3cnIHwgJ2NvbnRpbnVlJztcbn0gJiBPbWl0PFR4UGFyc2VyQXJncywgJ3BhcnNlU2lnbmF0dXJlRGF0YSc+O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHhQYXJzZXIoYXJndjogQXJnc1BhcnNlVHJhbnNhY3Rpb24pOiBUeFBhcnNlciB7XG4gIGlmIChhcmd2LmFsbCkge1xuICAgIHJldHVybiBuZXcgVHhQYXJzZXIoeyAuLi5hcmd2LCAuLi5UeFBhcnNlci5QQVJTRV9BTEwgfSk7XG4gIH1cbiAgcmV0dXJuIG5ldyBUeFBhcnNlcih7XG4gICAgLi4uYXJndixcbiAgICBwYXJzZVNpZ25hdHVyZURhdGE6IHtcbiAgICAgIHNjcmlwdDogYXJndi5wYXJzZVNpZ25hdHVyZURhdGEsXG4gICAgICBlY2RzYTogYXJndi5wYXJzZVNpZ25hdHVyZURhdGEsXG4gICAgICBzY2hub3JyOiBhcmd2LnBhcnNlU2lnbmF0dXJlRGF0YSxcbiAgICB9LFxuICB9KTtcbn1cblxuZXhwb3J0IGNvbnN0IGNtZFBhcnNlVHggPSB7XG4gIGNvbW1hbmQ6ICdwYXJzZVR4IFtwYXRoXScsXG4gIGFsaWFzZXM6IFsncGFyc2UnLCAndHgnXSxcbiAgZGVzY3JpYmU6XG4gICAgJ0Rpc3BsYXkgdHJhbnNhY3Rpb24gY29tcG9uZW50cyBpbiBodW1hbi1yZWFkYWJsZSBmb3JtLiAnICtcbiAgICAnU3VwcG9ydGVkIGZvcm1hdHMgYXJlIFBhcnRpYWxseSBTaWduZWQgQml0Y29pbiBUcmFuc2FjdGlvbiAoUFNCVCksICcgK1xuICAgICdiaXRjb2luanMtbGliIGVuY29kaW5nIChMZWdhY3kpIG9yIGZ1bGx5IHNpZ25lZCB0cmFuc2FjdGlvbi4gJyArXG4gICAgJ0J5dGVzIG11c3QgYmUgZW5jb2RlZCBpbiBoZXggb3IgYmFzZTY0IGZvcm1hdC4nLFxuXG4gIGJ1aWxkZXIoYjogeWFyZ3MuQXJndjx1bmtub3duPik6IHlhcmdzLkFyZ3Y8QXJnc1BhcnNlVHJhbnNhY3Rpb24+IHtcbiAgICByZXR1cm4gYlxuICAgICAgLm9wdGlvbnMocmVhZFN0cmluZ09wdGlvbnMpXG4gICAgICAub3B0aW9ucyhnZXROZXR3b3JrT3B0aW9uc0RlbWFuZCgpKVxuICAgICAgLm9wdGlvbigndHhpZCcsIHsgdHlwZTogJ3N0cmluZycgfSlcbiAgICAgIC5vcHRpb24oJ3ByZXZUeCcsIHsgdHlwZTogJ3N0cmluZycsIGRlc2NyaXB0aW9uOiAncHJldmlvdXMgdHJhbnNhY3Rpb24gaGV4IG9yIGJhc2U2NCBzdHJpbmcnLCBhcnJheTogdHJ1ZSB9KVxuICAgICAgLm9wdGlvbignYmxvY2tIZWlnaHQnLCB7IHR5cGU6ICdudW1iZXInIH0pXG4gICAgICAub3B0aW9uKCd0eEluZGV4JywgeyB0eXBlOiAnbnVtYmVyJyB9KVxuICAgICAgLm9wdGlvbignZmV0Y2hBbGwnLCB7IHR5cGU6ICdib29sZWFuJywgZGVmYXVsdDogZmFsc2UgfSlcbiAgICAgIC5vcHRpb24oJ2ZldGNoU3RhdHVzJywgeyB0eXBlOiAnYm9vbGVhbicsIGRlZmF1bHQ6IGZhbHNlIH0pXG4gICAgICAub3B0aW9uKCdmZXRjaElucHV0cycsIHsgdHlwZTogJ2Jvb2xlYW4nLCBkZWZhdWx0OiBmYWxzZSB9KVxuICAgICAgLm9wdGlvbignZmV0Y2hTcGVuZHMnLCB7IHR5cGU6ICdib29sZWFuJywgZGVmYXVsdDogZmFsc2UgfSlcbiAgICAgIC5vcHRpb24oJ3BhcnNlU2NyaXB0QXNtJywgeyBhbGlhczogJ3NjcmlwdGFzbScsIHR5cGU6ICdib29sZWFuJywgZGVmYXVsdDogZmFsc2UgfSlcbiAgICAgIC5vcHRpb24oJ3BhcnNlU2NyaXB0RGF0YScsIHsgYWxpYXM6ICdzY3JpcHRkYXRhJywgdHlwZTogJ2Jvb2xlYW4nLCBkZWZhdWx0OiBmYWxzZSB9KVxuICAgICAgLm9wdGlvbigncGFyc2VTaWduYXR1cmVEYXRhJywgeyBhbGlhczogJ3NpZ2RhdGEnLCB0eXBlOiAnYm9vbGVhbicsIGRlZmF1bHQ6IGZhbHNlIH0pXG4gICAgICAub3B0aW9uKCdwYXJzZU91dHB1dFNjcmlwdCcsIHsgdHlwZTogJ2Jvb2xlYW4nLCBkZWZhdWx0OiBmYWxzZSB9KVxuICAgICAgLm9wdGlvbigncGFyc2VBc1Vua25vd24nLCB7XG4gICAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnc2hvdyBwbGFpbiBKYXZhc2NyaXB0IG9iamVjdCB3aXRob3V0IGFueSBwb3N0LXByb2Nlc3NpbmcnLFxuICAgICAgfSlcbiAgICAgIC5vcHRpb24oJ21heE91dHB1dHMnLCB7IHR5cGU6ICdudW1iZXInIH0pXG4gICAgICAub3B0aW9uKCd2aW4nLCB7IHR5cGU6ICdudW1iZXInIH0pXG4gICAgICAuYXJyYXkoJ3ZpbicpXG4gICAgICAub3B0aW9uKCd2b3V0JywgeyB0eXBlOiAnbnVtYmVyJyB9KVxuICAgICAgLmFycmF5KCd2b3V0JylcbiAgICAgIC5vcHRpb24oJ2ZpbmFsaXplJywge1xuICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICBkZXNjcmlwdGlvbjogJ2ZpbmFsaXplIFBTQlQgYW5kIHBhcnNlIHJlc3VsdCBpbnN0ZWFkIG9mIFBTQlQnLFxuICAgICAgfSlcbiAgICAgIC5vcHRpb24oJ2FsbCcsIHsgdHlwZTogJ2Jvb2xlYW4nLCBkZWZhdWx0OiBmYWxzZSB9KVxuICAgICAgLm9wdGlvbignY2FjaGUnLCB7XG4gICAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICAgIGRlc2NyaXB0aW9uOiAndXNlIGxvY2FsIGNhY2hlIGZvciBodHRwIHJlc3BvbnNlcycsXG4gICAgICB9KVxuICAgICAgLm9wdGlvbignZm9ybWF0JywgZm9ybWF0VHJlZU9ySnNvbilcbiAgICAgIC5vcHRpb24oJ3BhcnNlRXJyb3InLCB7IGNob2ljZXM6IFsnY29udGludWUnLCAndGhyb3cnXSwgZGVmYXVsdDogJ2NvbnRpbnVlJyB9IGFzIGNvbnN0KTtcbiAgfSxcblxuICBhc3luYyBoYW5kbGVyKGFyZ3Y6IHlhcmdzLkFyZ3VtZW50czxBcmdzUGFyc2VUcmFuc2FjdGlvbj4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQgZGF0YTtcblxuICAgIGNvbnN0IGh0dHBDbGllbnQgPSBhd2FpdCBnZXRDbGllbnQoeyBjYWNoZTogYXJndi5jYWNoZSB9KTtcblxuICAgIGlmIChhcmd2LnR4aWQgfHwgYXJndi5ibG9ja0hlaWdodCAhPT0gdW5kZWZpbmVkIHx8IGFyZ3YudHhJbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBkYXRhID0gYXdhaXQgZmV0Y2hUcmFuc2FjdGlvbkhleChcbiAgICAgICAgaHR0cENsaWVudCxcbiAgICAgICAge1xuICAgICAgICAgIHR4aWQ6IGFyZ3YudHhpZCxcbiAgICAgICAgICBibG9ja0hlaWdodDogYXJndi5ibG9ja0hlaWdodCxcbiAgICAgICAgICB0eEluZGV4OiBhcmd2LnR4SW5kZXgsXG4gICAgICAgIH0sXG4gICAgICAgIGFyZ3YubmV0d29ya1xuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBzdHJpbmcgPSBhd2FpdCBhcmdUb1N0cmluZyhhcmd2LCBkYXRhKTtcbiAgICBpZiAoIXN0cmluZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBubyB0eGRhdGFgKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkZWNvZGVCeXRlcyhieXRlczogQnVmZmVyKTogUGFyc2VyVHgge1xuICAgICAgcmV0dXJuIHV0eG9saWIuYml0Z28uaXNQc2J0KGJ5dGVzKVxuICAgICAgICA/IHV0eG9saWIuYml0Z28uY3JlYXRlUHNidEZyb21CdWZmZXIoYnl0ZXMsIGFyZ3YubmV0d29yaylcbiAgICAgICAgOiB1dHhvbGliLmJpdGdvLmNyZWF0ZVRyYW5zYWN0aW9uRnJvbUJ1ZmZlcihieXRlcywgYXJndi5uZXR3b3JrLCB7IGFtb3VudFR5cGU6ICdiaWdpbnQnIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGJ5dGVzID0gc3RyaW5nVG9CdWZmZXIoc3RyaW5nLCBbJ2hleCcsICdiYXNlNjQnXSk7XG4gICAgbGV0IHR4ID0gZGVjb2RlQnl0ZXMoYnl0ZXMpO1xuXG4gICAgY29uc3QgeyBpZDogdHhpZCB9ID0gZ2V0UGFyc2VyVHhQcm9wZXJ0aWVzKHR4LCB1bmRlZmluZWQpO1xuICAgIGlmICh0eCBpbnN0YW5jZW9mIHV0eG9saWIuYml0Z28uVXR4b1RyYW5zYWN0aW9uKSB7XG4gICAgICBpZiAoYXJndi50eGlkICYmIHR4aWQgIT09IGFyZ3YudHhpZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGNvbXB1dGVkIHR4aWQgZG9lcyBub3QgbWF0Y2ggdHhpZCBhcmd1bWVudGApO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoYXJndi5maW5hbGl6ZSkge1xuICAgICAgdHguZmluYWxpemVBbGxJbnB1dHMoKTtcbiAgICAgIHR4ID0gdHguZXh0cmFjdFRyYW5zYWN0aW9uKCk7XG4gICAgfVxuXG4gICAgY29uc3QgcHJldlR4czogUGFyc2VyVHhbXSA9IChhcmd2LnByZXZUeCA/PyBbXSkubWFwKChzKSA9PiB7XG4gICAgICBjb25zdCBidWYgPSBzdHJpbmdUb0J1ZmZlcihzLCBbJ2hleCcsICdiYXNlNjQnXSk7XG4gICAgICByZXR1cm4gZGVjb2RlQnl0ZXMoYnVmKTtcbiAgICB9KTtcblxuICAgIGlmIChhcmd2LnBhcnNlQXNVbmtub3duKSB7XG4gICAgICBjb25zb2xlLmxvZyhmb3JtYXRTdHJpbmcocGFyc2VVbmtub3duKG5ldyBQYXJzZXIoKSwgJ3R4JywgdHgpLCBhcmd2KSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGFyZ3YuZmV0Y2hBbGwpIHtcbiAgICAgIGFyZ3YuZmV0Y2hTdGF0dXMgPSB0cnVlO1xuICAgICAgYXJndi5mZXRjaElucHV0cyA9IHRydWU7XG4gICAgICBhcmd2LmZldGNoU3BlbmRzID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJzZWQgPSBnZXRUeFBhcnNlcihhcmd2KS5wYXJzZSh0eCwge1xuICAgICAgc3RhdHVzOiBhcmd2LmZldGNoU3RhdHVzICYmIHR4aWQgPyBhd2FpdCBmZXRjaFRyYW5zYWN0aW9uU3RhdHVzKGh0dHBDbGllbnQsIHR4aWQsIGFyZ3YubmV0d29yaykgOiB1bmRlZmluZWQsXG4gICAgICBwcmV2T3V0cHV0czogYXJndi5mZXRjaElucHV0cyA/IGF3YWl0IGZldGNoUHJldk91dHB1dHMoaHR0cENsaWVudCwgdHgpIDogZ2V0UHJldk91dHB1dHNGcm9tUHJldlR4cyh0eCwgcHJldlR4cyksXG4gICAgICBwcmV2T3V0cHV0U3BlbmRzOiBhcmd2LmZldGNoU3BlbmRzID8gYXdhaXQgZmV0Y2hQcmV2T3V0cHV0U3BlbmRzKGh0dHBDbGllbnQsIHR4KSA6IHVuZGVmaW5lZCxcbiAgICAgIG91dHB1dFNwZW5kczpcbiAgICAgICAgYXJndi5mZXRjaFNwZW5kcyAmJiB0eCBpbnN0YW5jZW9mIHV0eG9saWIuYml0Z28uVXR4b1RyYW5zYWN0aW9uXG4gICAgICAgICAgPyBhd2FpdCBmZXRjaE91dHB1dFNwZW5kcyhodHRwQ2xpZW50LCB0eClcbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICB9KTtcblxuICAgIGNvbnNvbGUubG9nKGZvcm1hdFN0cmluZyhwYXJzZWQsIGFyZ3YpKTtcbiAgfSxcbn0gYXMgY29uc3Q7XG4iXX0=