@decaf-ts/fabric-weaver
Version:
template for ts projects
140 lines • 18.6 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.FabricPeerChannelCommandBuilder = 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 FabricPeerChannelCommandBuilder {
constructor(logger) {
this.binName = fabric_binaries_1.FabricBinaries.PEER;
this.baseCommand = fabric_peer_1.PeerCommands.CHANNEL;
this.command = fabric_peer_1.PeerChannelCommands.JOIN;
this.args = [];
if (!logger)
this.log = logging_1.Logging.for(FabricPeerChannelCommandBuilder);
else
this.log = logger.for(FabricPeerChannelCommandBuilder.name);
}
setCommand(command) {
if (command !== undefined) {
this.log.debug(`Setting command to ${command}`);
this.command = command;
}
return this;
}
setBlockPath(blockPath) {
if (blockPath !== undefined) {
this.log.debug(`Setting blockpath to ${blockPath}`);
this.args.push(`--blockpath ${blockPath}`);
}
return this;
}
setBlockReference(blockRef) {
if (blockRef !== undefined) {
this.log.debug(`Setting block reference to ${blockRef}`);
this.blockReference = blockRef;
}
return this;
}
setDestination(destination) {
if (destination !== undefined) {
this.log.debug(`Setting destination to ${destination}`);
this.destination = destination;
}
return this;
}
setChannelID(channelID) {
if (channelID !== undefined) {
this.log.debug(`Setting channel ID to ${channelID}`);
this.args.push(`--channelID ${channelID}`);
}
return this;
}
setOrderer(orderer) {
if (orderer !== undefined) {
this.log.debug(`Setting orderer to ${orderer}`);
this.args.push(`--orderer ${orderer}`);
}
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;
}
build() {
const command = [
this.getBinary(),
this.getBaseCommand(),
this.getCommand(),
this.blockReference,
this.destination,
...[...new Set(this.args)],
]
.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)];
}
async execute() {
const bin = this.getBinary();
const argz = [
this.getBaseCommand(),
this.getCommand(),
this.blockReference,
this.destination,
...this.getArgs(),
].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
await (0, child_process_1.runCommand)(bin, argz);
}
catch (error) {
this.log.error(`Error: Failed to execute the command: ${error}`);
process.exit(1);
}
}
}
exports.FabricPeerChannelCommandBuilder = FabricPeerChannelCommandBuilder;
// Flags:
// --cafile string Path to file containing PEM-encoded trusted certificate(s) for the ordering endpoint
// --certfile string Path to file containing PEM-encoded X509 public key to use for mutual TLS communication with the orderer endpoint
// --clientauth Use mutual TLS when communicating with the orderer endpoint
// --connTimeout duration Timeout for client to connect (default 3s)
// -h, --help help for channel
// --keyfile string Path to file containing PEM-encoded private key to use for mutual TLS communication with the orderer endpoint
// -o, --orderer string Ordering service endpoint
// --ordererTLSHostnameOverride string The hostname override to use when validating the TLS connection to the orderer
// --tls Use TLS when communicating with the orderer endpoint
// --tlsHandshakeTimeShift duration The amount of time to shift backwards for certificate expiration checks during TLS handshakes with the orderer endpoint
// -f, --file string Configuration transaction file generated by a tool such as configtxgen for submitting to orderer
// -h, --help help for create
// --outputBlock string The path to write the genesis block for the channel. (default ./<channelID>.block)
// -t, --timeout duration Channel creation timeout (default 10s)
// --bestEffort Whether fetch requests should ignore errors and return blocks on a best effort basis
// --snapshotpath string Path to the snapshot directory
// -f, --file string Configuration transaction file generated by a tool such as configtxgen for submitting to orderer
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFicmljLXBlZXItY2hhbm5lbC1jb21tYW5kLWJ1aWxkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZmFicmljL3BlZXIvZmFicmljLXBlZXItY2hhbm5lbC1jb21tYW5kLWJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsK0NBQW9EO0FBQ3BELGtFQUE4RDtBQUM5RCwwREFBNkU7QUFDN0UsNkRBQXVEO0FBRXZELE1BQWEsK0JBQStCO0lBYTFDLFlBQVksTUFBZTtRQVZuQixZQUFPLEdBQW1CLGdDQUFjLENBQUMsSUFBSSxDQUFDO1FBQzlDLGdCQUFXLEdBQUcsMEJBQVksQ0FBQyxPQUFPLENBQUM7UUFFbkMsWUFBTyxHQUFHLGlDQUFtQixDQUFDLElBQUksQ0FBQztRQUtuQyxTQUFJLEdBQWEsRUFBRSxDQUFDO1FBRzFCLElBQUksQ0FBQyxNQUFNO1lBQUUsSUFBSSxDQUFDLEdBQUcsR0FBRyxpQkFBTyxDQUFDLEdBQUcsQ0FBQywrQkFBK0IsQ0FBQyxDQUFDOztZQUNoRSxJQUFJLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsK0JBQStCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbkUsQ0FBQztJQUVELFVBQVUsQ0FBQyxPQUE2QjtRQUN0QyxJQUFJLE9BQU8sS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUMxQixJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxzQkFBc0IsT0FBTyxFQUFFLENBQUMsQ0FBQztZQUNoRCxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN6QixDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsWUFBWSxDQUFDLFNBQWtCO1FBQzdCLElBQUksU0FBUyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzVCLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLHdCQUF3QixTQUFTLEVBQUUsQ0FBQyxDQUFDO1lBQ3BELElB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SywwR0FBMEc7QUFDMUcseUZBQXlGO0FBQ3pGLCtEQUErRDtBQUMvRCw0SkFBNEo7QUFDNUosd0VBQXdFO0FBQ3hFLDZIQUE2SDtBQUM3SCxtR0FBbUc7QUFDbkcsc0tBQXNLO0FBQ3RLLGdJQUFnSTtBQUNoSSwrQ0FBK0M7QUFDL0Msa0hBQWtIO0FBQ2xILHNFQUFzRTtBQUN0RSxrSEFBa0g7QUFDbEgsK0RBQStEO0FBQy9ELHlIQUF5SCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IExvZ2dlciwgTG9nZ2luZyB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHsgRmFicmljQmluYXJpZXMgfSBmcm9tIFwiLi4vY29uc3RhbnRzL2ZhYnJpYy1iaW5hcmllc1wiO1xuaW1wb3J0IHsgUGVlckNoYW5uZWxDb21tYW5kcywgUGVlckNvbW1hbmRzIH0gZnJvbSBcIi4uL2NvbnN0YW50cy9mYWJyaWMtcGVlclwiO1xuaW1wb3J0IHsgcnVuQ29tbWFuZCB9IGZyb20gXCIuLi8uLi91dGlscy9jaGlsZC1wcm9jZXNzXCI7XG5cbmV4cG9ydCBjbGFzcyBGYWJyaWNQZWVyQ2hhbm5lbENvbW1hbmRCdWlsZGVyIHtcbiAgcHJpdmF0ZSBsb2c6IExvZ2dlcjtcblxuICBwcml2YXRlIGJpbk5hbWU6IEZhYnJpY0JpbmFyaWVzID0gRmFicmljQmluYXJpZXMuUEVFUjtcbiAgcHJpdmF0ZSBiYXNlQ29tbWFuZCA9IFBlZXJDb21tYW5kcy5DSEFOTkVMO1xuXG4gIHByaXZhdGUgY29tbWFuZCA9IFBlZXJDaGFubmVsQ29tbWFuZHMuSk9JTjtcblxuICBwcml2YXRlIGJsb2NrUmVmZXJlbmNlPzogc3RyaW5nO1xuICBwcml2YXRlIGRlc3RpbmF0aW9uPzogc3RyaW5nO1xuXG4gIHByaXZhdGUgYXJnczogc3RyaW5nW10gPSBbXTtcblxuICBjb25zdHJ1Y3Rvcihsb2dnZXI/OiBMb2dnZXIpIHtcbiAgICBpZiAoIWxvZ2dlcikgdGhpcy5sb2cgPSBMb2dnaW5nLmZvcihGYWJyaWNQZWVyQ2hhbm5lbENvbW1hbmRCdWlsZGVyKTtcbiAgICBlbHNlIHRoaXMubG9nID0gbG9nZ2VyLmZvcihGYWJyaWNQZWVyQ2hhbm5lbENvbW1hbmRCdWlsZGVyLm5hbWUpO1xuICB9XG5cbiAgc2V0Q29tbWFuZChjb21tYW5kPzogUGVlckNoYW5uZWxDb21tYW5kcyk6IHRoaXMge1xuICAgIGlmIChjb21tYW5kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIGNvbW1hbmQgdG8gJHtjb21tYW5kfWApO1xuICAgICAgdGhpcy5jb21tYW5kID0gY29tbWFuZDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRCbG9ja1BhdGgoYmxvY2tQYXRoPzogc3RyaW5nKTogdGhpcyB7XG4gICAgaWYgKGJsb2NrUGF0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBibG9ja3BhdGggdG8gJHtibG9ja1BhdGh9YCk7XG4gICAgICB0aGlzLmFyZ3MucHVzaChgLS1ibG9ja3BhdGggJHtibG9ja1BhdGh9YCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0QmxvY2tSZWZlcmVuY2UoYmxvY2tSZWY/OiBzdHJpbmcpOiB0aGlzIHtcbiAgICBpZiAoYmxvY2tSZWYgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgYmxvY2sgcmVmZXJlbmNlIHRvICR7YmxvY2tSZWZ9YCk7XG4gICAgICB0aGlzLmJsb2NrUmVmZXJlbmNlID0gYmxvY2tSZWY7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0RGVzdGluYXRpb24oZGVzdGluYXRpb24/OiBzdHJpbmcpOiB0aGlzIHtcbiAgICBpZiAoZGVzdGluYXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgZGVzdGluYXRpb24gdG8gJHtkZXN0aW5hdGlvbn1gKTtcbiAgICAgIHRoaXMuZGVzdGluYXRpb24gPSBkZXN0aW5hdGlvbjtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRDaGFubmVsSUQoY2hhbm5lbElEPzogc3RyaW5nKTogdGhpcyB7XG4gICAgaWYgKGNoYW5uZWxJRCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBjaGFubmVsIElEIHRvICR7Y2hhbm5lbElEfWApO1xuICAgICAgdGhpcy5hcmdzLnB1c2goYC0tY2hhbm5lbElEICR7Y2hhbm5lbElEfWApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldE9yZGVyZXIob3JkZXJlcj86IHN0cmluZyk6IHRoaXMge1xuICAgIGlmIChvcmRlcmVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIG9yZGVyZXIgdG8gJHtvcmRlcmVyfWApO1xuICAgICAgdGhpcy5hcmdzLnB1c2goYC0tb3JkZXJlciAke29yZGVyZXJ9YCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgZW5hYmxlVExTKGVuYWJsZT86IGJvb2xlYW4pOiB0aGlzIHtcbiAgICBpZiAoZW5hYmxlICE9PSB1bmRlZmluZWQgJiYgZW5hYmxlID09PSB0cnVlKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBUTFMgZW5hYmxlZDogJHtlbmFibGV9YCk7XG4gICAgICB0aGlzLmFyZ3MucHVzaChgLS10bHNgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRUTFNDQUZpbGUoY2FGaWxlPzogc3RyaW5nKTogdGhpcyB7XG4gICAgaWYgKGNhRmlsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBUTFMgQ0EgZmlsZTogJHtjYUZpbGV9YCk7XG4gICAgICB0aGlzLmFyZ3MucHVzaChgLS1jYWZpbGUgJHtjYUZpbGV9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBidWlsZCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGNvbW1hbmQ6IHN0cmluZyA9IFtcbiAgICAgIHRoaXMuZ2V0QmluYXJ5KCksXG4gICAgICB0aGlzLmdldEJhc2VDb21tYW5kKCksXG4gICAgICB0aGlzLmdldENvbW1hbmQoKSxcbiAgICAgIHRoaXMuYmxvY2tSZWZlcmVuY2UsXG4gICAgICB0aGlzLmRlc3RpbmF0aW9uLFxuICAgICAgLi4uWy4uLm5ldyBTZXQodGhpcy5hcmdzKV0sXG4gICAgXVxuICAgICAgLmZpbHRlcigoaXRlbSkgPT4gaXRlbSAhPT0gdW5kZWZpbmVkICYmIGl0ZW0gIT09IG51bGwgJiYgaXRlbSAhPT0gXCJcIilcbiAgICAgIC5qb2luKFwiIFwiKTtcblxuICAgIHRoaXMubG9nLmRlYnVnKGBCdWlsdCBjb21tYW5kOiAke2NvbW1hbmR9YCk7XG4gICAgcmV0dXJuIGNvbW1hbmQ7XG4gIH1cblxuICBnZXRCYXNlQ29tbWFuZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmJhc2VDb21tYW5kO1xuICB9XG5cbiAgZ2V0Q29tbWFuZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNvbW1hbmQ7XG4gIH1cblxuICBnZXRCaW5hcnkoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5iaW5OYW1lO1xuICB9XG5cbiAgZ2V0QXJncygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIFsuLi5uZXcgU2V0KHRoaXMuYXJncyldO1xuICB9XG5cbiAgYXN5bmMgZXhlY3V0ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBiaW4gPSB0aGlzLmdldEJpbmFyeSgpO1xuICAgIGNvbnN0IGFyZ3ogPSBbXG4gICAgICB0aGlzLmdldEJhc2VDb21tYW5kKCksXG4gICAgICB0aGlzLmdldENvbW1hbmQoKSxcbiAgICAgIHRoaXMuYmxvY2tSZWZlcmVuY2UsXG4gICAgICB0aGlzLmRlc3RpbmF0aW9uLFxuICAgICAgLi4udGhpcy5nZXRBcmdzKCksXG4gICAgXS5maWx0ZXIoXG4gICAgICAoaXRlbSkgPT4gaXRlbSAhPT0gdW5kZWZpbmVkICYmIGl0ZW0gIT09IG51bGwgJiYgaXRlbSAhPT0gXCJcIlxuICAgICkgYXMgc3RyaW5nW107XG5cbiAgICB0cnkge1xuICAgICAgLy8gY29uc3QgcmVnZXggPSAvXFxbXFxzKklORk9cXHMqXFxdIExpc3RlbmluZyBvbiBodHRwLztcbiAgICAgIC8vIGNhbiBiZSB1c2VkIGFzIGEgcHJvbWlzZSBidXQgdG8gbG9jayB0aGUgbG9ncyBydW5uaW5nIGFzIGV4ZWNzeW5jXG4gICAgICBhd2FpdCBydW5Db21tYW5kKGJpbiwgYXJneik7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIHRoaXMubG9nLmVycm9yKGBFcnJvcjogRmFpbGVkIHRvIGV4ZWN1dGUgdGhlIGNvbW1hbmQ6ICR7ZXJyb3J9YCk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICB9XG59XG5cbi8vIEZsYWdzOlxuLy8gICAgICAgLS1jYWZpbGUgc3RyaW5nICAgICAgICAgICAgICAgICAgICAgICBQYXRoIHRvIGZpbGUgY29udGFpbmluZyBQRU0tZW5jb2RlZCB0cnVzdGVkIGNlcnRpZmljYXRlKHMpIGZvciB0aGUgb3JkZXJpbmcgZW5kcG9pbnRcbi8vICAgICAgIC0tY2VydGZpbGUgc3RyaW5nICAgICAgICAgICAgICAgICAgICAgUGF0aCB0byBmaWxlIGNvbnRhaW5pbmcgUEVNLWVuY29kZWQgWDUwOSBwdWJsaWMga2V5IHRvIHVzZSBmb3IgbXV0dWFsIFRMUyBjb21tdW5pY2F0aW9uIHdpdGggdGhlIG9yZGVyZXIgZW5kcG9pbnRcbi8vICAgICAgIC0tY2xpZW50YXV0aCAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlIG11dHVhbCBUTFMgd2hlbiBjb21tdW5pY2F0aW5nIHdpdGggdGhlIG9yZGVyZXIgZW5kcG9pbnRcbi8vICAgICAgIC0tY29ublRpbWVvdXQgZHVyYXRpb24gICAgICAgICAgICAgICAgVGltZW91dCBmb3IgY2xpZW50IHRvIGNvbm5lY3QgKGRlZmF1bHQgM3MpXG4vLyAgIC1oLCAtLWhlbHAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHAgZm9yIGNoYW5uZWxcbi8vICAgICAgIC0ta2V5ZmlsZSBzdHJpbmcgICAgICAgICAgICAgICAgICAgICAgUGF0aCB0byBmaWxlIGNvbnRhaW5pbmcgUEVNLWVuY29kZWQgcHJpdmF0ZSBrZXkgdG8gdXNlIGZvciBtdXR1YWwgVExTIGNvbW11bmljYXRpb24gd2l0aCB0aGUgb3JkZXJlciBlbmRwb2ludFxuLy8gICAtbywgLS1vcmRlcmVyIHN0cmluZyAgICAgICAgICAgICAgICAgICAgICBPcmRlcmluZyBzZXJ2aWNlIGVuZHBvaW50XG4vLyAgICAgICAtLW9yZGVyZXJUTFNIb3N0bmFtZU92ZXJyaWRlIHN0cmluZyAgIFRoZSBob3N0bmFtZSBvdmVycmlkZSB0byB1c2Ugd2hlbiB2YWxpZGF0aW5nIHRoZSBUTFMgY29ubmVjdGlvbiB0byB0aGUgb3JkZXJlclxuLy8gICAgICAgLS10bHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2UgVExTIHdoZW4gY29tbXVuaWNhdGluZyB3aXRoIHRoZSBvcmRlcmVyIGVuZHBvaW50XG4vLyAgICAgICAtLXRsc0hhbmRzaGFrZVRpbWVTaGlmdCBkdXJhdGlvbiAgICAgIFRoZSBhbW91bnQgb2YgdGltZSB0byBzaGlmdCBiYWNrd2FyZHMgZm9yIGNlcnRpZmljYXRlIGV4cGlyYXRpb24gY2hlY2tzIGR1cmluZyBUTFMgaGFuZHNoYWtlcyB3aXRoIHRoZSBvcmRlcmVyIGVuZHBvaW50XG4vLyAgIC1mLCAtLWZpbGUgc3RyaW5nICAgICAgICAgIENvbmZpZ3VyYXRpb24gdHJhbnNhY3Rpb24gZmlsZSBnZW5lcmF0ZWQgYnkgYSB0b29sIHN1Y2ggYXMgY29uZmlndHhnZW4gZm9yIHN1Ym1pdHRpbmcgdG8gb3JkZXJlclxuLy8gICAtaCwgLS1oZWxwICAgICAgICAgICAgICAgICBoZWxwIGZvciBjcmVhdGVcbi8vICAgICAgIC0tb3V0cHV0QmxvY2sgc3RyaW5nICAgVGhlIHBhdGggdG8gd3JpdGUgdGhlIGdlbmVzaXMgYmxvY2sgZm9yIHRoZSBjaGFubmVsLiAoZGVmYXVsdCAuLzxjaGFubmVsSUQ+LmJsb2NrKVxuLy8gICAtdCwgLS10aW1lb3V0IGR1cmF0aW9uICAgICBDaGFubmVsIGNyZWF0aW9uIHRpbWVvdXQgKGRlZmF1bHQgMTBzKVxuLy8gICAgICAgLS1iZXN0RWZmb3J0ICAgICAgICAgV2hldGhlciBmZXRjaCByZXF1ZXN0cyBzaG91bGQgaWdub3JlIGVycm9ycyBhbmQgcmV0dXJuIGJsb2NrcyBvbiBhIGJlc3QgZWZmb3J0IGJhc2lzXG4vLyAgICAgICAtLXNuYXBzaG90cGF0aCBzdHJpbmcgICBQYXRoIHRvIHRoZSBzbmFwc2hvdCBkaXJlY3Rvcnlcbi8vICAgLWYsIC0tZmlsZSBzdHJpbmcgICBDb25maWd1cmF0aW9uIHRyYW5zYWN0aW9uIGZpbGUgZ2VuZXJhdGVkIGJ5IGEgdG9vbCBzdWNoIGFzIGNvbmZpZ3R4Z2VuIGZvciBzdWJtaXR0aW5nIHRvIG9yZGVyZXJcbiJdfQ==