@decaf-ts/fabric-weaver
Version:
template for ts projects
216 lines • 27.4 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.FabricPeerLifecycleChaincodeCommandBuilder = void 0;
const logging_1 = require("@decaf-ts/logging");
const fabric_binaries_1 = require("../constants/fabric-binaries.cjs");
const fabric_peer_1 = require("../constants/fabric-peer.cjs");
const child_process_1 = require("../../utils/child-process.cjs");
class FabricPeerLifecycleChaincodeCommandBuilder {
constructor(logger) {
this.binName = fabric_binaries_1.FabricBinaries.PEER;
this.baseCommand = fabric_peer_1.PeerCommands.LIFECYCLE_CHAINCODE;
this.command = fabric_peer_1.PeerLifecycleChaincodeCommands.PACKAGE;
this.peerDetails = {};
this.args = [];
if (!logger)
this.log = logging_1.Logging.for(FabricPeerLifecycleChaincodeCommandBuilder);
else
this.log = logger.for(FabricPeerLifecycleChaincodeCommandBuilder.name);
}
setCommand(command) {
if (command !== undefined) {
this.log.debug(`Setting command to ${command}`);
this.command = command;
}
return this;
}
setDestination(destination) {
if (destination !== undefined) {
this.log.debug(`Setting contract destination to ${destination}`);
this.destination = destination;
}
return this;
}
setContractPath(contractPath) {
if (contractPath !== undefined) {
this.log.debug(`Setting contract path to ${contractPath}`);
this.args.push(`--path ${contractPath}`);
}
return this;
}
setLang(lang) {
if (lang !== undefined) {
this.log.debug(`Setting contract language to ${lang}`);
this.args.push(`--lang ${lang}`);
}
return this;
}
setLabel(label) {
if (label !== undefined) {
this.log.debug(`Setting contract label to ${label}`);
this.args.push(`--label ${label}`);
}
return this;
}
setOrdererAddress(ordererAddress) {
if (ordererAddress !== undefined) {
this.log.debug(`Setting orderer address to ${ordererAddress}`);
this.args.push(`--orderer ${ordererAddress}`);
}
return this;
}
setChannelID(channelID) {
if (channelID !== undefined) {
this.log.debug(`Setting channel ID to ${channelID}`);
this.args.push(`--channelID ${channelID}`);
}
return this;
}
setContractName(contractName) {
if (contractName !== undefined) {
this.log.debug(`Setting contract name to ${contractName}`);
this.args.push(`--name ${contractName}`);
}
return this;
}
setVersion(version) {
if (version !== undefined) {
this.log.debug(`Setting contract version to ${version}`);
this.args.push(`--version ${version}`);
}
return this;
}
setPackageID(packageID) {
if (packageID !== undefined) {
this.log.debug(`Setting contract package ID to ${packageID}`);
this.args.push(`--package-id ${packageID}`);
}
return this;
}
setSequence(sequence) {
if (sequence !== undefined) {
this.log.debug(`Setting contract sequence to ${sequence}`);
this.args.push(`--sequence ${sequence}`);
}
return this;
}
enableTLS(enable) {
if (enable !== undefined && enable === true) {
this.log.debug(`Setting TLS enabled: ${enable}`);
this.args.push("--tls");
}
return this;
}
setTLSCAFile(caFile) {
if (caFile !== undefined) {
this.log.debug(`Setting TLS CA file: ${caFile}`);
this.args.push(`--cafile ${caFile}`);
}
return this;
}
setOrdererTLSHostnameOverride(ordererTLSHostnameOverride) {
if (ordererTLSHostnameOverride !== undefined) {
this.log.debug(`Setting orderer TLS hostname override to ${ordererTLSHostnameOverride}`);
this.args.push(`--ordererTLSHostnameOverride ${ordererTLSHostnameOverride}`);
}
return this;
}
setCollectionsConfigPath(collectionsConfigPath) {
if (collectionsConfigPath !== undefined) {
this.log.debug(`Setting collection configuration path to ${collectionsConfigPath}`);
this.args.push(`--collections-config ${collectionsConfigPath}`);
}
return this;
}
setPeerAddresses(peerAddresses) {
if (peerAddresses !== undefined &&
Array.isArray(peerAddresses) &&
peerAddresses.length > 0) {
this.log.debug(`Setting peer addresses: ${peerAddresses.join(", ")}`);
this.peerDetails.peerAddresses = peerAddresses;
}
return this;
}
setPeerTLSRoots(peerTLSRoots) {
if (peerTLSRoots !== undefined &&
Array.isArray(peerTLSRoots) &&
peerTLSRoots.length > 0) {
this.log.debug(`Setting peer TLS roots: ${peerTLSRoots.join(", ")}`);
this.peerDetails.peerTLSRoots = peerTLSRoots;
}
return this;
}
setOutput(output) {
if (output !== undefined) {
this.log.debug(`Setting output to ${output}`);
this.args.push(`--output ${output}`);
}
return this;
}
build() {
const command = [
this.getBinary(),
this.getBaseCommand(),
this.getCommand(),
this.destination,
...[...new Set(this.args)],
...(this.generatePeerDetails() || []),
]
.filter((item) => item !== undefined && item !== null && item !== "")
.join(" ");
this.log.debug(`Built command: ${command}`);
return command;
}
getBaseCommand() {
return this.baseCommand;
}
getCommand() {
return this.command;
}
getBinary() {
return this.binName;
}
getArgs() {
return [...new Set(this.args)];
}
generatePeerDetails() {
const peerAddresses = this.peerDetails.peerAddresses || undefined;
const peerTLSRoots = this.peerDetails.peerTLSRoots || undefined;
this.log.info(`Generating peer details: ${peerAddresses}, ${peerTLSRoots}...`);
if (peerAddresses !== undefined &&
Array.isArray(peerAddresses) &&
peerAddresses.length > 0) {
const peerCommands = peerAddresses.map((address, i) => {
let str = `--peerAddresses ${address}`;
if (peerTLSRoots !== undefined && Array.isArray(peerTLSRoots)) {
str += ` --tlsRootCertFiles ${peerTLSRoots[i]}`;
}
return str;
});
this.log.info(`Generated peer details: ${peerCommands}`);
return peerCommands;
}
return undefined;
}
async execute(options) {
const bin = this.getBinary();
const argz = [
this.getBaseCommand(),
this.getCommand(),
this.destination,
...this.getArgs(),
...(this.generatePeerDetails() || []),
].filter((item) => item !== undefined && item !== null && item !== "");
try {
// const regex = /\[\s*INFO\s*\] Listening on http/;
// can be used as a promise but to lock the logs running as execsync
return (await (0, child_process_1.runCommand)(bin, argz, options));
}
catch (error) {
this.log.error(`Error: Failed to execute the command: ${error}`);
process.exit(1);
}
}
}
exports.FabricPeerLifecycleChaincodeCommandBuilder = FabricPeerLifecycleChaincodeCommandBuilder;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFicmljLXBlZXItbGlmZWN5Y2xlLWNoYWluY29kZS1jb21tYW5kLWJ1aWxkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZmFicmljL3BlZXIvZmFicmljLXBlZXItbGlmZWN5Y2xlLWNoYWluY29kZS1jb21tYW5kLWJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsK0NBQW9EO0FBQ3BELGtFQUE4RDtBQUM5RCwwREFHa0M7QUFDbEMsNkRBQXVEO0FBRXZELE1BQWEsMENBQTBDO0lBZXJELFlBQVksTUFBZTtRQVpuQixZQUFPLEdBQW1CLGdDQUFjLENBQUMsSUFBSSxDQUFDO1FBQzlDLGdCQUFXLEdBQUcsMEJBQVksQ0FBQyxtQkFBbUIsQ0FBQztRQUUvQyxZQUFPLEdBQUcsNENBQThCLENBQUMsT0FBTyxDQUFDO1FBSWpELGdCQUFXLEdBQ2pCLEVBQUUsQ0FBQztRQUVHLFNBQUksR0FBYSxFQUFFLENBQUM7UUFHMUIsSUFBSSxDQUFDLE1BQU07WUFDVCxJQUFJLENBQUMsR0FBRyxHQUFHLGlCQUFPLENBQUMsR0FBRyxDQUFDLDBDQUEwQyxDQUFDLENBQUM7O1lBQ2hFLElBQUksQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQywwQ0FBMEMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM5RSxDQUFDO0lBRUQsVUFBVSxDQUFDLE9BQXdDO1FBQ2pELElBQUksT0FBTyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzFCLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLHNCQUFzQixPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQ2hELElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQ3pCLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxjQUFjLENBQUMsV0FBb0I7UUFDakMsSUFBSSxXQUFXLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDOUIsSUFBSSxDQUFDLEdB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RztZQUNYLElBQUksQ0FBQyxjQUFjLEVBQUU7WUFDckIsSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNqQixJQUFJLENBQUMsV0FBVztZQUNoQixHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDakIsR0FBRyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLEVBQUUsQ0FBQztTQUN0QyxDQUFDLE1BQU0sQ0FDTixDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxLQUFLLFNBQVMsSUFBSSxJQUFJLEtBQUssSUFBSSxJQUFJLElBQUksS0FBSyxFQUFFLENBQ2pELENBQUM7UUFFZCxJQUFJLENBQUM7WUFDSCxvREFBb0Q7WUFDcEQsb0VBQW9FO1lBQ3BFLE9BQU8sQ0FBQyxNQUFNLElBQUEsMEJBQVUsRUFBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUE2QixDQUFDO1FBQzVFLENBQUM7UUFBQyxPQUFPLEtBQWMsRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLHlDQUF5QyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQ2pFLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEIsQ0FBQztJQUNILENBQUM7Q0FDRjtBQXRRRCxnR0FzUUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBMb2dnZXIsIExvZ2dpbmcgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcbmltcG9ydCB7IEZhYnJpY0JpbmFyaWVzIH0gZnJvbSBcIi4uL2NvbnN0YW50cy9mYWJyaWMtYmluYXJpZXNcIjtcbmltcG9ydCB7XG4gIFBlZXJDb21tYW5kcyxcbiAgUGVlckxpZmVjeWNsZUNoYWluY29kZUNvbW1hbmRzLFxufSBmcm9tIFwiLi4vY29uc3RhbnRzL2ZhYnJpYy1wZWVyXCI7XG5pbXBvcnQgeyBydW5Db21tYW5kIH0gZnJvbSBcIi4uLy4uL3V0aWxzL2NoaWxkLXByb2Nlc3NcIjtcblxuZXhwb3J0IGNsYXNzIEZhYnJpY1BlZXJMaWZlY3ljbGVDaGFpbmNvZGVDb21tYW5kQnVpbGRlciB7XG4gIHByaXZhdGUgbG9nOiBMb2dnZXI7XG5cbiAgcHJpdmF0ZSBiaW5OYW1lOiBGYWJyaWNCaW5hcmllcyA9IEZhYnJpY0JpbmFyaWVzLlBFRVI7XG4gIHByaXZhdGUgYmFzZUNvbW1hbmQgPSBQZWVyQ29tbWFuZHMuTElGRUNZQ0xFX0NIQUlOQ09ERTtcblxuICBwcml2YXRlIGNvbW1hbmQgPSBQZWVyTGlmZWN5Y2xlQ2hhaW5jb2RlQ29tbWFuZHMuUEFDS0FHRTtcblxuICBwcml2YXRlIGRlc3RpbmF0aW9uPzogc3RyaW5nO1xuXG4gIHByaXZhdGUgcGVlckRldGFpbHM6IHsgcGVlckFkZHJlc3Nlcz86IHN0cmluZ1tdOyBwZWVyVExTUm9vdHM/OiBzdHJpbmdbXSB9ID1cbiAgICB7fTtcblxuICBwcml2YXRlIGFyZ3M6IHN0cmluZ1tdID0gW107XG5cbiAgY29uc3RydWN0b3IobG9nZ2VyPzogTG9nZ2VyKSB7XG4gICAgaWYgKCFsb2dnZXIpXG4gICAgICB0aGlzLmxvZyA9IExvZ2dpbmcuZm9yKEZhYnJpY1BlZXJMaWZlY3ljbGVDaGFpbmNvZGVDb21tYW5kQnVpbGRlcik7XG4gICAgZWxzZSB0aGlzLmxvZyA9IGxvZ2dlci5mb3IoRmFicmljUGVlckxpZmVjeWNsZUNoYWluY29kZUNvbW1hbmRCdWlsZGVyLm5hbWUpO1xuICB9XG5cbiAgc2V0Q29tbWFuZChjb21tYW5kPzogUGVlckxpZmVjeWNsZUNoYWluY29kZUNvbW1hbmRzKTogdGhpcyB7XG4gICAgaWYgKGNvbW1hbmQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgY29tbWFuZCB0byAke2NvbW1hbmR9YCk7XG4gICAgICB0aGlzLmNvbW1hbmQgPSBjb21tYW5kO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldERlc3RpbmF0aW9uKGRlc3RpbmF0aW9uPzogc3RyaW5nKTogdGhpcyB7XG4gICAgaWYgKGRlc3RpbmF0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIGNvbnRyYWN0IGRlc3RpbmF0aW9uIHRvICR7ZGVzdGluYXRpb259YCk7XG4gICAgICB0aGlzLmRlc3RpbmF0aW9uID0gZGVzdGluYXRpb247XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0Q29udHJhY3RQYXRoKGNvbnRyYWN0UGF0aD86IHN0cmluZyk6IHRoaXMge1xuICAgIGlmIChjb250cmFjdFBhdGggIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgY29udHJhY3QgcGF0aCB0byAke2NvbnRyYWN0UGF0aH1gKTtcbiAgICAgIHRoaXMuYXJncy5wdXNoKGAtLXBhdGggJHtjb250cmFjdFBhdGh9YCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0TGFuZyhsYW5nPzogc3RyaW5nKTogdGhpcyB7XG4gICAgaWYgKGxhbmcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgY29udHJhY3QgbGFuZ3VhZ2UgdG8gJHtsYW5nfWApO1xuICAgICAgdGhpcy5hcmdzLnB1c2goYC0tbGFuZyAke2xhbmd9YCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0TGFiZWwobGFiZWw/OiBzdHJpbmcpOiB0aGlzIHtcbiAgICBpZiAobGFiZWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgY29udHJhY3QgbGFiZWwgdG8gJHtsYWJlbH1gKTtcbiAgICAgIHRoaXMuYXJncy5wdXNoKGAtLWxhYmVsICR7bGFiZWx9YCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0T3JkZXJlckFkZHJlc3Mob3JkZXJlckFkZHJlc3M/OiBzdHJpbmcpOiB0aGlzIHtcbiAgICBpZiAob3JkZXJlckFkZHJlc3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgb3JkZXJlciBhZGRyZXNzIHRvICR7b3JkZXJlckFkZHJlc3N9YCk7XG4gICAgICB0aGlzLmFyZ3MucHVzaChgLS1vcmRlcmVyICR7b3JkZXJlckFkZHJlc3N9YCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0Q2hhbm5lbElEKGNoYW5uZWxJRD86IHN0cmluZyk6IHRoaXMge1xuICAgIGlmIChjaGFubmVsSUQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgY2hhbm5lbCBJRCB0byAke2NoYW5uZWxJRH1gKTtcbiAgICAgIHRoaXMuYXJncy5wdXNoKGAtLWNoYW5uZWxJRCAke2NoYW5uZWxJRH1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRDb250cmFjdE5hbWUoY29udHJhY3ROYW1lPzogc3RyaW5nKTogdGhpcyB7XG4gICAgaWYgKGNvbnRyYWN0TmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBjb250cmFjdCBuYW1lIHRvICR7Y29udHJhY3ROYW1lfWApO1xuICAgICAgdGhpcy5hcmdzLnB1c2goYC0tbmFtZSAke2NvbnRyYWN0TmFtZX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRWZXJzaW9uKHZlcnNpb24/OiBzdHJpbmcpOiB0aGlzIHtcbiAgICBpZiAodmVyc2lvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBjb250cmFjdCB2ZXJzaW9uIHRvICR7dmVyc2lvbn1gKTtcbiAgICAgIHRoaXMuYXJncy5wdXNoKGAtLXZlcnNpb24gJHt2ZXJzaW9ufWApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldFBhY2thZ2VJRChwYWNrYWdlSUQ/OiBzdHJpbmcpOiB0aGlzIHtcbiAgICBpZiAocGFja2FnZUlEICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIGNvbnRyYWN0IHBhY2thZ2UgSUQgdG8gJHtwYWNrYWdlSUR9YCk7XG4gICAgICB0aGlzLmFyZ3MucHVzaChgLS1wYWNrYWdlLWlkICR7cGFja2FnZUlEfWApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldFNlcXVlbmNlKHNlcXVlbmNlPzogc3RyaW5nKTogdGhpcyB7XG4gICAgaWYgKHNlcXVlbmNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIGNvbnRyYWN0IHNlcXVlbmNlIHRvICR7c2VxdWVuY2V9YCk7XG4gICAgICB0aGlzLmFyZ3MucHVzaChgLS1zZXF1ZW5jZSAke3NlcXVlbmNlfWApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGVuYWJsZVRMUyhlbmFibGU/OiBib29sZWFuKTogdGhpcyB7XG4gICAgaWYgKGVuYWJsZSAhPT0gdW5kZWZpbmVkICYmIGVuYWJsZSA9PT0gdHJ1ZSkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgVExTIGVuYWJsZWQ6ICR7ZW5hYmxlfWApO1xuICAgICAgdGhpcy5hcmdzLnB1c2goXCItLXRsc1wiKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRUTFNDQUZpbGUoY2FGaWxlPzogc3RyaW5nKTogdGhpcyB7XG4gICAgaWYgKGNhRmlsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBUTFMgQ0EgZmlsZTogJHtjYUZpbGV9YCk7XG4gICAgICB0aGlzLmFyZ3MucHVzaChgLS1jYWZpbGUgJHtjYUZpbGV9YCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0T3JkZXJlclRMU0hvc3RuYW1lT3ZlcnJpZGUob3JkZXJlclRMU0hvc3RuYW1lT3ZlcnJpZGU/OiBzdHJpbmcpOiB0aGlzIHtcbiAgICBpZiAob3JkZXJlclRMU0hvc3RuYW1lT3ZlcnJpZGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoXG4gICAgICAgIGBTZXR0aW5nIG9yZGVyZXIgVExTIGhvc3RuYW1lIG92ZXJyaWRlIHRvICR7b3JkZXJlclRMU0hvc3RuYW1lT3ZlcnJpZGV9YFxuICAgICAgKTtcbiAgICAgIHRoaXMuYXJncy5wdXNoKFxuICAgICAgICBgLS1vcmRlcmVyVExTSG9zdG5hbWVPdmVycmlkZSAke29yZGVyZXJUTFNIb3N0bmFtZU92ZXJyaWRlfWBcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0Q29sbGVjdGlvbnNDb25maWdQYXRoKGNvbGxlY3Rpb25zQ29uZmlnUGF0aD86IHN0cmluZyk6IHRoaXMge1xuICAgIGlmIChjb2xsZWN0aW9uc0NvbmZpZ1BhdGggIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoXG4gICAgICAgIGBTZXR0aW5nIGNvbGxlY3Rpb24gY29uZmlndXJhdGlvbiBwYXRoIHRvICR7Y29sbGVjdGlvbnNDb25maWdQYXRofWBcbiAgICAgICk7XG4gICAgICB0aGlzLmFyZ3MucHVzaChgLS1jb2xsZWN0aW9ucy1jb25maWcgJHtjb2xsZWN0aW9uc0NvbmZpZ1BhdGh9YCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0UGVlckFkZHJlc3NlcyhwZWVyQWRkcmVzc2VzPzogc3RyaW5nW10pOiB0aGlzIHtcbiAgICBpZiAoXG4gICAgICBwZWVyQWRkcmVzc2VzICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIEFycmF5LmlzQXJyYXkocGVlckFkZHJlc3NlcykgJiZcbiAgICAgIHBlZXJBZGRyZXNzZXMubGVuZ3RoID4gMFxuICAgICkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgcGVlciBhZGRyZXNzZXM6ICR7cGVlckFkZHJlc3Nlcy5qb2luKFwiLCBcIil9YCk7XG4gICAgICB0aGlzLnBlZXJEZXRhaWxzLnBlZXJBZGRyZXNzZXMgPSBwZWVyQWRkcmVzc2VzO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldFBlZXJUTFNSb290cyhwZWVyVExTUm9vdHM/OiBzdHJpbmdbXSk6IHRoaXMge1xuICAgIGlmIChcbiAgICAgIHBlZXJUTFNSb290cyAhPT0gdW5kZWZpbmVkICYmXG4gICAgICBBcnJheS5pc0FycmF5KHBlZXJUTFNSb290cykgJiZcbiAgICAgIHBlZXJUTFNSb290cy5sZW5ndGggPiAwXG4gICAgKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBwZWVyIFRMUyByb290czogJHtwZWVyVExTUm9vdHMuam9pbihcIiwgXCIpfWApO1xuICAgICAgdGhpcy5wZWVyRGV0YWlscy5wZWVyVExTUm9vdHMgPSBwZWVyVExTUm9vdHM7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0T3V0cHV0KG91dHB1dD86IHN0cmluZyk6IHRoaXMge1xuICAgIGlmIChvdXRwdXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgb3V0cHV0IHRvICR7b3V0cHV0fWApO1xuICAgICAgdGhpcy5hcmdzLnB1c2goYC0tb3V0cHV0ICR7b3V0cHV0fWApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGJ1aWxkKCk6IHN0cmluZyB7XG4gICAgY29uc3QgY29tbWFuZDogc3RyaW5nID0gW1xuICAgICAgdGhpcy5nZXRCaW5hcnkoKSxcbiAgICAgIHRoaXMuZ2V0QmFzZUNvbW1hbmQoKSxcbiAgICAgIHRoaXMuZ2V0Q29tbWFuZCgpLFxuICAgICAgdGhpcy5kZXN0aW5hdGlvbixcbiAgICAgIC4uLlsuLi5uZXcgU2V0KHRoaXMuYXJncyldLFxuICAgICAgLi4uKHRoaXMuZ2VuZXJhdGVQZWVyRGV0YWlscygpIHx8IFtdKSxcbiAgICBdXG4gICAgICAuZmlsdGVyKChpdGVtKSA9PiBpdGVtICE9PSB1bmRlZmluZWQgJiYgaXRlbSAhPT0gbnVsbCAmJiBpdGVtICE9PSBcIlwiKVxuICAgICAgLmpvaW4oXCIgXCIpO1xuXG4gICAgdGhpcy5sb2cuZGVidWcoYEJ1aWx0IGNvbW1hbmQ6ICR7Y29tbWFuZH1gKTtcbiAgICByZXR1cm4gY29tbWFuZDtcbiAgfVxuXG4gIGdldEJhc2VDb21tYW5kKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYmFzZUNvbW1hbmQ7XG4gIH1cblxuICBnZXRDb21tYW5kKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY29tbWFuZDtcbiAgfVxuXG4gIGdldEJpbmFyeSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmJpbk5hbWU7XG4gIH1cblxuICBnZXRBcmdzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gWy4uLm5ldyBTZXQodGhpcy5hcmdzKV07XG4gIH1cblxuICBwcml2YXRlIGdlbmVyYXRlUGVlckRldGFpbHMoKTogc3RyaW5nW10gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHBlZXJBZGRyZXNzZXMgPSB0aGlzLnBlZXJEZXRhaWxzLnBlZXJBZGRyZXNzZXMgfHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IHBlZXJUTFNSb290cyA9IHRoaXMucGVlckRldGFpbHMucGVlclRMU1Jvb3RzIHx8IHVuZGVmaW5lZDtcblxuICAgIHRoaXMubG9nLmluZm8oXG4gICAgICBgR2VuZXJhdGluZyBwZWVyIGRldGFpbHM6ICR7cGVlckFkZHJlc3Nlc30sICR7cGVlclRMU1Jvb3RzfS4uLmBcbiAgICApO1xuICAgIGlmIChcbiAgICAgIHBlZXJBZGRyZXNzZXMgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgQXJyYXkuaXNBcnJheShwZWVyQWRkcmVzc2VzKSAmJlxuICAgICAgcGVlckFkZHJlc3Nlcy5sZW5ndGggPiAwXG4gICAgKSB7XG4gICAgICBjb25zdCBwZWVyQ29tbWFuZHMgPSBwZWVyQWRkcmVzc2VzLm1hcCgoYWRkcmVzcywgaSkgPT4ge1xuICAgICAgICBsZXQgc3RyID0gYC0tcGVlckFkZHJlc3NlcyAke2FkZHJlc3N9YDtcblxuICAgICAgICBpZiAocGVlclRMU1Jvb3RzICE9PSB1bmRlZmluZWQgJiYgQXJyYXkuaXNBcnJheShwZWVyVExTUm9vdHMpKSB7XG4gICAgICAgICAgc3RyICs9IGAgLS10bHNSb290Q2VydEZpbGVzICR7cGVlclRMU1Jvb3RzW2ldfWA7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc3RyO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMubG9nLmluZm8oYEdlbmVyYXRlZCBwZWVyIGRldGFpbHM6ICR7cGVlckNvbW1hbmRzfWApO1xuXG4gICAgICByZXR1cm4gcGVlckNvbW1hbmRzO1xuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBhc3luYyBleGVjdXRlKG9wdGlvbnM/OiB7IFtpbmRleGVyOiBzdHJpbmddOiBzdHJpbmcgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGJpbiA9IHRoaXMuZ2V0QmluYXJ5KCk7XG4gICAgY29uc3QgYXJneiA9IFtcbiAgICAgIHRoaXMuZ2V0QmFzZUNvbW1hbmQoKSxcbiAgICAgIHRoaXMuZ2V0Q29tbWFuZCgpLFxuICAgICAgdGhpcy5kZXN0aW5hdGlvbixcbiAgICAgIC4uLnRoaXMuZ2V0QXJncygpLFxuICAgICAgLi4uKHRoaXMuZ2VuZXJhdGVQZWVyRGV0YWlscygpIHx8IFtdKSxcbiAgICBdLmZpbHRlcihcbiAgICAgIChpdGVtKSA9PiBpdGVtICE9PSB1bmRlZmluZWQgJiYgaXRlbSAhPT0gbnVsbCAmJiBpdGVtICE9PSBcIlwiXG4gICAgKSBhcyBzdHJpbmdbXTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBjb25zdCByZWdleCA9IC9cXFtcXHMqSU5GT1xccypcXF0gTGlzdGVuaW5nIG9uIGh0dHAvO1xuICAgICAgLy8gY2FuIGJlIHVzZWQgYXMgYSBwcm9taXNlIGJ1dCB0byBsb2NrIHRoZSBsb2dzIHJ1bm5pbmcgYXMgZXhlY3N5bmNcbiAgICAgIHJldHVybiAoYXdhaXQgcnVuQ29tbWFuZChiaW4sIGFyZ3osIG9wdGlvbnMpKSBhcyB1bmtub3duIGFzIFByb21pc2U8dm9pZD47XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIHRoaXMubG9nLmVycm9yKGBFcnJvcjogRmFpbGVkIHRvIGV4ZWN1dGUgdGhlIGNvbW1hbmQ6ICR7ZXJyb3J9YCk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICB9XG59XG4iXX0=