@decaf-ts/fabric-weaver
Version:
template for ts projects
1,049 lines • 183 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.FabricPeerConfigBuilder = void 0;
const logging_1 = require("@decaf-ts/logging");
const path_1 = __importDefault(require("path"));
const fs_1 = __importDefault(require("fs"));
const yaml_1 = require("../../utils/yaml.cjs");
class FabricPeerConfigBuilder {
constructor(logger) {
this.config = (0, yaml_1.readFileYaml)(path_1.default.join(__dirname, "../../../config/core.yaml"));
if (!logger)
this.log = logging_1.Logging.for(FabricPeerConfigBuilder);
else
this.log = logger.for(FabricPeerConfigBuilder.name);
}
setGossip(gossip) {
if (gossip === undefined)
return this;
if (gossip.bootstrap !== undefined) {
this.log.debug(`Setting bootstrap: ${gossip.bootstrap}`);
this.config.peer.gossip.bootstrap = gossip.bootstrap;
}
if (gossip.useLeaderElection !== undefined) {
this.log.debug(`Setting use leader election: ${gossip.useLeaderElection}`);
this.config.peer.gossip.useLeaderElection = gossip.useLeaderElection;
}
if (gossip.orgLeader !== undefined) {
this.log.debug(`Setting org leaders: ${gossip.orgLeader}`);
this.config.peer.gossip.orgLeader = gossip.orgLeader;
}
if (gossip.membershipTrackerInterval !== undefined) {
this.log.debug(`Setting membership tracker interval: ${gossip.membershipTrackerInterval}`);
this.config.peer.gossip.membershipTrackerInterval =
gossip.membershipTrackerInterval;
}
if (gossip.maxBlockCountToStore !== undefined) {
this.log.debug(`Setting max block count to store: ${gossip.maxBlockCountToStore}`);
this.config.peer.gossip.maxBlockCountToStore =
gossip.maxBlockCountToStore;
}
if (gossip.maxPropagationBurstLatency !== undefined) {
this.log.debug(`Setting max propagation burst latency: ${gossip.maxPropagationBurstLatency}`);
this.config.peer.gossip.maxPropagationBurstLatency =
gossip.maxPropagationBurstLatency;
}
if (gossip.maxPropagationBurstSize !== undefined) {
this.log.debug(`Setting max propagation burst size: ${gossip.maxPropagationBurstSize}`);
this.config.peer.gossip.maxPropagationBurstSize =
gossip.maxPropagationBurstSize;
}
if (gossip.propagateIterations !== undefined) {
this.log.debug(`Setting propagate iterations: ${gossip.propagateIterations}`);
this.config.peer.gossip.propagateIterations =
gossip.propagateIterations;
}
if (gossip.propagatePeerNum !== undefined) {
this.log.debug(`Setting propagate peer number: ${gossip.propagatePeerNum}`);
this.config.peer.gossip.propagatePeerNum = gossip.propagatePeerNum;
}
if (gossip.pullInterval !== undefined) {
this.log.debug(`Setting pull interval: ${gossip.pullInterval}`);
this.config.peer.gossip.pullInterval = gossip.pullInterval;
}
if (gossip.pullPeerNum !== undefined) {
this.log.debug(`Setting pull peer number: ${gossip.pullPeerNum}`);
this.config.peer.gossip.pullPeerNum = gossip.pullPeerNum;
}
if (gossip.requestStateInfoInterval !== undefined) {
this.log.debug(`Setting request state info interval: ${gossip.requestStateInfoInterval}`);
this.config.peer.gossip.requestStateInfoInterval =
gossip.requestStateInfoInterval;
}
if (gossip.publishStateInfoInterval !== undefined) {
this.log.debug(`Setting publish state info interval: ${gossip.publishStateInfoInterval}`);
this.config.peer.gossip.publishStateInfoInterval =
gossip.publishStateInfoInterval;
}
if (gossip.stateInfoRetentionInterval !== undefined) {
this.log.debug(`Setting state info retention interval: ${gossip.stateInfoRetentionInterval}`);
this.config.peer.gossip.stateInfoRetentionInterval =
gossip.stateInfoRetentionInterval;
}
if (gossip.publishCertPeriod !== undefined) {
this.log.debug(`Setting publish cert period: ${gossip.publishCertPeriod}`);
this.config.peer.gossip.publishCertPeriod = gossip.publishCertPeriod;
}
if (gossip.skipBlockVerification !== undefined) {
this.log.debug(`Setting skip block verifications: ${gossip.skipBlockVerification}`);
this.config.peer.gossip.skipBlockVerification =
gossip.skipBlockVerification;
}
if (gossip.dialTimeout !== undefined) {
this.log.debug(`Setting dial timeout: ${gossip.dialTimeout}`);
this.config.peer.gossip.dialTimeout = gossip.dialTimeout;
}
if (gossip.connTimeout !== undefined) {
this.log.debug(`Setting connection timeout: ${gossip.connTimeout}`);
this.config.peer.gossip.connTimeout = gossip.connTimeout;
}
if (gossip.recvBuffSize !== undefined) {
this.log.debug(`Setting receive buffer size: ${gossip.recvBuffSize}`);
this.config.peer.gossip.recvBuffSize = gossip.recvBuffSize;
}
if (gossip.sendBuffSize !== undefined) {
this.log.debug(`Setting send buffer size: ${gossip.sendBuffSize}`);
this.config.peer.gossip.sendBuffSize = gossip.sendBuffSize;
}
if (gossip.digestWaitTime !== undefined) {
this.log.debug(`Setting digest wait time: ${gossip.digestWaitTime}`);
this.config.peer.gossip.digestWaitTime = gossip.digestWaitTime;
}
if (gossip.requestWaitTime !== undefined) {
this.log.debug(`Setting request wait time: ${gossip.requestWaitTime}`);
this.config.peer.gossip.requestWaitTime = gossip.requestWaitTime;
}
if (gossip.responseWaitTime !== undefined) {
this.log.debug(`Setting response wait time: ${gossip.responseWaitTime}`);
this.config.peer.gossip.responseWaitTime = gossip.responseWaitTime;
}
if (gossip.aliveTimeInterval !== undefined) {
this.log.debug(`Setting alive time interval: ${gossip.aliveTimeInterval}`);
this.config.peer.gossip.aliveTimeInterval = gossip.aliveTimeInterval;
}
if (gossip.aliveExpirationTimeout !== undefined) {
this.log.debug(`Setting alive expiration timeout: ${gossip.aliveExpirationTimeout}`);
this.config.peer.gossip.aliveExpirationTimeout =
gossip.aliveExpirationTimeout;
}
if (gossip.reconnectInterval !== undefined) {
this.log.debug(`Setting reconnect interval: ${gossip.reconnectInterval}`);
this.config.peer.gossip.reconnectInterval = gossip.reconnectInterval;
}
if (gossip.maxConnectionAttempts !== undefined) {
this.log.debug(`Setting maximum connection attempts: ${gossip.maxConnectionAttempts}`);
this.config.peer.gossip.maxConnectionAttempts =
gossip.maxConnectionAttempts;
}
if (gossip.msgExpirationFactor !== undefined) {
this.log.debug(`Setting message expiration factor: ${gossip.msgExpirationFactor}`);
this.config.peer.gossip.msgExpirationFactor =
gossip.msgExpirationFactor;
}
if (gossip.externalEndpoint !== undefined) {
this.log.debug(`Setting external endpoint: ${gossip.externalEndpoint}`);
this.config.peer.gossip.externalEndpoint = gossip.externalEndpoint;
}
if (gossip.election !== undefined) {
const election = gossip.election;
if (election.startupGracePeriod !== undefined) {
this.log.debug(`Setting startup grace period: ${election.startupGracePeriod}`);
this.config.peer.gossip.election.startupGracePeriod =
election.startupGracePeriod;
}
if (election.membershipSampleInterval !== undefined) {
this.log.debug(`Setting membership sample interval: ${election.membershipSampleInterval}`);
this.config.peer.gossip.election.membershipSampleInterval =
election.membershipSampleInterval;
}
if (election.leaderAliveThreshold !== undefined) {
this.log.debug(`Setting leader alive threshold: ${election.leaderAliveThreshold}`);
this.config.peer.gossip.election.leaderAliveThreshold =
election.leaderAliveThreshold;
}
if (election.leaderElectionDuration !== undefined) {
this.log.debug(`Setting leader election duration: ${election.leaderElectionDuration}`);
this.config.peer.gossip.election.leaderElectionDuration =
election.leaderElectionDuration;
}
}
if (gossip.pvtData !== undefined) {
const pvtData = gossip.pvtData;
if (pvtData.pullRetryThreshold !== undefined) {
this.log.debug(`Setting pull retry threshold: ${pvtData.pullRetryThreshold}`);
this.config.peer.gossip.pvtData.pullRetryThreshold =
pvtData.pullRetryThreshold;
}
if (pvtData.transientstoreMaxBlockRetention !== undefined) {
this.log.debug(`Setting transientstore max block retention: ${pvtData.transientstoreMaxBlockRetention}`);
this.config.peer.gossip.pvtData.transientstoreMaxBlockRetention =
pvtData.transientstoreMaxBlockRetention;
}
if (pvtData.pushAckTimeout !== undefined) {
this.log.debug(`Setting push ack timeout: ${pvtData.pushAckTimeout}`);
this.config.peer.gossip.pvtData.pushAckTimeout =
pvtData.pushAckTimeout;
}
if (pvtData.btlPullMargin !== undefined) {
this.log.debug(`Setting btl pull margin: ${pvtData.btlPullMargin}`);
this.config.peer.gossip.pvtData.btlPullMargin =
pvtData.btlPullMargin;
}
if (pvtData.reconcileBatchSize !== undefined) {
this.log.debug(`Setting reconcile batch size: ${pvtData.reconcileBatchSize}`);
this.config.peer.gossip.pvtData.reconcileBatchSize =
pvtData.reconcileBatchSize;
}
if (pvtData.reconcileSleepInterval !== undefined) {
this.log.debug(`Setting reconcile sleep interval: ${pvtData.reconcileSleepInterval}`);
this.config.peer.gossip.pvtData.reconcileSleepInterval =
pvtData.reconcileSleepInterval;
}
if (pvtData.reconciliationEnabled !== undefined) {
this.log.debug(`Setting reconciliation enabled: ${pvtData.reconciliationEnabled}`);
this.config.peer.gossip.pvtData.reconciliationEnabled =
pvtData.reconciliationEnabled;
}
if (pvtData.skipPullingInvalidTransactionsDuringCommit !== undefined) {
this.log.debug(`Setting skip pulling invalid transactions during commit: ${pvtData.skipPullingInvalidTransactionsDuringCommit}`);
this.config.peer.gossip.pvtData.skipPullingInvalidTransactionsDuringCommit =
pvtData.skipPullingInvalidTransactionsDuringCommit;
}
if (pvtData.implicitCollectionDisseminationPolicy !== undefined) {
if (pvtData.implicitCollectionDisseminationPolicy !== undefined) {
const imp = pvtData.implicitCollectionDisseminationPolicy;
if (imp.maxPeerCount !== undefined) {
this.log.debug(`Setting implicit collection dissemination policy max peer count: ${imp.maxPeerCount}`);
this.config.peer.gossip.pvtData.implicitCollectionDisseminationPolicy.maxPeerCount =
imp.maxPeerCount;
}
if (imp.requiredPeerCount !== undefined) {
this.log.debug(`Setting implicit collection dissemination policy required peer count: ${imp.requiredPeerCount}`);
this.config.peer.gossip.pvtData.implicitCollectionDisseminationPolicy.requiredPeerCount =
imp.requiredPeerCount;
}
}
}
}
if (gossip.state !== undefined) {
const st = gossip.state;
if (st.enabled !== undefined) {
this.log.debug(`Setting state enabled: ${st.enabled}`);
this.config.peer.gossip.state.enabled = st.enabled;
}
if (st.checkInterval !== undefined) {
this.log.debug(`Setting state check interval: ${st.checkInterval}`);
this.config.peer.gossip.state.checkInterval = st.checkInterval;
}
if (st.responseTimeout !== undefined) {
this.log.debug(`Setting state response timeout: ${st.responseTimeout}`);
this.config.peer.gossip.state.responseTimeout = st.responseTimeout;
}
if (st.batchSize !== undefined) {
this.log.debug(`Setting state batch size: ${st.batchSize}`);
this.config.peer.gossip.state.batchSize = st.batchSize;
}
if (st.blockBufferSize !== undefined) {
this.log.debug(`Setting state block buffer size: ${st.blockBufferSize}`);
this.config.peer.gossip.state.blockBufferSize = st.blockBufferSize;
}
if (st.maxRetries !== undefined) {
this.log.debug(`Setting state max retries: ${st.maxRetries}`);
this.config.peer.gossip.state.maxRetries = st.maxRetries;
}
}
return this;
}
setTLS(tls) {
if (tls === undefined)
return this;
if (tls.enabled !== undefined) {
this.log.debug(`Setting TLS enabled: ${tls.enabled}`);
this.config.peer.tls.enabled = tls.enabled;
}
if (tls.clientAuthRequired !== undefined) {
this.log.debug(`Setting client authentication required: ${tls.clientAuthRequired}`);
this.config.peer.tls.clientAuthRequired = tls.clientAuthRequired;
}
if (tls.cert !== undefined) {
if (tls.cert.file !== undefined) {
this.log.debug(`Setting TLS cert file: ${tls.cert.file}`);
this.config.peer.tls.cert.file = tls.cert.file;
}
}
if (tls.key !== undefined) {
if (tls.key.file !== undefined) {
this.log.debug(`Setting TLS key file: ${tls.key.file}`);
this.config.peer.tls.key.file = tls.key.file;
}
}
if (tls.rootcert !== undefined) {
if (tls.rootcert.file !== undefined) {
this.log.debug(`Setting TLS rootcert file: ${tls.rootcert.file}`);
this.config.peer.tls.rootcert.file = tls.rootcert.file;
}
}
if (tls.clientRootCAs !== undefined) {
if (tls.clientRootCAs.files !== undefined) {
this.log.debug(`Setting TLS client root CAs files: ${tls.clientRootCAs.files.join(", ")}`);
this.config.peer.tls.clientRootCAs.files = tls.clientRootCAs.files;
}
}
if (tls.clientKey !== undefined) {
if (tls.clientKey.file !== undefined) {
this.log.debug(`Setting TLS client key file: ${tls.clientKey.file}`);
this.config.peer.tls.clientKey.file = tls.clientKey.file;
}
}
if (tls.clientCert !== undefined) {
if (tls.clientCert.file !== undefined) {
this.log.debug(`Setting TLS client cert file: ${tls.clientCert.file}`);
this.config.peer.tls.clientCert.file = tls.clientCert.file;
}
}
return this;
}
setAuthentication(authentication) {
if (authentication === undefined)
return this;
this.log.debug(`Setting authentication time window: ${authentication}`);
this.config.peer.authentication.timewindow = authentication;
return this;
}
setKeepAlice(keepAlice) {
if (keepAlice === undefined)
return this;
if (keepAlice.interval !== undefined) {
this.log.debug(`Setting keep-alive interval: ${keepAlice.interval}`);
this.config.peer.keepalive.interval = keepAlice.interval;
}
if (keepAlice.timeout !== undefined) {
this.log.debug(`Setting keep-alive timeout: ${keepAlice.timeout}`);
this.config.peer.keepalive.timeout = keepAlice.timeout;
}
if (keepAlice.minInterval !== undefined) {
this.log.debug(`Setting minimum keep-alive interval: ${keepAlice.minInterval}`);
this.config.peer.keepalive.minInterval = keepAlice.minInterval;
}
if (keepAlice.client !== undefined) {
if (keepAlice.client.interval !== undefined) {
this.log.debug(`Setting client keep-alive interval: ${keepAlice.client.interval}`);
this.config.peer.keepalive.client.interval =
keepAlice.client.interval;
}
if (keepAlice.client.timeout !== undefined) {
this.log.debug(`Setting client keep-alive timeout: ${keepAlice.client.timeout}`);
this.config.peer.keepalive.client.timeout = keepAlice.client.timeout;
}
}
if (keepAlice.deliveryClient !== undefined) {
if (keepAlice.deliveryClient.interval !== undefined) {
this.log.debug(`Setting delivery client keep-alive interval: ${keepAlice.deliveryClient.interval}`);
this.config.peer.keepalive.deliveryClient.interval =
keepAlice.deliveryClient.interval;
}
if (keepAlice.deliveryClient.timeout !== undefined) {
this.log.debug(`Setting delivery client keep-alive timeout: ${keepAlice.deliveryClient.timeout}`);
this.config.peer.keepalive.deliveryClient.timeout =
keepAlice.deliveryClient.timeout;
}
}
return this;
}
setGateway(gateway) {
if (gateway === undefined)
return this;
if (gateway.enabled !== undefined) {
this.log.debug(`Setting gateway enabled: ${gateway.enabled}`);
this.config.peer.gateway.enabled = gateway.enabled;
}
if (gateway.endorsementTimeout !== undefined) {
this.log.debug(`Setting endorsement timeout: ${gateway.endorsementTimeout}`);
this.config.peer.gateway.endorsementTimeout =
gateway.endorsementTimeout;
}
if (gateway.broadcastTimeout !== undefined) {
this.log.debug(`Setting broadcast timeout: ${gateway.broadcastTimeout}`);
this.config.peer.gateway.broadcastTimeout = gateway.broadcastTimeout;
}
if (gateway.dialTimeout !== undefined) {
this.log.debug(`Setting dial timeout: ${gateway.dialTimeout}`);
this.config.peer.gateway.dialTimeout = gateway.dialTimeout;
}
return this;
}
setGeneral(general) {
if (general === undefined)
return this;
if (general.validatorPoolSize !== undefined) {
this.log.debug(`Setting validator pool size: ${general.validatorPoolSize}`);
this.config.peer.validatorPoolSize = general.validatorPoolSize;
}
if (general.fileSystemPath !== undefined) {
this.log.debug(`Setting file system path: ${general.fileSystemPath}`);
this.config.peer.fileSystemPath = general.fileSystemPath;
}
if (general.id !== undefined) {
this.log.debug(`Setting peer ID: ${general.id}`);
this.config.peer.id = general.id;
}
if (general.networkId !== undefined) {
this.log.debug(`Setting network ID: ${general.networkId}`);
this.config.peer.networkId = general.networkId;
}
if (general.listenAddress !== undefined) {
this.log.debug(`Setting listen address: ${general.listenAddress}`);
this.config.peer.listenAddress = general.listenAddress;
}
if (general.chaincodeListenAddress !== undefined) {
this.log.debug(`Setting chaincode listen address: ${general.chaincodeListenAddress}`);
this.config.peer.chaincodeListenAddress = general.chaincodeListenAddress;
}
if (general.chaincodeAddress !== undefined) {
this.log.debug(`Setting chaincode address: ${general.chaincodeAddress}`);
this.config.peer.chaincodeAddress = general.chaincodeAddress;
}
if (general.address !== undefined) {
this.log.debug(`Setting peer address: ${general.address}`);
this.config.peer.address = general.address;
}
if (general.addressAutoDetect !== undefined) {
this.log.debug(`Setting address auto-detect to ${general.addressAutoDetect}`);
this.config.peer.addressAutoDetect = general.addressAutoDetect;
}
return this;
}
setBCCSP(bccsp) {
if (bccsp !== undefined) {
if (bccsp.Default !== undefined) {
this.log.debug(`Setting BCCSP default to ${bccsp.Default}`);
this.config.peer.BCCSP.Default = bccsp.Default;
}
if (bccsp.SW !== undefined) {
if (bccsp.SW.Hash !== undefined) {
this.log.debug(`Setting BCCSP SW hash to ${bccsp.SW.Hash}`);
this.config.peer.BCCSP.SW.Hash = bccsp.SW.Hash;
}
if (bccsp.SW.Security !== undefined) {
this.log.debug(`Setting BCCSP SW security to ${bccsp.SW.Security}`);
this.config.peer.BCCSP.SW.Security = bccsp.SW.Security;
}
if (bccsp.SW.FileKeyStore !== undefined) {
if (bccsp.SW.FileKeyStore.KeyStore !== undefined) {
this.log.debug(`Setting BCCSP SW FileKeyStore key store to ${bccsp.SW.FileKeyStore.KeyStore}`);
this.config.peer.BCCSP.SW.FileKeyStore.KeyStore =
bccsp.SW.FileKeyStore.KeyStore;
}
}
}
if (bccsp.PKCS11 !== undefined) {
if (bccsp.PKCS11.Library !== undefined) {
this.log.debug(`Setting BCCSP PKCS11 library to ${bccsp.PKCS11.Library}`);
this.config.peer.BCCSP.PKCS11.Library = bccsp.PKCS11.Library;
}
if (bccsp.PKCS11.Label !== undefined) {
this.log.debug(`Setting BCCSP PKCS11 label to ${bccsp.PKCS11.Label}`);
this.config.peer.BCCSP.PKCS11.Label = bccsp.PKCS11.Label;
}
if (bccsp.PKCS11.Pin !== undefined) {
this.log.debug(`Setting BCCSP PKCS11 pin to ${bccsp.PKCS11.Pin}`);
this.config.peer.BCCSP.PKCS11.Pin = bccsp.PKCS11.Pin;
}
if (bccsp.PKCS11.Hash !== undefined) {
this.log.debug(`Setting BCCSP PKCS11 hash to ${bccsp.PKCS11.Hash}`);
this.config.peer.BCCSP.PKCS11.Hash = bccsp.PKCS11.Hash;
}
if (bccsp.PKCS11.Security !== undefined) {
this.log.debug(`Setting BCCSP PKCS11 security to ${bccsp.PKCS11.Security}`);
this.config.peer.BCCSP.PKCS11.Security = bccsp.PKCS11.Security;
}
if (bccsp.PKCS11.SoftwareVerify !== undefined) {
this.log.debug(`Setting BCCSP PKCS11 software verify to ${bccsp.PKCS11.SoftwareVerify}`);
this.config.peer.BCCSP.PKCS11.SoftwareVerify =
bccsp.PKCS11.SoftwareVerify;
}
if (bccsp.PKCS11.Immutable !== undefined) {
this.log.debug(`Setting BCCSP PKCS11 immutable to ${bccsp.PKCS11.Immutable}`);
this.config.peer.BCCSP.PKCS11.Immutable = bccsp.PKCS11.Immutable;
}
if (bccsp.PKCS11.AltID !== undefined) {
this.log.debug(`Setting BCCSP PKCS11 alt ID to ${bccsp.PKCS11.AltID}`);
this.config.peer.BCCSP.PKCS11.AltID = bccsp.PKCS11.AltID;
}
if (bccsp.PKCS11.KeyIds !== undefined) {
this.log.debug(`Setting BCCSP PKCS11 key IDs to ${bccsp.PKCS11.KeyIds}`);
this.config.peer.BCCSP.PKCS11.KeyIds = bccsp.PKCS11.KeyIds;
}
}
}
return this;
}
setMspConfig(mspConfig) {
if (mspConfig === undefined)
return this;
if (mspConfig.localMspType !== undefined) {
this.log.debug(`Setting local MSP type to ${mspConfig.localMspType}`);
this.config.peer.localMspType = mspConfig.localMspType;
}
if (mspConfig.mspConfigPath !== undefined) {
this.log.debug(`Setting MSP config path to ${mspConfig.mspConfigPath}`);
this.config.peer.mspConfigPath = mspConfig.mspConfigPath;
}
if (mspConfig.localMspId !== undefined) {
this.log.debug(`Setting local MSP ID to ${mspConfig.localMspId}`);
this.config.peer.localMspId = mspConfig.localMspId;
}
return this;
}
setConnTimeoutClient(connTimeoutClient) {
if (connTimeoutClient !== undefined) {
this.log.debug(`Setting connection timeout client to ${connTimeoutClient}`);
this.config.peer.client.connTimeout = connTimeoutClient;
}
return this;
}
setDeliveryClient(deliveryClient) {
if (deliveryClient === undefined)
return this;
if (deliveryClient.addressOverrides !== undefined) {
this.log.debug(`Setting address overrides: ${JSON.stringify(deliveryClient.addressOverrides)}`);
this.config.peer.deliveryclient.addressOverrides =
deliveryClient.addressOverrides;
}
if (deliveryClient.blockGossipEnabled !== undefined) {
this.log.debug(`Setting block gossip enabled to ${deliveryClient.blockGossipEnabled}`);
this.config.peer.deliveryclient.blockGossipEnabled =
deliveryClient.blockGossipEnabled;
}
if (deliveryClient.reconnectTotalTimeThreshold !== undefined) {
this.log.debug(`Setting reconnect total time threshold to ${deliveryClient.reconnectTotalTimeThreshold}`);
this.config.peer.deliveryclient.reconnectTotalTimeThreshold =
deliveryClient.reconnectTotalTimeThreshold;
}
if (deliveryClient.connTimeout !== undefined) {
this.log.debug(`Setting connection timeout to ${deliveryClient.connTimeout}`);
this.config.peer.deliveryclient.connTimeout =
deliveryClient.connTimeout;
}
if (deliveryClient.reConnectBackoffThreshold !== undefined) {
this.log.debug(`Setting reconnect backoff threshold to ${deliveryClient.reConnectBackoffThreshold}`);
this.config.peer.deliveryclient.reConnectBackoffThreshold =
deliveryClient.reConnectBackoffThreshold;
}
return this;
}
setProfile(profile) {
if (profile === undefined)
return this;
if (profile.enabled !== undefined) {
this.log.debug(`Setting profile to ${profile.enabled}`);
this.config.peer.profile = profile;
}
if (profile.listenAddress !== undefined) {
this.log.debug(`Setting listen address to ${profile.listenAddress}`);
this.config.peer.profile.listenAddress = profile.listenAddress;
}
return this;
}
setHandlers(handlers) {
if (handlers === undefined)
return this;
if (handlers.authFilters !== undefined) {
this.log.debug(`Setting auth filters: ${JSON.stringify(handlers.authFilters)}`);
this.config.peer.handlers.authFilters = handlers.authFilters;
}
if (handlers.decorators !== undefined) {
this.log.debug(`Setting decorators: ${JSON.stringify(handlers.decorators)}`);
this.config.peer.handlers.decorators = handlers.decorators;
}
if (handlers.endorsers !== undefined) {
const ecss = handlers.endorsers.escc;
if (ecss !== undefined) {
if (ecss.name !== undefined) {
this.log.debug(`Setting ESCC name: ${ecss.name}`);
this.config.peer.handlers.endorsers.escc.name = ecss.name;
}
if (ecss.library !== undefined) {
this.log.debug(`Setting ESCC library: ${ecss.library}`);
this.config.peer.handlers.endorsers.escc.library = ecss.library;
}
}
}
if (handlers.validators !== undefined) {
const vscc = handlers.validators.vscc;
if (vscc !== undefined) {
if (vscc.name !== undefined) {
this.log.debug(`Setting VSCC name: ${vscc.name}`);
this.config.peer.handlers.validators.vscc.name = vscc.name;
}
if (vscc.library !== undefined) {
this.log.debug(`Setting VSCC library: ${vscc.library}`);
this.config.peer.handlers.validators.vscc.library = vscc.library;
}
}
}
return this;
}
setDiscovery(discovery) {
if (discovery === undefined)
return this;
if (discovery.enabled !== undefined) {
this.log.debug(`Setting discovery enabled: ${discovery.enabled}`);
this.config.peer.discovery.enabled = discovery.enabled;
}
if (discovery.authCacheEnabled !== undefined) {
this.log.debug(`Setting auth cache enabled: ${discovery.authCacheEnabled}`);
this.config.peer.discovery.authCacheEnabled =
discovery.authCacheEnabled;
}
if (discovery.authCacheMaxSize !== undefined) {
this.log.debug(`Setting auth cache max size: ${discovery.authCacheMaxSize}`);
this.config.peer.discovery.authCacheMaxSize =
discovery.authCacheMaxSize;
}
if (discovery.authCachePurgeRetentionRatio !== undefined) {
this.log.debug(`Setting auth cache purge retention ratio: ${discovery.authCachePurgeRetentionRatio}`);
this.config.peer.discovery.authCachePurgeRetentionRatio =
discovery.authCachePurgeRetentionRatio;
}
if (discovery.orgMembersAllowedAccess !== undefined) {
this.log.debug(`Setting org members allowed access: ${discovery.orgMembersAllowedAccess}`);
this.config.peer.discovery.orgMembersAllowedAccess =
discovery.orgMembersAllowedAccess;
}
return this;
}
setLimits(limits) {
if (limits === undefined)
return this;
if (limits.concurrency !== undefined) {
const concurrency = limits.concurrency;
if (concurrency.deliverService !== undefined) {
this.log.debug(`Setting deliver service concurrency: ${concurrency.deliverService}`);
this.config.peer.limits.concurrency.deliverService =
concurrency.deliverService;
}
if (concurrency.gatewayService !== undefined) {
this.log.debug(`Setting gateway service concurrency: ${concurrency.gatewayService}`);
this.config.peer.limits.concurrency.gatewayService =
concurrency.gatewayService;
}
if (concurrency.endorserService !== undefined) {
this.log.debug(`Setting endorser service concurrency: ${concurrency.endorserService}`);
this.config.peer.limits.concurrency.endorserService =
concurrency.endorserService;
}
}
return this;
}
setMessageSize(size) {
if (size === undefined)
return this;
if (size.maxRecvMsgSize !== undefined) {
this.log.debug(`Setting max receive message size: ${size.maxRecvMsgSize}`);
this.config.peer.maxRecvMsgSize = size.maxRecvMsgSize;
}
if (size.maxSendMsgSize !== undefined) {
this.log.debug(`Setting max send message size: ${size.maxSendMsgSize}`);
this.config.peer.maxSendMsgSize = size.maxSendMsgSize;
}
return this;
}
setChaincode(chaincode) {
if (chaincode === undefined)
return this;
if (chaincode.id !== undefined) {
if (chaincode.id.path !== undefined) {
this.log.debug(`Setting chaincode path: ${chaincode.id.path}`);
this.config.chaincode.id.path = chaincode.id.path;
}
if (chaincode.id.name !== undefined) {
this.log.debug(`Setting chaincode name: ${chaincode.id.name}`);
this.config.chaincode.id.name = chaincode.id.name;
}
}
if (chaincode.builder !== undefined) {
this.log.debug(`Setting chaincode builder: ${chaincode.builder}`);
this.config.chaincode.builder = chaincode.builder;
}
if (chaincode.pull !== undefined) {
this.log.debug(`Setting chaincode pull: ${chaincode.pull}`);
this.config.chaincode.pull = chaincode.pull;
}
if (chaincode.golang !== undefined) {
const golang = chaincode.golang;
if (golang.runtime !== undefined) {
this.log.debug(`Setting Go runtime: ${golang.runtime}`);
this.config.chaincode.golang.runtime = golang.runtime;
}
if (golang.dynamicLink !== undefined) {
this.log.debug(`Setting Go dynamic link: ${golang.dynamicLink}`);
this.config.chaincode.golang.dynamicLink = golang.dynamicLink;
}
}
if (chaincode.java !== undefined) {
const java = chaincode.java;
if (java.runtime !== undefined) {
this.log.debug(`Setting Java runtime: ${java.runtime}`);
this.config.chaincode.java.runtime = java.runtime;
}
}
if (chaincode.node !== undefined) {
const node = chaincode.node;
if (node.runtime !== undefined) {
this.log.debug(`Setting Node runtime: ${node.runtime}`);
this.config.chaincode.node.runtime = node.runtime;
}
}
if (chaincode.externalBuilders !== undefined) {
this.log.debug(`Setting external builders: ${chaincode.externalBuilders.length}`);
this.config.chaincode.externalBuilders = chaincode.externalBuilders;
}
if (chaincode.installTimeout !== undefined) {
this.log.debug(`Setting install timeout: ${chaincode.installTimeout}`);
this.config.chaincode.installTimeout = chaincode.installTimeout;
}
if (chaincode.startuptimeout !== undefined) {
this.log.debug(`Setting startup timeout: ${chaincode.startuptimeout}`);
this.config.chaincode.startuptimeout = chaincode.startuptimeout;
}
if (chaincode.executetimeout !== undefined) {
this.log.debug(`Setting execute timeout: ${chaincode.executetimeout}`);
this.config.chaincode.executetimeout = chaincode.executetimeout;
}
if (chaincode.mode !== undefined) {
this.log.debug(`Setting chaincode mode: ${chaincode.mode}`);
this.config.chaincode.mode = chaincode.mode;
}
if (chaincode.keepalive !== undefined) {
this.log.debug(`Setting chaincode keepalive: ${chaincode.keepalive}`);
this.config.chaincode.keepalive = chaincode.keepalive;
}
if (chaincode.system !== undefined) {
const system = chaincode.system;
if (system._lifecycle !== undefined) {
this.log.debug(`Setting system lifecycle: ${system._lifecycle}`);
this.config.chaincode.system._lifecycle = system._lifecycle;
}
if (system.cscc !== undefined) {
this.log.debug(`Setting CSCC: ${system.cscc}`);
this.config.chaincode.system._lifecycle = system.cscc;
}
if (system.lscc !== undefined) {
this.log.debug(`Setting LSCC: ${system.lscc}`);
this.config.chaincode.system._lifecycle = system.lscc;
}
if (system.qscc !== undefined) {
this.log.debug(`Setting QSCC: ${system.qscc}`);
this.config.chaincode.system._lifecycle = system.qscc;
}
}
if (chaincode.logging !== undefined) {
const logging = chaincode.logging;
if (logging.level !== undefined) {
this.log.debug(`Setting logging level: ${logging.level}`);
this.config.chaincode.logging.level = logging.level;
}
if (logging.shim !== undefined) {
this.log.debug(`Setting logging shim: ${logging.shim}`);
this.config.chaincode.logging.shim = logging.shim;
}
if (logging.format !== undefined) {
this.log.debug(`Setting logging format: ${logging.format}`);
this.config.chaincode.logging.format = logging.format;
}
}
return this;
}
setVMOptions(options) {
if (options === undefined)
return this;
if (options.endpoint !== undefined) {
this.log.debug(`Setting VM endpoint: ${options.endpoint}`);
this.config.vm.endpoint = options.endpoint;
}
if (options.docker != undefined) {
const docker = options.docker;
if (docker.tls !== undefined) {
if (docker.tls.enabled !== undefined) {
this.log.debug(`Setting TLS enabled: ${docker.tls.enabled}`);
this.config.vm.docker.tls.enabled = docker.tls.enabled;
}
if (docker.tls.ca !== undefined) {
if (docker.tls.ca.file !== undefined) {
this.log.debug(`Setting TLS CA file: ${docker.tls.ca.file}`);
this.config.vm.docker.tls.ca.file = docker.tls.ca.file;
}
}
if (docker.tls.cert !== undefined) {
if (docker.tls.cert.file !== undefined) {
this.log.debug(`Setting TLS cert file: ${docker.tls.cert.file}`);
this.config.vm.docker.tls.cert.file = docker.tls.cert.file;
}
}
}
if (docker.attachStdout !== undefined) {
this.log.debug(`Setting attach stdout: ${docker.attachStdout}`);
this.config.vm.docker.attachStdout = docker.attachStdout;
}
if (docker.hostConfig !== undefined) {
const hostConfig = docker.hostConfig;
if (hostConfig.NetworkMode !== undefined) {
this.log.debug(`Setting NetworkMode: ${hostConfig.NetworkMode}`);
this.config.vm.docker.hostConfig.NetworkMode =
hostConfig.NetworkMode;
}
if (hostConfig.Dns !== undefined) {
this.log.info(`Setting DNS: ${hostConfig.Dns.join(", ")}`);
this.config.vm.docker.hostConfig.Dns = hostConfig.Dns;
}
if (hostConfig.LogConfig !== undefined) {
const logConfig = hostConfig.LogConfig;
if (logConfig.Type !== undefined) {
this.log.info(`Setting LogType: ${logConfig.Type}`);
this.config.vm.docker.hostConfig.LogConfig.Type =
logConfig.Type;
}
if (logConfig.Config !== undefined) {
if (logConfig.Config["max-size"] !== undefined) {
this.log.info(`Setting Log maxSize: ${logConfig.Config["max-size"]}`);
this.config.vm.docker.hostConfig.LogConfig.Config["max-size"] = logConfig.Config["max-size"];
}
if (logConfig.Config["max-file"] !== undefined) {
this.log.info(`Setting Log maxFile: ${logConfig.Config["max-file"]}`);
this.config.vm.docker.hostConfig.LogConfig.Config["max-file"] = logConfig.Config["max-file"];
}
}
}
if (hostConfig.Memory !== undefined) {
this.log.info(`Setting Memory: ${hostConfig.Memory}`);
this.config.vm.docker.hostConfig.Memory = hostConfig.Memory;
}
}
}
return this;
}
setLedgerState(state) {
if (state === undefined)
return this;
if (state.stateDatabase !== undefined) {
this.log.debug(`Setting state database: ${state.stateDatabase}`);
this.config.ledger.state.stateDatabase = state.stateDatabase;
}
if (state.totalQueryLimit !== undefined) {
this.log.debug(`Setting total query limit: ${state.totalQueryLimit}`);
this.config.ledger.state.totalQueryLimit = state.totalQueryLimit;
}
if (state.couchDBConfig !== undefined) {
const couchDB = state.couchDBConfig;
if (couchDB.couchDBAddress !== undefined) {
this.log.debug(`Setting CouchDB address: ${couchDB.couchDBAddress}`);
this.config.ledger.state.couchDBConfig.couchDBAddress =
couchDB.couchDBAddress;
}
if (couchDB.username !== undefined) {
this.log.debug(`Setting CouchDB user: ${couchDB.username}`);
this.config.ledger.state.couchDBConfig.username = couchDB.username;
}
if (couchDB.password !== undefined) {
this.log.debug(`Setting CouchDB password: ${couchDB.password}`);
this.config.ledger.state.couchDBConfig.password = couchDB.password;
}
if (couchDB.maxRetries !== undefined) {
this.log.debug(`Setting CouchDB max retries: ${couchDB.maxRetries}`);
this.config.ledger.state.couchDBConfig.maxRetries =
couchDB.maxRetries;
}
if (couchDB.maxRetriesOnStartup !== undefined) {
this.log.debug(`Setting CouchDB max retries on startup: ${couchDB.maxRetriesOnStartup}`);
this.config.ledger.state.couchDBConfig.maxRetriesOnStartup =
couchDB.maxRetriesOnStartup;
}
if (couchDB.requestTimeout !== undefined) {
this.log.debug(`Setting CouchDB request timeout: ${couchDB.requestTimeout}`);
this.config.ledger.state.couchDBConfig.requestTimeout =
couchDB.requestTimeout;
}
if (couchDB.internalQueryLimit !== undefined) {
this.log.debug(`Setting CouchDB internal query limit: ${couchDB.internalQueryLimit}`);
this.config.ledger.state.couchDBConfig.internalQueryLimit =
couchDB.internalQueryLimit;
}
if (couchDB.maxBatchUpdateSize !== undefined) {
this.log.debug(`Setting CouchDB maximum batch update size: ${couchDB.maxBatchUpdateSize}`);
this.config.ledger.state.couchDBConfig.maxBatchUpdateSize =
couchDB.maxBatchUpdateSize;
}
if (couchDB.createGlobalChangesDB !== undefined) {
this.log.debug(`Setting CouchDB create global changes database: ${couchDB.createGlobalChangesDB}`);
this.config.ledger.state.couchDBConfig.createGlobalChangesDB =
couchDB.createGlobalChangesDB;
}
if (couchDB.cacheSize !== undefined) {
this.log.debug(`Setting CouchDB cache size: ${couchDB.cacheSize}`);
this.config.ledger.state.couchDBConfig.cacheSize = couchDB.cacheSize;
}
}
return this;
}
setLegerBlockchain(blockchain) {
if (blockchain !== undefined) {
this.log.debug(`Setting ledger blockchain: ${JSON.stringify(blockchain)}`);
this.config.ledger.blockchain = blockchain;
}
return this;
}
enableLedgerHistoryDatabase(enable) {
if (enable !== undefined) {
this.log.debug(`Setting ledger history database enabled: ${enable}`);
this.config.ledger.history.enableHistoryDatabase = enable;
}
return this;
}
setLedgerPvtDataStore(pvtData) {
if (pvtData === undefined)
return this;
if (pvtData.collElgProcDbBatchesInterval !== undefined) {
this.log.debug(`Setting private data collection eligibility process database batches interval: ${pvtData.collElgProcDbBatchesInterval}`);
this.config.ledger.pvtdataStore.collElgProcDbBatchesInterval =
pvtData.collElgProcDbBatchesInterval;
}
if (pvtData.collElgProcMaxDbBatchSize !== undefined) {
this.log.debug(`Setting private data collection eligibility process maximum database batch size: ${pvtData.collElgProcMaxDbBatchSize}`);
this.config.ledger.pvtdataStore.collElgProcMaxDbBatchSize =
pvtData.collElgProcMaxDbBatchSize;
}
if (pvtData.deprioritizedDataReconcilerInterval !== undefined) {
this.log.debug(`Setting deprioritized data reconciliation interval: ${pvtData.deprioritizedDataReconcilerInterval}`);
this.config.ledger.pvtdataStore.deprioritizedDataReconcilerInterval =
pvtData.deprioritizedDataReconcilerInterval;
}
if (pvtData.purgeInterval !== undefined) {
this.log.debug(`Setting ledger purge interval: ${pvtData.purgeInterval}`);
this.config.ledger.pvtdataStore.purgeInterval = pvtData.purgeInterval;
}
if (pvtData.purgedKeyAuditLogging !== undefined) {
this.log.debug(`Setting purged key audit logging: ${pvtData.purgedKeyAuditLogging}`);
this.config.ledger.pvtdataStore.purgedKeyAuditLogging =
pvtData.purgedKeyAuditLogging;
}
return this;
}
setLedgerSnapshotsRootDir(rootDir) {
if (rootDir !== undefined) {
this.log.debug(`Setting ledger snapshots root directory: ${rootDir}`);
this.config.ledger.snapshots.rootDir = rootDir;
}
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, "core.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.FabricPeerConfigBuilder = FabricPeerConfigBuilder;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFicmljLXBlZXItY29uZmlnLWJ1aWxkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZmFicmljL3BlZXIvZmFicmljLXBlZXItY29uZmlnLWJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsK0NBQW9EO0FBQ3BELGdEQUF3QjtBQUN4Qiw0Q0FBb0I7QUFDcEIsMkNBQStEO0FBMEIvRCxNQUFhLHVCQUF1QjtJQU9sQyxZQUFZLE1BQWU7UUFKbkIsV0FBTSxHQUFlLElBQUEsbUJBQVksRUFDdkMsY0FBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsMkJBQTJCLENBQUMsQ0FDcEMsQ0FBQztRQUdkLElBQUksQ0FBQyxNQUFNO1lBQUUsSUFBSSxDQUFDLEdBQUcsR0FBRyxpQkFBTyxDQUFDLEdBQUcsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDOztZQUN4RCxJQUFJLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDM0QsQ0FBQztJQUVELFNBQVMsQ0FBQyxNQUFxQjtRQUM3QixJQUFJLE1BQU0sS0FBSyxTQUFTO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFFdEMsSUFBSSxNQUFNLENBQUMsU0FBUyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ25DLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLHNCQUFzQixNQUFNLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztZQUN6RCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUssQ0FBQyxNQUFPLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUM7UUFDekQsQ0FBQztRQUVELElBQUksTUFBTSxDQUFDLGlCQUFpQixLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzNDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUNaLGdDQUFnQyxNQUFNLENBQUMsaUJBQWlCLEVBQUUsQ0FDM0QsQ0FB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RyxDQUFDLEtBQUssQ0FBQyw0QkFBNEIsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUNwRCxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDdkUsSUFBQSxvQkFBYSxFQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFbEMsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0NBQ0Y7QUEvMkNELDBEQSsyQ0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBMb2dnZXIsIExvZ2dpbmcgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgeyByZWFkRmlsZVlhbWwsIHdyaXRlRmlsZVlhbWwgfSBmcm9tIFwiLi4vLi4vdXRpbHMveWFtbFwiO1xuaW1wb3J0IHtcbiAgQkNDU1BDb25maWcsXG4gIENoYWluY29kZUNvbmZpZyxcbiAgRGVsaXZlcnlDbGllbnRDb25maWcsXG4gIERpc2NvdmVyeUNvbmZpZyxcbiAgR2F0ZXdheUNvbmZpZyxcbiAgR2VuZXJhbENvbmZpZyxcbiAgR29zc2lwQ29uZmlnLFxuICBIYW5kbGVyc0NvbmZpZyxcbiAgS2VlcEFsaXZlQ29uZmlnLFxuICBMZWRnZXJTdGF0ZUNvbmZpZyxcbiAgTGltaXRzQ29uZmlnLFxuICBNU0dTaXplQ29uZmlnLFxuICBNU1BDb25maWcsXG4gIFBlZXJDb25maWcsXG4gIFByaXZhdGVEYXRhU3RvcmVDb25maWcsXG4gIFByb2ZpbGVDb25maWcsXG4gIFRMU0NvbmZpZyxcbiAgVk1Db25maWcsXG59IGZyb20gXCIuLi9pbnRlcmZhY2VzL2ZhYnJpYy9wZWVyLWNvbmZpZ1wiO1xuaW1wb3J0IHtcbiAgTWV0cmljc0NvbmZpZyxcbiAgT3BlcmF0aW9uc0NvbmZpZyxcbn0gZnJvbSBcIi4uL2ludGVyZmFjZXMvZmFicmljL2dlbmVyYWwtY29uZmlnc1wiO1xuXG5leHBvcnQgY2xhc3MgRmFicmljUGVlckNvbmZpZ0J1aWxkZXIge1xuICBwcml2YXRlIGxvZzogTG9nZ2VyO1xuXG4gIHByaXZhdGUgY29uZmlnOiBQZWVyQ29uZmlnID0gcmVhZEZpbGVZYW1sKFxuICAgIHBhdGguam9pbihfX2Rpcm5hbWUsIFwiLi4vLi4vLi4vY29uZmlnL2NvcmUueWFtbFwiKVxuICApIGFzIFBlZXJDb25maWc7XG5cbiAgY29uc3RydWN0b3IobG9nZ2VyPzogTG9nZ2VyKSB7XG4gICAgaWYgKCFsb2dnZXIpIHRoaXMubG9nID0gTG9nZ2luZy5mb3IoRmFicmljUGVlckNvbmZpZ0J1aWxkZXIpO1xuICAgIGVsc2UgdGhpcy5sb2cgPSBsb2dnZXIuZm9yKEZhYnJpY1BlZXJDb25maWdCdWlsZGVyLm5hbWUpO1xuICB9XG5cbiAgc2V0R29zc2lwKGdvc3NpcD86IEdvc3NpcENvbmZpZyk6IHRoaXMge1xuICAgIGlmIChnb3NzaXAgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRoaXM7XG5cbiAgICBpZiAoZ29zc2lwLmJvb3RzdHJhcCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBib290c3RyYXA6ICR7Z29zc2lwLmJvb3RzdHJhcH1gKTtcbiAgICAgIHRoaXMuY29uZmlnLnBlZXIhLmdvc3NpcCEuYm9vdHN0cmFwID0gZ29zc2lwLmJvb3RzdHJhcDtcbiAgICB9XG5cbiAgICBpZiAoZ29zc2lwLnVzZUxlYWRlckVsZWN0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKFxuICAgICAgICBgU2V0dGluZyB1c2UgbGVhZGVyIGVsZWN0aW9uOiAke2dvc3NpcC51c2VMZWFkZXJFbGVjdGlvbn1gXG4gICAgICApO1xuICAgICAgdGhpcy5jb25maWcucGVlciEuZ29zc2lwIS51c2VMZWFkZXJFbGVjdGlvbiA9IGdvc3NpcC51c2VMZWFkZXJFbGVjdGlvbjtcbiAgICB9XG5cbiAgICBpZiAoZ29zc2lwLm9yZ0xlYWRlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBvcmcgbGVhZGVyczogJHtnb3NzaXAub3JnTGVhZGVyfWApO1xuICAgICAgdGhpcy5jb25maWcucGVlciEuZ29zc2lwIS5vcmdMZWFkZXIgPSBnb3NzaXAub3JnTGVhZGVyO1xuICAgIH1cblxuICAgIGlmIChnb3NzaXAubWVtYmVyc2hpcFRyYWNrZXJJbnRlcnZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgICAgYFNldHRpbmcgbWVtYmVyc2hpcCB0cmFja2VyIGludGVydmFsOiAke2dvc3NpcC5tZW1iZXJzaGlwVHJhY2tlckludGVydmFsfWBcbiAgICAgICk7XG4gICAgICB0aGlzLmNvbmZpZy5wZWVyIS5nb3NzaXAhLm1lbWJlcnNoaXBUcmFja2VySW50ZXJ2YWwgPVxuICAgICAgICBnb3NzaXAubWVtYmVyc2hpcFRyYWNrZXJJbnRlcnZhbDtcbiAgICB9XG5cbiAgICBpZiAoZ29zc2lwLm1heEJsb2NrQ291bnRUb1N0b3JlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKFxuICAgICAgICBgU2V0dGluZyBtYXggYmxvY2sgY291bnQgdG8gc3RvcmU6ICR7Z29zc2lwLm1heEJsb2NrQ291bnRUb1N0b3JlfWBcbiAgICAgICk7XG4gICAgICB0aGlzLmNvbmZpZy5wZWVyIS5nb3NzaXAhLm1heEJsb2NrQ291bnRUb1N0b3JlID1cbiAgICAgICAgZ29zc2lwLm1heEJsb2NrQ291bnRUb1N0b3JlO1xuICAgIH1cblxuICAgIGlmIChnb3NzaXAubWF4UHJvcGFnYXRpb25CdXJzdExhdGVuY3kgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoXG4gICAgICAgIGBTZXR0aW5nIG1heCBwcm9wYWdhdGlvbiBidXJzdCBsYXRlbmN5OiAke2dvc3NpcC5tYXhQcm9wYWdhdGlvbkJ1cnN0TGF0ZW5jeX1gXG4gICAgICApO1xuICAgICAgdGhpcy5jb25maWcucGVlciEuZ29zc2lwIS5tYXhQcm9wYWdhdGlvbkJ1cnN0TGF0ZW5jeSA9XG4gICAgICAgIGdvc3NpcC5tYXhQcm9wYWdhdGlvbkJ1cnN0TGF0ZW5jeTtcbiAgICB9XG5cbiAgICBpZiAoZ29zc2lwLm1heFByb3BhZ2F0aW9uQnVyc3RTaXplICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKFxuICAgICAgICBgU2V0dGluZyBtYXggcHJvcGFnYXRpb24gYnVyc3Qgc2l6ZTogJHtnb3NzaXAubWF4UHJvcGFnYXRpb25CdXJzdFNpemV9YFxuICAgICAgKTtcbiAgICAgIHRoaXMuY29uZmlnLnBlZXIhLmdvc3NpcCEubWF4UHJvcGFnYXRpb25CdXJzdFNpemUgPVxuICAgICAgICBnb3NzaXAubWF4UHJvcGFnYXRpb25CdXJzdFNpemU7XG4gICAgfVxuXG4gICAgaWYgKGdvc3NpcC5wcm9wYWdhdGVJdGVyYXRpb25zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKFxuICAgICAgICBgU2V0dGluZyBwcm9wYWdhdGUgaXRlcmF0aW9uczogJHtnb3NzaXAucHJvcGFnYXRlSXRlcmF0aW9uc31gXG4gICAgICApO1xuICAgICAgdGhpcy5jb25maWcucGVlciEuZ29zc2lwIS5wcm9wYWdhdGVJdGVyYXRpb25zID1cbiAgICAgICAgZ29zc2lwLnByb3BhZ2F0ZUl0ZXJhdGlvbnM7XG4gICAgfVxuXG4gICAgaWYgKGdvc3NpcC5wcm9wYWdhdGVQZWVyTnVtICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKFxuICAgICAgICBgU2V0dGluZyBwcm9wYWdhdGUgcGVlciBudW1iZXI6ICR7Z29zc2lwLnByb3BhZ2F0ZVBlZXJOdW19YFxuICAgICAgKTtcbiAgICAgIHRoaXMuY29uZmlnLnBlZXIhLmdvc3NpcCEucHJvcGFnYXRlUGVlck51bSA9IGdvc3NpcC5wcm9wYWdhdGVQZWVyTnVtO1xuICAgIH1cblxuICAgIGlmIChnb3NzaXAucHVsbEludGVydmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIHB1bGwgaW50ZXJ2YWw6ICR7Z29zc2lwLnB1bGxJbnRlcnZhbH1gKTtcbiAgICAgIHRoaXMuY29uZmlnLnBlZXIhLmdvc3NpcCEucHVsbEludGVydmFsID0gZ29zc2lwLnB1bGxJbnRlcnZhbDtcbiAgICB9XG5cbiAgICBpZiAoZ29zc2lwLnB1bGxQZWVyTnVtICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIHB1bGwgcGVlciBudW1iZXI6ICR7Z29zc2lwLnB1bGxQZWVyTnVtfWApO1xuICAgICAgdGhpcy5jb25maWcucGVlciEuZ29zc2lwIS5wdWxsUGVlck51bSA9IGdvc3NpcC5wdWxsUGVlck51bTtcbiAgICB9XG5cbiAgICBpZiAoZ29zc2lwLnJlcXVlc3RTdGF0ZUluZm9JbnRlcnZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgICAgYFNldHRpbmcgcmVxdWVzdCBzdGF0ZSBpbmZvIGludGVydmFsOiAke2dvc3NpcC5yZXF1ZXN0U3RhdGVJbmZvSW50ZXJ2YWx9YFxuICAgICAgKTtcbiAgICAgIHRoaXMuY29uZmlnLnBlZXIhLmdvc3NpcCEucmVxdWVzdFN0YXRlSW5mb0ludGVydmFsID1cbiAgICAgICAgZ29zc2lwLnJlcXVlc3RTdGF0ZUluZm9JbnRlcnZhbDtcbiAgICB9XG5cbiAgICBpZiAoZ29zc2lwLnB1Ymxpc2hTdGF0ZUluZm9JbnRlcnZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgICAgYFNldHRpbmcgcHVibGlzaCBzdGF0ZSBpbmZvIGludGVydmFsOiAke2dvc3NpcC5wdWJsaXNoU3RhdGVJbmZvSW50ZXJ2YWx9YFxuICAgICAgKTtcbiAgICAgIHRoaXMuY29uZmlnLnBlZXIhLmdvc3NpcCEucHVibGlzaFN0YXRlSW5mb0ludGVydmFsID1cbiAgICAgICAgZ29zc2lwLnB1Ymxpc2hTdGF0ZUluZm9JbnRlcnZhbDtcbiAgICB9XG5cbiAgICBpZiAoZ29zc2lwLnN0YXRlSW5mb1JldGVudGlvbkludGVydmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKFxuICAgICAgICBgU2V0dGluZyBzdGF0ZSBpbmZvIHJldGVudGlvbiBpbnRlcnZhbDogJHtnb3NzaXAuc3RhdGVJbmZvUmV0ZW50aW9uSW50ZXJ2YWx9YFxuICAgICAgKTtcbiAgICAgIHRoaXMuY29uZmlnLnBlZXIhLmdvc3NpcCEuc3RhdGVJbmZvUmV0ZW50aW9uSW50ZXJ2YWwgPVxuICAgICAgICBnb3NzaXAuc3RhdGVJbmZvUmV0ZW50aW9uSW50ZXJ2YWw7XG4gICAgfVxuXG4gICAgaWYgKGdvc3NpcC5wdWJsaXNoQ2VydFBlcmlvZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgICAgYFNldHRpbmcgcHVibGlzaCBjZXJ0IHBlcmlvZDogJHtnb3NzaXAucHVibGlzaENlcnRQZXJpb2R9YFxuICAgICAgKTtcbiAgICAgIHRoaXMuY29uZmlnLnBlZXIhLmdvc3NpcCEucHVibGlzaENlcnRQZXJpb2QgPSBnb3NzaXAucHVibGlzaENlcnRQZXJpb2Q7XG4gICAgfVxuXG4gICAgaWYgKGdvc3NpcC5za2lwQmxvY2tWZXJpZmljYXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoXG4gICAgICAgIGBTZXR0aW5nIHNraXAgYmxvY2sgdmVyaWZpY2F0aW9uczogJHtnb3NzaXAuc2tpcEJsb2NrVmVyaWZpY2F0aW9ufWBcbiAgICAgICk7XG4gICAgICB0aGlzLmNvbmZpZy5wZWVyIS5nb3NzaXAhLnNraXBCbG9ja1ZlcmlmaWNhdGlvbiA9XG4gICAgICAgIGdvc3NpcC5za2lwQmxvY2tWZXJpZmljYXRpb247XG4gICAgfVxuXG4gICAgaWYgKGdvc3NpcC5kaWFsVGltZW91dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBkaWFsIHRpbWVvdXQ6ICR7Z29zc2lwLmRpYWxUaW1lb3V0fWApO1xuICAgICAgdGhpcy5jb25maWcucGVlciEuZ29zc2lwIS5kaWFsVGltZW91dCA9IGdvc3NpcC5kaWFsVGltZW91dDtcbiAgICB9XG5cbiAgICBpZiAoZ29zc2lwLmNvbm5UaW1lb3V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIGNvbm5lY3Rpb24gdGltZW91dDogJHtnb3NzaXAuY29ublRpbWVvdXR9YCk7XG4gICAgICB0aGlzLmNvbmZpZy5wZWVyIS5nb3NzaXAhLmNvbm5UaW1lb3V0ID0gZ29zc2lwLmNvbm5UaW1lb3V0O1xuICAgIH1cblxuICAgIGlmIChnb3NzaXAucmVjdkJ1ZmZTaXplICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIHJlY2VpdmUgYnVmZmVyIHNpemU6ICR7Z29zc2lwLnJlY3ZCdWZmU2l6ZX1gKTtcbiAgICAgIHRoaXMuY29uZmlnLnBlZXIhLmdvc3NpcCEucmVjdkJ1ZmZTaXplID0gZ29zc2lwLnJlY3ZCdWZmU2l6ZTtcbiAgICB9XG5cbiAgICBpZiAoZ29zc2lwLnNlbmRCdWZmU2l6ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBzZW5kIGJ1ZmZlciBzaXplOiAke2dvc3NpcC5zZW5kQnVmZlNpemV9YCk7XG4gICAgICB0aGlzLmNvbmZpZy5wZWVyIS5nb3NzaXAhLnNlbmRCdWZmU2l6ZSA9IGdvc3NpcC5zZW5kQnVmZlNpemU7XG4gICAgfVxuXG4gICAgaWYgKGdvc3NpcC5kaWdlc3RXYWl0VGltZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBkaWdlc3Qgd2FpdCB0aW1lOiAke2dvc3NpcC5kaWdlc3RXYWl0VGltZX1gKTtcbiAgICAgIHRoaXMuY29uZmlnLnBlZXIhLmdvc3NpcCEuZGlnZXN0V2FpdFRpbWUgPSBnb3NzaXAuZGlnZXN0V2FpdFRpbWU7XG4gICAgfVxuICAgIGlmIChnb3NzaXAucmVxdWVzdFdhaXRUaW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIHJlcXVlc3Qgd2FpdCB0aW1lOiAke2dvc3NpcC5yZXF1ZXN0V2FpdFRpbWV9YCk7XG4gICAgICB0aGlzLmNvbmZpZy5wZWVyIS5nb3NzaXAhLnJlcXVlc3RXYWl0VGltZSA9IGdvc3NpcC5yZXF1ZXN0V2FpdFRpbWU7XG4gICAgfVxuICAgIGlmIChnb3NzaXAucmVzcG9uc2VXYWl0VGltZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyByZXNwb25zZSB3YWl0IHRpbWU6ICR7Z29zc2lwLnJlc3BvbnNlV2FpdFRpbWV9YCk7XG4gICAgICB0aGlzLmNvbmZpZy5wZWVyIS5nb3NzaXAhLnJlc3BvbnNlV2FpdFRpbWUgPSBnb3NzaXAucmVzcG9uc2VXYWl0VGltZTtcbiAgICB9XG4gICAgaWYgKGdvc3NpcC5hbGl2ZVRpbWVJbnRlcnZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgICAgYFNldHRpbmcgYWxpdmUgdGltZSBpbnRlcnZhbDogJHtnb3NzaXAuYWxpdmVUaW1lSW50ZXJ2YWx9YFxuICAgICAgKTtcbiAgICAgIHRoaXMuY29uZmlnLnBlZXIhLmdvc3NpcCEuYWxpdmVUaW1lSW50ZXJ2YWwgPSBnb3NzaXAuYWxpdmVUaW1lSW50ZXJ2YWw7XG4gICAgfVxuICAgIGlmIChnb3NzaXAuYWxpdmVFeHBpcmF0aW9uVGltZW91dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgICAgYFNldHRpbmcgYWxpdmUgZXhwaXJhdGlvbiB0aW1lb3V0OiAke2dvc3NpcC5hbGl2ZUV4cGlyYXRpb25UaW1lb3V0fWBcbiAgICAgICk7XG4gICAgICB0aGlzLmNvbmZpZy5wZWVyIS5nb3NzaXAhLmFsaXZlRXhwaXJhdGlvblRpbWVvdXQgPVxuICAgICAgICBnb3NzaXAuYWxpdmVFeHBpcmF0aW9uVGltZW91dDtcbiAgICB9XG5cbiAgICBpZiAoZ29zc2lwLnJlY29ubmVjdEludGVydmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIHJlY29ubmVjdCBpbnRlcnZhbDogJHtnb3NzaXAucmVjb25uZWN0SW50ZXJ2YWx9YCk7XG4gICAgICB0aGlzLmNvbmZpZy5wZWVyIS5nb3NzaXAhLnJlY29ubmVjdEludGVydmFsID0gZ29zc2lwLnJlY29ubmVjdEludGVydmFsO1xuICAgIH1cblxuICAgIGlmIChnb3NzaXAubWF4Q29ubmVjdGlvbkF0dGVtcHRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKFxuICAgICAgICBgU2V0dGluZyBtYXhpbXVtIGNvbm5lY3Rpb24gYXR0ZW1wdHM6ICR7Z29zc2lwLm1heENvbm5lY3Rpb25BdHRlbXB0c31gXG4gICAgICApO1xuICAgICAgdGhpcy5jb25maWcucGVlciEuZ29zc2lwIS5tYXhDb25uZWN0aW9uQXR0ZW1wdHMgPVxuICAgICAgICBnb3NzaXAubWF4Q29ubmVjdGlvbkF0dGVtcHRzO1xuICAgIH1cblxuICAgIGlmIChnb3NzaXAubXNnRXhwaXJhdGlvbkZhY3RvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgICAgYFNldHRpbmcgbWVzc2FnZSBleHBpcmF0aW9uIGZhY3RvcjogJHtnb3NzaXAubXNnRXhwaXJhdGlvbkZhY3Rvcn1gXG4gICAgICApO1xuICAgICAgdGhpcy5jb25maWcucGVlciEuZ29zc2lwIS5tc2dFeHBpcmF0aW9uRmFjdG9yID1cbiAgICAgICAgZ29zc2lwLm1zZ0V4cGlyYXRpb25GYWN0b3I7XG4gICAgfVxuXG4gICAgaWYgKGdvc3NpcC5leHRlcm5hbEVuZHBvaW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIGV4dGVybmFsIGVuZHBvaW50OiAke2dvc3NpcC5leHRlcm5hbEVuZHBvaW50fWApO1xuICAgICAgdGhpcy5jb25maWcucGVlciEuZ29zc2lwIS5leHRlcm5hbEVuZHBvaW50ID0gZ29zc2lwLmV4dGVybmFsRW5kcG9pbnQ7XG4gICAgfVxuXG4gICAgaWYgKGdvc3NpcC5lbGVjdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBlbGVjdGlvbiA9IGdvc3NpcC5lbGVjdGlvbjtcblxuICAgICAgaWYgKGVsZWN0aW9uLnN0YXJ0dXBHcmFjZVBlcmlvZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKFxuICAgICAgICAgIGBTZXR0aW5nIHN0YXJ0dXAgZ3JhY2UgcGVyaW9kOiAke2VsZWN0aW9uLnN0YXJ0dXBHcmFjZVBlcmlvZH1gXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuY29uZmlnLnBlZXIhLmdvc3NpcCEuZWxlY3Rpb24hLnN0YXJ0dXBHcmFjZVBlcmlvZCA9XG4gICAgICAgICAgZWxlY3Rpb24uc3RhcnR1cEdyYWNlUGVyaW9kO1xuICAgICAgfVxuXG4gICAgICBpZiAoZWxlY3Rpb24ubWVtYmVyc2hpcFNhbXBsZUludGVydmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoXG4gICAgICAgICAgYFNldHRpbmcgbWVtYmVyc2hpcCBzYW1wbGUgaW50ZXJ2YWw6ICR7ZWxlY3Rpb24ubWVtYmVyc2hpcFNhbXBsZUludGVydmFsfWBcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5jb25maWcucGVlciEuZ29zc2lwIS5lbGVjdGlvbiEubWVtYmVyc2hpcFNhbXBsZUludGVydmFsID1cbiAgICAgICAgICBlbGVjdGlvbi5tZW1iZXJzaGlwU2FtcGxlSW50ZXJ2YWw7XG4gICAgICB9XG5cbiAgICAgIGlmIChlbGVjdGlvbi5sZWFkZXJBbGl2ZVRocmVzaG9sZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKFxuICAgICAgICAgIGBTZXR0aW5nIGxlYWRlciBhbGl2ZSB0aHJlc2hvbGQ6ICR7ZWxlY3Rpb24ubGVhZGVyQWxpdmVUaHJlc2hvbGR9YFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmNvbmZpZy5wZWVyIS5nb3NzaXAhLmVsZWN0aW9uIS5sZWFkZXJBbGl2ZVRocmVzaG9sZCA9XG4gICAgICAgICAgZWxlY3Rpb24ubGVhZGVyQWxpdmVUaHJlc2hvbGQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChlbGVjdGlvbi5sZWFkZXJFbGVjdGlvbkR1cmF0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoXG4gICAgICAgICAgYFNldHRpbmcgbGVhZGVyIGVsZWN0aW9uIGR1cmF0aW9uOiAke2VsZWN0aW9uLmxlYWRlckVsZWN0aW9uRHVyYXRpb259YFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmNvbmZpZy5wZWVyIS5nb3NzaXAhLmVsZWN0aW9uIS5sZWFkZXJFbGVjdGlvbkR1cmF0aW9uID1cbiAgICAgICAgICBlbGVjdGlvbi5sZWFkZXJFbGVjdGlvbkR1cmF0aW9uO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChnb3NzaXAucHZ0RGF0YSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBwdnREYXRhID0gZ29zc2lwLnB2dERhdGE7XG5cbiAgICAgIGlmIChwdnREYXRhLnB1bGxSZXRyeVRocmVzaG9sZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKFxuICAgICAgICAgIGBTZXR0aW5nIHB1bGwgcmV0cnkgdGhyZXNob2xkOiAke3B2dERhdGEucHVsbFJldHJ5VGhyZXNob2xkfWBcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5jb25maWcucGVlciEuZ29zc2lwIS5wdnREYXRhIS5wdWxsUmV0cnlUaHJlc2hvbGQgPVxuICAgICAgICAgIHB2dERhdGEucHVsbFJldHJ5VGhyZXNob2xkO1xuICAgICAgfVxuXG4gICAgICBpZiAocHZ0RGF0YS50cmFuc2llbnRzdG9yZU1heEJsb2NrUmV0ZW50aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoXG4gICAgICAgICAgYFNldHRpbmcgdHJhbnNpZW50c3RvcmUgbWF4IGJsb2NrIHJldGVudGlvbjogJHtwdnREYXRhLnRyYW5zaWVudHN0b3JlTWF4QmxvY2tSZXRlbnRpb259YFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmNvbmZpZy5wZWVyIS5nb3NzaXAhLnB2dERhdGEhLnRyYW5zaWVudHN0b3JlTWF4QmxvY2tSZXRlbnRpb24gPVxuICAgICAgICAgIHB2dERhdGEudHJhbnNpZW50c3RvcmVNYXhCbG9ja1JldGVudGlvbjtcbiAgICAgIH1cblxuICAgICAgaWYgKHB2dERhdGEucHVzaEFja1RpbWVvdXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBwdXNoIGFjayB0aW1lb3V0OiAke3B2dERhdGEucHVzaEFja1RpbWVvdXR9YCk7XG4gICAgICAgIHRoaXMuY29uZmlnLnBlZXIhLmdvc3NpcCEucHZ0RGF0YSEucHVzaEFja1RpbWVvdXQgPVxuICAgICAgICAgIHB2dERhdGEucHVzaEFja1RpbWVvdXQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChwdnREYXRhLmJ0bFB1bGxNYXJnaW4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBidGwgcHVsbCBtYXJnaW46ICR7cHZ0RGF0YS5idGxQdWxsTWFyZ2lufWApO1xuICAgICAgICB0aGlzLmNvbmZpZy5wZWVyIS5nb3NzaXAhLnB2dERhdGEhLmJ0bFB1bGxNYXJnaW4gPVxuICAgICAgICAgIHB2dERhdGEuYnRsUHVsbE1hcmdpbjtcbiAgICAgIH1cblxuICAgICAgaWYgKHB2dERhdGEucmVjb25jaWxlQmF0Y2hTaXplICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoXG4gICAgICAgICAgYFNldHRpbmcgcmVjb25jaWxlIGJhdGNoIHNpemU6ICR7cHZ0RGF0YS5yZWNvbmNpbGVCYXRjaFNpemV9YFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmNvbmZpZy5wZWVyIS5nb3NzaXAhLnB2dERhdGEhLnJlY29uY2lsZUJhdGNoU2l6ZSA9XG4gICAgICAgICAgcHZ0RGF0YS5yZWNvbmNpbGVCYXRjaFNpemU7XG4gICAgICB9XG5cbiAgICAgIGlmIChwdnREYXRhLnJlY29uY2lsZVNsZWVwSW50ZXJ2YWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgICAgICBgU2V0dGluZyByZWNvbmNpbGUgc2xlZXAgaW50ZXJ2YWw6ICR7cHZ0RGF0YS5yZWNvbmNpbGVTbGVlcEludGVydmFsfWBcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5jb25maWcucGVlciEuZ29zc2lwIS5wdnREYXRhIS5yZWNvbmNpbGVTbGVlcEludGVydmFsID1cbiAgICAgICAgICBwdnREYXRhLnJlY29uY2lsZVNsZWVwSW50ZXJ2YWw7XG4gICAgICB9XG5cbiAgICAgIGlmIChwdnREYXRhLnJlY29uY2lsaWF0aW9uRW5hYmxlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKFxuICAgICAgICAgIGBTZXR0aW5nIHJlY29uY2lsaWF0aW9uIGVuYWJsZWQ6ICR7cHZ0RGF0YS5yZWNvbmNpbGlhdGlvbkVuYWJsZWR9YFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmNvbmZpZy5wZWVyIS5nb3NzaXAhLnB2dERhdGEhLnJlY29uY2lsaWF0aW9uRW5hYmxlZCA9XG4gICAgICAgICAgcHZ0RGF0YS5yZWNvbmNpbGlhdGlvbkVuYWJsZWQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChwdnREYXRhLnNraXBQdWxsaW5nSW52YWxpZFRyYW5zYWN0aW9uc0R1cmluZ0NvbW1pdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKFxuICAgICAgICAgIGBTZXR0aW5nIHNraXAgcHVsbGluZyBpbnZhbGlkIHRyYW5zYWN0aW9ucyBkdXJpbmcgY29tbWl0OiAke3B2dERhdGEuc2tpcFB1bGxpbmdJbnZhbGlkVHJhbnNhY3Rpb25zRHVyaW5nQ29tbWl0fWBcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5jb25maWcucGVlciEuZ29zc2lwIS5wdnREYXRhIS5za2lwUHVsbGluZ0ludmFsaWRUcmFuc2FjdGlvbnNEdXJpbmdDb21taXQgPVxuICAgICAgICAgIHB2dERhdGEuc2tpcFB1bGxpbmdJbnZhbGlkVHJhbnNhY3Rpb25zRHVyaW5nQ29tbWl0O1xuICAgICAgfVxuXG4gICAgICBpZiAocHZ0RGF0YS5pbXBsaWNpdENvbGxlY3Rpb25EaXNzZW1pbmF0aW9uUG9saWN5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHB2dERhdGEuaW1wbGljaXRDb2xsZWN0aW9uRGlzc2VtaW5hdGlvblBvbGljeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgY29uc3QgaW1wID0gcHZ0RGF0YS5pbXBsaWNpdENvbGxlY3Rpb25EaXNzZW1pbmF0aW9uUG9saWN5O1xuXG4gICAgICAgICAgaWYgKGltcC5tYXhQZWVyQ291bnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5sb2cuZGVidWcoXG4gICAgICAgICAgICAgIGBTZXR0aW5nIGltcGxpY2l0IGNvbGxlY3Rpb24gZGlzc2VtaW5hdGlvbiBwb2xpY3kgbWF4IHBlZXIgY291bnQ6ICR7aW1wLm1heFBlZXJDb3VudH1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5jb25maWcucGVlciEuZ29zc2lwIS5wdnREYXRhIS5pbXBsaWNpdENvbGxlY3Rpb25EaXNzZW1pbmF0aW9uUG9saWN5IS5tYXhQZWVyQ291bnQgPVxuICAgICAgICAgICAgICBpbXAubWF4UGVlckNvdW50O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChpbXAucmVxdWlyZWRQZWVyQ291bnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5sb2cuZGVidWcoXG4gICAgICAgICAgICAgIGBTZXR0aW5nIGltcGxpY2l0IGNvbGxlY3Rpb24gZGlzc2VtaW5hdGlvbiBwb2xpY3kgcmVxdWlyZWQgcGVlciBjb3VudDogJHtpbXAucmVxdWlyZWRQZWVyQ291bnR9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuY29uZmlnLnBlZXIhLmdvc3NpcCEucHZ0RGF0YSEuaW1wbGljaXRDb2xsZWN0aW9uRGlzc2VtaW5hdGlvblBvbGljeSEucmVxdWlyZWRQZWVyQ291bnQgPVxuICAgICAgICAgICAgICBpbXAucmVxdWlyZWRQZWVyQ291bnQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGdvc3NpcC5zdGF0ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBzdCA9IGdvc3NpcC5zdGF0ZTtcblxuICAgICAgaWYgKHN0LmVuYWJsZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBzdGF0ZSBlbmFibGVkOiAke3N0LmVuYWJsZWR9YCk7XG4gICAgICAgIHRoaXMuY29uZmlnLnBlZXIhLmdvc3NpcCEuc3RhdGUhLmVuYWJsZWQgPSBzdC5lbmFibGVkO1xuICAgICAgfVxuXG4gICAgICBpZiAoc3QuY2hlY2tJbnRlcnZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIHN0YXRlIGNoZWNrIGludGVydmFsOiAke3N0LmNoZWNrSW50ZXJ2YWx9YCk7XG4gICAgICAgIHRoaXMuY29uZmlnLnBlZXIhLmdvc3NpcCEuc3RhdGUhLmNoZWNrSW50ZXJ2YWwgPSBzdC5jaGVja0ludGVydmFsO1xuICAgICAgfVxuXG4gICAgICBpZiAoc3QucmVzcG9uc2VUaW1lb3V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgc3RhdGUgcmVzcG9uc2UgdGltZW91dDogJHtzdC5yZXNwb25zZVRpbWVvdXR9YCk7XG4gICAgICAgIHRoaXMuY29uZmlnLnBlZXIhLmdvc3NpcCEuc3RhdGUhLnJlc3BvbnNlVGltZW91dCA9IHN0LnJlc3BvbnNlVGltZW91dDtcbiAgICAgIH1cblxuICAgICAgaWYgKHN0LmJhdGNoU2l6ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIHN0YXRlIGJhdGNoIHNpemU6ICR7c3QuYmF0Y2hTaXplfWApO1xuICAgICAgICB0aGlzLmNvbmZpZy5wZWVyIS5nb3NzaXAhLnN0YXRlIS5iYXRjaFNpemUgPSBzdC5iYXRjaFNpemU7XG4gICAgICB9XG5cbiAgICAgIGlmIChzdC5ibG9ja0J1ZmZlclNpemUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgICAgICBgU2V0dGluZyBzdGF0ZSBibG9jayBidWZmZXIgc2l6ZTogJHtzdC5ibG9ja0J1ZmZlclNpemV9YFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmNvbmZpZy5wZWVyIS5nb3NzaXAhLnN0YXRlIS5ibG9ja0J1ZmZlclNpemUgPSBzdC5ibG9ja0J1ZmZlclNpemU7XG4gICAgICB9XG5cbiAgICAgIGlmIChzdC5tYXhSZXRyaWVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgc3RhdGUgbWF4IHJldHJpZXM6ICR7c3QubWF4UmV0cmllc31gKTtcbiAgICAgICAgdGhpcy5jb25maWcucGVlciEuZ29zc2lwIS5zdGF0ZSEubWF4UmV0cmllcyA9IHN0Lm1heFJldHJpZXM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRUTFModGxzPzogVExTQ29uZmlnKTogdGhpcyB7XG4gICAgaWYgKHRscyA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdGhpcztcblxuICAgIGlmICh0bHMuZW5hYmxlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBUTFMgZW5hYmxlZDogJHt0bHMuZW5hYmxlZH1gKTtcbiAgICAgIHRoaXMuY29uZmlnLnBlZXIhLnRscyEuZW5hYmxlZCA9IHRscy5lbmFibGVkO1xuICAgIH1cblxuICAgIGlmICh0bHMuY2xpZW50QXV0aFJlcXVpcmVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKFxuICAgICAgICBgU2V0dGluZyBjbGllbnQgYXV0aGVudGljYXRpb24gcmVxdWlyZWQ6ICR7dGxzLmNsaWVudEF1dGhSZXF1aXJlZH1gXG4gICAgICApO1xuICAgICAgdGhpcy5jb25maWcucGVlciEudGxzIS5jbGllbnRBdXRoUmVxdWlyZWQgPSB0bHMuY2xpZW50QXV0aFJlcXVpcmVkO1xuICAgIH1cblxuICAgIGlmICh0bHMuY2VydCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAodGxzLmNlcnQuZmlsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIFRMUyBjZXJ0IGZpbGU6ICR7dGxzLmNlcnQuZmlsZX1gKTtcbiAgICAgICAgdGhpcy5jb25maWcucGVlciEudGxzIS5jZXJ0IS5maWxlID0gdGxzLmNlcnQuZmlsZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGxzLmtleSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAodGxzLmtleS5maWxlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgVExTIGtleSBmaWxlOiAke3Rscy5rZXkuZmlsZX1gKTtcbiAgICAgICAgdGhpcy5jb25maWcucGVlciEudGxzIS5rZXkhLmZpbGUgPSB0bHMua2V5LmZpbGU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRscy5yb290Y2VydCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAodGxzLnJvb3RjZXJ0LmZpbGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBUTFMgcm9vdGNlcnQgZmlsZTogJHt0bHMucm9vdGNlcnQuZmlsZX1gKTtcbiAgICAgICAgdGhpcy5jb25maWcucGVlciEudGxzIS5yb290Y2VydCEuZmlsZSA9IHRscy5yb290Y2VydC5maWxlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0bHMuY2xpZW50Um9vdENBcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAodGxzLmNsaWVudFJvb3RDQXMuZmlsZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgICAgICBgU2V0dGluZyBUTFMgY2xpZW50IHJvb3QgQ0FzIGZpbGVzOiAke3Rscy5jbGllbnRSb290Q0FzLmZpbGVzLmpvaW4oXCIsIFwiKX1gXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuY29uZmlnLnBlZXIhLnRscyEuY2xpZW50Um9vdENBcyEuZmlsZXMgPSB0bHMuY2xpZW50Um9vdENBcy5maWxlcztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGxzLmNsaWVudEtleSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAodGxzLmNsaWVudEtleS5maWxlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgVExTIGNsaWVudCBrZXkgZmlsZTogJHt0bHMuY2xpZW50S2V5LmZpbGV9YCk7XG4gICAgICAgIHRoaXMuY29uZmlnLnBlZXIhLnRscyEuY2xpZW50S2V5IS5maWxlID0gdGxzLmNsaWVudEtleS5maWxlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0bHMuY2xpZW50Q2VydCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAodGxzLmNsaWVudENlcnQuZmlsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIFRMUyBjbGllbnQgY2VydCBmaWxlOiAke3Rscy5jbGllbnRDZXJ0LmZpbGV9YCk7XG4gICAgICAgIHRoaXMuY29uZmlnLnBlZXIhLnRscyEuY2xpZW50Q2VydCEuZmlsZSA9IHRscy5jbGllbnRDZXJ0LmZpbGU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRBdXRoZW50aWNhdGlvbihhdXRoZW50aWNhdGlvbj86IHN0cmluZyk6IHRoaXMge1xuICAgIGlmIChhdXRoZW50aWNhdGlvbiA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdGhpcztcblxuICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIGF1dGhlbnRpY2F0aW9uIHRpbWUgd2luZG93OiAke2F1dGhlbnRpY2F0aW9ufWApO1xuICAgIHRoaXMuY29uZmlnLnBlZXIhLmF1dGhlbnRpY2F0aW9uIS50aW1ld2luZG93ID0gYXV0aGVudGljYXRpb247XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldEtlZXBBbGljZShrZWVwQWxpY2U/OiBLZWVwQWxpdmVDb25maWcpOiB0aGlzIHtcbiAgICBpZiAoa2VlcEFsaWNlID09PSB1bmRlZmluZWQpIHJldHVybiB0aGlzO1xuXG4gICAgaWYgKGtlZXBBbGljZS5pbnRlcnZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBrZWVwLWFsaXZlIGludGVydmFsOiAke2tlZXBBbGljZS5pbnRlcnZhbH1gKTtcbiAgICAgIHRoaXMuY29uZmlnLnBlZXIhLmtlZXBhbGl2ZSEuaW50ZXJ2YWwgPSBrZWVwQWxpY2UuaW50ZXJ2YWw7XG4gICAgfVxuXG4gICAgaWYgKGtlZXBBbGljZS50aW1lb3V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIGtlZXAtYWxpdmUgdGltZW91dDogJHtrZWVwQWxpY2UudGltZW91dH1gKTtcbiAgICAgIHRoaXMuY29uZmlnLnBlZXIhLmtlZXBhbGl2ZSEudGltZW91dCA9IGtlZXBBbGljZS50aW1lb3V0O1xuICAgIH1cblxuICAgIGlmIChrZWVwQWxpY2UubWluSW50ZXJ2YWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoXG4gICAgICAgIGBTZXR0aW5nIG1pbmltdW0ga2VlcC1hbGl2ZSBpbnRlcnZhbDogJHtrZWVwQWxpY2UubWluSW50ZXJ2YWx9YFxuICAgICAgKTtcbiAgICAgIHRoaXMuY29uZmlnLnBlZXIhLmtlZXBhbGl2ZSEubWluSW50ZXJ2YWwgPSBrZWVwQWxpY2UubWluSW50ZXJ2YWw7XG4gICAgfVxuICAgIGlmIChrZWVwQWxpY2UuY2xpZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChrZWVwQWxpY2UuY2xpZW50LmludGVydmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoXG4gICAgICAgICAgYFNldHRpbmcgY2xpZW50IGtlZXAtYWxpdmUgaW50ZXJ2YWw6ICR7a2VlcEFsaWNlLmNsaWVudC5pbnRlcnZhbH1gXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuY29uZmlnLnBlZXIhLmtlZXBhbGl2ZSEuY2xpZW50IS5pbnRlcnZhbCA9XG4gICAgICAgICAga2VlcEFsaWNlLmNsaWVudC5pbnRlcnZhbDtcbiAgICAgIH1cblxuICAgICAgaWYgKGtlZXBBbGljZS5jbGllbnQudGltZW91dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKFxuICAgICAgICAgIGBTZXR0aW5nIGNsaWVudCBrZWVwLWFsaXZlIHRpbWVvdXQ6ICR7a2VlcEFsaWNlLmNsaWVudC50aW1lb3V0fWBcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5jb25maWcucGVlciEua2VlcGFsaXZlIS5jbGllbnQhLnRpbWVvdXQgPSBrZWVwQWxpY2UuY2xpZW50LnRpbWVvdXQ7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChrZWVwQWxpY2UuZGVsaXZlcnlDbGllbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKGtlZXBBbGljZS5kZWxpdmVyeUNsaWVudC5pbnRlcnZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKFxuICAgICAgICAgIGBTZXR0aW5nIGRlbGl2ZXJ5IGNsaWVudCBrZWVwLWFsaXZlIGludGVydmFsOiAke2tlZXBBbGljZS5kZWxpdmVyeUNsaWVudC5pbnRlcnZhbH1gXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuY29uZmlnLnBlZXIhLmtlZXBhbGl2ZSEuZGVsaXZlcnlDbGllbnQhLmludGVydmFsID1cbiAgICAgICAgICBrZWVwQWxpY2UuZGVsaXZlcnlDbGllbnQuaW50ZXJ2YWw7XG4gICAgICB9XG5cbiAgICAgIGlmIChrZWVwQWxpY2UuZGVsaXZlcnlDbGllbnQudGltZW91dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKFxuICAgICAgICAgIGBTZXR0aW5nIGRlbGl2ZXJ5IGNsaWVudCBrZWVwLWFsaXZlIHRpbWVvdXQ6ICR7a2VlcEFsaWNlLmRlbGl2ZXJ5Q2xpZW50LnRpbWVvdXR9YFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmNvbmZpZy5wZWVyIS5rZWVwYWxpdmUhLmRlbGl2ZXJ5Q2xpZW50IS50aW1lb3V0ID1cbiAgICAgICAgICBrZWVwQWxpY2UuZGVsaXZlcnlDbGllbnQudGltZW91dDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldEdhdGV3YXkoZ2F0ZXdheT86IEdhdGV3YXlDb25maWcpOiB0aGlzIHtcbiAgICBpZiAoZ2F0ZXdheSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdGhpcztcblxuICAgIGlmIChnYXRld2F5LmVuYWJsZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgZ2F0ZXdheSBlbmFibGVkOiAke2dhdGV3YXkuZW5hYmxlZH1gKTtcbiAgICAgIHRoaXMuY29uZmlnLnBlZXIhLmdhdGV3YXkhLmVuYWJsZWQgPSBnYXRld2F5LmVuYWJsZWQ7XG4gICAgfVxuXG4gICAgaWYgKGdhdGV3YXkuZW5kb3JzZW1lbnRUaW1lb3V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKFxuICAgICAgICBgU2V0dGluZyBlbmRvcnNlbWVudCB0aW1lb3V0OiAke2dhdGV3YXkuZW5kb3JzZW1lbnRUaW1lb3V0fWBcbiAgICAgICk7XG4gICAgICB0aGlzLmNvbmZpZy5wZWVyIS5nYXRld2F5IS5lbmRvcnNlbWVudFRpbWVvdXQgPVxuICAgICAgICBnYXRld2F5LmVuZG9yc2VtZW50VGltZW91dDtcbiAgICB9XG5cbiAgICBpZiAoZ2F0ZXdheS5icm9hZGNhc3RUaW1lb3V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIGJyb2FkY2FzdCB0aW1lb3V0OiAke2dhdGV3YXkuYnJvYWRjYXN0VGltZW91dH1gKTtcbiAgICAgIHRoaXMuY29uZmlnLnBlZXIhLmdhdGV3YXkhLmJyb2FkY2FzdFRpbWVvdXQgPSBnYXRld2F5LmJyb2FkY2FzdFRpbWVvdXQ7XG4gICAgfVxuICAgIGlmIChnYXRld2F5LmRpYWxUaW1lb3V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIGRpYWwgdGltZW91dDogJHtnYXRld2F5LmRpYWxUaW1lb3V0fWApO1xuICAgICAgdGhpcy5jb25maWcucGVlciEuZ2F0ZXdheSEuZGlhbFRpbWVvdXQgPSBnYXRld2F5LmRpYWxUaW1lb3V0O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldEdlbmVyYWwoZ2VuZXJhbD86IEdlbmVyYWxDb25maWcpOiB0aGlzIHtcbiAgICBpZiAoZ2VuZXJhbCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdGhpcztcblxuICAgIGlmIChnZW5lcmFsLnZhbGlkYXRvclBvb2xTaXplICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKFxuICAgICAgICBgU2V0dGluZyB2YWxpZGF0b3IgcG9vbCBzaXplOiAke2dlbmVyYWwudmFsaWRhdG9yUG9vbFNpemV9YFxuICAgICAgKTtcbiAgICAgIHRoaXMuY29uZmlnLnBlZXIhLnZhbGlkYXRvclBvb2xTaXplID0gZ2VuZXJhbC52YWxpZGF0b3JQb29sU2l6ZTtcbiAgICB9XG5cbiAgICBpZiAoZ2VuZXJhbC5maWxlU3lzdGVtUGF0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBmaWxlIHN5c3RlbSBwYXRoOiAke2dlbmVyYWwuZmlsZVN5c3RlbVBhdGh9YCk7XG4gICAgICB0aGlzLmNvbmZpZy5wZWVyIS5maWxlU3lzdGVtUGF0aCA9IGdlbmVyYWwuZmlsZVN5c3RlbVBhdGg7XG4gICAgfVxuICAgIGlmIChnZW5lcmFsLmlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIHBlZXIgSUQ6ICR7Z2VuZXJhbC5pZH1gKTtcbiAgICAgIHRoaXMuY29uZmlnLnBlZXIhLmlkID0gZ2VuZXJhbC5pZDtcbiAgICB9XG4gICAgaWYgKGdlbmVyYWwubmV0d29ya0lkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIG5ldHdvcmsgSUQ6ICR7Z2VuZXJhbC5uZXR3b3JrSWR9YCk7XG4gICAgICB0aGlzLmNvbmZpZy5wZWVyIS5uZXR3b3JrSWQgPSBnZW5lcmFsLm5ldHdvcmtJZDtcbiAgICB9XG4gICAgaWYgKGdlbmVyYWwubGlzdGVuQWRkcmVzcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBsaXN0ZW4gYWRkcmVzczogJHtnZW5lcmFsLmxpc3RlbkFkZHJlc3N9YCk7XG4gICAgICB0aGlzLmNvbmZpZy5wZWVyIS5saXN0ZW5BZGRyZXNzID0gZ2VuZXJhbC5saXN0ZW5BZGRyZXNzO1xuICAgIH1cbiAgICBpZiAoZ2VuZXJhbC5jaGFpbmNvZGVMaXN0ZW5BZGRyZXNzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKFxuICAgICAgICBgU2V0dGluZyBjaGFpbmNvZGUgbGlzdGVuIGFkZHJlc3M6ICR7Z2VuZXJhbC5jaGFpbmNvZGVMaXN0ZW5BZGRyZXNzfWBcbiAgICAgICk7XG4gICAgICB0aGlzLmNvbmZpZy5wZWVyIS5jaGFpbmNvZGVMaXN0ZW5BZGRyZXNzID0gZ2VuZXJhbC5jaGFpbmNvZGVMaXN0ZW5BZGRyZXNzO1xuICAgIH1cbiAgICBpZiAoZ2VuZXJhbC5jaGFpbmNvZGVBZGRyZXNzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIGNoYWluY29kZSBhZGRyZXNzOiAke2dlbmVyYWwuY2hhaW5jb2RlQWRkcmVzc31gKTtcbiAgICAgIHRoaXMuY29uZmlnLnBlZXIhLmNoYWluY29kZUFkZHJlc3MgPSBnZW5lcmFsLmNoYWluY29kZUFkZHJlc3M7XG4gICAgfVxuICAgIGlmIChnZW5lcmFsLmFkZHJlc3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgcGVlciBhZGRyZXNzOiAke2dlbmVyYWwuYWRkcmVzc31gKTtcbiAgICAgIHRoaXMuY29uZmlnLnBlZXIhLmFkZHJlc3MgPSBnZW5lcmFsLmFkZHJlc3M7XG4gICAgfVxuICAgIGlmIChnZW5lcmFsLmFkZHJlc3NBdXRvRGV0ZWN0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKFxuICAgICAgICBgU2V0dGluZyBhZGRyZXNzIGF1dG8tZGV0ZWN0IHRvICR7Z2VuZXJhbC5hZGRyZXNzQXV0b0RldGVjdH1gXG4gICAgICApO1xuICAgICAgdGhpcy5jb25maWcucGVlciEuYWRkcmVzc0F1dG9EZXRlY3QgPSBnZW5lcmFsLmFkZHJlc3NBdXRvRGV0ZWN0O1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0QkNDU1AoYmNjc3A/OiBCQ0NTUENvbmZpZyk6IHRoaXMge1xuICAgIGlmIChiY2NzcCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoYmNjc3AuRGVmYXVsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIEJDQ1NQIGRlZmF1bHQgdG8gJHtiY2NzcC5EZWZhdWx0fWApO1xuICAgICAgICB0aGlzLmNvbmZpZy5wZWVyIS5CQ0NTUCEuRGVmYXVsdCA9IGJjY3NwLkRlZmF1bHQ7XG4gICAgICB9XG4gICAgICBpZiAoYmNjc3AuU1cgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoYmNjc3AuU1cuSGFzaCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgQkNDU1AgU1cgaGFzaCB0byAke2JjY3NwLlNXLkhhc2h9YCk7XG4gICAgICAgICAgdGhpcy5jb25maWcucGVlciEuQkNDU1AhLlNXIS5IYXNoID0gYmNjc3AuU1cuSGFzaDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYmNjc3AuU1cuU2VjdXJpdHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIEJDQ1NQIFNXIHNlY3VyaXR5IHRvICR7YmNjc3AuU1cuU2VjdXJpdHl9YCk7XG4gICAgICAgICAgdGhpcy5jb25maWcucGVlciEuQkNDU1AhLlNXIS5TZWN1cml0eSA9IGJjY3NwLlNXLlNlY3VyaXR5O1xuICAgICAgICB9XG4gICAgICAgIGlmIChiY2NzcC5TVy5GaWxlS2V5U3RvcmUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGlmIChiY2NzcC5TVy5GaWxlS2V5U3RvcmUuS2V5U3RvcmUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5sb2cuZGVidWcoXG4gICAgICAgICAgICAgIGBTZXR0aW5nIEJDQ1NQIFNXIEZpbGVLZXlTdG9yZSBrZXkgc3RvcmUgdG8gJHtiY2NzcC5TVy5GaWxlS2V5U3RvcmUuS2V5U3RvcmV9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuY29uZmlnLnBlZXIhLkJDQ1NQIS5TVyEuRmlsZUtleVN0b3JlIS5LZXlTdG9yZSA9XG4gICAgICAgICAgICAgIGJjY3NwLlNXLkZpbGVLZXlTdG9yZS5LZXlTdG9yZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGJjY3NwLlBLQ1MxMSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmIChiY2NzcC5QS0NTMTEuTGlicmFyeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhpcy5sb2cuZGVidWcoXG4gICAgICAgICAgICBgU2V0dGluZyBCQ0NTUCBQS0NTMTEgbGlicmFyeSB0byAke2JjY3NwLlBLQ1MxMS5MaWJyYXJ5fWBcbiAgICAgICAgICApO1xuICAgICAgICAgIHRoaXMuY29uZmlnLnBlZXIhLkJDQ1NQIS5QS0NTMTEhLkxpYnJhcnkgPSBiY2NzcC5QS0NTMTEuTGlicmFyeTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYmNjc3AuUEtDUzExLkxhYmVsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBCQ0NTUCBQS0NTMTEgbGFiZWwgdG8gJHtiY2NzcC5QS0NTMTEuTGFiZWx9YCk7XG4gICAgICAgICAgdGhpcy5jb25maWcucGVlciEuQkNDU1AhLlBLQ1MxMSEuTGFiZWwgPSBiY2NzcC5QS0NTMTEuTGFiZWw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJjY3NwLlBLQ1MxMS5QaW4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIEJDQ1NQIFBLQ1MxMSBwaW4gdG8gJHtiY2NzcC5QS0NTMTEuUGlufWApO1xuICAgICAgICAgIHRoaXMuY29uZmlnLnBlZXIhLkJDQ1NQIS5QS0NTMTEhLlBpbiA9IGJjY3NwLlBLQ1MxMS5QaW47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJjY3NwLlBLQ1MxMS5IYXNoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBCQ0NTUCBQS0NTMTEgaGFzaCB0byAke2JjY3NwLlBLQ1MxMS5IYXNofWApO1xuICAgICAgICAgIHRoaXMuY29uZmlnLnBlZXIhLkJDQ1NQIS5QS0NTMTEhLkhhc2ggPSBiY2NzcC5QS0NTMTEuSGFzaDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYmNjc3AuUEtDUzExLlNlY3VyaXR5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgICAgICAgIGBTZXR0aW5nIEJDQ1NQIFBLQ1MxMSBzZWN1cml0eSB0byAke2JjY3NwLlBLQ1MxMS5TZWN1cml0eX1gXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aGlzLmNvbmZpZy5wZWVyIS5CQ0NTUCEuUEtDUzExIS5TZWN1cml0eSA9IGJjY3NwLlBLQ1MxMS5TZWN1cml0eTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChiY2NzcC5QS0NTMTEuU29mdHdhcmVWZXJpZnkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRoaXMubG9nLmRlYnVnKFxuICAgICAgICAgICAgYFNldHRpbmcgQkNDU1AgUEtDUzExIHNvZnR3YXJlIHZlcmlmeSB0byAke2JjY3NwLlBLQ1MxMS5Tb2Z0d2FyZVZlcmlmeX1gXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aGlzLmNvbmZpZy5wZWVyIS5CQ0NTUCEuUEtDUzExIS5Tb2Z0d2FyZVZlcmlmeSA9XG4gICAgICAgICAgICBiY2NzcC5QS0NTMTEuU29mdHdhcmVWZXJpZnk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJjY3NwLlBLQ1MxMS5JbW11dGFibGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRoaXMubG9nLmRlYnVnKFxuICAgICAgICAgICAgYFNldHRpbmcgQkNDU1AgUEtDUzExIGltbXV0YWJsZSB0byAke2JjY3NwLlBLQ1MxMS5JbW11dGFibGV9YFxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5jb25maWcucGVlciEuQkNDU1AhLlBLQ1MxMSEuSW1tdXRhYmxlID0gYmNjc3AuUEtDUzExLkltbXV0YWJsZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYmNjc3AuUEtDUzExLkFsdElEICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgICAgICAgIGBTZXR0aW5nIEJDQ1NQIFBLQ1MxMSBhbHQgSUQgdG8gJHtiY2NzcC5QS0NTMTEuQWx0SUR9YFxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5jb25maWcucGVlciEuQkNDU1AhLlBLQ1MxMSEuQWx0SUQgPSBiY2NzcC5QS0NTMTEuQWx0SUQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJjY3NwLlBLQ1MxMS5LZXlJZHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRoaXMubG9nLmRlYnVnKFxuICAgICAgICAgICAgYFNldHRpbmcgQkNDU1AgUEtDUzExIGtleSBJRHMgdG8gJHtiY2NzcC5QS0NTMTEuS2V5SWRzfWBcbiAgICAgICAgICApO1xuICAgICAgICAgIHRoaXMuY29uZmlnLnBlZXIhLkJDQ1NQIS5QS0NTMTEhLktleUlkcyA9IGJjY3NwLlBLQ1MxMS5LZXlJZHM7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldE1zcENvbmZpZyhtc3BDb25maWc/OiBNU1BDb25maWcpOiB0aGlzIHtcbiAgICBpZiAobXNwQ29uZmlnID09PSB1bmRlZmluZWQpIHJldHVybiB0aGlzO1xuXG4gICAgaWYgKG1zcENvbmZpZy5sb2NhbE1zcFR5cGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgbG9jYWwgTVNQIHR5cGUgdG8gJHttc3BDb25maWcubG9jYWxNc3BUeXBlfWApO1xuICAgICAgdGhpcy5jb25maWcucGVlciEubG9jYWxNc3BUeXBlID0gbXNwQ29uZmlnLmxvY2FsTXNwVHlwZTtcbiAgICB9XG4gICAgaWYgKG1zcENvbmZpZy5tc3BDb25maWdQYXRoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIE1TUCBjb25maWcgcGF0aCB0byAke21zcENvbmZpZy5tc3BDb25maWdQYXRofWApO1xuICAgICAgdGhpcy5jb25maWcucGVlciEubXNwQ29uZmlnUGF0aCA9IG1zcENvbmZpZy5tc3BDb25maWdQYXRoO1xuICAgIH1cbiAgICBpZiAobXNwQ29uZmlnLmxvY2FsTXNwSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgbG9jYWwgTVNQIElEIHRvICR7bXNwQ29uZmlnLmxvY2FsTXNwSWR9YCk7XG4gICAgICB0aGlzLmNvbmZpZy5wZWVyIS5sb2NhbE1zcElkID0gbXNwQ29uZmlnLmxvY2FsTXNwSWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRDb25uVGltZW91dENsaWVudChjb25uVGltZW91dENsaWVudD86IHN0cmluZyk6IHRoaXMge1xuICAgIGlmIChjb25uVGltZW91dENsaWVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgICAgYFNldHRpbmcgY29ubmVjdGlvbiB0aW1lb3V0IGNsaWVudCB0byAke2Nvbm5UaW1lb3V0Q2xpZW50fWBcbiAgICAgICk7XG4gICAgICB0aGlzLmNvbmZpZy5wZWVyIS5jbGllbnQhLmNvbm5UaW1lb3V0ID0gY29ublRpbWVvdXRDbGllbnQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXREZWxpdmVyeUNsaWVudChkZWxpdmVyeUNsaWVudD86IERlbGl2ZXJ5Q2xpZW50Q29uZmlnKTogdGhpcyB7XG4gICAgaWYgKGRlbGl2ZXJ5Q2xpZW50ID09PSB1bmRlZmluZWQpIHJldHVybiB0aGlzO1xuXG4gICAgaWYgKGRlbGl2ZXJ5Q2xpZW50LmFkZHJlc3NPdmVycmlkZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoXG4gICAgICAgIGBTZXR0aW5nIGFkZHJlc3Mgb3ZlcnJpZGVzOiAke0pTT04uc3RyaW5naWZ5KGRlbGl2ZXJ5Q2xpZW50LmFkZHJlc3NPdmVycmlkZXMpfWBcbiAgICAgICk7XG4gICAgICB0aGlzLmNvbmZpZy5wZWVyIS5kZWxpdmVyeWNsaWVudCEuYWRkcmVzc092ZXJyaWRlcyA9XG4gICAgICAgIGRlbGl2ZXJ5Q2xpZW50LmFkZHJlc3NPdmVycmlkZXM7XG4gICAgfVxuXG4gICAgaWYgKGRlbGl2ZXJ5Q2xpZW50LmJsb2NrR29zc2lwRW5hYmxlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgICAgYFNldHRpbmcgYmxvY2sgZ29zc2lwIGVuYWJsZWQgdG8gJHtkZWxpdmVyeUNsaWVudC5ibG9ja0dvc3NpcEVuYWJsZWR9YFxuICAgICAgKTtcbiAgICAgIHRoaXMuY29uZmlnLnBlZXIhLmRlbGl2ZXJ5Y2xpZW50IS5ibG9ja0dvc3NpcEVuYWJsZWQgPVxuICAgICAgICBkZWxpdmVyeUNsaWVudC5ibG9ja0dvc3NpcEVuYWJsZWQ7XG4gICAgfVxuXG4gICAgaWYgKGRlbGl2ZXJ5Q2xpZW50LnJlY29ubmVjdFRvdGFsVGltZVRocmVzaG9sZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgICAgYFNldHRpbmcgcmVjb25uZWN0IHRvdGFsIHRpbWUgdGhyZXNob2xkIHRvICR7ZGVsaXZlcnlDbGllbnQucmVjb25uZWN0VG90YWxUaW1lVGhyZXNob2xkfWBcbiAgICAgICk7XG4gICAgICB0aGlzLmNvbmZpZy5wZWVyIS5kZWxpdmVyeWNsaWVudCEucmVjb25uZWN0VG90YWxUaW1lVGhyZXNob2xkID1cbiAgICAgICAgZGVsaXZlcnlDbGllbnQucmVjb25uZWN0VG90YWxUaW1lVGhyZXNob2xkO1xuICAgIH1cblxuICAgIGlmIChkZWxpdmVyeUNsaWVudC5jb25uVGltZW91dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgICAgYFNldHRpbmcgY29ubmVjdGlvbiB0aW1lb3V0IHRvICR7ZGVsaXZlcnlDbGllbnQuY29ublRpbWVvdXR9YFxuICAgICAgKTtcbiAgICAgIHRoaXMuY29uZmlnLnBlZXIhLmRlbGl2ZXJ5Y2xpZW50IS5jb25uVGltZW91dCA9XG4gICAgICAgIGRlbGl2ZXJ5Q2xpZW50LmNvbm5UaW1lb3V0O1xuICAgIH1cbiAgICBpZiAoZGVsaXZlcnlDbGllbnQucmVDb25uZWN0QmFja29mZlRocmVzaG9sZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgICAgYFNldHRpbmcgcmVjb25uZWN0IGJhY2tvZmYgdGhyZXNob2xkIHRvICR7ZGVsaXZlcnlDbGllbnQucmVDb25uZWN0QmFja29mZlRocmVzaG9sZH1gXG4gICAgICApO1xuICAgICAgdGhpcy5jb25maWcucGVlciEuZGVsaXZlcnljbGllbnQhLnJlQ29ubmVjdEJhY2tvZmZUaHJlc2hvbGQgPVxuICAgICAgICBkZWxpdmVyeUNsaWVudC5yZUNvbm5lY3RCYWNrb2ZmVGhyZXNob2xkO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0UHJvZmlsZShwcm9maWxlPzogUHJvZmlsZUNvbmZpZyk6IHRoaXMge1xuICAgIGlmIChwcm9maWxlID09PSB1bmRlZmluZWQpIHJldHVybiB0aGlzO1xuXG4gICAgaWYgKHByb2ZpbGUuZW5hYmxlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBwcm9maWxlIHRvICR7cHJvZmlsZS5lbmFibGVkfWApO1xuICAgICAgdGhpcy5jb25maWcucGVlciEucHJvZmlsZSA9IHByb2ZpbGU7XG4gICAgfVxuICAgIGlmIChwcm9maWxlLmxpc3RlbkFkZHJlc3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgbGlzdGVuIGFkZHJlc3MgdG8gJHtwcm9maWxlLmxpc3RlbkFkZHJlc3N9YCk7XG4gICAgICB0aGlzLmNvbmZpZy5wZWVyIS5wcm9maWxlIS5saXN0ZW5BZGRyZXNzID0gcHJvZmlsZS5saXN0ZW5BZGRyZXNzO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0SGFuZGxlcnMoaGFuZGxlcnM/OiBIYW5kbGVyc0NvbmZpZyk6IHRoaXMge1xuICAgIGlmIChoYW5kbGVycyA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdGhpcztcblxuICAgIGlmIChoYW5kbGVycy5hdXRoRmlsdGVycyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgICAgYFNldHRpbmcgYXV0aCBmaWx0ZXJzOiAke0pTT04uc3RyaW5naWZ5KGhhbmRsZXJzLmF1dGhGaWx0ZXJzKX1gXG4gICAgICApO1xuICAgICAgdGhpcy5jb25maWcucGVlciEuaGFuZGxlcnMhLmF1dGhGaWx0ZXJzID0gaGFuZGxlcnMuYXV0aEZpbHRlcnM7XG4gICAgfVxuXG4gICAgaWYgKGhhbmRsZXJzLmRlY29yYXRvcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoXG4gICAgICAgIGBTZXR0aW5nIGRlY29yYXRvcnM6ICR7SlNPTi5zdHJpbmdpZnkoaGFuZGxlcnMuZGVjb3JhdG9ycyl9YFxuICAgICAgKTtcbiAgICAgIHRoaXMuY29uZmlnLnBlZXIhLmhhbmRsZXJzIS5kZWNvcmF0b3JzID0gaGFuZGxlcnMuZGVjb3JhdG9ycztcbiAgICB9XG4gICAgaWYgKGhhbmRsZXJzLmVuZG9yc2VycyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBlY3NzID0gaGFuZGxlcnMuZW5kb3JzZXJzLmVzY2M7XG5cbiAgICAgIGlmIChlY3NzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKGVjc3MubmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgRVNDQyBuYW1lOiAke2Vjc3MubmFtZX1gKTtcbiAgICAgICAgICB0aGlzLmNvbmZpZy5wZWVyIS5oYW5kbGVycyEuZW5kb3JzZXJzIS5lc2NjIS5uYW1lID0gZWNzcy5uYW1lO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlY3NzLmxpYnJhcnkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIEVTQ0MgbGlicmFyeTogJHtlY3NzLmxpYnJhcnl9YCk7XG4gICAgICAgICAgdGhpcy5jb25maWcucGVlciEuaGFuZGxlcnMhLmVuZG9yc2VycyEuZXNjYyEubGlicmFyeSA9IGVjc3MubGlicmFyeTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChoYW5kbGVycy52YWxpZGF0b3JzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IHZzY2MgPSBoYW5kbGVycy52YWxpZGF0b3JzLnZzY2M7XG5cbiAgICAgIGlmICh2c2NjICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHZzY2MubmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgVlNDQyBuYW1lOiAke3ZzY2MubmFtZX1gKTtcbiAgICAgICAgICB0aGlzLmNvbmZpZy5wZWVyIS5oYW5kbGVycyEudmFsaWRhdG9ycyEudnNjYyEubmFtZSA9IHZzY2MubmFtZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodnNjYy5saWJyYXJ5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBWU0NDIGxpYnJhcnk6ICR7dnNjYy5saWJyYXJ5fWApO1xuICAgICAgICAgIHRoaXMuY29uZmlnLnBlZXIhLmhhbmRsZXJzIS52YWxpZGF0b3JzIS52c2NjIS5saWJyYXJ5ID0gdnNjYy5saWJyYXJ5O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXREaXNjb3ZlcnkoZGlzY292ZXJ5PzogRGlzY292ZXJ5Q29uZmlnKTogdGhpcyB7XG4gICAgaWYgKGRpc2NvdmVyeSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdGhpcztcblxuICAgIGlmIChkaXNjb3ZlcnkuZW5hYmxlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBkaXNjb3ZlcnkgZW5hYmxlZDogJHtkaXNjb3ZlcnkuZW5hYmxlZH1gKTtcbiAgICAgIHRoaXMuY29uZmlnLnBlZXIhLmRpc2NvdmVyeSEuZW5hYmxlZCA9IGRpc2NvdmVyeS5lbmFibGVkO1xuICAgIH1cblxuICAgIGlmIChkaXNjb3ZlcnkuYXV0aENhY2hlRW5hYmxlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgICAgYFNldHRpbmcgYXV0aCBjYWNoZSBlbmFibGVkOiAke2Rpc2NvdmVyeS5hdXRoQ2FjaGVFbmFibGVkfWBcbiAgICAgICk7XG4gICAgICB0aGlzLmNvbmZpZy5wZWVyIS5kaXNjb3ZlcnkhLmF1dGhDYWNoZUVuYWJsZWQgPVxuICAgICAgICBkaXNjb3ZlcnkuYXV0aENhY2hlRW5hYmxlZDtcbiAgICB9XG5cbiAgICBpZiAoZGlzY292ZXJ5LmF1dGhDYWNoZU1heFNpemUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoXG4gICAgICAgIGBTZXR0aW5nIGF1dGggY2FjaGUgbWF4IHNpemU6ICR7ZGlzY292ZXJ5LmF1dGhDYWNoZU1heFNpemV9YFxuICAgICAgKTtcbiAgICAgIHRoaXMuY29uZmlnLnBlZXIhLmRpc2NvdmVyeSEuYXV0aENhY2hlTWF4U2l6ZSA9XG4gICAgICAgIGRpc2NvdmVyeS5hdXRoQ2FjaGVNYXhTaXplO1xuICAgIH1cbiAgICBpZiAoZGlzY292ZXJ5LmF1dGhDYWNoZVB1cmdlUmV0ZW50aW9uUmF0aW8gIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoXG4gICAgICAgIGBTZXR0aW5nIGF1dGggY2FjaGUgcHVyZ2UgcmV0ZW50aW9uIHJhdGlvOiAke2Rpc2NvdmVyeS5hdXRoQ2FjaGVQdXJnZVJldGVudGlvblJhdGlvfWBcbiAgICAgICk7XG4gICAgICB0aGlzLmNvbmZpZy5wZWVyIS5kaXNjb3ZlcnkhLmF1dGhDYWNoZVB1cmdlUmV0ZW50aW9uUmF0aW8gPVxuICAgICAgICBkaXNjb3ZlcnkuYXV0aENhY2hlUHVyZ2VSZXRlbnRpb25SYXRpbztcbiAgICB9XG4gICAgaWYgKGRpc2NvdmVyeS5vcmdNZW1iZXJzQWxsb3dlZEFjY2VzcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgICAgYFNldHRpbmcgb3JnIG1lbWJlcnMgYWxsb3dlZCBhY2Nlc3M6ICR7ZGlzY292ZXJ5Lm9yZ01lbWJlcnNBbGxvd2VkQWNjZXNzfWBcbiAgICAgICk7XG4gICAgICB0aGlzLmNvbmZpZy5wZWVyIS5kaXNjb3ZlcnkhLm9yZ01lbWJlcnNBbGxvd2VkQWNjZXNzID1cbiAgICAgICAgZGlzY292ZXJ5Lm9yZ01lbWJlcnNBbGxvd2VkQWNjZXNzO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldExpbWl0cyhsaW1pdHM/OiBMaW1pdHNDb25maWcpOiB0aGlzIHtcbiAgICBpZiAobGltaXRzID09PSB1bmRlZmluZWQpIHJldHVybiB0aGlzO1xuXG4gICAgaWYgKGxpbWl0cy5jb25jdXJyZW5jeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBjb25jdXJyZW5jeSA9IGxpbWl0cy5jb25jdXJyZW5jeTtcblxuICAgICAgaWYgKGNvbmN1cnJlbmN5LmRlbGl2ZXJTZXJ2aWNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoXG4gICAgICAgICAgYFNldHRpbmcgZGVsaXZlciBzZXJ2aWNlIGNvbmN1cnJlbmN5OiAke2NvbmN1cnJlbmN5LmRlbGl2ZXJTZXJ2aWNlfWBcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5jb25maWcucGVlciEubGltaXRzIS5jb25jdXJyZW5jeSEuZGVsaXZlclNlcnZpY2UgPVxuICAgICAgICAgIGNvbmN1cnJlbmN5LmRlbGl2ZXJTZXJ2aWNlO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmN1cnJlbmN5LmdhdGV3YXlTZXJ2aWNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoXG4gICAgICAgICAgYFNldHRpbmcgZ2F0ZXdheSBzZXJ2aWNlIGNvbmN1cnJlbmN5OiAke2NvbmN1cnJlbmN5LmdhdGV3YXlTZXJ2aWNlfWBcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5jb25maWcucGVlciEubGltaXRzIS5jb25jdXJyZW5jeSEuZ2F0ZXdheVNlcnZpY2UgPVxuICAgICAgICAgIGNvbmN1cnJlbmN5LmdhdGV3YXlTZXJ2aWNlO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uY3VycmVuY3kuZW5kb3JzZXJTZXJ2aWNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoXG4gICAgICAgICAgYFNldHRpbmcgZW5kb3JzZXIgc2VydmljZSBjb25jdXJyZW5jeTogJHtjb25jdXJyZW5jeS5lbmRvcnNlclNlcnZpY2V9YFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmNvbmZpZy5wZWVyIS5saW1pdHMhLmNvbmN1cnJlbmN5IS5lbmRvcnNlclNlcnZpY2UgPVxuICAgICAgICAgIGNvbmN1cnJlbmN5LmVuZG9yc2VyU2VydmljZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldE1lc3NhZ2VTaXplKHNpemU/OiBNU0dTaXplQ29uZmlnKTogdGhpcyB7XG4gICAgaWYgKHNpemUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRoaXM7XG5cbiAgICBpZiAoc2l6ZS5tYXhSZWN2TXNnU2l6ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgICAgYFNldHRpbmcgbWF4IHJlY2VpdmUgbWVzc2FnZSBzaXplOiAke3NpemUubWF4UmVjdk1zZ1NpemV9YFxuICAgICAgKTtcbiAgICAgIHRoaXMuY29uZmlnLnBlZXIhLm1heFJlY3ZNc2dTaXplID0gc2l6ZS5tYXhSZWN2TXNnU2l6ZTtcbiAgICB9XG5cbiAgICBpZiAoc2l6ZS5tYXhTZW5kTXNnU2l6ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBtYXggc2VuZCBtZXNzYWdlIHNpemU6ICR7c2l6ZS5tYXhTZW5kTXNnU2l6ZX1gKTtcbiAgICAgIHRoaXMuY29uZmlnLnBlZXIhLm1heFNlbmRNc2dTaXplID0gc2l6ZS5tYXhTZW5kTXNnU2l6ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldENoYWluY29kZShjaGFpbmNvZGU/OiBDaGFpbmNvZGVDb25maWcpOiB0aGlzIHtcbiAgICBpZiAoY2hhaW5jb2RlID09PSB1bmRlZmluZWQpIHJldHVybiB0aGlzO1xuXG4gICAgaWYgKGNoYWluY29kZS5pZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoY2hhaW5jb2RlLmlkLnBhdGggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBjaGFpbmNvZGUgcGF0aDogJHtjaGFpbmNvZGUuaWQucGF0aH1gKTtcbiAgICAgICAgdGhpcy5jb25maWcuY2hhaW5jb2RlIS5pZCEucGF0aCA9IGNoYWluY29kZS5pZC5wYXRoO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2hhaW5jb2RlLmlkLm5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBjaGFpbmNvZGUgbmFtZTogJHtjaGFpbmNvZGUuaWQubmFtZX1gKTtcbiAgICAgICAgdGhpcy5jb25maWcuY2hhaW5jb2RlIS5pZCEubmFtZSA9IGNoYWluY29kZS5pZC5uYW1lO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjaGFpbmNvZGUuYnVpbGRlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBjaGFpbmNvZGUgYnVpbGRlcjogJHtjaGFpbmNvZGUuYnVpbGRlcn1gKTtcbiAgICAgIHRoaXMuY29uZmlnLmNoYWluY29kZSEuYnVpbGRlciA9IGNoYWluY29kZS5idWlsZGVyO1xuICAgIH1cblxuICAgIGlmIChjaGFpbmNvZGUucHVsbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBjaGFpbmNvZGUgcHVsbDogJHtjaGFpbmNvZGUucHVsbH1gKTtcbiAgICAgIHRoaXMuY29uZmlnLmNoYWluY29kZSEucHVsbCA9IGNoYWluY29kZS5wdWxsO1xuICAgIH1cblxuICAgIGlmIChjaGFpbmNvZGUuZ29sYW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGdvbGFuZyA9IGNoYWluY29kZS5nb2xhbmc7XG5cbiAgICAgIGlmIChnb2xhbmcucnVudGltZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIEdvIHJ1bnRpbWU6ICR7Z29sYW5nLnJ1bnRpbWV9YCk7XG4gICAgICAgIHRoaXMuY29uZmlnLmNoYWluY29kZSEuZ29sYW5nIS5ydW50aW1lID0gZ29sYW5nLnJ1bnRpbWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChnb2xhbmcuZHluYW1pY0xpbmsgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBHbyBkeW5hbWljIGxpbms6ICR7Z29sYW5nLmR5bmFtaWNMaW5rfWApO1xuICAgICAgICB0aGlzLmNvbmZpZy5jaGFpbmNvZGUhLmdvbGFuZyEuZHluYW1pY0xpbmsgPSBnb2xhbmcuZHluYW1pY0xpbms7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNoYWluY29kZS5qYXZhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGphdmEgPSBjaGFpbmNvZGUuamF2YTtcblxuICAgICAgaWYgKGphdmEucnVudGltZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIEphdmEgcnVudGltZTogJHtqYXZhLnJ1bnRpbWV9YCk7XG4gICAgICAgIHRoaXMuY29uZmlnLmNoYWluY29kZSEuamF2YSEucnVudGltZSA9IGphdmEucnVudGltZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY2hhaW5jb2RlLm5vZGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3Qgbm9kZSA9IGNoYWluY29kZS5ub2RlO1xuXG4gICAgICBpZiAobm9kZS5ydW50aW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgTm9kZSBydW50aW1lOiAke25vZGUucnVudGltZX1gKTtcbiAgICAgICAgdGhpcy5jb25maWcuY2hhaW5jb2RlIS5ub2RlIS5ydW50aW1lID0gbm9kZS5ydW50aW1lO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjaGFpbmNvZGUuZXh0ZXJuYWxCdWlsZGVycyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgICAgYFNldHRpbmcgZXh0ZXJuYWwgYnVpbGRlcnM6ICR7Y2hhaW5jb2RlLmV4dGVybmFsQnVpbGRlcnMubGVuZ3RofWBcbiAgICAgICk7XG4gICAgICB0aGlzLmNvbmZpZy5jaGFpbmNvZGUhLmV4dGVybmFsQnVpbGRlcnMgPSBjaGFpbmNvZGUuZXh0ZXJuYWxCdWlsZGVycztcbiAgICB9XG5cbiAgICBpZiAoY2hhaW5jb2RlLmluc3RhbGxUaW1lb3V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIGluc3RhbGwgdGltZW91dDogJHtjaGFpbmNvZGUuaW5zdGFsbFRpbWVvdXR9YCk7XG4gICAgICB0aGlzLmNvbmZpZy5jaGFpbmNvZGUhLmluc3RhbGxUaW1lb3V0ID0gY2hhaW5jb2RlLmluc3RhbGxUaW1lb3V0O1xuICAgIH1cblxuICAgIGlmIChjaGFpbmNvZGUuc3RhcnR1cHRpbWVvdXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgc3RhcnR1cCB0aW1lb3V0OiAke2NoYWluY29kZS5zdGFydHVwdGltZW91dH1gKTtcbiAgICAgIHRoaXMuY29uZmlnLmNoYWluY29kZSEuc3RhcnR1cHRpbWVvdXQgPSBjaGFpbmNvZGUuc3RhcnR1cHRpbWVvdXQ7XG4gICAgfVxuXG4gICAgaWYgKGNoYWluY29kZS5leGVjdXRldGltZW91dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBleGVjdXRlIHRpbWVvdXQ6ICR7Y2hhaW5jb2RlLmV4ZWN1dGV0aW1lb3V0fWApO1xuICAgICAgdGhpcy5jb25maWcuY2hhaW5jb2RlIS5leGVjdXRldGltZW91dCA9IGNoYWluY29kZS5leGVjdXRldGltZW91dDtcbiAgICB9XG5cbiAgICBpZiAoY2hhaW5jb2RlLm1vZGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgY2hhaW5jb2RlIG1vZGU6ICR7Y2hhaW5jb2RlLm1vZGV9YCk7XG4gICAgICB0aGlzLmNvbmZpZy5jaGFpbmNvZGUhLm1vZGUgPSBjaGFpbmNvZGUubW9kZTtcbiAgICB9XG5cbiAgICBpZiAoY2hhaW5jb2RlLmtlZXBhbGl2ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBjaGFpbmNvZGUga2VlcGFsaXZlOiAke2NoYWluY29kZS5rZWVwYWxpdmV9YCk7XG4gICAgICB0aGlzLmNvbmZpZy5jaGFpbmNvZGUhLmtlZXBhbGl2ZSA9IGNoYWluY29kZS5rZWVwYWxpdmU7XG4gICAgfVxuXG4gICAgaWYgKGNoYWluY29kZS5zeXN0ZW0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3Qgc3lzdGVtID0gY2hhaW5jb2RlLnN5c3RlbTtcblxuICAgICAgaWYgKHN5c3RlbS5fbGlmZWN5Y2xlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgc3lzdGVtIGxpZmVjeWNsZTogJHtzeXN0ZW0uX2xpZmVjeWNsZX1gKTtcbiAgICAgICAgdGhpcy5jb25maWcuY2hhaW5jb2RlIS5zeXN0ZW0hLl9saWZlY3ljbGUgPSBzeXN0ZW0uX2xpZmVjeWNsZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHN5c3RlbS5jc2NjICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgQ1NDQzogJHtzeXN0ZW0uY3NjY31gKTtcbiAgICAgICAgdGhpcy5jb25maWcuY2hhaW5jb2RlIS5zeXN0ZW0hLl9saWZlY3ljbGUgPSBzeXN0ZW0uY3NjYztcbiAgICAgIH1cblxuICAgICAgaWYgKHN5c3RlbS5sc2NjICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgTFNDQzogJHtzeXN0ZW0ubHNjY31gKTtcbiAgICAgICAgdGhpcy5jb25maWcuY2hhaW5jb2RlIS5zeXN0ZW0hLl9saWZlY3ljbGUgPSBzeXN0ZW0ubHNjYztcbiAgICAgIH1cblxuICAgICAgaWYgKHN5c3RlbS5xc2NjICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgUVNDQzogJHtzeXN0ZW0ucXNjY31gKTtcbiAgICAgICAgdGhpcy5jb25maWcuY2hhaW5jb2RlIS5zeXN0ZW0hLl9saWZlY3ljbGUgPSBzeXN0ZW0ucXNjYztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY2hhaW5jb2RlLmxvZ2dpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgbG9nZ2luZyA9IGNoYWluY29kZS5sb2dnaW5nO1xuXG4gICAgICBpZiAobG9nZ2luZy5sZXZlbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIGxvZ2dpbmcgbGV2ZWw6ICR7bG9nZ2luZy5sZXZlbH1gKTtcbiAgICAgICAgdGhpcy5jb25maWcuY2hhaW5jb2RlIS5sb2dnaW5nIS5sZXZlbCA9IGxvZ2dpbmcubGV2ZWw7XG4gICAgICB9XG5cbiAgICAgIGlmIChsb2dnaW5nLnNoaW0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBsb2dnaW5nIHNoaW06ICR7bG9nZ2luZy5zaGltfWApO1xuICAgICAgICB0aGlzLmNvbmZpZy5jaGFpbmNvZGUhLmxvZ2dpbmchLnNoaW0gPSBsb2dnaW5nLnNoaW07XG4gICAgICB9XG5cbiAgICAgIGlmIChsb2dnaW5nLmZvcm1hdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIGxvZ2dpbmcgZm9ybWF0OiAke2xvZ2dpbmcuZm9ybWF0fWApO1xuICAgICAgICB0aGlzLmNvbmZpZy5jaGFpbmNvZGUhLmxvZ2dpbmchLmZvcm1hdCA9IGxvZ2dpbmcuZm9ybWF0O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldFZNT3B0aW9ucyhvcHRpb25zPzogVk1Db25maWcpOiB0aGlzIHtcbiAgICBpZiAob3B0aW9ucyA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdGhpcztcblxuICAgIGlmIChvcHRpb25zLmVuZHBvaW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIFZNIGVuZHBvaW50OiAke29wdGlvbnMuZW5kcG9pbnR9YCk7XG4gICAgICB0aGlzLmNvbmZpZy52bSEuZW5kcG9pbnQgPSBvcHRpb25zLmVuZHBvaW50O1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmRvY2tlciAhPSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGRvY2tlciA9IG9wdGlvbnMuZG9ja2VyO1xuXG4gICAgICBpZiAoZG9ja2VyLnRscyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmIChkb2NrZXIudGxzLmVuYWJsZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIFRMUyBlbmFibGVkOiAke2RvY2tlci50bHMuZW5hYmxlZH1gKTtcbiAgICAgICAgICB0aGlzLmNvbmZpZy52bSEuZG9ja2VyIS50bHMhLmVuYWJsZWQgPSBkb2NrZXIudGxzLmVuYWJsZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZG9ja2VyLnRscy5jYSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWYgKGRvY2tlci50bHMuY2EuZmlsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBUTFMgQ0EgZmlsZTogJHtkb2NrZXIudGxzLmNhLmZpbGV9YCk7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZy52bSEuZG9ja2VyIS50bHMhLmNhIS5maWxlID0gZG9ja2VyLnRscy5jYS5maWxlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkb2NrZXIudGxzLmNlcnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGlmIChkb2NrZXIudGxzLmNlcnQuZmlsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBUTFMgY2VydCBmaWxlOiAke2RvY2tlci50bHMuY2VydC5maWxlfWApO1xuICAgICAgICAgICAgdGhpcy5jb25maWcudm0hLmRvY2tlciEudGxzIS5jZXJ0IS5maWxlID0gZG9ja2VyLnRscy5jZXJ0LmZpbGU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChkb2NrZXIuYXR0YWNoU3Rkb3V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgYXR0YWNoIHN0ZG91dDogJHtkb2NrZXIuYXR0YWNoU3Rkb3V0fWApO1xuICAgICAgICB0aGlzLmNvbmZpZy52bSEuZG9ja2VyIS5hdHRhY2hTdGRvdXQgPSBkb2NrZXIuYXR0YWNoU3Rkb3V0O1xuICAgICAgfVxuXG4gICAgICBpZiAoZG9ja2VyLmhvc3RDb25maWcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCBob3N0Q29uZmlnID0gZG9ja2VyLmhvc3RDb25maWc7XG5cbiAgICAgICAgaWYgKGhvc3RDb25maWcuTmV0d29ya01vZGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIE5ldHdvcmtNb2RlOiAke2hvc3RDb25maWcuTmV0d29ya01vZGV9YCk7XG4gICAgICAgICAgdGhpcy5jb25maWcudm0hLmRvY2tlciEuaG9zdENvbmZpZyEuTmV0d29ya01vZGUgPVxuICAgICAgICAgICAgaG9zdENvbmZpZy5OZXR3b3JrTW9kZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChob3N0Q29uZmlnLkRucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhpcy5sb2cuaW5mbyhgU2V0dGluZyBETlM6ICR7aG9zdENvbmZpZy5EbnMuam9pbihcIiwgXCIpfWApO1xuICAgICAgICAgIHRoaXMuY29uZmlnLnZtIS5kb2NrZXIhLmhvc3RDb25maWchLkRucyA9IGhvc3RDb25maWcuRG5zO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGhvc3RDb25maWcuTG9nQ29uZmlnICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBjb25zdCBsb2dDb25maWcgPSBob3N0Q29uZmlnLkxvZ0NvbmZpZztcblxuICAgICAgICAgIGlmIChsb2dDb25maWcuVHlwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLmxvZy5pbmZvKGBTZXR0aW5nIExvZ1R5cGU6ICR7bG9nQ29uZmlnLlR5cGV9YCk7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZy52bSEuZG9ja2VyIS5ob3N0Q29uZmlnIS5Mb2dDb25maWchLlR5cGUgPVxuICAgICAgICAgICAgICBsb2dDb25maWcuVHlwZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAobG9nQ29uZmlnLkNvbmZpZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBpZiAobG9nQ29uZmlnLkNvbmZpZ1tcIm1heC1zaXplXCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgdGhpcy5sb2cuaW5mbyhcbiAgICAgICAgICAgICAgICBgU2V0dGluZyBMb2cgbWF4U2l6ZTogJHtsb2dDb25maWcuQ29uZmlnW1wibWF4LXNpemVcIl19YFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB0aGlzLmNvbmZpZy52bSEuZG9ja2VyIS5ob3N0Q29uZmlnIS5Mb2dDb25maWchLkNvbmZpZyFbXG4gICAgICAgICAgICAgICAgXCJtYXgtc2l6ZVwiXG4gICAgICAgICAgICAgIF0gPSBsb2dDb25maWcuQ29uZmlnW1wibWF4LXNpemVcIl07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChsb2dDb25maWcuQ29uZmlnW1wibWF4LWZpbGVcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICB0aGlzLmxvZy5pbmZvKFxuICAgICAgICAgICAgICAgIGBTZXR0aW5nIExvZyBtYXhGaWxlOiAke2xvZ0NvbmZpZy5Db25maWdbXCJtYXgtZmlsZVwiXX1gXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIHRoaXMuY29uZmlnLnZtIS5kb2NrZXIhLmhvc3RDb25maWchLkxvZ0NvbmZpZyEuQ29uZmlnIVtcbiAgICAgICAgICAgICAgICBcIm1heC1maWxlXCJcbiAgICAgICAgICAgICAgXSA9IGxvZ0NvbmZpZy5Db25maWdbXCJtYXgtZmlsZVwiXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaG9zdENvbmZpZy5NZW1vcnkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRoaXMubG9nLmluZm8oYFNldHRpbmcgTWVtb3J5OiAke2hvc3RDb25maWcuTWVtb3J5fWApO1xuICAgICAgICAgIHRoaXMuY29uZmlnLnZtIS5kb2NrZXIhLmhvc3RDb25maWchLk1lbW9yeSA9IGhvc3RDb25maWcuTWVtb3J5O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRMZWRnZXJTdGF0ZShzdGF0ZT86IExlZGdlclN0YXRlQ29uZmlnKTogdGhpcyB7XG4gICAgaWYgKHN0YXRlID09PSB1bmRlZmluZWQpIHJldHVybiB0aGlzO1xuXG4gICAgaWYgKHN0YXRlLnN0YXRlRGF0YWJhc2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgc3RhdGUgZGF0YWJhc2U6ICR7c3RhdGUuc3RhdGVEYXRhYmFzZX1gKTtcbiAgICAgIHRoaXMuY29uZmlnLmxlZGdlciEuc3RhdGUhLnN0YXRlRGF0YWJhc2UgPSBzdGF0ZS5zdGF0ZURhdGFiYXNlO1xuICAgIH1cblxuICAgIGlmIChzdGF0ZS50b3RhbFF1ZXJ5TGltaXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgdG90YWwgcXVlcnkgbGltaXQ6ICR7c3RhdGUudG90YWxRdWVyeUxpbWl0fWApO1xuICAgICAgdGhpcy5jb25maWcubGVkZ2VyIS5zdGF0ZSEudG90YWxRdWVyeUxpbWl0ID0gc3RhdGUudG90YWxRdWVyeUxpbWl0O1xuICAgIH1cblxuICAgIGlmIChzdGF0ZS5jb3VjaERCQ29uZmlnICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGNvdWNoREIgPSBzdGF0ZS5jb3VjaERCQ29uZmlnO1xuXG4gICAgICBpZiAoY291Y2hEQi5jb3VjaERCQWRkcmVzcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIENvdWNoREIgYWRkcmVzczogJHtjb3VjaERCLmNvdWNoREJBZGRyZXNzfWApO1xuICAgICAgICB0aGlzLmNvbmZpZy5sZWRnZXIhLnN0YXRlIS5jb3VjaERCQ29uZmlnIS5jb3VjaERCQWRkcmVzcyA9XG4gICAgICAgICAgY291Y2hEQi5jb3VjaERCQWRkcmVzcztcbiAgICAgIH1cblxuICAgICAgaWYgKGNvdWNoREIudXNlcm5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBDb3VjaERCIHVzZXI6ICR7Y291Y2hEQi51c2VybmFtZX1gKTtcbiAgICAgICAgdGhpcy5jb25maWcubGVkZ2VyIS5zdGF0ZSEuY291Y2hEQkNvbmZpZyEudXNlcm5hbWUgPSBjb3VjaERCLnVzZXJuYW1lO1xuICAgICAgfVxuXG4gICAgICBpZiAoY291Y2hEQi5wYXNzd29yZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIENvdWNoREIgcGFzc3dvcmQ6ICR7Y291Y2hEQi5wYXNzd29yZH1gKTtcbiAgICAgICAgdGhpcy5jb25maWcubGVkZ2VyIS5zdGF0ZSEuY291Y2hEQkNvbmZpZyEucGFzc3dvcmQgPSBjb3VjaERCLnBhc3N3b3JkO1xuICAgICAgfVxuXG4gICAgICBpZiAoY291Y2hEQi5tYXhSZXRyaWVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgQ291Y2hEQiBtYXggcmV0cmllczogJHtjb3VjaERCLm1heFJldHJpZXN9YCk7XG4gICAgICAgIHRoaXMuY29uZmlnLmxlZGdlciEuc3RhdGUhLmNvdWNoREJDb25maWchLm1heFJldHJpZXMgPVxuICAgICAgICAgIGNvdWNoREIubWF4UmV0cmllcztcbiAgICAgIH1cblxuICAgICAgaWYgKGNvdWNoREIubWF4UmV0cmllc09uU3RhcnR1cCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKFxuICAgICAgICAgIGBTZXR0aW5nIENvdWNoREIgbWF4IHJldHJpZXMgb24gc3RhcnR1cDogJHtjb3VjaERCLm1heFJldHJpZXNPblN0YXJ0dXB9YFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmNvbmZpZy5sZWRnZXIhLnN0YXRlIS5jb3VjaERCQ29uZmlnIS5tYXhSZXRyaWVzT25TdGFydHVwID1cbiAgICAgICAgICBjb3VjaERCLm1heFJldHJpZXNPblN0YXJ0dXA7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb3VjaERCLnJlcXVlc3RUaW1lb3V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoXG4gICAgICAgICAgYFNldHRpbmcgQ291Y2hEQiByZXF1ZXN0IHRpbWVvdXQ6ICR7Y291Y2hEQi5yZXF1ZXN0VGltZW91dH1gXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuY29uZmlnLmxlZGdlciEuc3RhdGUhLmNvdWNoREJDb25maWchLnJlcXVlc3RUaW1lb3V0ID1cbiAgICAgICAgICBjb3VjaERCLnJlcXVlc3RUaW1lb3V0O1xuICAgICAgfVxuXG4gICAgICBpZiAoY291Y2hEQi5pbnRlcm5hbFF1ZXJ5TGltaXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgICAgICBgU2V0dGluZyBDb3VjaERCIGludGVybmFsIHF1ZXJ5IGxpbWl0OiAke2NvdWNoREIuaW50ZXJuYWxRdWVyeUxpbWl0fWBcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5jb25maWcubGVkZ2VyIS5zdGF0ZSEuY291Y2hEQkNvbmZpZyEuaW50ZXJuYWxRdWVyeUxpbWl0ID1cbiAgICAgICAgICBjb3VjaERCLmludGVybmFsUXVlcnlMaW1pdDtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvdWNoREIubWF4QmF0Y2hVcGRhdGVTaXplICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoXG4gICAgICAgICAgYFNldHRpbmcgQ291Y2hEQiBtYXhpbXVtIGJhdGNoIHVwZGF0ZSBzaXplOiAke2NvdWNoREIubWF4QmF0Y2hVcGRhdGVTaXplfWBcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5jb25maWcubGVkZ2VyIS5zdGF0ZSEuY291Y2hEQkNvbmZpZyEubWF4QmF0Y2hVcGRhdGVTaXplID1cbiAgICAgICAgICBjb3VjaERCLm1heEJhdGNoVXBkYXRlU2l6ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvdWNoREIuY3JlYXRlR2xvYmFsQ2hhbmdlc0RCICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoXG4gICAgICAgICAgYFNldHRpbmcgQ291Y2hEQiBjcmVhdGUgZ2xvYmFsIGNoYW5nZXMgZGF0YWJhc2U6ICR7Y291Y2hEQi5jcmVhdGVHbG9iYWxDaGFuZ2VzREJ9YFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmNvbmZpZy5sZWRnZXIhLnN0YXRlIS5jb3VjaERCQ29uZmlnIS5jcmVhdGVHbG9iYWxDaGFuZ2VzREIgPVxuICAgICAgICAgIGNvdWNoREIuY3JlYXRlR2xvYmFsQ2hhbmdlc0RCO1xuICAgICAgfVxuXG4gICAgICBpZiAoY291Y2hEQi5jYWNoZVNpemUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBDb3VjaERCIGNhY2hlIHNpemU6ICR7Y291Y2hEQi5jYWNoZVNpemV9YCk7XG4gICAgICAgIHRoaXMuY29uZmlnLmxlZGdlciEuc3RhdGUhLmNvdWNoREJDb25maWchLmNhY2hlU2l6ZSA9IGNvdWNoREIuY2FjaGVTaXplO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0TGVnZXJCbG9ja2NoYWluKGJsb2NrY2hhaW4/OiBhbnkpOiB0aGlzIHtcbiAgICBpZiAoYmxvY2tjaGFpbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgICAgYFNldHRpbmcgbGVkZ2VyIGJsb2NrY2hhaW46ICR7SlNPTi5zdHJpbmdpZnkoYmxvY2tjaGFpbil9YFxuICAgICAgKTtcbiAgICAgIHRoaXMuY29uZmlnLmxlZGdlciEuYmxvY2tjaGFpbiA9IGJsb2NrY2hhaW47XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgZW5hYmxlTGVkZ2VySGlzdG9yeURhdGFiYXNlKGVuYWJsZT86IGJvb2xlYW4pOiB0aGlzIHtcbiAgICBpZiAoZW5hYmxlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIGxlZGdlciBoaXN0b3J5IGRhdGFiYXNlIGVuYWJsZWQ6ICR7ZW5hYmxlfWApO1xuICAgICAgdGhpcy5jb25maWcubGVkZ2VyIS5oaXN0b3J5IS5lbmFibGVIaXN0b3J5RGF0YWJhc2UgPSBlbmFibGU7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0TGVkZ2VyUHZ0RGF0YVN0b3JlKHB2dERhdGE/OiBQcml2YXRlRGF0YVN0b3JlQ29uZmlnKSB7XG4gICAgaWYgKHB2dERhdGEgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRoaXM7XG5cbiAgICBpZiAocHZ0RGF0YS5jb2xsRWxnUHJvY0RiQmF0Y2hlc0ludGVydmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKFxuICAgICAgICBgU2V0dGluZyBwcml2YXRlIGRhdGEgY29sbGVjdGlvbiBlbGlnaWJpbGl0eSBwcm9jZXNzIGRhdGFiYXNlIGJhdGNoZXMgaW50ZXJ2YWw6ICR7cHZ0RGF0YS5jb2xsRWxnUHJvY0RiQmF0Y2hlc0ludGVydmFsfWBcbiAgICAgICk7XG4gICAgICB0aGlzLmNvbmZpZy5sZWRnZXIhLnB2dGRhdGFTdG9yZSEuY29sbEVsZ1Byb2NEYkJhdGNoZXNJbnRlcnZhbCA9XG4gICAgICAgIHB2dERhdGEuY29sbEVsZ1Byb2NEYkJhdGNoZXNJbnRlcnZhbDtcbiAgICB9XG5cbiAgICBpZiAocHZ0RGF0YS5jb2xsRWxnUHJvY01heERiQmF0Y2hTaXplICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKFxuICAgICAgICBgU2V0dGluZyBwcml2YXRlIGRhdGEgY29sbGVjdGlvbiBlbGlnaWJpbGl0eSBwcm9jZXNzIG1heGltdW0gZGF0YWJhc2UgYmF0Y2ggc2l6ZTogJHtwdnREYXRhLmNvbGxFbGdQcm9jTWF4RGJCYXRjaFNpemV9YFxuICAgICAgKTtcbiAgICAgIHRoaXMuY29uZmlnLmxlZGdlciEucHZ0ZGF0YVN0b3JlIS5jb2xsRWxnUHJvY01heERiQmF0Y2hTaXplID1cbiAgICAgICAgcHZ0RGF0YS5jb2xsRWxnUHJvY01heERiQmF0Y2hTaXplO1xuICAgIH1cblxuICAgIGlmIChwdnREYXRhLmRlcHJpb3JpdGl6ZWREYXRhUmVjb25jaWxlckludGVydmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKFxuICAgICAgICBgU2V0dGluZyBkZXByaW9yaXRpemVkIGRhdGEgcmVjb25jaWxpYXRpb24gaW50ZXJ2YWw6ICR7cHZ0RGF0YS5kZXByaW9yaXRpemVkRGF0YVJlY29uY2lsZXJJbnRlcnZhbH1gXG4gICAgICApO1xuICAgICAgdGhpcy5jb25maWcubGVkZ2VyIS5wdnRkYXRhU3RvcmUhLmRlcHJpb3JpdGl6ZWREYXRhUmVjb25jaWxlckludGVydmFsID1cbiAgICAgICAgcHZ0RGF0YS5kZXByaW9yaXRpemVkRGF0YVJlY29uY2lsZXJJbnRlcnZhbDtcbiAgICB9XG5cbiAgICBpZiAocHZ0RGF0YS5wdXJnZUludGVydmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIGxlZGdlciBwdXJnZSBpbnRlcnZhbDogJHtwdnREYXRhLnB1cmdlSW50ZXJ2YWx9YCk7XG4gICAgICB0aGlzLmNvbmZpZy5sZWRnZXIhLnB2dGRhdGFTdG9yZSEucHVyZ2VJbnRlcnZhbCA9IHB2dERhdGEucHVyZ2VJbnRlcnZhbDtcbiAgICB9XG5cbiAgICBpZiAocHZ0RGF0YS5wdXJnZWRLZXlBdWRpdExvZ2dpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoXG4gICAgICAgIGBTZXR0aW5nIHB1cmdlZCBrZXkgYXVkaXQgbG9nZ2luZzogJHtwdnREYXRhLnB1cmdlZEtleUF1ZGl0TG9nZ2luZ31gXG4gICAgICApO1xuICAgICAgdGhpcy5jb25maWcubGVkZ2VyIS5wdnRkYXRhU3RvcmUhLnB1cmdlZEtleUF1ZGl0TG9nZ2luZyA9XG4gICAgICAgIHB2dERhdGEucHVyZ2VkS2V5QXVkaXRMb2dnaW5nO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0TGVkZ2VyU25hcHNob3RzUm9vdERpcihyb290RGlyPzogc3RyaW5nKTogdGhpcyB7XG4gICAgaWYgKHJvb3REaXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgbGVkZ2VyIHNuYXBzaG90cyByb290IGRpcmVjdG9yeTogJHtyb290RGlyfWApO1xuICAgICAgdGhpcy5jb25maWcubGVkZ2VyIS5zbmFwc2hvdHMhLnJvb3REaXIgPSByb290RGlyO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldE9wZXJhdGlvbnMob3BlcmF0aW9ucz86IE9wZXJhdGlvbnNDb25maWcpOiB0aGlzIHtcbiAgICBpZiAob3BlcmF0aW9ucyA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdGhpcztcblxuICAgIGlmIChvcGVyYXRpb25zLmxpc3RlbkFkZHJlc3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoXG4gICAgICAgIGBTZXR0aW5nIG9wZXJhdGlvbnMgbGlzdGVuIGFkZHJlc3M6ICR7b3BlcmF0aW9ucy5saXN0ZW5BZGRyZXNzfWBcbiAgICAgICk7XG4gICAgICB0aGlzLmNvbmZpZy5vcGVyYXRpb25zIS5saXN0ZW5BZGRyZXNzID0gb3BlcmF0aW9ucy5saXN0ZW5BZGRyZXNzO1xuICAgIH1cbiAgICBpZiAob3BlcmF0aW9ucy50bHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKG9wZXJhdGlvbnMudGxzLmVuYWJsZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgICAgICBgU2V0dGluZyBvcGVyYXRpb25zIFRMUyBlbmFibGVkOiAke29wZXJhdGlvbnMudGxzLmVuYWJsZWR9YFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmNvbmZpZy5vcGVyYXRpb25zIS50bHMhLmVuYWJsZWQgPSBvcGVyYXRpb25zLnRscy5lbmFibGVkO1xuICAgICAgfVxuICAgICAgaWYgKG9wZXJhdGlvbnMudGxzLmNlcnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAob3BlcmF0aW9ucy50bHMuY2VydC5maWxlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgICAgICAgIGBTZXR0aW5nIG9wZXJhdGlvbnMgVExTIGNlcnQgZmlsZTogJHtvcGVyYXRpb25zLnRscy5jZXJ0LmZpbGV9YFxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5jb25maWcub3BlcmF0aW9ucyEudGxzIS5jZXJ0IS5maWxlID0gb3BlcmF0aW9ucy50bHMuY2VydC5maWxlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAob3BlcmF0aW9ucy50bHMua2V5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKG9wZXJhdGlvbnMudGxzLmtleS5maWxlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgICAgICAgIGBTZXR0aW5nIG9wZXJhdGlvbnMgVExTIGtleSBmaWxlOiAke29wZXJhdGlvbnMudGxzLmtleS5maWxlfWBcbiAgICAgICAgICApO1xuICAgICAgICAgIHRoaXMuY29uZmlnLm9wZXJhdGlvbnMhLnRscyEua2V5IS5maWxlID0gb3BlcmF0aW9ucy50bHMua2V5LmZpbGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChvcGVyYXRpb25zLnRscy5jbGllbnRBdXRoUmVxdWlyZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgICAgICBgU2V0dGluZyBvcGVyYXRpb25zIFRMUyBjbGllbnQgYXV0aGVudGljYXRpb24gcmVxdWlyZWQ6ICR7b3BlcmF0aW9ucy50bHMuY2xpZW50QXV0aFJlcXVpcmVkfWBcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5jb25maWcub3BlcmF0aW9ucyEudGxzIS5jbGllbnRBdXRoUmVxdWlyZWQgPVxuICAgICAgICAgIG9wZXJhdGlvbnMudGxzLmNsaWVudEF1dGhSZXF1aXJlZDtcbiAgICAgIH1cbiAgICAgIGlmIChvcGVyYXRpb25zLnRscy5jbGllbnRSb290Q0FzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKG9wZXJhdGlvbnMudGxzLmNsaWVudFJvb3RDQXMuZmlsZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRoaXMubG9nLmRlYnVnKFxuICAgICAgICAgICAgYFNldHRpbmcgb3BlcmF0aW9ucyBUTFMgY2xpZW50IHJvb3QgQ0FzIGZpbGVzOiAke29wZXJhdGlvbnMudGxzLmNsaWVudFJvb3RDQXMuZmlsZXMuam9pbihcbiAgICAgICAgICAgICAgXCIsIFwiXG4gICAgICAgICAgICApfWBcbiAgICAgICAgICApO1xuICAgICAgICAgIHRoaXMuY29uZmlnLm9wZXJhdGlvbnMhLnRscyEuY2xpZW50Um9vdENBcyEuZmlsZXMgPVxuICAgICAgICAgICAgb3BlcmF0aW9ucy50bHMuY2xpZW50Um9vdENBcy5maWxlcztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldE1ldHJpY3MobWV0cmljcz86IE1ldHJpY3NDb25maWcpOiB0aGlzIHtcbiAgICBpZiAobWV0cmljcyA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdGhpcztcblxuICAgIGlmIChtZXRyaWNzLnByb3ZpZGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIG1ldHJpY3MgcHJvdmlkZXI6ICR7bWV0cmljcy5wcm92aWRlcn1gKTtcbiAgICAgIHRoaXMuY29uZmlnLm1ldHJpY3MhLnByb3ZpZGVyID0gbWV0cmljcy5wcm92aWRlcjtcbiAgICB9XG5cbiAgICBpZiAobWV0cmljcy5zdGF0c2QgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKG1ldHJpY3Muc3RhdHNkLm5ldHdvcmsgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgICAgICBgU2V0dGluZyBtZXRyaWNzIHN0YXRzZCBuZXR3b3JrOiAke21ldHJpY3Muc3RhdHNkLm5ldHdvcmt9YFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmNvbmZpZy5tZXRyaWNzIS5zdGF0c2QhLm5ldHdvcmsgPSBtZXRyaWNzLnN0YXRzZC5uZXR3b3JrO1xuICAgICAgfVxuICAgICAgaWYgKG1ldHJpY3Muc3RhdHNkLmFkZHJlc3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgICAgICBgU2V0dGluZyBtZXRyaWNzIHN0YXRzZCBhZGRyZXNzOiAke21ldHJpY3Muc3RhdHNkLmFkZHJlc3N9YFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmNvbmZpZy5tZXRyaWNzIS5zdGF0c2QhLmFkZHJlc3MgPSBtZXRyaWNzLnN0YXRzZC5hZGRyZXNzO1xuICAgICAgfVxuICAgICAgaWYgKG1ldHJpY3Muc3RhdHNkLndyaXRlSW50ZXJ2YWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgICAgICBgU2V0dGluZyBtZXRyaWNzIHN0YXRzZCB3cml0ZSBpbnRlcnZhbDogJHttZXRyaWNzLnN0YXRzZC53cml0ZUludGVydmFsfWBcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5jb25maWcubWV0cmljcyEuc3RhdHNkIS53cml0ZUludGVydmFsID1cbiAgICAgICAgICBtZXRyaWNzLnN0YXRzZC53cml0ZUludGVydmFsO1xuICAgICAgfVxuICAgICAgaWYgKG1ldHJpY3Muc3RhdHNkLnByZWZpeCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKFxuICAgICAgICAgIGBTZXR0aW5nIG1ldHJpY3Mgc3RhdHNkIHByZWZpeDogJHttZXRyaWNzLnN0YXRzZC5wcmVmaXh9YFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmNvbmZpZy5tZXRyaWNzIS5zdGF0c2QhLnByZWZpeCA9IG1ldHJpY3Muc3RhdHNkLnByZWZpeDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNhdmVzIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24gdG8gYSBmaWxlLlxuICAgKiBAc3VtbWFyeSBXcml0ZXMgdGhlIGN1cnJlbnQgRmFicmljIENBIFNlcnZlciBjb25maWd1cmF0aW9uIHRvIGEgWUFNTCBmaWxlIGF0IHRoZSBzcGVjaWZpZWQgcGF0aC4gSWYgdGhlIGRpcmVjdG9yeSBkb2Vzbid0IGV4aXN0LCBpdCB3aWxsIGJlIGNyZWF0ZWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjcGF0aCAtIFRoZSBwYXRoIHdoZXJlIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgc2hvdWxkIGJlIHNhdmVkLlxuICAgKiBAcmV0dXJuIHt0aGlzfSBUaGUgY3VycmVudCBpbnN0YW5jZSBvZiB0aGUgYnVpbGRlciBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgKiBAZXhhbXBsZVxuICAgKiBjb25zdCBidWlsZGVyID0gbmV3IEZhYnJpY0NBU2VydmVyQ29tbWFuZEJ1aWxkZXIoKTtcbiAgICogYnVpbGRlci5zYXZlKCcvcGF0aC90by9jb25maWcvZmFicmljLWNhLXNlcnZlci55YW1sJyk7XG4gICAqXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICAgKiAgIHBhcnRpY2lwYW50IEJ1aWxkZXIgYXMgRmFicmljQ0FTZXJ2ZXJDb21tYW5kQnVpbGRlclxuICAgKiAgIHBhcnRpY2lwYW50IEZpbGVTeXN0ZW0gYXMgRmlsZSBTeXN0ZW1cbiAgICogICBDbGllbnQtPj5CdWlsZGVyOiBzYXZlQ29uZmlnKCcvcGF0aC90by9jb25maWcvZmFicmljLWNhLXNlcnZlci55YW1sJylcbiAgICogICBCdWlsZGVyLT4+QnVpbGRlcjogQ2hlY2sgaWYgY3BhdGggaXMgZGVmaW5lZFxuICAgKiAgIGFsdCBjcGF0aCBpcyBkZWZpbmVkXG4gICAqICAgICBCdWlsZGVyLT4+RmlsZVN5c3RlbTogQ2hlY2sgaWYgZGlyZWN0b3J5IGV4aXN0c1xuICAgKiAgICAgYWx0IERpcmVjdG9yeSBkb2Vzbid0IGV4aXN0XG4gICAqICAgICAgIEJ1aWxkZXItPj5GaWxlU3lzdGVtOiBDcmVhdGUgZGlyZWN0b3J5XG4gICAqICAgICBlbmRcbiAgICogICAgIEJ1aWxkZXItPj5CdWlsZGVyOiBMb2cgZGVidWcgbWVzc2FnZVxuICAgKiAgICAgQnVpbGRlci0+PkZpbGVTeXN0ZW06IFdyaXRlIFlBTUwgY29uZmlndXJhdGlvbiB0byBmaWxlXG4gICAqICAgZW5kXG4gICAqICAgQnVpbGRlci0tPj5DbGllbnQ6IFJldHVybiB0aGlzXG4gICAqL1xuICBzYXZlKGNwYXRoPzogc3RyaW5nKTogdGhpcyB7XG4gICAgaWYgKGNwYXRoID09PSB1bmRlZmluZWQpIHJldHVybiB0aGlzO1xuXG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihjcGF0aCkpKVxuICAgICAgZnMubWtkaXJTeW5jKHBhdGguam9pbihjcGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gICAgaWYgKCFjcGF0aC5lbmRzV2l0aChcIi55YW1sXCIpKSBjcGF0aCA9IHBhdGguam9pbihjcGF0aCwgXCJjb3JlLnlhbWxcIik7XG5cbiAgICB0aGlzLmxvZy5kZWJ1ZyhgV3JpdGluZyBjb25maWd1cmF0aW9uIHRvICR7Y3BhdGh9YCk7XG4gICAgdGhpcy5sb2cuZGVidWcoYENvbmZpZyBmaWxlOiAke0pTT04uc3RyaW5naWZ5KHRoaXMuY29uZmlnLCBudWxsLCAyKX1gKTtcbiAgICB3cml0ZUZpbGVZYW1sKGNwYXRoLCB0aGlzLmNvbmZpZyk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuIl19