UNPKG

cdk8s-plus-28

Version:

cdk8s+ is a software development framework that provides high level abstractions for authoring Kubernetes applications. cdk8s-plus-28 synthesizes Kubernetes manifests for Kubernetes 1.28.0

845 lines 103 kB
"use strict"; var _a, _b, _c, _d, _e, _f; Object.defineProperty(exports, "__esModule", { value: true }); exports.Env = exports.extractContainerPorts = exports.EnvFrom = exports.Cpu = exports.MountPropagation = exports.Container = exports.ContainerRestartPolicy = exports.ImagePullPolicy = exports.EnvValue = exports.ResourceFieldPaths = exports.EnvFieldPaths = exports.ContainerSecurityContext = exports.Protocol = exports.SeccompProfileType = exports.Capability = void 0; const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); const cdk8s_1 = require("cdk8s"); const k8s = require("./imports/k8s"); const probe = require("./probe"); const utils_1 = require("./utils"); /** * Capability - complete list of POSIX capabilities */ var Capability; (function (Capability) { /** * ALL */ Capability["ALL"] = "ALL"; /** * CAP_AUDIT_CONTROL */ Capability["AUDIT_CONTROL"] = "AUDIT_CONTROL"; /** * CAP_AUDIT_READ */ Capability["AUDIT_READ"] = "AUDIT_READ"; /** * CAP_AUDIT_WRITE */ Capability["AUDIT_WRITE"] = "AUDIT_WRITE"; /** * CAP_BLOCK_SUSPEND */ Capability["BLOCK_SUSPEND"] = "BLOCK_SUSPEND"; /** * CAP_BPF */ Capability["BPF"] = "BPF"; /** * CAP_CHECKPOINT_RESTORE */ Capability["CHECKPOINT_RESTORE"] = "CHECKPOINT_RESTORE"; /** * CAP_CHOWN */ Capability["CHOWN"] = "CHOWN"; /** * CAP_DAC_OVERRIDE */ Capability["DAC_OVERRIDE"] = "DAC_OVERRIDE"; /** * CAP_DAC_READ_SEARCH */ Capability["DAC_READ_SEARCH"] = "DAC_READ_SEARCH"; /** * CAP_FOWNER */ Capability["FOWNER"] = "FOWNER"; /** * CAP_FSETID */ Capability["FSETID"] = "FSETID"; /** * CAP_IPC_LOCK */ Capability["IPC_LOCK"] = "IPC_LOCK"; /** * CAP_IPC_OWNER */ Capability["IPC_OWNER"] = "IPC_OWNER"; /** * CAP_KILL */ Capability["KILL"] = "KILL"; /** * CAP_LEASE */ Capability["LEASE"] = "LEASE"; /** * CAP_LINUX_IMMUTABLE */ Capability["LINUX_IMMUTABLE"] = "LINUX_IMMUTABLE"; /** * CAP_MAC_ADMIN */ Capability["MAC_ADMIN"] = "MAC_ADMIN"; /** * CAP_MAC_OVERRIDE */ Capability["MAC_OVERRIDE"] = "MAC_OVERRIDE"; /** * CAP_MKNOD */ Capability["MKNOD"] = "MKNOD"; /** * CAP_NET_ADMIN */ Capability["NET_ADMIN"] = "NET_ADMIN"; /** * CAP_NET_BIND_SERVICE */ Capability["NET_BIND_SERVICE"] = "NET_BIND_SERVICE"; /** * CAP_NET_BROADCAST */ Capability["NET_BROADCAST"] = "NET_BROADCAST"; /** * CAP_NET_RAW */ Capability["NET_RAW"] = "NET_RAW"; /** * CAP_PERFMON */ Capability["PERFMON"] = "PERFMON"; /** * CAP_SETGID */ Capability["SETGID"] = "SETGID"; /** * CAP_SETFCAP */ Capability["SETFCAP"] = "SETFCAP"; /** * CAP_SETPCAP */ Capability["SETPCAP"] = "SETPCAP"; /** * CAP_SETUID */ Capability["SETUID"] = "SETUID"; /** * CAP_SYS_ADMIN */ Capability["SYS_ADMIN"] = "SYS_ADMIN"; /** * CAP_SYS_BOOT */ Capability["SYS_BOOT"] = "SYS_BOOT"; /** * CAP_SYS_CHROOT */ Capability["SYS_CHROOT"] = "SYS_CHROOT"; /** * CAP_SYS_MODULE */ Capability["SYS_MODULE"] = "SYS_MODULE"; /** * CAP_SYS_NICE */ Capability["SYS_NICE"] = "SYS_NICE"; /** * CAP_SYS_PACCT */ Capability["SYS_PACCT"] = "SYS_PACCT"; /** * CAP_SYS_PTRACE */ Capability["SYS_PTRACE"] = "SYS_PTRACE"; /** * CAP_SYS_RAWIO */ Capability["SYS_RAWIO"] = "SYS_RAWIO"; /** * CAP_SYS_RESOURCE */ Capability["SYS_RESOURCE"] = "SYS_RESOURCE"; /** * CAP_SYS_TIME */ Capability["SYS_TIME"] = "SYS_TIME"; /** * CAP_SYS_TTY_CONFIG */ Capability["SYS_TTY_CONFIG"] = "SYS_TTY_CONFIG"; /** * CAP_SYSLOG */ Capability["SYSLOG"] = "SYSLOG"; /** * CAP_WAKE_ALARM */ Capability["WAKE_ALARM"] = "WAKE_ALARM"; })(Capability = exports.Capability || (exports.Capability = {})); var SeccompProfileType; (function (SeccompProfileType) { /** * A profile defined in a file on the node should be used */ SeccompProfileType["LOCALHOST"] = "Localhost"; /** * The container runtime default profile should be used */ SeccompProfileType["RUNTIME_DEFAULT"] = "RuntimeDefault"; /** * No profile should be applied */ SeccompProfileType["UNCONFINED"] = "Unconfined"; })(SeccompProfileType = exports.SeccompProfileType || (exports.SeccompProfileType = {})); /** * Network protocols. */ var Protocol; (function (Protocol) { /** * TCP. */ Protocol["TCP"] = "TCP"; /** * UDP. */ Protocol["UDP"] = "UDP"; /** * SCTP. */ Protocol["SCTP"] = "SCTP"; })(Protocol = exports.Protocol || (exports.Protocol = {})); /** * Container security attributes and settings. */ class ContainerSecurityContext { constructor(props = {}) { if (props.seccompProfile?.localhostProfile && props.seccompProfile.type != SeccompProfileType.LOCALHOST) { throw new Error('localhostProfile must only be set if type is "Localhost"'); } this.ensureNonRoot = props.ensureNonRoot ?? true; this.privileged = props.privileged ?? false; this.readOnlyRootFilesystem = props.readOnlyRootFilesystem ?? true; this.user = props.user; this.group = props.group; this.allowPrivilegeEscalation = props.allowPrivilegeEscalation ?? false; this.capabilities = props.capabilities; this.seccompProfile = props.seccompProfile; } /** * @internal */ _toKube() { return { runAsGroup: this.group, runAsUser: this.user, runAsNonRoot: this.ensureNonRoot, privileged: this.privileged, readOnlyRootFilesystem: this.readOnlyRootFilesystem, allowPrivilegeEscalation: this.allowPrivilegeEscalation, capabilities: this.capabilities, seccompProfile: this.seccompProfile, }; } } exports.ContainerSecurityContext = ContainerSecurityContext; _a = JSII_RTTI_SYMBOL_1; ContainerSecurityContext[_a] = { fqn: "cdk8s-plus-28.ContainerSecurityContext", version: "2.5.6" }; var EnvFieldPaths; (function (EnvFieldPaths) { /** * The name of the pod. */ EnvFieldPaths["POD_NAME"] = "metadata.name"; /** * The namespace of the pod. */ EnvFieldPaths["POD_NAMESPACE"] = "metadata.namespace"; /** * The uid of the pod. */ EnvFieldPaths["POD_UID"] = "metadata.uid"; /** * The labels of the pod. */ EnvFieldPaths["POD_LABEL"] = "metadata.labels"; /** * The annotations of the pod. */ EnvFieldPaths["POD_ANNOTATION"] = "metadata.annotations"; /** * The ipAddress of the pod. */ EnvFieldPaths["POD_IP"] = "status.podIP"; /** * The service account name of the pod. */ EnvFieldPaths["SERVICE_ACCOUNT_NAME"] = "spec.serviceAccountName"; /** * The name of the node. */ EnvFieldPaths["NODE_NAME"] = "spec.nodeName"; /** * The ipAddress of the node. */ EnvFieldPaths["NODE_IP"] = "status.hostIP"; /** * The ipAddresess of the pod. */ EnvFieldPaths["POD_IPS"] = "status.podIPs"; })(EnvFieldPaths = exports.EnvFieldPaths || (exports.EnvFieldPaths = {})); var ResourceFieldPaths; (function (ResourceFieldPaths) { /** * CPU limit of the container. */ ResourceFieldPaths["CPU_LIMIT"] = "limits.cpu"; /** * Memory limit of the container. */ ResourceFieldPaths["MEMORY_LIMIT"] = "limits.memory"; /** * CPU request of the container. */ ResourceFieldPaths["CPU_REQUEST"] = "requests.cpu"; /** * Memory request of the container. */ ResourceFieldPaths["MEMORY_REQUEST"] = "requests.memory"; /** * Ephemeral storage limit of the container. */ ResourceFieldPaths["STORAGE_LIMIT"] = "limits.ephemeral-storage"; /** * Ephemeral storage request of the container. */ ResourceFieldPaths["STORAGE_REQUEST"] = "requests.ephemeral-storage"; })(ResourceFieldPaths = exports.ResourceFieldPaths || (exports.ResourceFieldPaths = {})); /** * Utility class for creating reading env values from various sources. */ class EnvValue { constructor(value, valueFrom) { this.value = value; this.valueFrom = valueFrom; } /** * Create a value by reading a specific key inside a config map. * * @param configMap - The config map. * @param key - The key to extract the value from. * @param options - Additional options. */ static fromConfigMap(configMap, key, options = {}) { const source = { configMapKeyRef: { name: configMap.name, key, optional: options.optional, }, }; return new EnvValue(undefined, source); } /** * Defines an environment value from a secret JSON value. * * @param secretValue The secret value (secrent + key) * @param options Additional options */ static fromSecretValue(secretValue, options = {}) { const source = { secretKeyRef: { name: secretValue.secret.name, key: secretValue.key, optional: options.optional, }, }; return new EnvValue(undefined, source); } /** * Create a value from the given argument. * * @param value - The value. */ static fromValue(value) { return new EnvValue(value); } /** * * Create a value from a field reference. * * @param fieldPath: The field reference. * @param options: Additional options. */ static fromFieldRef(fieldPath, options = {}) { let needsKey = false; if (fieldPath === EnvFieldPaths.POD_LABEL || fieldPath === EnvFieldPaths.POD_ANNOTATION) { needsKey = true; } if (needsKey && options.key === undefined) { throw new Error(`${fieldPath} requires a key`); } const source = { fieldRef: { fieldPath: (`${fieldPath}` + (needsKey ? `['${options.key}']` : '')), ...(options.apiVersion ? { apiVersion: options.apiVersion } : {}), }, }; return new EnvValue(undefined, source); } /** * Create a value from a resource. * * @param resource: Resource to select the value from. * @param options: Additional options. */ static fromResource(resource, options = {}) { const source = { resourceFieldRef: { resource: `${resource}`, ...(options.divisor ? { divisor: k8s.IntOrString.fromString(options.divisor) } : {}), ...(options.container ? { containerName: options.container.name } : {}), }, }; return new EnvValue(undefined, source); } /** * Create a value from a key in the current process environment. * * @param key - The key to read. * @param options - Additional options. */ static fromProcess(key, options = {}) { const value = process.env[key]; if (options.required && !value) { throw new Error(`Missing ${key} env variable`); } return EnvValue.fromValue(value); } } exports.EnvValue = EnvValue; _b = JSII_RTTI_SYMBOL_1; EnvValue[_b] = { fqn: "cdk8s-plus-28.EnvValue", version: "2.5.6" }; var ImagePullPolicy; (function (ImagePullPolicy) { /** * Every time the kubelet launches a container, the kubelet queries the container image registry * to resolve the name to an image digest. If the kubelet has a container image with that exact * digest cached locally, the kubelet uses its cached image; otherwise, the kubelet downloads * (pulls) the image with the resolved digest, and uses that image to launch the container. * * Default is Always if ImagePullPolicy is omitted and either the image tag is :latest or * the image tag is omitted. */ ImagePullPolicy["ALWAYS"] = "Always"; /** * The image is pulled only if it is not already present locally. * * Default is IfNotPresent if ImagePullPolicy is omitted and the image tag is present but * not :latest */ ImagePullPolicy["IF_NOT_PRESENT"] = "IfNotPresent"; /** * The image is assumed to exist locally. No attempt is made to pull the image. */ ImagePullPolicy["NEVER"] = "Never"; })(ImagePullPolicy = exports.ImagePullPolicy || (exports.ImagePullPolicy = {})); /** * RestartPolicy defines the restart behavior of individual containers in a pod. * This field may only be set for init containers, and the only allowed value is "Always". * For non-init containers or when this field is not specified, * the restart behavior is defined by the Pod's restart policy and the container type. * Setting the RestartPolicy as "Always" for the init container will have the following effect: * this init container will be continually restarted on exit until all regular containers have terminated. * Once all regular containers have completed, all init containers with restartPolicy "Always" will be shut down. * This lifecycle differs from normal init containers and is often referred to as a "sidecar" container. * * @see https://kubernetes.io/docs/concepts/workloads/pods/sidecar-containers/ */ var ContainerRestartPolicy; (function (ContainerRestartPolicy) { /** * If an init container is created with its restartPolicy set to Always, * it will start and remain running during the entire life of the Pod. * For regular containers, this is ignored by Kubernetes. */ ContainerRestartPolicy["ALWAYS"] = "Always"; })(ContainerRestartPolicy = exports.ContainerRestartPolicy || (exports.ContainerRestartPolicy = {})); /** * A single application container that you want to run within a pod. */ class Container { constructor(props) { this._ports = []; if (props instanceof Container) { throw new Error('Attempted to construct a container from a Container object.'); } const defaultResourceSpec = { cpu: { request: Cpu.millis(1000), limit: Cpu.millis(1500), }, memory: { request: cdk8s_1.Size.mebibytes(512), limit: cdk8s_1.Size.mebibytes(2048), }, }; if (props.port && props.portNumber) { throw new Error('Either \'port\' or \'portNumber\' is allowed. Use \'portNumber\' since \'port\' is deprecated'); } const portNumber = props.portNumber ?? props.port; const defaultProbeConfiguration = probe.Probe.fromTcpSocket({ port: portNumber }); this.name = props.name ?? 'main'; this.image = props.image; this.portNumber = portNumber; this._command = props.command; this._args = props.args; this._readiness = props.readiness; this._liveness = props.liveness; this._startup = props.startup ?? (this.portNumber ? defaultProbeConfiguration : undefined); this._lifecycle = props.lifecycle; this.resources = props.resources ?? defaultResourceSpec; this.workingDir = props.workingDir; this.mounts = props.volumeMounts ?? []; this.imagePullPolicy = props.imagePullPolicy ?? ImagePullPolicy.ALWAYS; this.securityContext = new ContainerSecurityContext(props.securityContext); this.env = new Env(props.envFrom ?? [], props.envVariables ?? {}); this.restartPolicy = props.restartPolicy; if (this.portNumber) { this.addPort({ number: this.portNumber, }); } for (const port of props.ports ?? []) { this.addPort(port); } } /** * @deprecated - use `portNumber`. */ get port() { return this.portNumber; } /** * Ports exposed by this containers. * Returns a copy, use `addPort` to modify. */ get ports() { return [...this._ports]; } /** * Entrypoint array (the command to execute when the container starts). * @returns a copy of the entrypoint array, cannot be modified */ get command() { return this._command ? [...this._command] : undefined; } /** * Arguments to the entrypoint. * * @returns a copy of the arguments array, cannot be modified. */ get args() { return this._args ? [...this._args] : undefined; } /** * Mount a volume to a specific path so that it is accessible by the container. * Every pod that is configured to use this container will autmoatically have access to the volume. * * @param path - The desired path in the container. * @param storage - The storage to mount. */ mount(path, storage, options = {}) { this.mounts.push({ path, volume: storage.asVolume(), ...options }); } /** * Add a port to expose from this container. */ addPort(port) { const names = this._ports.map(p => p.name).filter(x => x); const numberProtocols = this._ports.map(p => `${p.number}/${p.protocol || Protocol.TCP}`); if (port.name && names.includes(port.name)) { throw new Error(`Port with name ${port.name} already exists`); } const protocol = `${port.number}/${port.protocol || Protocol.TCP}`; if (numberProtocols.includes(protocol)) { throw new Error(`Port with number ${port.number} and protocol ${port.protocol || Protocol.TCP} already exists`); } this._ports.push(port); } /** * @internal */ _toKube() { const volumeMounts = []; for (const mount of this.mounts) { volumeMounts.push({ name: mount.volume.name, mountPath: mount.path, readOnly: mount.readOnly, mountPropagation: mount.propagation, subPath: mount.subPath, subPathExpr: mount.subPathExpr, }); } const ports = new Array(); for (const port of this.ports) { ports.push({ containerPort: port.number, protocol: port.protocol?.toString(), name: port.name, hostPort: port.hostPort, hostIp: port.hostIp, }); } // Resource requests and limits const cpuLimit = this.resources?.cpu?.limit?.amount; const cpuRequest = this.resources?.cpu?.request?.amount; const memoryLimit = this.resources?.memory?.limit; const memoryRequest = this.resources?.memory?.request; const ephemeralStorageLimit = this.resources?.ephemeralStorage?.limit; const ephemeralStorageRequest = this.resources?.ephemeralStorage?.request; const limits = {}; const requests = {}; if (cpuLimit) { limits.cpu = k8s.Quantity.fromString(cpuLimit); } if (memoryLimit) { limits.memory = k8s.Quantity.fromString(memoryLimit.toMebibytes().toString() + 'Mi'); } if (ephemeralStorageLimit) { limits['ephemeral-storage'] = k8s.Quantity.fromString(ephemeralStorageLimit.toGibibytes().toString() + 'Gi'); } if (cpuRequest) { requests.cpu = k8s.Quantity.fromString(cpuRequest); } if (memoryRequest) { requests.memory = k8s.Quantity.fromString(memoryRequest.toMebibytes().toString() + 'Mi'); } if (ephemeralStorageRequest) { requests['ephemeral-storage'] = k8s.Quantity.fromString(ephemeralStorageRequest.toGibibytes().toString() + 'Gi'); } let resourceRequirements = undefined; if (Object.keys(limits).length > 0 || Object.keys(requests).length > 0) { resourceRequirements = { limits: utils_1.undefinedIfEmpty(limits), requests: utils_1.undefinedIfEmpty(requests), }; } const env = this.env._toKube(); return { name: this.name, image: this.image, imagePullPolicy: this.imagePullPolicy, ports: utils_1.undefinedIfEmpty(ports), volumeMounts: utils_1.undefinedIfEmpty(volumeMounts), command: this.command, args: this.args, workingDir: this.workingDir, env: env.variables, envFrom: env.from, readinessProbe: this._readiness?._toKube(this), livenessProbe: this._liveness?._toKube(this), startupProbe: this._startup?._toKube(this), lifecycle: this._lifecycle ? { postStart: this._lifecycle.postStart?._toKube(this), preStop: this._lifecycle.preStop?._toKube(this), } : undefined, resources: resourceRequirements, restartPolicy: this.restartPolicy, securityContext: this.securityContext._toKube(), }; } } exports.Container = Container; _c = JSII_RTTI_SYMBOL_1; Container[_c] = { fqn: "cdk8s-plus-28.Container", version: "2.5.6" }; var MountPropagation; (function (MountPropagation) { /** * This volume mount will not receive any subsequent mounts that are mounted * to this volume or any of its subdirectories by the host. In similar * fashion, no mounts created by the Container will be visible on the host. * * This is the default mode. * * This mode is equal to `private` mount propagation as described in the Linux * kernel documentation */ MountPropagation["NONE"] = "None"; /** * This volume mount will receive all subsequent mounts that are mounted to * this volume or any of its subdirectories. * * In other words, if the host mounts anything inside the volume mount, the * Container will see it mounted there. * * Similarly, if any Pod with Bidirectional mount propagation to the same * volume mounts anything there, the Container with HostToContainer mount * propagation will see it. * * This mode is equal to `rslave` mount propagation as described in the Linux * kernel documentation */ MountPropagation["HOST_TO_CONTAINER"] = "HostToContainer"; /** * This volume mount behaves the same the HostToContainer mount. In addition, * all volume mounts created by the Container will be propagated back to the * host and to all Containers of all Pods that use the same volume * * A typical use case for this mode is a Pod with a FlexVolume or CSI driver * or a Pod that needs to mount something on the host using a hostPath volume. * * This mode is equal to `rshared` mount propagation as described in the Linux * kernel documentation * * Caution: Bidirectional mount propagation can be dangerous. It can damage * the host operating system and therefore it is allowed only in privileged * Containers. Familiarity with Linux kernel behavior is strongly recommended. * In addition, any volume mounts created by Containers in Pods must be * destroyed (unmounted) by the Containers on termination. * */ MountPropagation["BIDIRECTIONAL"] = "Bidirectional"; })(MountPropagation = exports.MountPropagation || (exports.MountPropagation = {})); /** * Represents the amount of CPU. * The amount can be passed as millis or units. */ class Cpu { constructor(amount) { this.amount = amount; } static millis(amount) { return new Cpu(amount + 'm'); } static units(amount) { return new Cpu(amount.toString()); } } exports.Cpu = Cpu; _d = JSII_RTTI_SYMBOL_1; Cpu[_d] = { fqn: "cdk8s-plus-28.Cpu", version: "2.5.6" }; /** * A collection of env variables defined in other resources. */ class EnvFrom { constructor(configMap, prefix, sec) { this.configMap = configMap; this.prefix = prefix; this.sec = sec; } ; /** * @internal */ _toKube() { return { configMapRef: this.configMap ? { name: this.configMap.name, } : undefined, secretRef: this.sec ? { name: this.sec.name, } : undefined, prefix: this.prefix, }; } } exports.EnvFrom = EnvFrom; _e = JSII_RTTI_SYMBOL_1; EnvFrom[_e] = { fqn: "cdk8s-plus-28.EnvFrom", version: "2.5.6" }; function extractContainerPorts(selector) { if (!selector) { return []; } // we don't use instanceof intentionally since it can create // cyclic import problems. const containers = selector.containers ?? []; return containers.flatMap(c => c.ports); } exports.extractContainerPorts = extractContainerPorts; /** * Container environment variables. */ class Env { constructor(sources, variables) { this._sources = sources; this._variables = variables; } /** * Selects a ConfigMap to populate the environment variables with. * The contents of the target ConfigMap's Data field will represent * the key-value pairs as environment variables. */ static fromConfigMap(configMap, prefix) { return new EnvFrom(configMap, prefix, undefined); } /** * Selects a Secret to populate the environment variables with. * The contents of the target Secret's Data field will represent * the key-value pairs as environment variables. */ static fromSecret(secr) { return new EnvFrom(undefined, undefined, secr); } /** * Add a single variable by name and value. * The variable value can come from various dynamic sources such a secrets of config maps. * Use `EnvValue.fromXXX` to select sources. */ addVariable(name, value) { this._variables[name] = value; } /** * The environment variables for this container. * Returns a copy. To add environment variables use `container.env.addVariable()`. */ get variables() { return { ...this._variables }; } /** * Add a collection of variables by copying from another source. * Use `Env.fromXXX` functions to select sources. */ copyFrom(from) { this._sources.push(from); } /** * The list of sources used to populate the container environment, * in addition to the `variables`. * * Returns a copy. To add a source use `container.env.copyFrom()`. */ get sources() { return [...this._sources]; } renderEnv(env) { const result = new Array(); for (const [name, v] of Object.entries(env)) { result.push({ name, value: v.value, valueFrom: v.valueFrom, }); } return result; } /** * @internal */ _toKube() { return { from: utils_1.undefinedIfEmpty(this._sources.map(s => s._toKube())), variables: utils_1.undefinedIfEmpty(this.renderEnv(this._variables)), }; } } exports.Env = Env; _f = JSII_RTTI_SYMBOL_1; Env[_f] = { fqn: "cdk8s-plus-28.Env", version: "2.5.6" }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGFpbmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbnRhaW5lci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLGlDQUE2QjtBQUc3QixxQ0FBcUM7QUFDckMsaUNBQWlDO0FBRWpDLG1DQUEyQztBQUczQzs7R0FFRztBQUNILElBQVksVUF5S1g7QUF6S0QsV0FBWSxVQUFVO0lBQ3BCOztPQUVHO0lBQ0gseUJBQVcsQ0FBQTtJQUNYOztPQUVHO0lBQ0gsNkNBQStCLENBQUE7SUFDL0I7O09BRUc7SUFDSCx1Q0FBeUIsQ0FBQTtJQUN6Qjs7T0FFRztJQUNILHlDQUEyQixDQUFBO0lBQzNCOztPQUVHO0lBQ0gsNkNBQStCLENBQUE7SUFDL0I7O09BRUc7SUFDSCx5QkFBVyxDQUFBO0lBQ1g7O09BRUc7SUFDSCx1REFBeUMsQ0FBQTtJQUN6Qzs7T0FFRztJQUNILDZCQUFlLENBQUE7SUFDZjs7T0FFRztJQUNILDJDQUE2QixDQUFBO0lBQzdCOztPQUVHO0lBQ0gsaURBQW1DLENBQUE7SUFDbkM7O09BRUc7SUFDSCwrQkFBaUIsQ0FBQTtJQUNqQjs7T0FFRztJQUNILCtCQUFpQixDQUFBO0lBQ2pCOztPQUVHO0lBQ0gsbUNBQXFCLENBQUE7SUFDckI7O09BRUc7SUFDSCxxQ0FBdUIsQ0FBQTtJQUN2Qjs7T0FFRztJQUNILDJCQUFhLENBQUE7SUFDYjs7T0FFRztJQUNILDZCQUFlLENBQUE7SUFDZjs7T0FFRztJQUNILGlEQUFtQyxDQUFBO0lBQ25DOztPQUVHO0lBQ0gscUNBQXVCLENBQUE7SUFDdkI7O09BRUc7SUFDSCwyQ0FBNkIsQ0FBQTtJQUM3Qjs7T0FFRztJQUNILDZCQUFlLENBQUE7SUFDZjs7T0FFRztJQUNILHFDQUF1QixDQUFBO0lBQ3ZCOztPQUVHO0lBQ0gsbURBQXFDLENBQUE7SUFDckM7O09BRUc7SUFDSCw2Q0FBK0IsQ0FBQTtJQUMvQjs7T0FFRztJQUNILGlDQUFtQixDQUFBO0lBQ25COztP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TUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFRDs7T0FFRztJQUNJLE9BQU87UUFDWixPQUFPO1lBQ0wsSUFBSSxFQUFFLHdCQUFnQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7WUFDM0QsU0FBUyxFQUFFLHdCQUFnQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1NBQzdELENBQUM7SUFDSixDQUFDOztBQW5GSCxrQkFvRkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTaXplIH0gZnJvbSAnY2RrOHMnO1xuaW1wb3J0ICogYXMgY29uZmlnbWFwIGZyb20gJy4vY29uZmlnLW1hcCc7XG5pbXBvcnQgKiBhcyBoYW5kbGVyIGZyb20gJy4vaGFuZGxlcic7XG5pbXBvcnQgKiBhcyBrOHMgZnJvbSAnLi9pbXBvcnRzL2s4cyc7XG5pbXBvcnQgKiBhcyBwcm9iZSBmcm9tICcuL3Byb2JlJztcbmltcG9ydCAqIGFzIHNlY3JldCBmcm9tICcuL3NlY3JldCc7XG5pbXBvcnQgeyB1bmRlZmluZWRJZkVtcHR5IH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgKiBhcyB2b2x1bWUgZnJvbSAnLi92b2x1bWUnO1xuXG4vKipcbiAqIENhcGFiaWxpdHkgLSBjb21wbGV0ZSBsaXN0IG9mIFBPU0lYIGNhcGFiaWxpdGllc1xuICovXG5leHBvcnQgZW51bSBDYXBhYmlsaXR5IHtcbiAgLyoqXG4gICAqIEFMTFxuICAgKi9cbiAgQUxMID0gJ0FMTCcsXG4gIC8qKlxuICAgKiBDQVBfQVVESVRfQ09OVFJPTFxuICAgKi9cbiAgQVVESVRfQ09OVFJPTCA9ICdBVURJVF9DT05UUk9MJyxcbiAgLyoqXG4gICAqIENBUF9BVURJVF9SRUFEXG4gICAqL1xuICBBVURJVF9SRUFEID0gJ0FVRElUX1JFQUQnLFxuICAvKipcbiAgICogQ0FQX0FVRElUX1dSSVRFXG4gICAqL1xuICBBVURJVF9XUklURSA9ICdBVURJVF9XUklURScsXG4gIC8qKlxuICAgKiBDQVBfQkxPQ0tfU1VTUEVORFxuICAgKi9cbiAgQkxPQ0tfU1VTUEVORCA9ICdCTE9DS19TVVNQRU5EJyxcbiAgLyoqXG4gICAqIENBUF9CUEZcbiAgICovXG4gIEJQRiA9ICdCUEYnLFxuICAvKipcbiAgICogQ0FQX0NIRUNLUE9JTlRfUkVTVE9SRVxuICAgKi9cbiAgQ0hFQ0tQT0lOVF9SRVNUT1JFID0gJ0NIRUNLUE9JTlRfUkVTVE9SRScsXG4gIC8qKlxuICAgKiBDQVBfQ0hPV05cbiAgICovXG4gIENIT1dOID0gJ0NIT1dOJyxcbiAgLyoqXG4gICAqIENBUF9EQUNfT1ZFUlJJREVcbiAgICovXG4gIERBQ19PVkVSUklERSA9ICdEQUNfT1ZFUlJJREUnLFxuICAvKipcbiAgICogQ0FQX0RBQ19SRUFEX1NFQVJDSFxuICAgKi9cbiAgREFDX1JFQURfU0VBUkNIID0gJ0RBQ19SRUFEX1NFQVJDSCcsXG4gIC8qKlxuICAgKiBDQVBfRk9XTkVSXG4gICAqL1xuICBGT1dORVIgPSAnRk9XTkVSJyxcbiAgLyoqXG4gICAqIENBUF9GU0VUSURcbiAgICovXG4gIEZTRVRJRCA9ICdGU0VUSUQnLFxuICAvKipcbiAgICogQ0FQX0lQQ19MT0NLXG4gICAqL1xuICBJUENfTE9DSyA9ICdJUENfTE9DSycsXG4gIC8qKlxuICAgKiBDQVBfSVBDX09XTkVSXG4gICAqL1xuICBJUENfT1dORVIgPSAnSVBDX09XTkVSJyxcbiAgLyoqXG4gICAqIENBUF9LSUxMXG4gICAqL1xuICBLSUxMID0gJ0tJTEwnLFxuICAvKipcbiAgICogQ0FQX0xFQVNFXG4gICAqL1xuICBMRUFTRSA9ICdMRUFTRScsXG4gIC8qKlxuICAgKiBDQVBfTElOVVhfSU1NVVRBQkxFXG4gICAqL1xuICBMSU5VWF9JTU1VVEFCTEUgPSAnTElOVVhfSU1NVVRBQkxFJyxcbiAgLyoqXG4gICAqIENBUF9NQUNfQURNSU5cbiAgICovXG4gIE1BQ19BRE1JTiA9ICdNQUNfQURNSU4nLFxuICAvKipcbiAgICogQ0FQX01BQ19PVkVSUklERVxuICAgKi9cbiAgTUFDX09WRVJSSURFID0gJ01BQ19PVkVSUklERScsXG4gIC8qKlxuICAgKiBDQVBfTUtOT0RcbiAgICovXG4gIE1LTk9EID0gJ01LTk9EJyxcbiAgLyoqXG4gICAqIENBUF9ORVRfQURNSU5cbiAgICovXG4gIE5FVF9BRE1JTiA9ICdORVRfQURNSU4nLFxuICAvKipcbiAgICogQ0FQX05FVF9CSU5EX1NFUlZJQ0VcbiAgICovXG4gIE5FVF9CSU5EX1NFUlZJQ0UgPSAnTkVUX0JJTkRfU0VSVklDRScsXG4gIC8qKlxuICAgKiBDQVBfTkVUX0JST0FEQ0FTVFxuICAgKi9cbiAgTkVUX0JST0FEQ0FTVCA9ICdORVRfQlJPQURDQVNUJyxcbiAgLyoqXG4gICAqIENBUF9ORVRfUkFXXG4gICAqL1xuICBORVRfUkFXID0gJ05FVF9SQVcnLFxuICAvKipcbiAgICogQ0FQX1BFUkZNT05cbiAgICovXG4gIFBFUkZNT04gPSAnUEVSRk1PTicsXG4gIC8qKlxuICAgKiBDQVBfU0VUR0lEXG4gICAqL1xuICBTRVRHSUQgPSAnU0VUR0lEJyxcbiAgLyoqXG4