@awlsring/cdk8s-valheim
Version:
A package that vends a Valheim server chart.
378 lines • 62.7 kB
JavaScript
"use strict";
var _a;
Object.defineProperty(exports, "__esModule", { value: true });
exports.ValheimChart = void 0;
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
const cdk8s_1 = require("cdk8s");
const cdk8s_plus_26_1 = require("cdk8s-plus-26");
/**
* A chart to deploy a Valheim server
* Uses the container by @lloesche
* @see https://github.com/lloesche/valheim-server-docker
*/
class ValheimChart extends cdk8s_1.Chart {
constructor(scope, name, props) {
super(scope, name, props);
const serverVol = this.formServerPersistance(props?.persistence?.server);
const configVol = this.formConfigPersistance(props?.persistence?.config);
const ports = this.formPortRecords(props);
const deployment = new cdk8s_plus_26_1.Deployment(this, 'deployment', {
replicas: 1,
strategy: cdk8s_plus_26_1.DeploymentStrategy.recreate(),
containers: [
{
image: this.formImage(props?.imageTag),
ports: Object.keys(ports).map((key) => ports[key]),
envVariables: this.formEnvironment(props),
volumeMounts: [
{
path: '/config',
volume: configVol,
},
{
path: '/opt/valheim',
volume: serverVol,
},
],
securityContext: {
ensureNonRoot: false,
readOnlyRootFilesystem: props?.security?.readOnlyRootFilesystem ?? false,
privileged: props?.security?.privileged,
allowPrivilegeEscalation: props?.security?.allowPrivilegeEscalation,
group: props?.security?.group,
user: props?.security?.user,
},
resources: {
memory: props?.resourceLimits?.memory ?? {
request: cdk8s_1.Size.gibibytes(4),
},
cpu: props?.resourceLimits?.cpu ?? {
request: cdk8s_plus_26_1.Cpu.millis(2000),
},
},
},
],
volumes: [configVol, serverVol],
});
new cdk8s_plus_26_1.Service(this, 'service', {
type: props?.server?.serviceType ?? cdk8s_plus_26_1.ServiceType.LOAD_BALANCER,
selector: deployment,
ports: [
{
name: ports.game.name,
port: ports.game.number,
targetPort: ports.game.number,
protocol: cdk8s_plus_26_1.Protocol.UDP,
},
{
name: ports.query.name,
port: ports.query.number,
targetPort: ports.query.number,
protocol: cdk8s_plus_26_1.Protocol.UDP,
},
],
});
if (props?.supervisorHttp?.enabled) {
this.formService(deployment, ports.supervisor, props?.supervisorHttp.serviceType);
}
if (props?.statusHttp?.enabled) {
this.formService(deployment, ports.status, props?.statusHttp.serviceType);
}
}
formImage(tag) {
return `ghcr.io/lloesche/valheim-server:${tag ?? 'latest'}`;
}
formPortRecords(props) {
const gamePort = props?.server?.port ?? 2456;
const queryPort = gamePort + 1;
let portRecords = {
game: {
number: gamePort,
name: 'server',
protocol: cdk8s_plus_26_1.Protocol.UDP,
},
query: {
number: queryPort,
name: 'query',
protocol: cdk8s_plus_26_1.Protocol.UDP,
},
};
if (props?.supervisorHttp?.enabled) {
portRecords.supervisor = {
number: props.supervisorHttp.port ?? 9001,
name: 'supervisor',
protocol: cdk8s_plus_26_1.Protocol.TCP,
};
}
if (props?.statusHttp?.enabled) {
portRecords.status = {
number: props.statusHttp.port ?? 80,
name: 'status',
protocol: cdk8s_plus_26_1.Protocol.TCP,
};
}
return portRecords;
}
formService(scope, port, type) {
let name = port.name;
return new cdk8s_plus_26_1.Service(this, `${name}-service`, {
type: type ?? cdk8s_plus_26_1.ServiceType.CLUSTER_IP,
selector: scope,
ports: [
{
port: port.number,
targetPort: port.number,
protocol: port.protocol,
},
],
});
}
formHostVolume(name, path) {
return cdk8s_plus_26_1.Volume.fromHostPath(this, `${name}-volume`, path, {
path: `/data/valheim/${path}`,
type: cdk8s_plus_26_1.HostPathVolumeType.DIRECTORY_OR_CREATE,
});
}
formPersistanceVolume(name, props) {
let pvc = new cdk8s_plus_26_1.PersistentVolumeClaim(this, `${name}-pvc`, props);
return cdk8s_plus_26_1.Volume.fromPersistentVolumeClaim(this, `${name}-volume`, pvc);
}
formServerPersistance(props) {
let volume;
if (props) {
let pvcProps = {
storageClassName: props?.storageClass ?? 'local-path',
accessModes: props?.accessModes ?? [cdk8s_plus_26_1.PersistentVolumeAccessMode.READ_WRITE_ONCE],
storage: props?.storage ?? cdk8s_1.Size.gibibytes(10),
};
volume = this.formPersistanceVolume('server', pvcProps);
}
else {
volume = this.formHostVolume('server', 'valheim-server');
}
return volume;
}
formConfigPersistance(props) {
let volume;
if (props) {
let pvcProps = {
storageClassName: props.storageClass,
accessModes: props?.accessModes ?? [cdk8s_plus_26_1.PersistentVolumeAccessMode.READ_WRITE_ONCE],
storage: props?.storage ?? cdk8s_1.Size.gibibytes(1),
};
volume = this.formPersistanceVolume('config', pvcProps);
}
else {
volume = this.formHostVolume('config', 'valheim-config');
}
return volume;
}
formPasswordEnvValue(name, props) {
let envValue;
if (props.secret) {
const secret = cdk8s_plus_26_1.Secret.fromSecretName(this, `${name}-password`, props.secret);
envValue = cdk8s_plus_26_1.EnvValue.fromSecretValue({
secret: secret,
key: 'password',
});
}
else if (props.raw) {
envValue = cdk8s_plus_26_1.EnvValue.fromValue(props.raw);
}
else {
throw new Error('Invalid password configuration');
}
return envValue;
}
formEnvironment(props) {
let env = {};
let launchArgs = '';
if (props?.server?.launchArgs) {
launchArgs = props.server.launchArgs;
}
if (props?.server?.crossplay) {
launchArgs += ' -crossplay';
}
if (launchArgs !== '') {
env.SERVER_ARGS = cdk8s_plus_26_1.EnvValue.fromValue(launchArgs);
}
if (props?.server) {
if (props.server.port) {
env.SERVER_PORT = cdk8s_plus_26_1.EnvValue.fromValue(props.server.port.toString());
}
if (props.server.name) {
env.SERVER_NAME = cdk8s_plus_26_1.EnvValue.fromValue(props.server.name);
}
if (props.server.worldName) {
env.WORLD_NAME = cdk8s_plus_26_1.EnvValue.fromValue(props.server.worldName);
}
if (props.server.password) {
env.SERVER_PASS = this.formPasswordEnvValue('server', props.server.password);
}
if (props.server.public !== undefined) {
let isPublic = 'false';
if (props.server.public) {
isPublic = 'true';
}
env.SERVER_PUBLIC = cdk8s_plus_26_1.EnvValue.fromValue(isPublic);
}
if (props.server.updateCron) {
env.UPDATE_CRON = cdk8s_plus_26_1.EnvValue.fromValue(props.server.updateCron);
}
if (props.server.idleDatagramWindow) {
env.IDLE_DATAGRAM_WINDOW = cdk8s_plus_26_1.EnvValue.fromValue(props.server.idleDatagramWindow.toString());
}
if (props.server.idleDatagramMaxCount) {
env.IDLE_DATAGRAM_MAX_COUNT = cdk8s_plus_26_1.EnvValue.fromValue(props.server.idleDatagramMaxCount.toString());
}
if (props.server.updateWhenIdle !== undefined) {
let updateWhenIdle = 'false';
if (props.server.updateWhenIdle) {
updateWhenIdle = 'true';
}
env.UPDATE_WHEN_IDLE = cdk8s_plus_26_1.EnvValue.fromValue(updateWhenIdle);
}
if (props.server.restartIfIdle !== undefined) {
let restartIfIdle = 'false';
if (props.server.restartIfIdle) {
restartIfIdle = 'true';
}
env.RESTART_IF_IDLE = cdk8s_plus_26_1.EnvValue.fromValue(restartIfIdle);
}
if (props.server.timezone) {
env.TZ = cdk8s_plus_26_1.EnvValue.fromValue(props.server.timezone);
}
if (props.server.adminList) {
env.ADMINLIST_IDS = cdk8s_plus_26_1.EnvValue.fromValue(props.server.adminList.join(' '));
}
if (props.server.blockList) {
env.BANNEDLIST_IDS = cdk8s_plus_26_1.EnvValue.fromValue(props.server.blockList.join(' '));
}
if (props.server.allowList) {
env.PERMITTEDLIST_IDS = cdk8s_plus_26_1.EnvValue.fromValue(props.server.allowList.join(' '));
}
if (props.server.publicBeta !== undefined) {
let publicBeta = 'false';
if (props.server.publicBeta) {
publicBeta = 'true';
}
env.PUBLIC_BETA = cdk8s_plus_26_1.EnvValue.fromValue(publicBeta);
}
if (props.server.steamCmdArgs) {
env.STEAMCMD_ARGS = cdk8s_plus_26_1.EnvValue.fromValue(props.server.steamCmdArgs);
}
if (props.server.valheimPlus) {
if (props.server.valheimPlus.enabled !== undefined) {
let valheimPlusEnabled = 'false';
if (props.server.valheimPlus.enabled) {
valheimPlusEnabled = 'true';
}
env.VALHEIM_PLUS = cdk8s_plus_26_1.EnvValue.fromValue(valheimPlusEnabled);
}
if (props.server.valheimPlus.release) {
env.VALHEIM_PLUS_RELEASE = cdk8s_plus_26_1.EnvValue.fromValue(props.server.valheimPlus.release);
}
}
}
if (props?.backup) {
if (props.backup.enabled !== undefined) {
let doBackups = 'false';
if (props.backup.enabled) {
doBackups = 'true';
}
env.BACKUPS_ENABLED = cdk8s_plus_26_1.EnvValue.fromValue(doBackups);
}
if (props.backup.scheduleCron) {
env.BACKUPS_CRON = cdk8s_plus_26_1.EnvValue.fromValue(props.backup.scheduleCron);
}
if (props.backup.directory) {
env.BACKUPS_DIRECTORY = cdk8s_plus_26_1.EnvValue.fromValue(props.backup.directory);
}
if (props.backup.retentionAge) {
env.BACKUPS_MAX_AGE = cdk8s_plus_26_1.EnvValue.fromValue(props.backup.retentionAge.toString());
}
if (props.backup.maxBackups) {
env.BACKUPS_MAX_COUNT = cdk8s_plus_26_1.EnvValue.fromValue(props.backup.maxBackups.toString());
}
if (props.backup.performIfIdle) {
env.BACKUPS_IF_IDLE = cdk8s_plus_26_1.EnvValue.fromValue(props.backup.performIfIdle.toString());
}
if (props.backup.idleGracePeriod) {
env.BACKUPS_IDLE_GRACE_PERIOD = cdk8s_plus_26_1.EnvValue.fromValue(props.backup.idleGracePeriod.toString());
}
if (props.backup.zip !== undefined) {
let zipBackups = 'false';
if (props.backup.zip) {
zipBackups = 'true';
}
env.BACKUPS_ZIP = cdk8s_plus_26_1.EnvValue.fromValue(zipBackups);
}
if (props.backup.permissionUmask) {
env.PERMISSIONS_UMASK = cdk8s_plus_26_1.EnvValue.fromValue(props.backup.permissionUmask.toString());
}
}
if (props?.supervisorHttp) {
if (props.supervisorHttp.enabled !== undefined) {
let supervisorHttpEnabled = 'false';
if (props.supervisorHttp.enabled) {
supervisorHttpEnabled = 'true';
}
env.SUPERVISOR_HTTP = cdk8s_plus_26_1.EnvValue.fromValue(supervisorHttpEnabled);
}
if (props.supervisorHttp.port) {
env.SUPERVISOR_HTTP_PORT = cdk8s_plus_26_1.EnvValue.fromValue(props.supervisorHttp.port.toString());
}
if (props.supervisorHttp.username) {
env.SUPERVISOR_HTTP_USER = cdk8s_plus_26_1.EnvValue.fromValue(props.supervisorHttp.username);
}
if (props.supervisorHttp.password) {
env.SUPERVISOR_HTTP_PASS = this.formPasswordEnvValue('supervisor', props.supervisorHttp.password);
;
}
}
if (props?.statusHttp) {
if (props.statusHttp.enabled !== undefined) {
let statusHttpEnabled = 'false';
if (props.statusHttp.enabled) {
statusHttpEnabled = 'true';
}
env.STATUS_HTTP = cdk8s_plus_26_1.EnvValue.fromValue(statusHttpEnabled);
}
if (props.statusHttp.port) {
env.STATUS_HTTP_PORT = cdk8s_plus_26_1.EnvValue.fromValue(props.statusHttp.port.toString());
}
if (props.statusHttp.configPath) {
env.STATUS_HTTP_CONF = cdk8s_plus_26_1.EnvValue.fromValue(props.statusHttp.configPath);
}
if (props.statusHttp.htdocLocation) {
env.STATUS_HTTP_HTDOCS = cdk8s_plus_26_1.EnvValue.fromValue(props.statusHttp.htdocLocation);
}
}
if (props?.sysLog) {
if (props.sysLog.remoteHost) {
env.SYSLOG_HOST = cdk8s_plus_26_1.EnvValue.fromValue(props.sysLog.remoteHost);
}
if (props.sysLog.remotePort) {
env.SYSLOG_PORT = cdk8s_plus_26_1.EnvValue.fromValue(props.sysLog.remotePort.toString());
}
if (props.sysLog.logLocal !== undefined) {
let logLocal = 'false';
if (props.sysLog.logLocal) {
logLocal = 'true';
}
env.SYSLOG_LOCAL = cdk8s_plus_26_1.EnvValue.fromValue(logLocal);
}
}
if (props?.security?.user) {
env.PGID = cdk8s_plus_26_1.EnvValue.fromValue(props.security?.user.toString());
}
if (props?.security?.group) {
env.PUID = cdk8s_plus_26_1.EnvValue.fromValue(props.security?.group.toString());
}
return env;
}
}
exports.ValheimChart = ValheimChart;
_a = JSII_RTTI_SYMBOL_1;
ValheimChart[_a] = { fqn: "@awlsring/cdk8s-valheim.ValheimChart", version: "0.0.299" };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxpQ0FBZ0Q7QUFDaEQsaURBQStRO0FBd1YvUTs7OztHQUlHO0FBQ0gsTUFBYSxZQUFhLFNBQVEsYUFBSztJQUNyQyxZQUFZLEtBQWdCLEVBQUUsSUFBWSxFQUFFLEtBQXlCO1FBQ25FLEtBQUssQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRTFCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLEVBQUUsV0FBVyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3pFLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLEVBQUUsV0FBVyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBRXpFLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDMUMsTUFBTSxVQUFVLEdBQUcsSUFBSSwwQkFBVSxDQUFDLElBQUksRUFBRSxZQUFZLEVBQUU7WUFDcEQsUUFBUSxFQUFFLENBQUM7WUFDWCxRQUFRLEVBQUUsa0NBQWtCLENBQUMsUUFBUSxFQUFFO1lBQ3ZDLFVBQVUsRUFBRTtnQkFDVjtvQkFDRSxLQUFLLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDO29CQUN0QyxLQUFLLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDbEQsWUFBWSxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDO29CQUN6QyxZQUFZLEVBQUU7d0JBQ1o7NEJBQ0UsSUFBSSxFQUFFLFNBQVM7NEJBQ2YsTUFBTSxFQUFFLFNBQVM7eUJBQ2xCO3dCQUNE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LE1BQU0sQ0FBQyxVQUFVLEVBQUU7Z0JBQzNCLEdBQUcsQ0FBQyxXQUFXLEdBQUcsd0JBQVEsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQzthQUMxRTtZQUNELElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEtBQUssU0FBUyxFQUFFO2dCQUN2QyxJQUFJLFFBQVEsR0FBRyxPQUFPLENBQUM7Z0JBQ3ZCLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUU7b0JBQ3pCLFFBQVEsR0FBRyxNQUFNLENBQUM7aUJBQ25CO2dCQUNELEdBQUcsQ0FBQyxZQUFZLEdBQUcsd0JBQVEsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7YUFDakQ7U0FDRjtRQUVELElBQUksS0FBSyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUU7WUFDekIsR0FBRyxDQUFDLElBQUksR0FBRyx3QkFBUSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1NBQ2hFO1FBQ0QsSUFBSSxLQUFLLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRTtZQUMxQixHQUFHLENBQUMsSUFBSSxHQUFHLHdCQUFRLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7U0FDakU7UUFFRCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7O0FBaFlILG9DQWlZQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYXJ0LCBDaGFydFByb3BzLCBTaXplIH0gZnJvbSAnY2RrOHMnO1xuaW1wb3J0IHsgQ29udGFpbmVyUG9ydCwgQ3B1LCBDcHVSZXNvdXJjZXMsIERlcGxveW1lbnQsIERlcGxveW1lbnRTdHJhdGVneSwgRW52VmFsdWUsIEhvc3RQYXRoVm9sdW1lVHlwZSwgTWVtb3J5UmVzb3VyY2VzLCBQZXJzaXN0ZW50Vm9sdW1lQWNjZXNzTW9kZSwgUGVyc2lzdGVudFZvbHVtZUNsYWltLCBQZXJzaXN0ZW50Vm9sdW1lQ2xhaW1Qcm9wcywgUHJvdG9jb2wsIFNlY3JldCwgU2VydmljZSwgU2VydmljZVR5cGUsIFZvbHVtZSB9IGZyb20gJ2NkazhzLXBsdXMtMjYnO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5cbi8qKlxuICogUHJvcHMgZm9yIGNvbmZpZ3VyaW5nIHRoZSB2YWxoZWltIHNlcnZlciBiYWNrdXBzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFja3VwUHJvcHMge1xuICAvKipcbiAgICogU2hvdWxkIGJhY2t1cHMgYmUgZW5hYmxlZFxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBlbmFibGVkOiBib29sZWFuO1xuICAvKipcbiAgICogVGhlIGNyb24gc2NoZWR1bGUgZm9yIHRoZSBiYWNrdXAgam9iXG4gICAqIEBkZWZhdWx0IDAgKiAqICogKlxuICAgKi9cbiAgcmVhZG9ubHkgc2NoZWR1bGVDcm9uPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGRpcmVjdG9yeSB0byBzdG9yZSBiYWNrdXBzXG4gICAqIEBkZWZhdWx0IC9jb25maWcvYmFja3Vwc1xuICAgKi9cbiAgcmVhZG9ubHkgZGlyZWN0b3J5Pzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHJldGVudGlvbiBhZ2UgZm9yIGJhY2t1cHNcbiAgICogQGRlZmF1bHQgM1xuICAgKi9cbiAgcmVhZG9ubHkgcmV0ZW50aW9uQWdlPzogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIHJldGVudGlvbiBjb3VudCBmb3IgYmFja3Vwc1xuICAgKiBAZGVmYXVsdCB1bmxpbWl0ZWRcbiAgICovXG4gIHJlYWRvbmx5IG1heEJhY2t1cHM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBPbmx5IGJhY2t1cCBpZiBzZXJ2ZXIgaWRsZVxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBwZXJmb3JtSWZJZGxlPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFRoZSBncmFjZSBwZXJpb2QgZm9yIHRoZSBzZXJ2ZXIgdG8gYmUgaWRsZVxuICAgKiBAZGVmYXVsdCAzNjAwc1xuICAgKi9cbiAgcmVhZG9ubHkgaWRsZUdyYWNlUGVyaW9kPzogbnVtYmVyO1xuICAvKipcbiAgICogU2hvdWxkIHRoZSBiYWNrdXBzIGJlIHppcHBlZFxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSB6aXA/OiBib29sZWFuO1xuICAvKipcbiAgICogUGVybWlzc2lvbiBtYXNrIGZvciB0aGUgYmFja3VwIGRpcmVjdG9yeVxuICAgKi9cbiAgcmVhZG9ubHkgcGVybWlzc2lvblVtYXNrPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFByb3BzIGZvciBjb25maWd1cmluZyB2YWxoZWltIHBsdXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWYWxoZWltUGx1c1Byb3BzIHtcbiAgLyoqXG4gICAqIFNob3VsZCB2YWxoZWltIHBsdXMgYmUgZW5hYmxlZFxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlZDogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFRoZSB2ZXJzaW9uIG9mIHZhbGhlaW0gcGx1cyB0byB1c2VcbiAgICogQGRlZmF1bHQgbGF0ZXN0XG4gICAqL1xuICByZWFkb25seSByZWxlYXNlPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFByb3BzIGZvciBjb25maWd1cmluZyB0aGUgc3VwZXJ2aXNvclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN1cGVydmlzb3JIdHRwUHJvcHMge1xuICAvKipcbiAgICogU2hvdWxkIHRoZSBzdXBlcnZpc29yIGh0dHAgc2VydmVyIGJlIGVuYWJsZWRcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZWQ6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBUaGUgcG9ydCB0aGUgc3VwZXJ2aXNvciBodHRwIHNlcnZlciBydW5zIG9uXG4gICAqIEBkZWZhdWx0IDkwMDFcbiAgICovXG4gIHJlYWRvbmx5IHBvcnQ/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgc3VwZXJ2aXNvciB1c2VybmFtZVxuICAgKiBAZGVmYXVsdCBhZG1pblxuICAgKi9cbiAgcmVhZG9ubHkgdXNlcm5hbWU/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgc3VwZXJ2aXNvciBwYXNzd29yZFxuICAgKi9cbiAgcmVhZG9ubHkgcGFzc3dvcmQ6IFBhc3N3b3JkUHJvcHM7XG4gIC8qKlxuICAgKiBUaGUgc2VydmljZSB0eXBlIGZvciB0aGUgc3VwZXJ2aXNvciBodHRwIHNlcnZlclxuICAgKiBAZGVmYXVsdCBTZXJ2aWNlVHlwZS5DTFVTVEVSX0lQXG4gICAqL1xuICByZWFkb25seSBzZXJ2aWNlVHlwZT86IFNlcnZpY2VUeXBlO1xufVxuXG4vKipcbiAqIFByb3BzIGZvciBjb25maWd1cmluZyB0aGUgc3RhdHVzIGh0dHAgc2VydmVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RhdHVzSHR0cFByb3BzIHtcbiAgLyoqXG4gICAqIFNob3VsZCB0aGUgc3RhdHVzIGh0dHAgc2VydmVyIGJlIGVuYWJsZWRcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZWQ6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBUaGUgcG9ydCB0aGUgc3RhdHVzIGh0dHAgc2VydmVyIHJ1bnMgb25cbiAgICogQGRlZmF1bHQgODBcbiAgICovXG4gIHJlYWRvbmx5IHBvcnQ/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBQYXRoIHRvIHRoZSBidXN5Ym94IGh0dHBkIGNvbmZpZ1xuICAgKiBAZGVhZnVsdCAvY29uZmlnL2h0dHBkLmNvbmZcbiAgICovXG4gIHJlYWRvbmx5IGNvbmZpZ1BhdGg/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBQYXRoIHRvIHRoZSBzdGF0dXMgaHR0cGQgaHRkb2NzIHdoZXJlIHN0YXR1cy5qc29uIGlzIHdyaXR0ZW5cbiAgICogQGRlYWZ1bHQgL29wdC92YWxoZWltL2h0ZG9jc1xuICAgKi9cbiAgcmVhZG9ubHkgaHRkb2NMb2NhdGlvbj86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBzZXJ2aWNlIHR5cGUgZm9yIHRoZSBzdGF0dXMgaHR0cCBzZXJ2ZXJcbiAgICogQGRlZmF1bHQgU2VydmljZVR5cGUuQ0xVU1RFUl9JUFxuICAgKi9cbiAgcmVhZG9ubHkgc2VydmljZVR5cGU/OiBTZXJ2aWNlVHlwZTtcbn1cblxuLyoqXG4gKiBQcm9wcyBmb3IgY29uZmlndXJpbmcgc3lzbG9nXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3lzTG9nUHJvcHMge1xuICAvKipcbiAgICogVGhlIHJlbW90ZSBzeXNsb2cgaG9zdFxuICAgKi9cbiAgcmVhZG9ubHkgcmVtb3RlSG9zdD86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSByZW1vdGUgc3lzbG9nIHBvcnRcbiAgICogQGRlZmF1bHQgNTE0XG4gICAqL1xuICByZWFkb25seSByZW1vdGVQb3J0PzogbnVtYmVyO1xuICAvKipcbiAgICogU2hvdWxkIGxvZ2dpbmcgYmUgZG9uZSBsb2NhbFxuICAgKi9cbiAgcmVhZG9ubHkgbG9nTG9jYWw/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFBhc3N3b3JkIHByb3BlcnRpZXMuIFVzZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSBwYXNzd29yZCBzaG91bGQgYmUgYSByYXcgc3RyaW5nIGluIG1hbmlmZXN0IG9yIHJldHJpZXZlZCBmcm9tIGFuIGV4aXN0aW5nIHNlY3JldFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhc3N3b3JkUHJvcHMge1xuICAvKipcbiAgICogVGhlIHJhdyBwYXNzd29yZCBzdHJpbmcuIFdpbGwgYmUgdmlzaWJsZSBpbiBtYW5pZmVzdC4gU2hvdWxkIG5vdCB1c2UuXG4gICAqL1xuICByZWFkb25seSByYXc/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgc2VjcmV0IHRvIHJldHJpZXZlIHRoZSBwYXNzd29yZCBmcm9tLiBUaGUgc2VjcmV0IHNob3VsZCBiZSBzdG9yZWQgaW4gYSBrZXkgbmFtZWQgXCJwYXNzd29yZFwiXG4gICAqL1xuICByZWFkb25seSBzZWNyZXQ/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUHJvcHMgZm9yIGNvbmZpZ3VyaW5nIGEgVmFsaGVpbSBzZXJ2ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJ2ZXJQcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgcG9ydCB0aGUgc2VydmVyIHJ1bnMgb24uIFRoaXMgYW5kIHRoZSBwb3J0ICsgMSBtdXN0IGJlIG9wZW4gb24gdGhlIGhvc3RcbiAgICogVGhlIHNwZWNpZmllZCBwb3J0IGlzIHVzZWQgZm9yIGdhbWUgY29ubmNlY3Rpb25zLCBhbmQgdGhlIGluY3JlbWVudCBwb3J0IGlzXG4gICAqIHVzZWQgZm9yIHRoZSBzZXJ2ZXIgcXVlcnlcbiAgICogQGRlZmF1bHQgMjQ1NlxuICAgKi9cbiAgcmVhZG9ubHkgcG9ydD86IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBzZXJ2ZXJcbiAgICogQGRlZmF1bHQgXCJNeSBTZXJ2ZXJcIlxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZT86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSB3b3JsZCBuYW1lXG4gICAqIEBkZWZhdWx0IFwiRGVkaWNhdGVkXCJcbiAgICovXG4gIHJlYWRvbmx5IHdvcmxkTmFtZT86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBzZXJ2ZXIgcGFzc3dvcmRcbiAgICovXG4gIHJlYWRvbmx5IHBhc3N3b3JkPzogUGFzc3dvcmRQcm9wcztcbiAgLyoqXG4gICAqIElmIHRoZSBzZXJ2ZXIgaXMgcHVibGljXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IHB1YmxpYz86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBBcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgc2VydmVyIG9uIHN0YXJ0XG4gICAqL1xuICByZWFkb25seSBsYXVuY2hBcmdzPzogc3RyaW5nO1xuICAvKipcbiAgICogU3BhY2Ugc2VwYXJhdGVkIGxpc3Qgb2YgYWRtaW4gU3RlYW1JRHMgaW4gU3RlYW1JRDY0IGZvcm1hdC4gT3ZlcnJpZGVzIGFueSBleGlzdGluZyBhZG1pbmxpc3QudHh0IGVudHJpZXMhXG4gICAqL1xuICByZWFkb25seSBhZG1pbkxpc3Q/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIFNwYWNlIHNlcGFyYXRlZCBsaXN0IG9mIGJhbm5lZCBTdGVhbUlEcyBpbiBTdGVhbUlENjQgZm9ybWF0LiBPdmVycmlkZXMgYW55IGV4aXN0aW5nIGJhbmxpc3QudHh0IGVudHJpZXMhXG4gICAqL1xuICByZWFkb25seSBibG9ja0xpc3Q/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIFNwYWNlIHNlcGFyYXRlZCBsaXN0IG9mIGFsbG93ZWQgU3RlYW1JRHMgaW4gU3RlYW1JRDY0IGZvcm1hdC4gT3ZlcnJpZGVzIGFueSBleGlzdGluZyBwZXJtaXR0ZWRsaXN0LnR4dCBlbnRyaWVzIVxuICAgKi9cbiAgcmVhZG9ubHkgYWxsb3dMaXN0Pzogc3RyaW5nW107XG4gIC8qKlxuICAgKiBTaG91bGQgZW5hYmxlIGNyb3NzcGxheVxuICAgKi9cbiAgcmVhZG9ubHkgY3Jvc3NwbGF5PzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFRoZSBzZXJ2ZXIgdXBkYXRlIHNjaGVkdWxlXG4gICAqIEBkZWZhdWx0IFwiKlxcLzE1ICogKiAqICpcIlxuICAgKi9cbiAgcmVhZG9ubHkgdXBkYXRlQ3Jvbj86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSB0aW1lIHdpbmRvdywgaW4gc2Vjb25kcywgdG8gd2FpdCBmb3IgaW5jb21pbmcgVURQIGRhdGFncmFtcyBvbiBub24tcHVibGljIHNlcnZlcnMgYmVmb3JlIGRldGVybWluaW5nIGlmIHRoZSBzZXJ2ZXIgaXMgaWRsZVxuICAgKi9cbiAgcmVhZG9ubHkgaWRsZURhdGFncmFtV2luZG93PzogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIG51bWJlciBvZiBpbmNvbWluZyBVRFAgZGF0YWdyYW1zIHRoZSBjb250YWluZXIgc2hvdWxkIHRvbGVyYXRlIChpbmNsdWRpbmcgdXNlbGVzcyBkYXRhZ3JhbXMgc3VjaCBhcyBtRE5TLCBhcyB3ZWxsIGFzIHVzZWZ1bCBkYXRhZ3JhbXMgbGlrZSBxdWVyaWVzIGFnYWluc3QgdGhlIFVEUCBxdWVyeSBwb3J0IGFuZCBhY3RpdmUgY29ubmVjdGlvbnMgYnkgcGxheWVycykgb24gbm9uLXB1YmxpYyBzZXJ2ZXJzIGJlZm9yZSBkZWNpZGluZyB0aGF0IHRoZSBzZXJ2ZXIgaXMgbm90IGlkbGVcbiAgICovXG4gIHJlYWRvbmx5IGlkbGVEYXRhZ3JhbU1heENvdW50PzogbnVtYmVyO1xuICAvKipcbiAgICogT25seSBydW4gdXBkYXRlIGNoZWNrIGlmIG5vIHBsYXllcnMgYXJlIGNvbm5lY3RlZCB0byB0aGUgc2VydmVyICh0cnVlIG9yIGZhbHNlKVxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSB1cGRhdGVXaGVuSWRsZT86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBUaGUgc2VydmVyIHJlc3RhcnQgc2NoZWR1bGVcbiAgICogQGRlZmF1bHQgXCIwIDUgKiAqICpcIlxuICAgKi9cbiAgcmVhZG9ubHkgcmVzdGFydENyb24/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBPbmx5IHJlc3RhcnQgdGhlIHNlcnZlciBpZiBubyBwbGF5ZXJzIGFyZSBjb25uZWN0ZWQgdG8gdGhlIHNlcnZlciAodHJ1ZSBvciBmYWxzZSlcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgcmVzdGFydElmSWRsZT86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBUaGUgY29udGFpbmVyIHRpbWV6b25lXG4gICAqIEBkZWZhdWx0IFwiRXRjL1VUQ1xuICAgKi9cbiAgcmVhZG9ubHkgdGltZXpvbmU/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBJZiB0aGUgYmV0YSBzZXJ2ZXIgYnJhbmNoIHNob3VsZCBiZSB1c2VkXG4gICAqL1xuICByZWFkb25seSBwdWJsaWNCZXRhPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFRoZSBzZXJ2aWNlIHR5cGUgaW4gdGhlIGNsdXN0ZXIgdG8gZXhwb3NlIHRoZSBzZXJ2ZXIgb25cbiAgICogQGRlZmF1bHQgU2VydmljZVR5cGUuTE9BRF9CQUxBTkNFUlxuICAgKi9cbiAgcmVhZG9ubHkgc2VydmljZVR5cGU/OiBTZXJ2aWNlVHlwZTtcbiAgLyoqXG4gICAqIFRoZSBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgc3RlYW1jbWQgY29tbWFuZFxuICAgKi9cbiAgcmVhZG9ubHkgc3RlYW1DbWRBcmdzPzogc3RyaW5nO1xuICAvKipcbiAgICogUHJvcGVydGllcyBmb3IgVmFsaGVpbVBsdXNcbiAgICovXG4gIHJlYWRvbmx5IHZhbGhlaW1QbHVzPzogVmFsaGVpbVBsdXNQcm9wcztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQZXJzaXN0YW5jZVByb3BzIHtcbiAgLyoqXG4gICAqIFBWQyBjb25maWd1cmF0aW9uIGZvciBzZXJ2ZXIgc3BlY2lmaWMgZmlsZXNcbiAgICovXG4gIHJlYWRvbmx5IHNlcnZlcj86IFBlcnNpc3RlbnRWb2x1bWVDbGFpbUNvbmZpZ1Byb3BzO1xuICAvKipcbiAgICogUFZDIGNvbmZpZ3VyYXRpb24gZm9yIGRhdGEgc3BlY2lmaWMgZmlsZXNcbiAgICovXG4gIHJlYWRvbmx5IGNvbmZpZz86IFBlcnNpc3RlbnRWb2x1bWVDbGFpbUNvbmZpZ1Byb3BzO1xufVxuXG4vKipcbiAqIFByb3BzIGZvciBjb25maWd1cmluZyBhIHBlcnNpc3RlbnQgdm9sdW1lIGNsYWltXG4gKiBAc2VlIGh0dHBzOi8va3ViZXJuZXRlcy5pby9kb2NzL2NvbmNlcHRzL3N0b3JhZ2UvcGVyc2lzdGVudC12b2x1bWVzL1xuICpcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQZXJzaXN0ZW50Vm9sdW1lQ2xhaW1Db25maWdQcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgc3RvcmFnZSBjbGFzc1xuICAgKi9cbiAgcmVhZG9ubHkgc3RvcmFnZUNsYXNzOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgYWNjZXNzIG1vZGUgZnJvbSB0aGUgdm9sdW1lXG4gICAqIEBzZWUgaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvc3RvcmFnZS9wZXJzaXN0ZW50LXZvbHVtZXMvI2FjY2Vzcy1tb2Rlc1xuICAgKiBAZGVmYXVsdCA9IFtSRUFEX1dSSVRFX09OQ0VdXG4gICAqL1xuICByZWFkb25seSBhY2Nlc3NNb2Rlcz86IFBlcnNpc3RlbnRWb2x1bWVBY2Nlc3NNb2RlW107XG4gIC8qKlxuICAgKiBUaGUgc2l6ZSBvZiB0aGUgdm9sdW1lXG4gICAqIEBzZWUgaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvc3RvcmFnZS9wZXJzaXN0ZW50LXZvbHVtZXMvI2NhcGFjaXR5XG4gICAqL1xuICByZWFkb25seSBzdG9yYWdlPzogU2l6ZTtcbn1cblxuLyoqXG4gKiBQcm9wcyBmb3IgY29uZmlndXJpbmcgcmVzb3VyY2UgbGltaXRzXG4gKiBAc2VlIGh0dHBzOi8va3ViZXJuZXRlcy5pby9kb2NzL2NvbmNlcHRzL2NvbmZpZ3VyYXRpb24vbWFuYWdlLXJlc291cmNlcy1jb250YWluZXJzL1xuKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb3VyY2VMaW1pdHNQcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgQ1BVIHJlc291cmNlcyB0byBhbGxvY2F0ZSB0byB0aGUgY29udGFpbmVyXG4gICAqIEBzZWUgaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvY29uZmlndXJhdGlvbi9tYW5hZ2UtcmVzb3VyY2VzLWNvbnRhaW5lcnMvI21lYW5pbmctb2YtY3B1XG4gICAqIEBkZWZhdWx0ID0gMjAwMG1cbiAgICovXG4gIHJlYWRvbmx5IGNwdT86IENwdVJlc291cmNlcztcbiAgLyoqXG4gICAqIFRoZSBtZW1vcnkgcmVzb3VyY2VzIHRvIGFsbG9jYXRlIHRvIHRoZSBjb250YWluZXJcbiAgICogQHNlZSBodHRwczovL2t1YmVybmV0ZXMuaW8vZG9jcy9jb25jZXB0cy9jb25maWd1cmF0aW9uL21hbmFnZS1yZXNvdXJjZXMtY29udGFpbmVycy8jbWVhbmluZy1vZi1tZW1vcnlcbiAgICogQGRlZmF1bHQgPSA0R2lcbiAgICovXG4gIHJlYWRvbmx5IG1lbW9yeT86IE1lbW9yeVJlc291cmNlcztcbn1cblxuLyoqXG4gKiBQcm9wcyBmb3IgY29uZmlndXJpbmcgc2VjdXJpdHkgYXNwZWN0cyBvZiB0aGUgY29udGFpbmVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VjdXJpdHlQcm9wcyB7XG4gIHJlYWRvbmx5IHVzZXI/OiBudW1iZXI7XG4gIHJlYWRvbmx5IGdyb3VwPzogbnVtYmVyO1xuICByZWFkb25seSBwcml2aWxlZ2VkPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgcmVhZE9ubHlSb290RmlsZXN5c3RlbT86IGJvb2xlYW47XG4gIHJlYWRvbmx5IGFsbG93UHJpdmlsZWdlRXNjYWxhdGlvbj86IGJvb2xlYW47XG59XG5cbi8qKlxuICogVGhlIHByb3BzIGZvciB0aGUgY2hhcnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWYWxoZWltQ2hhcnRQcm9wcyBleHRlbmRzIENoYXJ0UHJvcHMge1xuICByZWFkb25seSBzZXJ2ZXI/OiBTZXJ2ZXJQcm9wcztcbiAgcmVhZG9ubHkgcGVyc2lzdGVuY2U/OiBQZXJzaXN0YW5jZVByb3BzO1xuICByZWFkb25seSBpbWFnZVRhZz86IHN0cmluZztcbiAgcmVhZG9ubHkgcmVzb3VyY2VMaW1pdHM/OiBSZXNvdXJjZUxpbWl0c1Byb3BzO1xuICByZWFkb25seSBiYWNrdXA/OiBCYWNrdXBQcm9wcztcbiAgcmVhZG9ubHkgc3VwZXJ2aXNvckh0dHA/OiBTdXBlcnZpc29ySHR0cFByb3BzO1xuICByZWFkb25seSBzdGF0dXNIdHRwPzogU3RhdHVzSHR0cFByb3BzO1xuICByZWFkb25seSBzeXNMb2c/OiBTeXNMb2dQcm9wcztcbiAgcmVhZG9ubHkgc2VjdXJpdHk/OiBTZWN1cml0eVByb3BzO1xufVxuXG4vKipcbiAqIEEgY2hhcnQgdG8gZGVwbG95IGEgVmFsaGVpbSBzZXJ2ZXJcbiAqIFVzZXMgdGhlIGNvbnRhaW5lciBieSBAbGxvZXNjaGVcbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2xsb2VzY2hlL3ZhbGhlaW0tc2VydmVyLWRvY2tlclxuICovXG5leHBvcnQgY2xhc3MgVmFsaGVpbUNoYXJ0IGV4dGVuZHMgQ2hhcnQge1xuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBuYW1lOiBzdHJpbmcsIHByb3BzPzogVmFsaGVpbUNoYXJ0UHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgbmFtZSwgcHJvcHMpO1xuXG4gICAgY29uc3Qgc2VydmVyVm9sID0gdGhpcy5mb3JtU2VydmVyUGVyc2lzdGFuY2UocHJvcHM/LnBlcnNpc3RlbmNlPy5zZXJ2ZXIpO1xuICAgIGNvbnN0IGNvbmZpZ1ZvbCA9IHRoaXMuZm9ybUNvbmZpZ1BlcnNpc3RhbmNlKHByb3BzPy5wZXJzaXN0ZW5jZT8uY29uZmlnKTtcblxuICAgIGNvbnN0IHBvcnRzID0gdGhpcy5mb3JtUG9ydFJlY29yZHMocHJvcHMpO1xuICAgIGNvbnN0IGRlcGxveW1lbnQgPSBuZXcgRGVwbG95bWVudCh0aGlzLCAnZGVwbG95bWVudCcsIHtcbiAgICAgIHJlcGxpY2FzOiAxLFxuICAgICAgc3RyYXRlZ3k6IERlcGxveW1lbnRTdHJhdGVneS5yZWNyZWF0ZSgpLFxuICAgICAgY29udGFpbmVyczogW1xuICAgICAgICB7XG4gICAgICAgICAgaW1hZ2U6IHRoaXMuZm9ybUltYWdlKHByb3BzPy5pbWFnZVRhZyksXG4gICAgICAgICAgcG9ydHM6IE9iamVjdC5rZXlzKHBvcnRzKS5tYXAoKGtleSkgPT4gcG9ydHNba2V5XSksXG4gICAgICAgICAgZW52VmFyaWFibGVzOiB0aGlzLmZvcm1FbnZpcm9ubWVudChwcm9wcyksXG4gICAgICAgICAgdm9sdW1lTW91bnRzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHBhdGg6ICcvY29uZmlnJyxcbiAgICAgICAgICAgICAgdm9sdW1lOiBjb25maWdWb2wsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBwYXRoOiAnL29wdC92YWxoZWltJyxcbiAgICAgICAgICAgICAgdm9sdW1lOiBzZXJ2ZXJWb2wsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgICAgc2VjdXJpdHlDb250ZXh0OiB7XG4gICAgICAgICAgICBlbnN1cmVOb25Sb290OiBmYWxzZSxcbiAgICAgICAgICAgIHJlYWRPbmx5Um9vdEZpbGVzeXN0ZW06IHByb3BzPy5zZWN1cml0eT8ucmVhZE9ubHlSb290RmlsZXN5c3RlbSA/PyBmYWxzZSxcbiAgICAgICAgICAgIHByaXZpbGVnZWQ6IHByb3BzPy5zZWN1cml0eT8ucHJpdmlsZWdlZCxcbiAgICAgICAgICAgIGFsbG93UHJpdmlsZWdlRXNjYWxhdGlvbjogcHJvcHM/LnNlY3VyaXR5Py5hbGxvd1ByaXZpbGVnZUVzY2FsYXRpb24sXG4gICAgICAgICAgICBncm91cDogcHJvcHM/LnNlY3VyaXR5Py5ncm91cCxcbiAgICAgICAgICAgIHVzZXI6IHByb3BzPy5zZWN1cml0eT8udXNlcixcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJlc291cmNlczoge1xuICAgICAgICAgICAgbWVtb3J5OiBwcm9wcz8ucmVzb3VyY2VMaW1pdHM/Lm1lbW9yeSA/PyB7XG4gICAgICAgICAgICAgIHJlcXVlc3Q6IFNpemUuZ2liaWJ5dGVzKDQpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNwdTogcHJvcHM/LnJlc291cmNlTGltaXRzPy5jcHUgPz8ge1xuICAgICAgICAgICAgICByZXF1ZXN0OiBDcHUubWlsbGlzKDIwMDApLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIHZvbHVtZXM6IFtjb25maWdWb2wsIHNlcnZlclZvbF0sXG4gICAgfSk7XG5cbiAgICBuZXcgU2VydmljZSh0aGlzLCAnc2VydmljZScsIHtcbiAgICAgIHR5cGU6IHByb3BzPy5zZXJ2ZXI/LnNlcnZpY2VUeXBlID8/IFNlcnZpY2VUeXBlLkxPQURfQkFMQU5DRVIsXG4gICAgICBzZWxlY3RvcjogZGVwbG95bWVudCxcbiAgICAgIHBvcnRzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBwb3J0cy5nYW1lLm5hbWUsXG4gICAgICAgICAgcG9ydDogcG9ydHMuZ2FtZS5udW1iZXIsXG4gICAgICAgICAgdGFyZ2V0UG9ydDogcG9ydHMuZ2FtZS5udW1iZXIsXG4gICAgICAgICAgcHJvdG9jb2w6IFByb3RvY29sLlVEUCxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IHBvcnRzLnF1ZXJ5Lm5hbWUsXG4gICAgICAgICAgcG9ydDogcG9ydHMucXVlcnkubnVtYmVyLFxuICAgICAgICAgIHRhcmdldFBvcnQ6IHBvcnRzLnF1ZXJ5Lm51bWJlcixcbiAgICAgICAgICBwcm90b2NvbDogUHJvdG9jb2wuVURQLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KTtcblxuICAgIGlmIChwcm9wcz8uc3VwZXJ2aXNvckh0dHA/LmVuYWJsZWQpIHtcbiAgICAgIHRoaXMuZm9ybVNlcnZpY2UoZGVwbG95bWVudCwgcG9ydHMuc3VwZXJ2aXNvciwgcHJvcHM/LnN1cGVydmlzb3JIdHRwLnNlcnZpY2VUeXBlKTtcbiAgICB9XG5cbiAgICBpZiAocHJvcHM/LnN0YXR1c0h0dHA/LmVuYWJsZWQpIHtcbiAgICAgIHRoaXMuZm9ybVNlcnZpY2UoZGVwbG95bWVudCwgcG9ydHMuc3RhdHVzLCBwcm9wcz8uc3RhdHVzSHR0cC5zZXJ2aWNlVHlwZSk7XG4gICAgfVxuXG4gIH1cblxuICBwcml2YXRlIGZvcm1JbWFnZSh0YWc/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYGdoY3IuaW8vbGxvZXNjaGUvdmFsaGVpbS1zZXJ2ZXI6JHt0YWcgPz8gJ2xhdGVzdCd9YDtcbiAgfVxuXG4gIHByaXZhdGUgZm9ybVBvcnRSZWNvcmRzKHByb3BzPzogVmFsaGVpbUNoYXJ0UHJvcHMpOiBSZWNvcmQ8c3RyaW5nLCBDb250YWluZXJQb3J0PiB7XG4gICAgY29uc3QgZ2FtZVBvcnQgPSBwcm9wcz8uc2VydmVyPy5wb3J0ID8/IDI0NTY7XG4gICAgY29uc3QgcXVlcnlQb3J0ID0gZ2FtZVBvcnQgKyAxO1xuXG4gICAgbGV0IHBvcnRSZWNvcmRzOiBSZWNvcmQ8c3RyaW5nLCBDb250YWluZXJQb3J0PiA9IHtcbiAgICAgIGdhbWU6IHtcbiAgICAgICAgbnVtYmVyOiBnYW1lUG9ydCxcbiAgICAgICAgbmFtZTogJ3NlcnZlcicsXG4gICAgICAgIHByb3RvY29sOiBQcm90b2NvbC5VRFAsXG4gICAgICB9LFxuICAgICAgcXVlcnk6IHtcbiAgICAgICAgbnVtYmVyOiBxdWVyeVBvcnQsXG4gICAgICAgIG5hbWU6ICdxdWVyeScsXG4gICAgICAgIHByb3RvY29sOiBQcm90b2NvbC5VRFAsXG4gICAgICB9LFxuICAgIH07XG5cbiAgICBpZiAocHJvcHM/LnN1cGVydmlzb3JIdHRwPy5lbmFibGVkKSB7XG4gICAgICBwb3J0UmVjb3Jkcy5zdXBlcnZpc29yID0ge1xuICAgICAgICBudW1iZXI6IHByb3BzLnN1cGVydmlzb3JIdHRwLnBvcnQgPz8gOTAwMSxcbiAgICAgICAgbmFtZTogJ3N1cGVydmlzb3InLFxuICAgICAgICBwcm90b2NvbDogUHJvdG9jb2wuVENQLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAocHJvcHM/LnN0YXR1c0h0dHA/LmVuYWJsZWQpIHtcbiAgICAgIHBvcnRSZWNvcmRzLnN0YXR1cyA9IHtcbiAgICAgICAgbnVtYmVyOiBwcm9wcy5zdGF0dXNIdHRwLnBvcnQgPz8gODAsXG4gICAgICAgIG5hbWU6ICdzdGF0dXMnLFxuICAgICAgICBwcm90b2NvbDogUHJvdG9jb2wuVENQLFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHBvcnRSZWNvcmRzO1xuICB9XG5cbiAgcHJpdmF0ZSBmb3JtU2VydmljZShzY29wZTogRGVwbG95bWVudCwgcG9ydDogQ29udGFpbmVyUG9ydCwgdHlwZT86IFNlcnZpY2VUeXBlKTogU2VydmljZSB7XG4gICAgbGV0IG5hbWUgPSBwb3J0Lm5hbWU7XG4gICAgcmV0dXJuIG5ldyBTZXJ2aWNlKHRoaXMsIGAke25hbWV9LX