@decaf-ts/fabric-weaver
Version:
template for ts projects
598 lines • 93.3 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.FabricCAServerConfigBuilder = void 0;
const logging_1 = require("@decaf-ts/logging");
const yaml_1 = require("../../utils/yaml.cjs");
const path_1 = __importDefault(require("path"));
const object_1 = require("../../utils-old/object.cjs");
const fs_1 = __importDefault(require("fs"));
class FabricCAServerConfigBuilder {
constructor(logger) {
this.config = (0, yaml_1.readFileYaml)(path_1.default.join(__dirname, "../../../config/fabric-ca-server-config.yaml"));
if (!logger)
this.log = logging_1.Logging.for(FabricCAServerConfigBuilder);
else
this.log = logger.for(FabricCAServerConfigBuilder.name);
}
setVersion(version) {
if (version !== undefined) {
this.log.debug(`Setting version: ${version}`);
this.config.version = version;
}
return this;
}
/**
* @description Sets the port for the Fabric CA Server.
* @summary Configures the network port on which the Fabric CA Server will listen for incoming connections.
* @param {number} [port] - The port number for the Fabric CA Server to listen on.
* @return {this} The current instance of the builder for method chaining.
*/
setPort(port) {
if (port !== undefined) {
this.log.debug(`Setting port: ${port}`);
this.config.port = port;
}
return this;
}
setCors(cors) {
if (cors === undefined)
return this;
if (cors.enabled !== undefined) {
this.log.debug("Setting CORS enabled");
this.config.cors.enabled = cors.enabled;
}
if (cors.origins !== undefined) {
this.log.debug(`Setting CORS origins: ${cors.origins}`);
this.config.cors.origins = cors.origins;
}
return this;
}
/**
* @description Enables or disables debug mode for the Fabric CA Server.
* @summary Configures whether the Fabric CA Server should run in debug mode, providing more detailed logging and output.
* @param {boolean} [enable] - Whether to enable debug mode.
* @return {this} The current instance of the builder for method chaining.
*/
enableDebug(enable) {
if (enable !== undefined) {
this.log.debug(`Setting debug: ${enable}`);
this.config.debug = enable;
}
return this;
}
setCrlSizeLimit(crlSizeLimit) {
if (crlSizeLimit !== undefined) {
this.log.debug(`Setting CRL size limit: ${crlSizeLimit}`);
this.config.crlsizelimit = crlSizeLimit;
}
return this;
}
setServerTLS(tlsConfig) {
if (!tlsConfig)
return this;
if (tlsConfig.enabled !== undefined) {
this.log.debug("Setting TLS enabled");
this.config.tls.enabled = tlsConfig.enabled;
}
if (tlsConfig.certfile !== undefined) {
this.log.debug(`Setting TLS cert file: ${tlsConfig.certfile}`);
this.config.tls.certfile = tlsConfig.certfile;
}
if (tlsConfig.keyfile !== undefined) {
this.log.debug(`Setting TLS key file: ${tlsConfig.keyfile}`);
this.config.tls.keyfile = tlsConfig.keyfile;
}
if (tlsConfig.clientauth !== undefined) {
if (tlsConfig.clientauth.certfiles !== undefined) {
this.log.debug(`Setting TLS client certfiles: ${tlsConfig.clientauth.certfiles}`);
this.config.tls.clientauth.certfiles = tlsConfig.clientauth.certfiles;
}
if (tlsConfig.clientauth.type !== undefined) {
this.log.debug(`Setting TLS client auth type: ${tlsConfig.clientauth.type}`);
this.config.tls.clientauth.type = tlsConfig.clientauth.type;
}
}
return this;
}
setCA(config) {
if (!config)
return this;
if (config.name !== undefined) {
this.log.debug(`Setting CA name: ${config.name}`);
this.config.ca.name = config.name;
}
if (config.keyfile !== undefined) {
this.log.debug(`Setting CA key file: ${config.keyfile}`);
this.config.ca.keyfile = config.keyfile;
}
if (config.certfile !== undefined) {
this.log.debug(`Setting CA cert file: ${config.certfile}`);
this.config.ca.certfile = config.certfile;
}
if (config.chainfile !== undefined) {
this.log.debug(`Setting CA chain file: ${config.chainfile}`);
this.config.ca.chainfile = config.chainfile;
}
if (config.reenrollIgnoreCertExpiry !== undefined) {
this.log.debug(`Setting reenrollIgnoreCertExpiry: ${config.reenrollIgnoreCertExpiry}`);
this.config.ca.reenrollIgnoreCertExpiry =
config.reenrollIgnoreCertExpiry;
}
return this;
}
setCrlExpiry(crlExpiry) {
if (crlExpiry !== undefined) {
this.log.debug(`Setting CRL expiry: ${crlExpiry}`);
this.config.crl.expiry = crlExpiry;
}
return this;
}
setIdentities(ids) {
if (ids !== undefined) {
if (!Array.isArray(ids))
ids = [ids];
this.log.debug(`Setting identities: ${JSON.stringify(ids)}`);
const baseIdentity = this.config.registry.identities[0];
const identities = ids.map((el) => {
const identity = { ...baseIdentity };
if (el.name !== undefined)
identity.name = el.name;
if (el.pass !== undefined)
identity.pass = el.pass;
if (el.type !== undefined)
identity.type = el.type;
if (el.affiliation !== undefined)
identity.affiliation = el.affiliation;
if (el.attrs !== undefined)
identity.attrs = (0, object_1.overrideNonUndefined)(identity.attrs, el.attrs);
return identity;
});
this.config.registry.identities = identities;
}
return this;
}
setMaxEnrollments(maxEnrollments) {
if (maxEnrollments !== undefined) {
this.log.debug(`Setting max enrollments: ${maxEnrollments}`);
this.config.registry.maxenrollments = maxEnrollments;
}
return this;
}
setDatabase(cfg) {
if (cfg === undefined)
return this;
if (cfg.type !== undefined) {
this.log.debug(`Setting database type: ${cfg.type}`);
this.config.db.type = cfg.type;
}
if (cfg.datasource !== undefined) {
this.log.debug(`Setting database datasource: ${cfg.datasource}`);
this.config.db.datasource = cfg.datasource;
}
if (cfg.tls !== undefined) {
if (cfg.tls.enabled !== undefined) {
this.log.debug(`Setting TLS enabled: ${cfg.tls.enabled}`);
this.config.db.tls.enabled = cfg.tls.enabled;
}
if (cfg.tls.certfiles !== undefined) {
this.log.debug(`Setting TLS certfiles: ${cfg.tls.certfiles}`);
this.config.db.tls.certfiles = cfg.tls.certfiles;
}
if (cfg.tls.client !== undefined) {
if (cfg.tls.client.certfile !== undefined) {
this.log.debug(`Setting TLS client certfile: ${cfg.tls.client.certfile}`);
this.config.db.tls.client.certfile = cfg.tls.client.certfile;
}
if (cfg.tls.client.keyfile !== undefined) {
this.log.debug(`Setting TLS client keyfile: ${cfg.tls.client.keyfile}`);
this.config.db.tls.client.keyfile = cfg.tls.client.keyfile;
}
}
}
return this;
}
setLDAP(ldap) {
if (ldap === undefined)
return this;
if (ldap.enabled !== undefined) {
this.log.debug(`Setting LDAP enabled: ${ldap.enabled}`);
this.config.ldap.enabled = ldap.enabled;
}
if (ldap.url !== undefined) {
this.log.debug(`Setting LDAP URL: ${ldap.url}`);
this.config.ldap.url = ldap.url;
}
if (ldap.tls !== undefined) {
if (ldap.tls.certfiles !== undefined) {
this.log.debug(`Setting TLS certfiles: ${ldap.tls.certfiles}`);
this.config.ldap.tls.certfiles = ldap.tls.certfiles;
}
if (ldap.tls.client !== undefined) {
if (ldap.tls.client.certfile !== undefined) {
this.log.debug(`Setting TLS client certfile: ${ldap.tls.client.certfile}`);
this.config.ldap.tls.client.certfile = ldap.tls.client.certfile;
}
if (ldap.tls.client.keyfile !== undefined) {
this.log.debug(`Setting TLS client keyfile: ${ldap.tls.client.keyfile}`);
this.config.ldap.tls.client.keyfile = ldap.tls.client.keyfile;
}
}
}
if (ldap.attribute !== undefined) {
if (ldap.attribute.names !== undefined) {
this.log.debug(`Setting LDAP attribute names: ${ldap.attribute.names}`);
this.config.ldap.attribute.names = ldap.attribute.names;
}
if (ldap.attribute.converters !== undefined) {
this.log.debug(`Setting LDAP attribute converters: ${JSON.stringify(ldap.attribute.converters)}`);
this.config.ldap.attribute.converters = ldap.attribute.converters;
}
if (ldap.attribute.maps !== undefined) {
this.log.debug(`Setting LDAP attribute maps: ${JSON.stringify(ldap.attribute.maps)}`);
this.config.ldap.attribute.maps = ldap.attribute.maps;
}
}
return this;
}
setAffiliations(affiliations) {
if (affiliations !== undefined) {
this.log.debug(`Setting affiliations: ${JSON.stringify(affiliations)}`);
this.config.affiliations = affiliations;
}
return this;
}
/**
* @description Removes unused profiles from the Fabric CA Server configuration.
* @summary This method allows you to remove the TLS and/or CA profiles from the configuration if they are not needed.
* Removing unused profiles can help streamline the configuration and potentially improve performance.
* @param {boolean} [removeTLSProfile=false] - Whether to remove the TLS profile.
* @param {boolean} [removeCAProfile=false] - Whether to remove the CA profile.
* @return {this} The current instance of the builder for method chaining.
* @example
* const builder = new FabricCAServerCommandBuilder();
* builder.removeUnusedProfiles(true, false); // Removes TLS profile, keeps CA profile
*
* @mermaid
* sequenceDiagram
* participant Client
* participant Builder as FabricCAServerCommandBuilder
* participant Config as FabricCAServerConfig
* Client->>Builder: removeUnusedProfiles(true, false)
* Builder->>Builder: Check removeTLSProfile
* alt removeTLSProfile is true
* Builder->>Config: Remove TLS profile
* end
* Builder->>Builder: Check removeCAProfile
* alt removeCAProfile is true
* Builder->>Config: Remove CA profile
* end
* Builder-->>Client: Return this
*/
removeUnusedProfiles(removeTLSProfile = false, removeCAProfile = false) {
if (removeTLSProfile) {
this.log.debug("Removing TLS profile");
delete this.config.signing?.profiles?.tls;
}
if (removeCAProfile) {
this.log.debug("Removing CA profile");
delete this.config.signing?.profiles?.ca;
}
return this;
}
setSigning(cfg) {
if (cfg === undefined)
return this;
if (cfg.default !== undefined) {
if (cfg.default.usage !== undefined) {
this.log.debug(`Setting default usage: ${cfg.default.usage}`);
this.config.signing.default.usage = [...new Set(cfg.default.usage)];
}
if (cfg.default.expiry !== undefined) {
this.log.debug(`Setting default expiry: ${cfg.default.expiry}`);
this.config.signing.default.expiry = cfg.default.expiry;
}
}
if (cfg.profiles !== undefined) {
if (cfg.profiles.ca !== undefined) {
if (cfg.profiles.ca.usage !== undefined) {
this.log.debug(`Setting CA usage: ${cfg.profiles.ca.usage}`);
this.config.signing.profiles.ca.usage = [
...new Set(cfg.profiles.ca.usage),
];
}
if (cfg.profiles.ca.expiry !== undefined) {
this.log.debug(`Setting CA expiry: ${cfg.profiles.ca.expiry}`);
this.config.signing.profiles.ca.expiry = cfg.profiles.ca.expiry;
}
if (cfg.profiles.ca.caconstraint !== undefined) {
if (cfg.profiles.ca.caconstraint.isca !== undefined) {
this.log.debug(`Setting CA isCA: ${cfg.profiles.ca.caconstraint.isca}`);
this.config.signing.profiles.ca.caconstraint.isca =
cfg.profiles.ca.caconstraint.isca;
}
if (cfg.profiles.ca.caconstraint.maxpathlen !== undefined) {
this.log.debug(`Setting CA max pathlength: ${cfg.profiles.ca.caconstraint.maxpathlen}`);
this.config.signing.profiles.ca.caconstraint.maxpathlen =
cfg.profiles.ca.caconstraint.maxpathlen;
}
}
}
if (cfg.profiles.tls !== undefined) {
if (cfg.profiles.tls.usage !== undefined) {
this.log.debug(`Setting TLS usage: ${cfg.profiles.tls.usage}`);
this.config.signing.profiles.tls.usage = [
...new Set(cfg.profiles.tls.usage),
];
}
if (cfg.profiles.tls.expiry !== undefined) {
this.log.debug(`Setting TLS expiry: ${cfg.profiles.tls.expiry}`);
this.config.signing.profiles.tls.expiry = cfg.profiles.tls.expiry;
}
}
}
return this;
}
setCSR(csr) {
if (csr === undefined)
return this;
if (csr.cn !== undefined) {
this.log.debug(`Setting CSR CN: ${csr.cn}`);
this.config.csr.cn = csr.cn;
}
if (csr.hosts !== undefined) {
this.log.debug(`Setting CSR hosts: ${csr.hosts}`);
this.config.csr.hosts = [...new Set(csr.hosts)];
}
if (csr.keyrequest !== undefined) {
if (csr.keyrequest.algo !== undefined) {
this.log.debug(`Setting CSR key request algorithm: ${csr.keyrequest.algo}`);
this.config.csr.keyrequest.algo = csr.keyrequest.algo;
}
if (csr.keyrequest.size !== undefined) {
this.log.debug(`Setting CSR key request size: ${csr.keyrequest.size}`);
this.config.csr.keyrequest.size = csr.keyrequest.size;
}
}
if (csr.names !== undefined) {
this.log.debug(`Setting CSR names: ${JSON.stringify(csr.names)}`);
this.config.csr.names = csr.names;
}
if (csr.ca !== undefined) {
if (csr.ca.expiry !== undefined) {
this.log.debug(`Setting CSR CA expiry: ${csr.ca.expiry}`);
this.config.csr.ca.expiry = csr.ca.expiry;
}
if (csr.ca.pathlength !== undefined) {
this.log.debug(`Setting CSR CA pathlength: ${csr.ca.pathlength}`);
this.config.csr.ca.pathlength = csr.ca.pathlength;
}
}
return this;
}
setIdemix(idemix) {
if (idemix === undefined)
return this;
if (idemix.nonceexpiration !== undefined) {
this.log.debug(`Setting Idemix nonce expiration: ${idemix.nonceexpiration}`);
this.config.idemix.nonceexpiration = idemix.nonceexpiration;
}
if (idemix.curve !== undefined) {
this.log.debug(`Setting Idemix curve: ${idemix.curve}`);
this.config.idemix.curve = idemix.curve;
}
if (idemix.noncesweepinterval !== undefined) {
this.log.debug(`Setting Idemix noncesweep interval: ${idemix.noncesweepinterval}`);
this.config.idemix.noncesweepinterval = idemix.noncesweepinterval;
}
if (idemix.rhpoolsize !== undefined) {
this.log.debug(`Setting Idemix rhpoolsize: ${idemix.rhpoolsize}`);
this.config.idemix.rhpoolsize = idemix.rhpoolsize;
}
return this;
}
setBCCSP(bccsp) {
if (bccsp === undefined)
return this;
if (bccsp.default !== undefined) {
this.log.debug(`Setting default BCCSP: ${bccsp.default}`);
this.config.bccsp.default = bccsp.default;
}
if (bccsp.sw !== undefined) {
if (bccsp.sw.hash !== undefined) {
this.log.debug(`Setting BCCSP hash: ${bccsp.sw.hash}`);
this.config.bccsp.sw.hash = bccsp.sw.hash;
}
if (bccsp.sw.security !== undefined) {
this.log.debug(`Setting BCCSP security: ${bccsp.sw.security}`);
this.config.bccsp.sw.security = bccsp.sw.security;
}
if (bccsp.sw.filekeystore !== undefined) {
if (bccsp.sw.filekeystore.keystore !== undefined) {
this.log.debug(`Setting BCCSP filekeystore keystore: ${bccsp.sw.filekeystore.keystore}`);
this.config.bccsp.sw.filekeystore.keystore =
bccsp.sw.filekeystore.keystore;
}
}
}
return this;
}
setCACount(count) {
if (count !== undefined) {
this.log.debug(`Setting CA count: ${count}`);
this.config.cacount = count;
}
return this;
}
setCAFiles(files) {
if (files !== undefined) {
this.log.debug(`Setting CA files: ${files.join(", ")}`);
this.config.cafiles = files;
}
return this;
}
setIntermediate(int) {
if (int === undefined)
return this;
if (int.parentserver !== undefined) {
if (int.parentserver.url !== undefined) {
this.log.debug(`Setting intermediate CA parent server URL: ${int.parentserver.url}`);
this.config.intermediate.parentserver.url = int.parentserver.url;
}
if (int.parentserver.caname !== undefined) {
this.log.debug(`Setting intermediate CA parent server caname: ${int.parentserver.caname}`);
this.config.intermediate.parentserver.caname =
int.parentserver.caname;
}
}
if (int.enrollment !== undefined) {
if (int.enrollment.hosts !== undefined) {
this.log.debug(`Setting intermediate CA enrollment hosts: ${int.enrollment.hosts.join(", ")}`);
this.config.intermediate.enrollment.hosts = int.enrollment.hosts;
}
if (int.enrollment.profile !== undefined) {
this.log.debug(`Setting intermediate CA enrollment profile: ${int.enrollment.profile}`);
this.config.intermediate.enrollment.profile = int.enrollment.profile;
}
if (int.enrollment.label !== undefined) {
this.log.debug(`Setting intermediate CA enrollment label: ${int.enrollment.label}`);
this.config.intermediate.enrollment.label = int.enrollment.label;
}
}
if (int.tls !== undefined) {
if (int.tls.certfiles !== undefined) {
this.log.debug(`Setting intermediate CA TLS certfiles: ${int.tls.certfiles.join(", ")}`);
this.config.intermediate.tls.certfiles = int.tls.certfiles;
}
if (int.tls.client !== undefined) {
if (int.tls.client.certfile !== undefined) {
this.log.debug(`Setting intermediate CA TLS client certfile: ${int.tls.client.certfile}`);
this.config.intermediate.tls.client.certfile =
int.tls.client.certfile;
}
if (int.tls.client.keyfile !== undefined) {
this.log.debug(`Setting intermediate CA TLS client keyfile: ${int.tls.client.keyfile}`);
this.config.intermediate.tls.client.keyfile =
int.tls.client.keyfile;
}
}
}
return this;
}
setPasswordAttempts(attempts) {
if (attempts !== undefined) {
this.log.debug(`Setting password attempts: ${attempts}`);
this.config.cfg.identities.passwordattempts = attempts;
}
return this;
}
setOperations(operations) {
if (operations === undefined)
return this;
if (operations.listenAddress !== undefined) {
this.log.debug(`Setting operations listen address: ${operations.listenAddress}`);
this.config.operations.listenAddress = operations.listenAddress;
}
if (operations.tls !== undefined) {
if (operations.tls.enabled !== undefined) {
this.log.debug(`Setting operations TLS enabled: ${operations.tls.enabled}`);
this.config.operations.tls.enabled = operations.tls.enabled;
}
if (operations.tls.cert !== undefined) {
if (operations.tls.cert.file !== undefined) {
this.log.debug(`Setting operations TLS cert file: ${operations.tls.cert.file}`);
this.config.operations.tls.cert.file = operations.tls.cert.file;
}
}
if (operations.tls.key !== undefined) {
if (operations.tls.key.file !== undefined) {
this.log.debug(`Setting operations TLS key file: ${operations.tls.key.file}`);
this.config.operations.tls.key.file = operations.tls.key.file;
}
}
if (operations.tls.clientAuthRequired !== undefined) {
this.log.debug(`Setting operations TLS client authentication required: ${operations.tls.clientAuthRequired}`);
this.config.operations.tls.clientAuthRequired =
operations.tls.clientAuthRequired;
}
if (operations.tls.clientRootCAs !== undefined) {
if (operations.tls.clientRootCAs.files !== undefined) {
this.log.debug(`Setting operations TLS client root CAs files: ${operations.tls.clientRootCAs.files.join(", ")}`);
this.config.operations.tls.clientRootCAs.files =
operations.tls.clientRootCAs.files;
}
}
}
return this;
}
setMetrics(metrics) {
if (metrics === undefined)
return this;
if (metrics.provider !== undefined) {
this.log.debug(`Setting metrics provider: ${metrics.provider}`);
this.config.metrics.provider = metrics.provider;
}
if (metrics.statsd !== undefined) {
if (metrics.statsd.network !== undefined) {
this.log.debug(`Setting metrics statsd network: ${metrics.statsd.network}`);
this.config.metrics.statsd.network = metrics.statsd.network;
}
if (metrics.statsd.address !== undefined) {
this.log.debug(`Setting metrics statsd address: ${metrics.statsd.address}`);
this.config.metrics.statsd.address = metrics.statsd.address;
}
if (metrics.statsd.writeInterval !== undefined) {
this.log.debug(`Setting metrics statsd write interval: ${metrics.statsd.writeInterval}`);
this.config.metrics.statsd.writeInterval =
metrics.statsd.writeInterval;
}
if (metrics.statsd.prefix !== undefined) {
this.log.debug(`Setting metrics statsd prefix: ${metrics.statsd.prefix}`);
this.config.metrics.statsd.prefix = metrics.statsd.prefix;
}
}
return this;
}
/**
* @description Saves the current configuration to a file.
* @summary Writes the current Fabric CA Server configuration to a YAML file at the specified path. If the directory doesn't exist, it will be created.
* @param {string} cpath - The path where the configuration file should be saved.
* @return {this} The current instance of the builder for method chaining.
* @example
* const builder = new FabricCAServerCommandBuilder();
* builder.save('/path/to/config/fabric-ca-server.yaml');
*
* @mermaid
* sequenceDiagram
* participant Client
* participant Builder as FabricCAServerCommandBuilder
* participant FileSystem as File System
* Client->>Builder: saveConfig('/path/to/config/fabric-ca-server.yaml')
* Builder->>Builder: Check if cpath is defined
* alt cpath is defined
* Builder->>FileSystem: Check if directory exists
* alt Directory doesn't exist
* Builder->>FileSystem: Create directory
* end
* Builder->>Builder: Log debug message
* Builder->>FileSystem: Write YAML configuration to file
* end
* Builder-->>Client: Return this
*/
save(cpath) {
if (cpath === undefined)
return this;
if (!fs_1.default.existsSync(path_1.default.join(cpath)))
fs_1.default.mkdirSync(path_1.default.join(cpath), { recursive: true });
if (!cpath.endsWith(".yaml"))
cpath = path_1.default.join(cpath, "fabric-ca-server-config.yaml");
this.log.debug(`Writing configuration to ${cpath}`);
this.log.debug(`Config file: ${JSON.stringify(this.config, null, 2)}`);
(0, yaml_1.writeFileYaml)(cpath, this.config);
return this;
}
}
exports.FabricCAServerConfigBuilder = FabricCAServerConfigBuilder;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFicmljLWNhLXNlcnZlci1jb25maWctYnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9mYWJyaWMvZmFicmljLWNhLXNlcnZlci9mYWJyaWMtY2Etc2VydmVyLWNvbmZpZy1idWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLCtDQUFvRDtBQUNwRCwyQ0FBK0Q7QUFlL0QsZ0RBQXdCO0FBQ3hCLG1EQUE4RDtBQUM5RCw0Q0FBb0I7QUFNcEIsTUFBYSwyQkFBMkI7SUFPdEMsWUFBWSxNQUFlO1FBSm5CLFdBQU0sR0FBeUIsSUFBQSxtQkFBWSxFQUNqRCxjQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSw4Q0FBOEMsQ0FBQyxDQUM3QyxDQUFDO1FBR3hCLElBQUksQ0FBQyxNQUFNO1lBQUUsSUFBSSxDQUFDLEdBQUcsR0FBRyxpQkFBTyxDQUFDLEdBQUcsQ0FBQywyQkFBMkIsQ0FBQyxDQUFDOztZQUM1RCxJQUFJLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsMkJBQTJCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDL0QsQ0FBQztJQUVELFVBQVUsQ0FBQyxPQUFnQjtRQUN6QixJQUFJLE9BQU8sS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUMxQixJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsT0FBTyxFQUFFLENBQUMsQ0FBQztZQUM5QyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDaEMsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsT0FBTyxDQUFDLElBQWE7UUFDbkIsSUFBSSxJQUFJLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDdkIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsaUJBQWlCLElBQUksRUFBRSxDQUFDLENBQUM7WUFDeEMsSUFBSSxDQUFDLE1B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LENBQUMsS0FBSyxDQUFDLGdCQUFnQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN2RSxJQUFBLG9CQUFhLEVBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUVsQyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7Q0FDRjtBQXJ1QkQsa0VBcXVCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IExvZ2dlciwgTG9nZ2luZyB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHsgcmVhZEZpbGVZYW1sLCB3cml0ZUZpbGVZYW1sIH0gZnJvbSBcIi4uLy4uL3V0aWxzL3lhbWxcIjtcbmltcG9ydCB7XG4gIEJDQ1NQQ29uZmlnLFxuICBDQUNvbmZpZyxcbiAgQ29yc0NvbmZpZyxcbiAgQ1NSQ29uZmlnLFxuICBEQkNvbmZpZyxcbiAgRmFicmljQ0FTZXJ2ZXJDb25maWcsXG4gIElkZW1peENvbmZpZyxcbiAgSWRlbnRpdHksXG4gIEludGVybWVkaWF0ZUNBQ29uZmlnLFxuICBMREFQQ29uZmlnLFxuICBTZXJ2ZXJUTFNDb25maWcsXG4gIFNpZ25pbmdDb25maWcsXG59IGZyb20gXCIuLi9pbnRlcmZhY2VzL2ZhYnJpYy9mYWJyaWMtY2Etc2VydmVyLWNvbmZpZ1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCB7IG92ZXJyaWRlTm9uVW5kZWZpbmVkIH0gZnJvbSBcIi4uLy4uL3V0aWxzLW9sZC9vYmplY3RcIjtcbmltcG9ydCBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCB7XG4gIE1ldHJpY3NDb25maWcsXG4gIE9wZXJhdGlvbnNDb25maWcsXG59IGZyb20gXCIuLi9pbnRlcmZhY2VzL2ZhYnJpYy9nZW5lcmFsLWNvbmZpZ3NcIjtcblxuZXhwb3J0IGNsYXNzIEZhYnJpY0NBU2VydmVyQ29uZmlnQnVpbGRlciB7XG4gIHByaXZhdGUgbG9nOiBMb2dnZXI7XG5cbiAgcHJpdmF0ZSBjb25maWc6IEZhYnJpY0NBU2VydmVyQ29uZmlnID0gcmVhZEZpbGVZYW1sKFxuICAgIHBhdGguam9pbihfX2Rpcm5hbWUsIFwiLi4vLi4vLi4vY29uZmlnL2ZhYnJpYy1jYS1zZXJ2ZXItY29uZmlnLnlhbWxcIilcbiAgKSBhcyBGYWJyaWNDQVNlcnZlckNvbmZpZztcblxuICBjb25zdHJ1Y3Rvcihsb2dnZXI/OiBMb2dnZXIpIHtcbiAgICBpZiAoIWxvZ2dlcikgdGhpcy5sb2cgPSBMb2dnaW5nLmZvcihGYWJyaWNDQVNlcnZlckNvbmZpZ0J1aWxkZXIpO1xuICAgIGVsc2UgdGhpcy5sb2cgPSBsb2dnZXIuZm9yKEZhYnJpY0NBU2VydmVyQ29uZmlnQnVpbGRlci5uYW1lKTtcbiAgfVxuXG4gIHNldFZlcnNpb24odmVyc2lvbj86IHN0cmluZyk6IHRoaXMge1xuICAgIGlmICh2ZXJzaW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIHZlcnNpb246ICR7dmVyc2lvbn1gKTtcbiAgICAgIHRoaXMuY29uZmlnLnZlcnNpb24gPSB2ZXJzaW9uO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXRzIHRoZSBwb3J0IGZvciB0aGUgRmFicmljIENBIFNlcnZlci5cbiAgICogQHN1bW1hcnkgQ29uZmlndXJlcyB0aGUgbmV0d29yayBwb3J0IG9uIHdoaWNoIHRoZSBGYWJyaWMgQ0EgU2VydmVyIHdpbGwgbGlzdGVuIGZvciBpbmNvbWluZyBjb25uZWN0aW9ucy5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFtwb3J0XSAtIFRoZSBwb3J0IG51bWJlciBmb3IgdGhlIEZhYnJpYyBDQSBTZXJ2ZXIgdG8gbGlzdGVuIG9uLlxuICAgKiBAcmV0dXJuIHt0aGlzfSBUaGUgY3VycmVudCBpbnN0YW5jZSBvZiB0aGUgYnVpbGRlciBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgKi9cbiAgc2V0UG9ydChwb3J0PzogbnVtYmVyKTogdGhpcyB7XG4gICAgaWYgKHBvcnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgcG9ydDogJHtwb3J0fWApO1xuICAgICAgdGhpcy5jb25maWcucG9ydCA9IHBvcnQ7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0Q29ycyhjb3JzPzogQ29yc0NvbmZpZykge1xuICAgIGlmIChjb3JzID09PSB1bmRlZmluZWQpIHJldHVybiB0aGlzO1xuXG4gICAgaWYgKGNvcnMuZW5hYmxlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhcIlNldHRpbmcgQ09SUyBlbmFibGVkXCIpO1xuICAgICAgdGhpcy5jb25maWcuY29ycyEuZW5hYmxlZCA9IGNvcnMuZW5hYmxlZDtcbiAgICB9XG4gICAgaWYgKGNvcnMub3JpZ2lucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBDT1JTIG9yaWdpbnM6ICR7Y29ycy5vcmlnaW5zfWApO1xuICAgICAgdGhpcy5jb25maWcuY29ycyEub3JpZ2lucyA9IGNvcnMub3JpZ2lucztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEVuYWJsZXMgb3IgZGlzYWJsZXMgZGVidWcgbW9kZSBmb3IgdGhlIEZhYnJpYyBDQSBTZXJ2ZXIuXG4gICAqIEBzdW1tYXJ5IENvbmZpZ3VyZXMgd2hldGhlciB0aGUgRmFicmljIENBIFNlcnZlciBzaG91bGQgcnVuIGluIGRlYnVnIG1vZGUsIHByb3ZpZGluZyBtb3JlIGRldGFpbGVkIGxvZ2dpbmcgYW5kIG91dHB1dC5cbiAgICogQHBhcmFtIHtib29sZWFufSBbZW5hYmxlXSAtIFdoZXRoZXIgdG8gZW5hYmxlIGRlYnVnIG1vZGUuXG4gICAqIEByZXR1cm4ge3RoaXN9IFRoZSBjdXJyZW50IGluc3RhbmNlIG9mIHRoZSBidWlsZGVyIGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAqL1xuICBlbmFibGVEZWJ1ZyhlbmFibGU/OiBib29sZWFuKTogdGhpcyB7XG4gICAgaWYgKGVuYWJsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBkZWJ1ZzogJHtlbmFibGV9YCk7XG4gICAgICB0aGlzLmNvbmZpZy5kZWJ1ZyA9IGVuYWJsZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRDcmxTaXplTGltaXQoY3JsU2l6ZUxpbWl0PzogbnVtYmVyKTogdGhpcyB7XG4gICAgaWYgKGNybFNpemVMaW1pdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBDUkwgc2l6ZSBsaW1pdDogJHtjcmxTaXplTGltaXR9YCk7XG4gICAgICB0aGlzLmNvbmZpZy5jcmxzaXplbGltaXQgPSBjcmxTaXplTGltaXQ7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0U2VydmVyVExTKHRsc0NvbmZpZz86IFNlcnZlclRMU0NvbmZpZyk6IHRoaXMge1xuICAgIGlmICghdGxzQ29uZmlnKSByZXR1cm4gdGhpcztcblxuICAgIGlmICh0bHNDb25maWcuZW5hYmxlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhcIlNldHRpbmcgVExTIGVuYWJsZWRcIik7XG4gICAgICB0aGlzLmNvbmZpZy50bHMhLmVuYWJsZWQgPSB0bHNDb25maWcuZW5hYmxlZDtcbiAgICB9XG5cbiAgICBpZiAodGxzQ29uZmlnLmNlcnRmaWxlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIFRMUyBjZXJ0IGZpbGU6ICR7dGxzQ29uZmlnLmNlcnRmaWxlfWApO1xuICAgICAgdGhpcy5jb25maWcudGxzIS5jZXJ0ZmlsZSA9IHRsc0NvbmZpZy5jZXJ0ZmlsZTtcbiAgICB9XG5cbiAgICBpZiAodGxzQ29uZmlnLmtleWZpbGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgVExTIGtleSBmaWxlOiAke3Rsc0NvbmZpZy5rZXlmaWxlfWApO1xuICAgICAgdGhpcy5jb25maWcudGxzIS5rZXlmaWxlID0gdGxzQ29uZmlnLmtleWZpbGU7XG4gICAgfVxuXG4gICAgaWYgKHRsc0NvbmZpZy5jbGllbnRhdXRoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICh0bHNDb25maWcuY2xpZW50YXV0aC5jZXJ0ZmlsZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgICAgICBgU2V0dGluZyBUTFMgY2xpZW50IGNlcnRmaWxlczogJHt0bHNDb25maWcuY2xpZW50YXV0aC5jZXJ0ZmlsZXN9YFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmNvbmZpZy50bHMhLmNsaWVudGF1dGghLmNlcnRmaWxlcyA9IHRsc0NvbmZpZy5jbGllbnRhdXRoLmNlcnRmaWxlcztcbiAgICAgIH1cblxuICAgICAgaWYgKHRsc0NvbmZpZy5jbGllbnRhdXRoLnR5cGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgICAgICBgU2V0dGluZyBUTFMgY2xpZW50IGF1dGggdHlwZTogJHt0bHNDb25maWcuY2xpZW50YXV0aC50eXBlfWBcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5jb25maWcudGxzIS5jbGllbnRhdXRoIS50eXBlID0gdGxzQ29uZmlnLmNsaWVudGF1dGgudHlwZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldENBKGNvbmZpZz86IENBQ29uZmlnKTogdGhpcyB7XG4gICAgaWYgKCFjb25maWcpIHJldHVybiB0aGlzO1xuXG4gICAgaWYgKGNvbmZpZy5uYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIENBIG5hbWU6ICR7Y29uZmlnLm5hbWV9YCk7XG4gICAgICB0aGlzLmNvbmZpZy5jYSEubmFtZSA9IGNvbmZpZy5uYW1lO1xuICAgIH1cblxuICAgIGlmIChjb25maWcua2V5ZmlsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBDQSBrZXkgZmlsZTogJHtjb25maWcua2V5ZmlsZX1gKTtcbiAgICAgIHRoaXMuY29uZmlnLmNhIS5rZXlmaWxlID0gY29uZmlnLmtleWZpbGU7XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5jZXJ0ZmlsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBDQSBjZXJ0IGZpbGU6ICR7Y29uZmlnLmNlcnRmaWxlfWApO1xuICAgICAgdGhpcy5jb25maWcuY2EhLmNlcnRmaWxlID0gY29uZmlnLmNlcnRmaWxlO1xuICAgIH1cblxuICAgIGlmIChjb25maWcuY2hhaW5maWxlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIENBIGNoYWluIGZpbGU6ICR7Y29uZmlnLmNoYWluZmlsZX1gKTtcbiAgICAgIHRoaXMuY29uZmlnLmNhIS5jaGFpbmZpbGUgPSBjb25maWcuY2hhaW5maWxlO1xuICAgIH1cblxuICAgIGlmIChjb25maWcucmVlbnJvbGxJZ25vcmVDZXJ0RXhwaXJ5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKFxuICAgICAgICBgU2V0dGluZyByZWVucm9sbElnbm9yZUNlcnRFeHBpcnk6ICR7Y29uZmlnLnJlZW5yb2xsSWdub3JlQ2VydEV4cGlyeX1gXG4gICAgICApO1xuICAgICAgdGhpcy5jb25maWcuY2EhLnJlZW5yb2xsSWdub3JlQ2VydEV4cGlyeSA9XG4gICAgICAgIGNvbmZpZy5yZWVucm9sbElnbm9yZUNlcnRFeHBpcnk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRDcmxFeHBpcnkoY3JsRXhwaXJ5Pzogc3RyaW5nKTogdGhpcyB7XG4gICAgaWYgKGNybEV4cGlyeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBDUkwgZXhwaXJ5OiAke2NybEV4cGlyeX1gKTtcbiAgICAgIHRoaXMuY29uZmlnLmNybCEuZXhwaXJ5ID0gY3JsRXhwaXJ5O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldElkZW50aXRpZXMoaWRzPzogSWRlbnRpdHlbXSB8IElkZW50aXR5KTogdGhpcyB7XG4gICAgaWYgKGlkcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkoaWRzKSkgaWRzID0gW2lkc107XG5cbiAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIGlkZW50aXRpZXM6ICR7SlNPTi5zdHJpbmdpZnkoaWRzKX1gKTtcbiAgICAgIGNvbnN0IGJhc2VJZGVudGl0eTogSWRlbnRpdHkgPSB0aGlzLmNvbmZpZy5yZWdpc3RyeSEuaWRlbnRpdGllcyFbMF07XG4gICAgICBjb25zdCBpZGVudGl0aWVzOiBJZGVudGl0eVtdID0gaWRzLm1hcCgoZWw6IElkZW50aXR5KSA9PiB7XG4gICAgICAgIGNvbnN0IGlkZW50aXR5ID0geyAuLi5iYXNlSWRlbnRpdHkgfTtcbiAgICAgICAgaWYgKGVsLm5hbWUgIT09IHVuZGVmaW5lZCkgaWRlbnRpdHkubmFtZSA9IGVsLm5hbWU7XG4gICAgICAgIGlmIChlbC5wYXNzICE9PSB1bmRlZmluZWQpIGlkZW50aXR5LnBhc3MgPSBlbC5wYXNzO1xuICAgICAgICBpZiAoZWwudHlwZSAhPT0gdW5kZWZpbmVkKSBpZGVudGl0eS50eXBlID0gZWwudHlwZTtcbiAgICAgICAgaWYgKGVsLmFmZmlsaWF0aW9uICE9PSB1bmRlZmluZWQpIGlkZW50aXR5LmFmZmlsaWF0aW9uID0gZWwuYWZmaWxpYXRpb247XG4gICAgICAgIGlmIChlbC5hdHRycyAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgIGlkZW50aXR5LmF0dHJzID0gb3ZlcnJpZGVOb25VbmRlZmluZWQoXG4gICAgICAgICAgICBpZGVudGl0eS5hdHRycyBhcyB7XG4gICAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IHN0cmluZyB8IGJvb2xlYW47XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZWwuYXR0cnNcbiAgICAgICAgICApO1xuXG4gICAgICAgIHJldHVybiBpZGVudGl0eTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5jb25maWcucmVnaXN0cnkhLmlkZW50aXRpZXMgPSBpZGVudGl0aWVzO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldE1heEVucm9sbG1lbnRzKG1heEVucm9sbG1lbnRzPzogbnVtYmVyKTogdGhpcyB7XG4gICAgaWYgKG1heEVucm9sbG1lbnRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIG1heCBlbnJvbGxtZW50czogJHttYXhFbnJvbGxtZW50c31gKTtcbiAgICAgIHRoaXMuY29uZmlnLnJlZ2lzdHJ5IS5tYXhlbnJvbGxtZW50cyA9IG1heEVucm9sbG1lbnRzO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldERhdGFiYXNlKGNmZz86IERCQ29uZmlnKTogdGhpcyB7XG4gICAgaWYgKGNmZyA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdGhpcztcblxuICAgIGlmIChjZmcudHlwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBkYXRhYmFzZSB0eXBlOiAke2NmZy50eXBlfWApO1xuICAgICAgdGhpcy5jb25maWcuZGIhLnR5cGUgPSBjZmcudHlwZTtcbiAgICB9XG4gICAgaWYgKGNmZy5kYXRhc291cmNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIGRhdGFiYXNlIGRhdGFzb3VyY2U6ICR7Y2ZnLmRhdGFzb3VyY2V9YCk7XG4gICAgICB0aGlzLmNvbmZpZy5kYiEuZGF0YXNvdXJjZSA9IGNmZy5kYXRhc291cmNlO1xuICAgIH1cblxuICAgIGlmIChjZmcudGxzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChjZmcudGxzLmVuYWJsZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBUTFMgZW5hYmxlZDogJHtjZmcudGxzLmVuYWJsZWR9YCk7XG4gICAgICAgIHRoaXMuY29uZmlnLmRiIS50bHMhLmVuYWJsZWQgPSBjZmcudGxzLmVuYWJsZWQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChjZmcudGxzLmNlcnRmaWxlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIFRMUyBjZXJ0ZmlsZXM6ICR7Y2ZnLnRscy5jZXJ0ZmlsZXN9YCk7XG4gICAgICAgIHRoaXMuY29uZmlnLmRiIS50bHMhLmNlcnRmaWxlcyA9IGNmZy50bHMuY2VydGZpbGVzO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2ZnLnRscy5jbGllbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoY2ZnLnRscy5jbGllbnQuY2VydGZpbGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRoaXMubG9nLmRlYnVnKFxuICAgICAgICAgICAgYFNldHRpbmcgVExTIGNsaWVudCBjZXJ0ZmlsZTogJHtjZmcudGxzLmNsaWVudC5jZXJ0ZmlsZX1gXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aGlzLmNvbmZpZy5kYiEudGxzIS5jbGllbnQhLmNlcnRmaWxlID0gY2ZnLnRscy5jbGllbnQuY2VydGZpbGU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2ZnLnRscy5jbGllbnQua2V5ZmlsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhpcy5sb2cuZGVidWcoXG4gICAgICAgICAgICBgU2V0dGluZyBUTFMgY2xpZW50IGtleWZpbGU6ICR7Y2ZnLnRscy5jbGllbnQua2V5ZmlsZX1gXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aGlzLmNvbmZpZy5kYiEudGxzIS5jbGllbnQhLmtleWZpbGUgPSBjZmcudGxzLmNsaWVudC5rZXlmaWxlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRMREFQKGxkYXA/OiBMREFQQ29uZmlnKTogdGhpcyB7XG4gICAgaWYgKGxkYXAgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRoaXM7XG5cbiAgICBpZiAobGRhcC5lbmFibGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIExEQVAgZW5hYmxlZDogJHtsZGFwLmVuYWJsZWR9YCk7XG4gICAgICB0aGlzLmNvbmZpZy5sZGFwIS5lbmFibGVkID0gbGRhcC5lbmFibGVkO1xuICAgIH1cblxuICAgIGlmIChsZGFwLnVybCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBMREFQIFVSTDogJHtsZGFwLnVybH1gKTtcbiAgICAgIHRoaXMuY29uZmlnLmxkYXAhLnVybCA9IGxkYXAudXJsO1xuICAgIH1cblxuICAgIGlmIChsZGFwLnRscyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAobGRhcC50bHMuY2VydGZpbGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgVExTIGNlcnRmaWxlczogJHtsZGFwLnRscy5jZXJ0ZmlsZXN9YCk7XG4gICAgICAgIHRoaXMuY29uZmlnLmxkYXAhLnRscyEuY2VydGZpbGVzID0gbGRhcC50bHMuY2VydGZpbGVzO1xuICAgICAgfVxuXG4gICAgICBpZiAobGRhcC50bHMuY2xpZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKGxkYXAudGxzLmNsaWVudC5jZXJ0ZmlsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhpcy5sb2cuZGVidWcoXG4gICAgICAgICAgICBgU2V0dGluZyBUTFMgY2xpZW50IGNlcnRmaWxlOiAke2xkYXAudGxzLmNsaWVudC5jZXJ0ZmlsZX1gXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aGlzLmNvbmZpZy5sZGFwIS50bHMhLmNsaWVudCEuY2VydGZpbGUgPSBsZGFwLnRscy5jbGllbnQuY2VydGZpbGU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobGRhcC50bHMuY2xpZW50LmtleWZpbGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRoaXMubG9nLmRlYnVnKFxuICAgICAgICAgICAgYFNldHRpbmcgVExTIGNsaWVudCBrZXlmaWxlOiAke2xkYXAudGxzLmNsaWVudC5rZXlmaWxlfWBcbiAgICAgICAgICApO1xuICAgICAgICAgIHRoaXMuY29uZmlnLmxkYXAhLnRscyEuY2xpZW50IS5rZXlmaWxlID0gbGRhcC50bHMuY2xpZW50LmtleWZpbGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobGRhcC5hdHRyaWJ1dGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKGxkYXAuYXR0cmlidXRlLm5hbWVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgTERBUCBhdHRyaWJ1dGUgbmFtZXM6ICR7bGRhcC5hdHRyaWJ1dGUubmFtZXN9YCk7XG4gICAgICAgIHRoaXMuY29uZmlnLmxkYXAhLmF0dHJpYnV0ZSEubmFtZXMgPSBsZGFwLmF0dHJpYnV0ZS5uYW1lcztcbiAgICAgIH1cblxuICAgICAgaWYgKGxkYXAuYXR0cmlidXRlLmNvbnZlcnRlcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgICAgICBgU2V0dGluZyBMREFQIGF0dHJpYnV0ZSBjb252ZXJ0ZXJzOiAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgbGRhcC5hdHRyaWJ1dGUuY29udmVydGVyc1xuICAgICAgICAgICl9YFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmNvbmZpZy5sZGFwIS5hdHRyaWJ1dGUhLmNvbnZlcnRlcnMgPSBsZGFwLmF0dHJpYnV0ZS5jb252ZXJ0ZXJzO1xuICAgICAgfVxuXG4gICAgICBpZiAobGRhcC5hdHRyaWJ1dGUubWFwcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKFxuICAgICAgICAgIGBTZXR0aW5nIExEQVAgYXR0cmlidXRlIG1hcHM6ICR7SlNPTi5zdHJpbmdpZnkobGRhcC5hdHRyaWJ1dGUubWFwcyl9YFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmNvbmZpZy5sZGFwIS5hdHRyaWJ1dGUhLm1hcHMgPSBsZGFwLmF0dHJpYnV0ZS5tYXBzO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0QWZmaWxpYXRpb25zKGFmZmlsaWF0aW9ucz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nW10gfSk6IHRoaXMge1xuICAgIGlmIChhZmZpbGlhdGlvbnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgYWZmaWxpYXRpb25zOiAke0pTT04uc3RyaW5naWZ5KGFmZmlsaWF0aW9ucyl9YCk7XG4gICAgICB0aGlzLmNvbmZpZy5hZmZpbGlhdGlvbnMgPSBhZmZpbGlhdGlvbnM7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZW1vdmVzIHVudXNlZCBwcm9maWxlcyBmcm9tIHRoZSBGYWJyaWMgQ0EgU2VydmVyIGNvbmZpZ3VyYXRpb24uXG4gICAqIEBzdW1tYXJ5IFRoaXMgbWV0aG9kIGFsbG93cyB5b3UgdG8gcmVtb3ZlIHRoZSBUTFMgYW5kL29yIENBIHByb2ZpbGVzIGZyb20gdGhlIGNvbmZpZ3VyYXRpb24gaWYgdGhleSBhcmUgbm90IG5lZWRlZC5cbiAgICogUmVtb3ZpbmcgdW51c2VkIHByb2ZpbGVzIGNhbiBoZWxwIHN0cmVhbWxpbmUgdGhlIGNvbmZpZ3VyYXRpb24gYW5kIHBvdGVudGlhbGx5IGltcHJvdmUgcGVyZm9ybWFuY2UuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3JlbW92ZVRMU1Byb2ZpbGU9ZmFsc2VdIC0gV2hldGhlciB0byByZW1vdmUgdGhlIFRMUyBwcm9maWxlLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtyZW1vdmVDQVByb2ZpbGU9ZmFsc2VdIC0gV2hldGhlciB0byByZW1vdmUgdGhlIENBIHByb2ZpbGUuXG4gICAqIEByZXR1cm4ge3RoaXN9IFRoZSBjdXJyZW50IGluc3RhbmNlIG9mIHRoZSBidWlsZGVyIGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAqIEBleGFtcGxlXG4gICAqIGNvbnN0IGJ1aWxkZXIgPSBuZXcgRmFicmljQ0FTZXJ2ZXJDb21tYW5kQnVpbGRlcigpO1xuICAgKiBidWlsZGVyLnJlbW92ZVVudXNlZFByb2ZpbGVzKHRydWUsIGZhbHNlKTsgLy8gUmVtb3ZlcyBUTFMgcHJvZmlsZSwga2VlcHMgQ0EgcHJvZmlsZVxuICAgKlxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAgICogICBwYXJ0aWNpcGFudCBCdWlsZGVyIGFzIEZhYnJpY0NBU2VydmVyQ29tbWFuZEJ1aWxkZXJcbiAgICogICBwYXJ0aWNpcGFudCBDb25maWcgYXMgRmFicmljQ0FTZXJ2ZXJDb25maWdcbiAgICogICBDbGllbnQtPj5CdWlsZGVyOiByZW1vdmVVbnVzZWRQcm9maWxlcyh0cnVlLCBmYWxzZSlcbiAgICogICBCdWlsZGVyLT4+QnVpbGRlcjogQ2hlY2sgcmVtb3ZlVExTUHJvZmlsZVxuICAgKiAgIGFsdCByZW1vdmVUTFNQcm9maWxlIGlzIHRydWVcbiAgICogICAgIEJ1aWxkZXItPj5Db25maWc6IFJlbW92ZSBUTFMgcHJvZmlsZVxuICAgKiAgIGVuZFxuICAgKiAgIEJ1aWxkZXItPj5CdWlsZGVyOiBDaGVjayByZW1vdmVDQVByb2ZpbGVcbiAgICogICBhbHQgcmVtb3ZlQ0FQcm9maWxlIGlzIHRydWVcbiAgICogICAgIEJ1aWxkZXItPj5Db25maWc6IFJlbW92ZSBDQSBwcm9maWxlXG4gICAqICAgZW5kXG4gICAqICAgQnVpbGRlci0tPj5DbGllbnQ6IFJldHVybiB0aGlzXG4gICAqL1xuICByZW1vdmVVbnVzZWRQcm9maWxlcyhcbiAgICByZW1vdmVUTFNQcm9maWxlOiBib29sZWFuID0gZmFsc2UsXG4gICAgcmVtb3ZlQ0FQcm9maWxlOiBib29sZWFuID0gZmFsc2VcbiAgKTogdGhpcyB7XG4gICAgaWYgKHJlbW92ZVRMU1Byb2ZpbGUpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKFwiUmVtb3ZpbmcgVExTIHByb2ZpbGVcIik7XG4gICAgICBkZWxldGUgdGhpcy5jb25maWcuc2lnbmluZz8ucHJvZmlsZXM/LnRscztcbiAgICB9XG4gICAgaWYgKHJlbW92ZUNBUHJvZmlsZSkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoXCJSZW1vdmluZyBDQSBwcm9maWxlXCIpO1xuICAgICAgZGVsZXRlIHRoaXMuY29uZmlnLnNpZ25pbmc/LnByb2ZpbGVzPy5jYTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRTaWduaW5nKGNmZz86IFNpZ25pbmdDb25maWcpOiB0aGlzIHtcbiAgICBpZiAoY2ZnID09PSB1bmRlZmluZWQpIHJldHVybiB0aGlzO1xuXG4gICAgaWYgKGNmZy5kZWZhdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChjZmcuZGVmYXVsdC51c2FnZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIGRlZmF1bHQgdXNhZ2U6ICR7Y2ZnLmRlZmF1bHQudXNhZ2V9YCk7XG4gICAgICAgIHRoaXMuY29uZmlnLnNpZ25pbmchLmRlZmF1bHQhLnVzYWdlID0gWy4uLm5ldyBTZXQoY2ZnLmRlZmF1bHQudXNhZ2UpXTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNmZy5kZWZhdWx0LmV4cGlyeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIGRlZmF1bHQgZXhwaXJ5OiAke2NmZy5kZWZhdWx0LmV4cGlyeX1gKTtcbiAgICAgICAgdGhpcy5jb25maWcuc2lnbmluZyEuZGVmYXVsdCEuZXhwaXJ5ID0gY2ZnLmRlZmF1bHQuZXhwaXJ5O1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjZmcucHJvZmlsZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKGNmZy5wcm9maWxlcy5jYSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmIChjZmcucHJvZmlsZXMuY2EudXNhZ2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIENBIHVzYWdlOiAke2NmZy5wcm9maWxlcy5jYS51c2FnZX1gKTtcbiAgICAgICAgICB0aGlzLmNvbmZpZy5zaWduaW5nIS5wcm9maWxlcyEuY2EhLnVzYWdlID0gW1xuICAgICAgICAgICAgLi4ubmV3IFNldChjZmcucHJvZmlsZXMuY2EudXNhZ2UpLFxuICAgICAgICAgIF07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2ZnLnByb2ZpbGVzLmNhLmV4cGlyeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgQ0EgZXhwaXJ5OiAke2NmZy5wcm9maWxlcy5jYS5leHBpcnl9YCk7XG4gICAgICAgICAgdGhpcy5jb25maWcuc2lnbmluZyEucHJvZmlsZXMhLmNhIS5leHBpcnkgPSBjZmcucHJvZmlsZXMuY2EuZXhwaXJ5O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNmZy5wcm9maWxlcy5jYS5jYWNvbnN0cmFpbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGlmIChjZmcucHJvZmlsZXMuY2EuY2Fjb25zdHJhaW50LmlzY2EgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5sb2cuZGVidWcoXG4gICAgICAgICAgICAgIGBTZXR0aW5nIENBIGlzQ0E6ICR7Y2ZnLnByb2ZpbGVzLmNhLmNhY29uc3RyYWludC5pc2NhfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZy5zaWduaW5nIS5wcm9maWxlcyEuY2EhLmNhY29uc3RyYWludCEuaXNjYSA9XG4gICAgICAgICAgICAgIGNmZy5wcm9maWxlcy5jYS5jYWNvbnN0cmFpbnQuaXNjYTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoY2ZnLnByb2ZpbGVzLmNhLmNhY29uc3RyYWludC5tYXhwYXRobGVuICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMubG9nLmRlYnVnKFxuICAgICAgICAgICAgICBgU2V0dGluZyBDQSBtYXggcGF0aGxlbmd0aDogJHtjZmcucHJvZmlsZXMuY2EuY2Fjb25zdHJhaW50Lm1heHBhdGhsZW59YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuY29uZmlnLnNpZ25pbmchLnByb2ZpbGVzIS5jYSEuY2Fjb25zdHJhaW50IS5tYXhwYXRobGVuID1cbiAgICAgICAgICAgICAgY2ZnLnByb2ZpbGVzLmNhLmNhY29uc3RyYWludC5tYXhwYXRobGVuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoY2ZnLnByb2ZpbGVzLnRscyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmIChjZmcucHJvZmlsZXMudGxzLnVzYWdlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBUTFMgdXNhZ2U6ICR7Y2ZnLnByb2ZpbGVzLnRscy51c2FnZX1gKTtcbiAgICAgICAgICB0aGlzLmNvbmZpZy5zaWduaW5nIS5wcm9maWxlcyEudGxzIS51c2FnZSA9IFtcbiAgICAgICAgICAgIC4uLm5ldyBTZXQoY2ZnLnByb2ZpbGVzLnRscy51c2FnZSksXG4gICAgICAgICAgXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjZmcucHJvZmlsZXMudGxzLmV4cGlyeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgVExTIGV4cGlyeTogJHtjZmcucHJvZmlsZXMudGxzLmV4cGlyeX1gKTtcbiAgICAgICAgICB0aGlzLmNvbmZpZy5zaWduaW5nIS5wcm9maWxlcyEudGxzIS5leHBpcnkgPSBjZmcucHJvZmlsZXMudGxzLmV4cGlyeTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0Q1NSKGNzcj86IENTUkNvbmZpZyk6IHRoaXMge1xuICAgIGlmIChjc3IgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRoaXM7XG5cbiAgICBpZiAoY3NyLmNuICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIENTUiBDTjogJHtjc3IuY259YCk7XG4gICAgICB0aGlzLmNvbmZpZy5jc3IhLmNuID0gY3NyLmNuO1xuICAgIH1cblxuICAgIGlmIChjc3IuaG9zdHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgQ1NSIGhvc3RzOiAke2Nzci5ob3N0c31gKTtcbiAgICAgIHRoaXMuY29uZmlnLmNzciEuaG9zdHMgPSBbLi4ubmV3IFNldChjc3IuaG9zdHMpXTtcbiAgICB9XG5cbiAgICBpZiAoY3NyLmtleXJlcXVlc3QgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKGNzci5rZXlyZXF1ZXN0LmFsZ28gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgICAgICBgU2V0dGluZyBDU1Iga2V5IHJlcXVlc3QgYWxnb3JpdGhtOiAke2Nzci5rZXlyZXF1ZXN0LmFsZ299YFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmNvbmZpZy5jc3IhLmtleXJlcXVlc3QhLmFsZ28gPSBjc3Iua2V5cmVxdWVzdC5hbGdvO1xuICAgICAgfVxuICAgICAgaWYgKGNzci5rZXlyZXF1ZXN0LnNpemUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBDU1Iga2V5IHJlcXVlc3Qgc2l6ZTogJHtjc3Iua2V5cmVxdWVzdC5zaXplfWApO1xuICAgICAgICB0aGlzLmNvbmZpZy5jc3IhLmtleXJlcXVlc3QhLnNpemUgPSBjc3Iua2V5cmVxdWVzdC5zaXplO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjc3IubmFtZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgQ1NSIG5hbWVzOiAke0pTT04uc3RyaW5naWZ5KGNzci5uYW1lcyl9YCk7XG4gICAgICB0aGlzLmNvbmZpZy5jc3IhLm5hbWVzID0gY3NyLm5hbWVzO1xuICAgIH1cblxuICAgIGlmIChjc3IuY2EgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKGNzci5jYS5leHBpcnkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBDU1IgQ0EgZXhwaXJ5OiAke2Nzci5jYS5leHBpcnl9YCk7XG4gICAgICAgIHRoaXMuY29uZmlnLmNzciEuY2EhLmV4cGlyeSA9IGNzci5jYS5leHBpcnk7XG4gICAgICB9XG4gICAgICBpZiAoY3NyLmNhLnBhdGhsZW5ndGggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBDU1IgQ0EgcGF0aGxlbmd0aDogJHtjc3IuY2EucGF0aGxlbmd0aH1gKTtcbiAgICAgICAgdGhpcy5jb25maWcuY3NyIS5jYSEucGF0aGxlbmd0aCA9IGNzci5jYS5wYXRobGVuZ3RoO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0SWRlbWl4KGlkZW1peD86IElkZW1peENvbmZpZyk6IHRoaXMge1xuICAgIGlmIChpZGVtaXggPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRoaXM7XG5cbiAgICBpZiAoaWRlbWl4Lm5vbmNlZXhwaXJhdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgICAgYFNldHRpbmcgSWRlbWl4IG5vbmNlIGV4cGlyYXRpb246ICR7aWRlbWl4Lm5vbmNlZXhwaXJhdGlvbn1gXG4gICAgICApO1xuICAgICAgdGhpcy5jb25maWcuaWRlbWl4IS5ub25jZWV4cGlyYXRpb24gPSBpZGVtaXgubm9uY2VleHBpcmF0aW9uO1xuICAgIH1cblxuICAgIGlmIChpZGVtaXguY3VydmUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgSWRlbWl4IGN1cnZlOiAke2lkZW1peC5jdXJ2ZX1gKTtcbiAgICAgIHRoaXMuY29uZmlnLmlkZW1peCEuY3VydmUgPSBpZGVtaXguY3VydmU7XG4gICAgfVxuXG4gICAgaWYgKGlkZW1peC5ub25jZXN3ZWVwaW50ZXJ2YWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoXG4gICAgICAgIGBTZXR0aW5nIElkZW1peCBub25jZXN3ZWVwIGludGVydmFsOiAke2lkZW1peC5ub25jZXN3ZWVwaW50ZXJ2YWx9YFxuICAgICAgKTtcbiAgICAgIHRoaXMuY29uZmlnLmlkZW1peCEubm9uY2Vzd2VlcGludGVydmFsID0gaWRlbWl4Lm5vbmNlc3dlZXBpbnRlcnZhbDtcbiAgICB9XG5cbiAgICBpZiAoaWRlbWl4LnJocG9vbHNpemUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgSWRlbWl4IHJocG9vbHNpemU6ICR7aWRlbWl4LnJocG9vbHNpemV9YCk7XG4gICAgICB0aGlzLmNvbmZpZy5pZGVtaXghLnJocG9vbHNpemUgPSBpZGVtaXgucmhwb29sc2l6ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldEJDQ1NQKGJjY3NwPzogQkNDU1BDb25maWcpOiB0aGlzIHtcbiAgICBpZiAoYmNjc3AgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRoaXM7XG5cbiAgICBpZiAoYmNjc3AuZGVmYXVsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBkZWZhdWx0IEJDQ1NQOiAke2JjY3NwLmRlZmF1bHR9YCk7XG4gICAgICB0aGlzLmNvbmZpZy5iY2NzcCEuZGVmYXVsdCA9IGJjY3NwLmRlZmF1bHQ7XG4gICAgfVxuXG4gICAgaWYgKGJjY3NwLnN3ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChiY2NzcC5zdy5oYXNoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgQkNDU1AgaGFzaDogJHtiY2NzcC5zdy5oYXNofWApO1xuICAgICAgICB0aGlzLmNvbmZpZy5iY2NzcCEuc3chLmhhc2ggPSBiY2NzcC5zdy5oYXNoO1xuICAgICAgfVxuXG4gICAgICBpZiAoYmNjc3Auc3cuc2VjdXJpdHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBCQ0NTUCBzZWN1cml0eTogJHtiY2NzcC5zdy5zZWN1cml0eX1gKTtcbiAgICAgICAgdGhpcy5jb25maWcuYmNjc3AhLnN3IS5zZWN1cml0eSA9IGJjY3NwLnN3LnNlY3VyaXR5O1xuICAgICAgfVxuICAgICAgaWYgKGJjY3NwLnN3LmZpbGVrZXlzdG9yZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmIChiY2NzcC5zdy5maWxla2V5c3RvcmUua2V5c3RvcmUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRoaXMubG9nLmRlYnVnKFxuICAgICAgICAgICAgYFNldHRpbmcgQkNDU1AgZmlsZWtleXN0b3JlIGtleXN0b3JlOiAke2JjY3NwLnN3LmZpbGVrZXlzdG9yZS5rZXlzdG9yZX1gXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aGlzLmNvbmZpZy5iY2NzcCEuc3chLmZpbGVrZXlzdG9yZSEua2V5c3RvcmUgPVxuICAgICAgICAgICAgYmNjc3Auc3cuZmlsZWtleXN0b3JlLmtleXN0b3JlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRDQUNvdW50KGNvdW50PzogbnVtYmVyKTogdGhpcyB7XG4gICAgaWYgKGNvdW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIENBIGNvdW50OiAke2NvdW50fWApO1xuICAgICAgdGhpcy5jb25maWcuY2Fjb3VudCA9IGNvdW50O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldENBRmlsZXMoZmlsZXM/OiBzdHJpbmdbXSk6IHRoaXMge1xuICAgIGlmIChmaWxlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBDQSBmaWxlczogJHtmaWxlcy5qb2luKFwiLCBcIil9YCk7XG4gICAgICB0aGlzLmNvbmZpZy5jYWZpbGVzID0gZmlsZXM7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0SW50ZXJtZWRpYXRlKGludDogSW50ZXJtZWRpYXRlQ0FDb25maWcpOiB0aGlzIHtcbiAgICBpZiAoaW50ID09PSB1bmRlZmluZWQpIHJldHVybiB0aGlzO1xuXG4gICAgaWYgKGludC5wYXJlbnRzZXJ2ZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKGludC5wYXJlbnRzZXJ2ZXIudXJsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoXG4gICAgICAgICAgYFNldHRpbmcgaW50ZXJtZWRpYXRlIENBIHBhcmVudCBzZXJ2ZXIgVVJMOiAke2ludC5wYXJlbnRzZXJ2ZXIudXJsfWBcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5jb25maWcuaW50ZXJtZWRpYXRlIS5wYXJlbnRzZXJ2ZXIhLnVybCA9IGludC5wYXJlbnRzZXJ2ZXIudXJsO1xuICAgICAgfVxuICAgICAgaWYgKGludC5wYXJlbnRzZXJ2ZXIuY2FuYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoXG4gICAgICAgICAgYFNldHRpbmcgaW50ZXJtZWRpYXRlIENBIHBhcmVudCBzZXJ2ZXIgY2FuYW1lOiAke2ludC5wYXJlbnRzZXJ2ZXIuY2FuYW1lfWBcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5jb25maWcuaW50ZXJtZWRpYXRlIS5wYXJlbnRzZXJ2ZXIhLmNhbmFtZSA9XG4gICAgICAgICAgaW50LnBhcmVudHNlcnZlci5jYW5hbWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGludC5lbnJvbGxtZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChpbnQuZW5yb2xsbWVudC5ob3N0cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKFxuICAgICAgICAgIGBTZXR0aW5nIGludGVybWVkaWF0ZSBDQSBlbnJvbGxtZW50IGhvc3RzOiAke2ludC5lbnJvbGxtZW50Lmhvc3RzLmpvaW4oXG4gICAgICAgICAgICBcIiwgXCJcbiAgICAgICAgICApfWBcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5jb25maWcuaW50ZXJtZWRpYXRlIS5lbnJvbGxtZW50IS5ob3N0cyA9IGludC5lbnJvbGxtZW50Lmhvc3RzO1xuICAgICAgfVxuICAgICAgaWYgKGludC5lbnJvbGxtZW50LnByb2ZpbGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgICAgICBgU2V0dGluZyBpbnRlcm1lZGlhdGUgQ0EgZW5yb2xsbWVudCBwcm9maWxlOiAke2ludC5lbnJvbGxtZW50LnByb2ZpbGV9YFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmNvbmZpZy5pbnRlcm1lZGlhdGUhLmVucm9sbG1lbnQhLnByb2ZpbGUgPSBpbnQuZW5yb2xsbWVudC5wcm9maWxlO1xuICAgICAgfVxuICAgICAgaWYgKGludC5lbnJvbGxtZW50LmxhYmVsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoXG4gICAgICAgICAgYFNldHRpbmcgaW50ZXJtZWRpYXRlIENBIGVucm9sbG1lbnQgbGFiZWw6ICR7aW50LmVucm9sbG1lbnQubGFiZWx9YFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmNvbmZpZy5pbnRlcm1lZGlhdGUhLmVucm9sbG1lbnQhLmxhYmVsID0gaW50LmVucm9sbG1lbnQubGFiZWw7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpbnQudGxzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChpbnQudGxzLmNlcnRmaWxlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKFxuICAgICAgICAgIGBTZXR0aW5nIGludGVybWVkaWF0ZSBDQSBUTFMgY2VydGZpbGVzOiAke2ludC50bHMuY2VydGZpbGVzLmpvaW4oXG4gICAgICAgICAgICBcIiwgXCJcbiAgICAgICAgICApfWBcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5jb25maWcuaW50ZXJtZWRpYXRlIS50bHMhLmNlcnRmaWxlcyA9IGludC50bHMuY2VydGZpbGVzO1xuICAgICAgfVxuICAgICAgaWYgKGludC50bHMuY2xpZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKGludC50bHMuY2xpZW50LmNlcnRmaWxlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgICAgICAgIGBTZXR0aW5nIGludGVybWVkaWF0ZSBDQSBUTFMgY2xpZW50IGNlcnRmaWxlOiAke2ludC50bHMuY2xpZW50LmNlcnRmaWxlfWBcbiAgICAgICAgICApO1xuICAgICAgICAgIHRoaXMuY29uZmlnLmludGVybWVkaWF0ZSEudGxzIS5jbGllbnQhLmNlcnRmaWxlID1cbiAgICAgICAgICAgIGludC50bHMuY2xpZW50LmNlcnRmaWxlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbnQudGxzLmNsaWVudC5rZXlmaWxlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgICAgICAgIGBTZXR0aW5nIGludGVybWVkaWF0ZSBDQSBUTFMgY2xpZW50IGtleWZpbGU6ICR7aW50LnRscy5jbGllbnQua2V5ZmlsZX1gXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aGlzLmNvbmZpZy5pbnRlcm1lZGlhdGUhLnRscyEuY2xpZW50IS5rZXlmaWxlID1cbiAgICAgICAgICAgIGludC50bHMuY2xpZW50LmtleWZpbGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldFBhc3N3b3JkQXR0ZW1wdHMoYXR0ZW1wdHM/OiBudW1iZXIpOiB0aGlzIHtcbiAgICBpZiAoYXR0ZW1wdHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgcGFzc3dvcmQgYXR0ZW1wdHM6ICR7YXR0ZW1wdHN9YCk7XG4gICAgICB0aGlzLmNvbmZpZy5jZmchLmlkZW50aXRpZXMhLnBhc3N3b3JkYXR0ZW1wdHMgPSBhdHRlbXB0cztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRPcGVyYXRpb25zKG9wZXJhdGlvbnM/OiBPcGVyYXRpb25zQ29uZmlnKTogdGhpcyB7XG4gICAgaWYgKG9wZXJhdGlvbnMgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRoaXM7XG5cbiAgICBpZiAob3BlcmF0aW9ucy5saXN0ZW5BZGRyZXNzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKFxuICAgICAgICBgU2V0dGluZyBvcGVyYXRpb25zIGxpc3RlbiBhZGRyZXNzOiAke29wZXJhdGlvbnMubGlzdGVuQWRkcmVzc31gXG4gICAgICApO1xuICAgICAgdGhpcy5jb25maWcub3BlcmF0aW9ucyEubGlzdGVuQWRkcmVzcyA9IG9wZXJhdGlvbnMubGlzdGVuQWRkcmVzcztcbiAgICB9XG4gICAgaWYgKG9wZXJhdGlvbnMudGxzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChvcGVyYXRpb25zLnRscy5lbmFibGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoXG4gICAgICAgICAgYFNldHRpbmcgb3BlcmF0aW9ucyBUTFMgZW5hYmxlZDogJHtvcGVyYXRpb25zLnRscy5lbmFibGVkfWBcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5jb25maWcub3BlcmF0aW9ucyEudGxzIS5lbmFibGVkID0gb3BlcmF0aW9ucy50bHMuZW5hYmxlZDtcbiAgICAgIH1cbiAgICAgIGlmIChvcGVyYXRpb25zLnRscy5jZXJ0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKG9wZXJhdGlvbnMudGxzLmNlcnQuZmlsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhpcy5sb2cuZGVidWcoXG4gICAgICAgICAgICBgU2V0dGluZyBvcGVyYXRpb25zIFRMUyBjZXJ0IGZpbGU6ICR7b3BlcmF0aW9ucy50bHMuY2VydC5maWxlfWBcbiAgICAgICAgICApO1xuICAgICAgICAgIHRoaXMuY29uZmlnLm9wZXJhdGlvbnMhLnRscyEuY2VydCEuZmlsZSA9IG9wZXJhdGlvbnMudGxzLmNlcnQuZmlsZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG9wZXJhdGlvbnMudGxzLmtleSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmIChvcGVyYXRpb25zLnRscy5rZXkuZmlsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhpcy5sb2cuZGVidWcoXG4gICAgICAgICAgICBgU2V0dGluZyBvcGVyYXRpb25zIFRMUyBrZXkgZmlsZTogJHtvcGVyYXRpb25zLnRscy5rZXkuZmlsZX1gXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aGlzLmNvbmZpZy5vcGVyYXRpb25zIS50bHMhLmtleSEuZmlsZSA9IG9wZXJhdGlvbnMudGxzLmtleS5maWxlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAob3BlcmF0aW9ucy50bHMuY2xpZW50QXV0aFJlcXVpcmVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoXG4gICAgICAgICAgYFNldHRpbmcgb3BlcmF0aW9ucyBUTFMgY2xpZW50IGF1dGhlbnRpY2F0aW9uIHJlcXVpcmVkOiAke29wZXJhdGlvbnMudGxzLmNsaWVudEF1dGhSZXF1aXJlZH1gXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuY29uZmlnLm9wZXJhdGlvbnMhLnRscyEuY2xpZW50QXV0aFJlcXVpcmVkID1cbiAgICAgICAgICBvcGVyYXRpb25zLnRscy5jbGllbnRBdXRoUmVxdWlyZWQ7XG4gICAgICB9XG4gICAgICBpZiAob3BlcmF0aW9ucy50bHMuY2xpZW50Um9vdENBcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmIChvcGVyYXRpb25zLnRscy5jbGllbnRSb290Q0FzLmZpbGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgICAgICAgIGBTZXR0aW5nIG9wZXJhdGlvbnMgVExTIGNsaWVudCByb290IENBcyBmaWxlczogJHtvcGVyYXRpb25zLnRscy5jbGllbnRSb290Q0FzLmZpbGVzLmpvaW4oXG4gICAgICAgICAgICAgIFwiLCBcIlxuICAgICAgICAgICAgKX1gXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aGlzLmNvbmZpZy5vcGVyYXRpb25zIS50bHMhLmNsaWVudFJvb3RDQXMhLmZpbGVzID1cbiAgICAgICAgICAgIG9wZXJhdGlvbnMudGxzLmNsaWVudFJvb3RDQXMuZmlsZXM7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRNZXRyaWNzKG1ldHJpY3M/OiBNZXRyaWNzQ29uZmlnKTogdGhpcyB7XG4gICAgaWYgKG1ldHJpY3MgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRoaXM7XG5cbiAgICBpZiAobWV0cmljcy5wcm92aWRlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBtZXRyaWNzIHByb3ZpZGVyOiAke21ldHJpY3MucHJvdmlkZXJ9YCk7XG4gICAgICB0aGlzLmNvbmZpZy5tZXRyaWNzIS5wcm92aWRlciA9IG1ldHJpY3MucHJvdmlkZXI7XG4gICAgfVxuXG4gICAgaWYgKG1ldHJpY3Muc3RhdHNkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChtZXRyaWNzLnN0YXRzZC5uZXR3b3JrICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoXG4gICAgICAgICAgYFNldHRpbmcgbWV0cmljcyBzdGF0c2QgbmV0d29yazogJHttZXRyaWNzLnN0YXRzZC5uZXR3b3JrfWBcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5jb25maWcubWV0cmljcyEuc3RhdHNkIS5uZXR3b3JrID0gbWV0cmljcy5zdGF0c2QubmV0d29yaztcbiAgICAgIH1cbiAgICAgIGlmIChtZXRyaWNzLnN0YXRzZC5hZGRyZXNzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoXG4gICAgICAgICAgYFNldHRpbmcgbWV0cmljcyBzdGF0c2QgYWRkcmVzczogJHttZXRyaWNzLnN0YXRzZC5hZGRyZXNzfWBcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5jb25maWcubWV0cmljcyEuc3RhdHNkIS5hZGRyZXNzID0gbWV0cmljcy5zdGF0c2QuYWRkcmVzcztcbiAgICAgIH1cbiAgICAgIGlmIChtZXRyaWNzLnN0YXRzZC53cml0ZUludGVydmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoXG4gICAgICAgICAgYFNldHRpbmcgbWV0cmljcyBzdGF0c2Qgd3JpdGUgaW50ZXJ2YWw6ICR7bWV0cmljcy5zdGF0c2Qud3JpdGVJbnRlcnZhbH1gXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuY29uZmlnLm1ldHJpY3MhLnN0YXRzZCEud3JpdGVJbnRlcnZhbCA9XG4gICAgICAgICAgbWV0cmljcy5zdGF0c2Qud3JpdGVJbnRlcnZhbDtcbiAgICAgIH1cbiAgICAgIGlmIChtZXRyaWNzLnN0YXRzZC5wcmVmaXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgICAgICBgU2V0dGluZyBtZXRyaWNzIHN0YXRzZCBwcmVmaXg6ICR7bWV0cmljcy5zdGF0c2QucHJlZml4fWBcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5jb25maWcubWV0cmljcyEuc3RhdHNkIS5wcmVmaXggPSBtZXRyaWNzLnN0YXRzZC5wcmVmaXg7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTYXZlcyB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uIHRvIGEgZmlsZS5cbiAgICogQHN1bW1hcnkgV3JpdGVzIHRoZSBjdXJyZW50IEZhYnJpYyBDQSBTZXJ2ZXIgY29uZmlndXJhdGlvbiB0byBhIFlBTUwgZmlsZSBhdCB0aGUgc3BlY2lmaWVkIHBhdGguIElmIHRoZSBkaXJlY3RvcnkgZG9lc24ndCBleGlzdCwgaXQgd2lsbCBiZSBjcmVhdGVkLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY3BhdGggLSBUaGUgcGF0aCB3aGVyZSB0aGUgY29uZmlndXJhdGlvbiBmaWxlIHNob3VsZCBiZSBzYXZlZC5cbiAgICogQHJldHVybiB7dGhpc30gVGhlIGN1cnJlbnQgaW5zdGFuY2Ugb2YgdGhlIGJ1aWxkZXIgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICogQGV4YW1wbGVcbiAgICogY29uc3QgYnVpbGRlciA9IG5ldyBGYWJyaWNDQVNlcnZlckNvbW1hbmRCdWlsZGVyKCk7XG4gICAqIGJ1aWxkZXIuc2F2ZSgnL3BhdGgvdG8vY29uZmlnL2ZhYnJpYy1jYS1zZXJ2ZXIueWFtbCcpO1xuICAgKlxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAgICogICBwYXJ0aWNpcGFudCBCdWlsZGVyIGFzIEZhYnJpY0NBU2VydmVyQ29tbWFuZEJ1aWxkZXJcbiAgICogICBwYXJ0aWNpcGFudCBGaWxlU3lzdGVtIGFzIEZpbGUgU3lzdGVtXG4gICAqICAgQ2xpZW50LT4+QnVpbGRlcjogc2F2ZUNvbmZpZygnL3BhdGgvdG8vY29uZmlnL2ZhYnJpYy1jYS1zZXJ2ZXIueWFtbCcpXG4gICAqICAgQnVpbGRlci0+PkJ1aWxkZXI6IENoZWNrIGlmIGNwYXRoIGlzIGRlZmluZWRcbiAgICogICBhbHQgY3BhdGggaXMgZGVmaW5lZFxuICAgKiAgICAgQnVpbGRlci0+PkZpbGVTeXN0ZW06IENoZWNrIGlmIGRpcmVjdG9yeSBleGlzdHNcbiAgICogICAgIGFsdCBEaXJlY3RvcnkgZG9lc24ndCBleGlzdFxuICAgKiAgICAgICBCdWlsZGVyLT4+RmlsZVN5c3RlbTogQ3JlYXRlIGRpcmVjdG9yeVxuICAgKiAgICAgZW5kXG4gICAqICAgICBCdWlsZGVyLT4+QnVpbGRlcjogTG9nIGRlYnVnIG1lc3NhZ2VcbiAgICogICAgIEJ1aWxkZXItPj5GaWxlU3lzdGVtOiBXcml0ZSBZQU1MIGNvbmZpZ3VyYXRpb24gdG8gZmlsZVxuICAgKiAgIGVuZFxuICAgKiAgIEJ1aWxkZXItLT4+Q2xpZW50OiBSZXR1cm4gdGhpc1xuICAgKi9cbiAgc2F2ZShjcGF0aD86IHN0cmluZyk6IHRoaXMge1xuICAgIGlmIChjcGF0aCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdGhpcztcblxuICAgIGlmICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oY3BhdGgpKSlcbiAgICAgIGZzLm1rZGlyU3luYyhwYXRoLmpvaW4oY3BhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIGlmICghY3BhdGguZW5kc1dpdGgoXCIueWFtbFwiKSlcbiAgICAgIGNwYXRoID0gcGF0aC5qb2luKGNwYXRoLCBcImZhYnJpYy1jYS1zZXJ2ZXItY29uZmlnLnlhbWxcIik7XG5cbiAgICB0aGlzLmxvZy5kZWJ1ZyhgV3JpdGluZyBjb25maWd1cmF0aW9uIHRvICR7Y3BhdGh9YCk7XG4gICAgdGhpcy5sb2cuZGVidWcoYENvbmZpZyBmaWxlOiAke0pTT04uc3RyaW5naWZ5KHRoaXMuY29uZmlnLCBudWxsLCAyKX1gKTtcbiAgICB3cml0ZUZpbGVZYW1sKGNwYXRoLCB0aGlzLmNvbmZpZyk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuIl19