UNPKG

@aws-cdk/aws-eks-v2-alpha

Version:

This module is deprecated. All constructs are now available under aws-cdk-lib/aws-eks-v2

116 lines 18.9 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.KubernetesManifest = void 0; const jsiiDeprecationWarnings = require("../.warnings.jsii.js"); const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); const core_1 = require("aws-cdk-lib/core"); const constructs_1 = require("constructs"); const alb_controller_1 = require("./alb-controller"); const kubectl_provider_1 = require("./kubectl-provider"); const PRUNE_LABEL_PREFIX = 'aws.cdk.eks/prune-'; /** * Represents a manifest within the Kubernetes system. * * Alternatively, you can use `cluster.addManifest(resource[, resource, ...])` * to define resources on this cluster. * * Applies/deletes the manifest using `kubectl`. */ class KubernetesManifest extends constructs_1.Construct { static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-eks-v2-alpha.KubernetesManifest", version: "2.240.0-alpha.0" }; /** * The CloudFormation resource type. */ static RESOURCE_TYPE = 'Custom::AWSCDK-EKS-KubernetesResource'; constructor(scope, id, props) { super(scope, id); try { jsiiDeprecationWarnings.print("@aws-cdk/aws-eks-v2-alpha.KubernetesManifest", ""); jsiiDeprecationWarnings._aws_cdk_aws_eks_v2_alpha_KubernetesManifestProps(props); } catch (error) { if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { Error.captureStackTrace(error, KubernetesManifest); } throw error; } const stack = core_1.Stack.of(this); const provider = kubectl_provider_1.KubectlProvider.getKubectlProvider(this, props.cluster); if (!provider) { throw new core_1.ValidationError('Kubectl Provider is not defined in this cluster. Define it when creating the cluster', this); } const prune = props.prune ?? props.cluster.prune; const pruneLabel = prune ? this.injectPruneLabel(props.manifest) : undefined; if (props.ingressAlb ?? false) { this.injectIngressAlbAnnotations(props.manifest, props.ingressAlbScheme ?? alb_controller_1.AlbScheme.INTERNAL); } const customResource = new core_1.CustomResource(this, 'Resource', { serviceToken: provider.serviceToken, resourceType: KubernetesManifest.RESOURCE_TYPE, removalPolicy: props.removalPolicy, properties: { // `toJsonString` enables embedding CDK tokens in the manifest and will // render a CloudFormation-compatible JSON string (similar to // StepFunctions, CloudWatch Dashboards etc). Manifest: stack.toJsonString(props.manifest), ClusterName: props.cluster.clusterName, PruneLabel: pruneLabel, Overwrite: props.overwrite, SkipValidation: props.skipValidation, }, }); this.node.defaultChild = customResource.node.defaultChild; } /** * Injects a generated prune label to all resources in this manifest. The * label name will be `awscdk.eks/manifest-ADDR` where `ADDR` is the address * of the construct in the construct tree. * * @returns the label name */ injectPruneLabel(manifest) { // max label name is 64 chars and addrs is always 42. const pruneLabel = PRUNE_LABEL_PREFIX + constructs_1.Node.of(this).addr; for (const resource of manifest) { // skip resource if it's not an object or if it does not have a "kind" if (typeof (resource) !== 'object' || !resource.kind) { continue; } if (!resource.metadata) { resource.metadata = {}; } if (!resource.metadata.labels) { resource.metadata.labels = {}; } resource.metadata.labels = { [pruneLabel]: '', ...resource.metadata.labels, }; } return pruneLabel; } /** * Inject the necessary ingress annontations if possible (and requested). * * @see https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.2/guide/ingress/annotations/ */ injectIngressAlbAnnotations(manifest, scheme) { for (const resource of manifest) { // skip resource if it's not an object or if it does not have a "kind" if (typeof (resource) !== 'object' || !resource.kind) { continue; } if (resource.kind === 'Ingress') { resource.metadata.annotations = { 'kubernetes.io/ingress.class': 'alb', 'alb.ingress.kubernetes.io/scheme': scheme, ...resource.metadata.annotations, }; } } } } exports.KubernetesManifest = KubernetesManifest; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiazhzLW1hbmlmZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiazhzLW1hbmlmZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQ0EsMkNBQTBFO0FBQzFFLDJDQUE2QztBQUM3QyxxREFBNkM7QUFFN0MseURBQXFEO0FBRXJELE1BQU0sa0JBQWtCLEdBQUcsb0JBQW9CLENBQUM7QUFtSGhEOzs7Ozs7O0dBT0c7QUFDSCxNQUFhLGtCQUFtQixTQUFRLHNCQUFTOztJQUMvQzs7T0FFRztJQUNJLE1BQU0sQ0FBVSxhQUFhLEdBQUcsdUNBQXVDLENBQUM7SUFFL0UsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUE4QjtRQUN0RSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDOzs7Ozs7OytDQVBSLGtCQUFrQjs7OztRQVMzQixNQUFNLEtBQUssR0FBRyxZQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdCLE1BQU0sUUFBUSxHQUFHLGtDQUFlLENBQUMsa0JBQWtCLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN6RSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDZCxNQUFNLElBQUksc0JBQWUsQ0FBQyxzRkFBc0YsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUMxSCxDQUFDO1FBRUQsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztRQUNqRCxNQUFNLFVBQVUsR0FBRyxLQUFLO1lBQ3RCLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQztZQUN2QyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBRWQsSUFBSSxLQUFLLENBQUMsVUFBVSxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQzlCLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxnQkFBZ0IsSUFBSSwwQkFBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2pHLENBQUM7UUFFRCxNQUFNLGNBQWMsR0FBRyxJQUFJLHFCQUFjLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRTtZQUMxRCxZQUFZLEVBQUUsUUFBUSxDQUFDLFlBQVk7WUFDbkMsWUFBWSxFQUFFLGtCQUFrQixDQUFDLGFBQWE7WUFDOUMsYUFBYSxFQUFFLEtBQUssQ0FBQyxhQUFhO1lBQ2xDLFVBQVUsRUFBRTtnQkFDVix1RUFBdUU7Z0JBQ3ZFLDZEQUE2RDtnQkFDN0QsNkNBQTZDO2dCQUM3QyxRQUFRLEVBQUUsS0FBSyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDO2dCQUM1QyxXQUFXLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxXQUFXO2dCQUN0QyxVQUFVLEVBQUUsVUFBVTtnQkFDdEIsU0FBUyxFQUFFLEtBQUssQ0FBQyxTQUFTO2dCQUMxQixjQUFjLEVBQUUsS0FBSyxDQUFDLGNBQWM7YUFDckM7U0FDRixDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQztLQUMzRDtJQUVEOzs7Ozs7T0FNRztJQUNLLGdCQUFnQixDQUFDLFFBQStCO1FBQ3RELHFEQUFxRDtRQUNyRCxNQUFNLFVBQVUsR0FBRyxrQkFBa0IsR0FBRyxpQkFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFFM0QsS0FBSyxNQUFNLFFBQVEsSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUNoQyxzRUFBc0U7WUFDdEUsSUFBSSxPQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssUUFBUSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUNwRCxTQUFTO1lBQ1gsQ0FBQztZQUVELElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ3ZCLFFBQVEsQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO1lBQ3pCLENBQUM7WUFFRCxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDOUIsUUFBUSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDO1lBQ2hDLENBQUM7WUFFRCxRQUFRLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRztnQkFDekIsQ0FBQyxVQUFVLENBQUMsRUFBRSxFQUFFO2dCQUNoQixHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTTthQUM1QixDQUFDO1FBQ0osQ0FBQztRQUVELE9BQU8sVUFBVSxDQUFDO0tBQ25CO0lBRUQ7Ozs7T0FJRztJQUNLLDJCQUEyQixDQUFDLFFBQStCLEVBQUUsTUFBaUI7UUFDcEYsS0FBSyxNQUFNLFFBQVEsSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUNoQyxzRUFBc0U7WUFDdEUsSUFBSSxPQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssUUFBUSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUNwRCxTQUFTO1lBQ1gsQ0FBQztZQUVELElBQUksUUFBUSxDQUFDLElBQUksS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDaEMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEdBQUc7b0JBQzlCLDZCQUE2QixFQUFFLEtBQUs7b0JBQ3BDLGtDQUFrQyxFQUFFLE1BQU07b0JBQzFDLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQyxXQUFXO2lCQUNqQyxDQUFDO1lBQ0osQ0FBQztRQUNILENBQUM7S0FDRjs7QUFqR0gsZ0RBa0dDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBSZW1vdmFsUG9saWN5IH0gZnJvbSAnYXdzLWNkay1saWIvY29yZSc7XG5pbXBvcnQgeyBDdXN0b21SZXNvdXJjZSwgU3RhY2ssIFZhbGlkYXRpb25FcnJvciB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUnO1xuaW1wb3J0IHsgQ29uc3RydWN0LCBOb2RlIH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBBbGJTY2hlbWUgfSBmcm9tICcuL2FsYi1jb250cm9sbGVyJztcbmltcG9ydCB0eXBlIHsgSUNsdXN0ZXIgfSBmcm9tICcuL2NsdXN0ZXInO1xuaW1wb3J0IHsgS3ViZWN0bFByb3ZpZGVyIH0gZnJvbSAnLi9rdWJlY3RsLXByb3ZpZGVyJztcblxuY29uc3QgUFJVTkVfTEFCRUxfUFJFRklYID0gJ2F3cy5jZGsuZWtzL3BydW5lLSc7XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgYEt1YmVybmV0ZXNNYW5pZmVzdGAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgS3ViZXJuZXRlc01hbmlmZXN0T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBXaGVuIGEgcmVzb3VyY2UgaXMgcmVtb3ZlZCBmcm9tIGEgS3ViZXJuZXRlcyBtYW5pZmVzdCwgaXQgbm8gbG9uZ2VyIGFwcGVhcnNcbiAgICogaW4gdGhlIG1hbmlmZXN0LCBhbmQgdGhlcmUgaXMgbm8gd2F5IHRvIGtub3cgdGhhdCB0aGlzIHJlc291cmNlIG5lZWRzIHRvIGJlXG4gICAqIGRlbGV0ZWQuIFRvIGFkZHJlc3MgdGhpcywgYGt1YmVjdGwgYXBwbHlgIGhhcyBhIGAtLXBydW5lYCBvcHRpb24gd2hpY2ggd2lsbFxuICAgKiBxdWVyeSB0aGUgY2x1c3RlciBmb3IgYWxsIHJlc291cmNlcyB3aXRoIGEgc3BlY2lmaWMgbGFiZWwgYW5kIHdpbGwgcmVtb3ZlXG4gICAqIGFsbCB0aGUgbGFiZWxkIHJlc291cmNlcyB0aGF0IGFyZSBub3QgcGFydCBvZiB0aGUgYXBwbGllZCBtYW5pZmVzdC4gSWYgdGhpc1xuICAgKiBvcHRpb24gaXMgZGlzYWJsZWQgYW5kIGEgcmVzb3VyY2UgaXMgcmVtb3ZlZCwgaXQgd2lsbCBiZWNvbWUgXCJvcnBoYW5lZFwiIGFuZFxuICAgKiB3aWxsIG5vdCBiZSBkZWxldGVkIGZyb20gdGhlIGNsdXN0ZXIuXG4gICAqXG4gICAqIFdoZW4gdGhpcyBvcHRpb24gaXMgZW5hYmxlZCAoZGVmYXVsdCksIHRoZSBjb25zdHJ1Y3Qgd2lsbCBpbmplY3QgYSBsYWJlbCB0b1xuICAgKiBhbGwgS3ViZXJuZXRlcyByZXNvdXJjZXMgaW5jbHVkZWQgaW4gdGhpcyBtYW5pZmVzdCB3aGljaCB3aWxsIGJlIHVzZWQgdG9cbiAgICogcHJ1bmUgcmVzb3VyY2VzIHdoZW4gdGhlIG1hbmlmZXN0IGNoYW5nZXMgdmlhIGBrdWJlY3RsIGFwcGx5IC0tcHJ1bmVgLlxuICAgKlxuICAgKiBUaGUgbGFiZWwgbmFtZSB3aWxsIGJlIGBhd3MuY2RrLmVrcy9wcnVuZS08QUREUj5gIHdoZXJlIGA8QUREUj5gIGlzIHRoZVxuICAgKiA0Mi1jaGFyIHVuaXF1ZSBhZGRyZXNzIG9mIHRoaXMgY29uc3RydWN0IGluIHRoZSBjb25zdHJ1Y3QgdHJlZS4gVmFsdWUgaXNcbiAgICogZW1wdHkuXG4gICAqXG4gICAqIEBzZWVcbiAgICogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvdGFza3MvbWFuYWdlLWt1YmVybmV0ZXMtb2JqZWN0cy9kZWNsYXJhdGl2ZS1jb25maWcvI2FsdGVybmF0aXZlLWt1YmVjdGwtYXBwbHktZi1kaXJlY3RvcnktcHJ1bmUtbC15b3VyLWxhYmVsXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYmFzZWQgb24gdGhlIHBydW5lIG9wdGlvbiBvZiB0aGUgY2x1c3Rlciwgd2hpY2ggaXMgYHRydWVgIHVubGVzc1xuICAgKiBvdGhlcndpc2Ugc3BlY2lmaWVkLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJ1bmU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIGZsYWcgdG8gc2lnbmlmeSBpZiB0aGUgbWFuaWZlc3QgdmFsaWRhdGlvbiBzaG91bGQgYmUgc2tpcHBlZFxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgc2tpcFZhbGlkYXRpb24/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBdXRvbWF0aWNhbGx5IGRldGVjdCBgSW5ncmVzc2AgcmVzb3VyY2VzIGluIHRoZSBtYW5pZmVzdCBhbmQgYW5ub3RhdGUgdGhlbSBzbyB0aGV5XG4gICAqIGFyZSBwaWNrZWQgdXAgYnkgYW4gQUxCIEluZ3Jlc3MgQ29udHJvbGxlci5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGluZ3Jlc3NBbGI/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IHRoZSBBTEIgc2NoZW1lIHRoYXQgc2hvdWxkIGJlIGFwcGxpZWQgdG8gYEluZ3Jlc3NgIHJlc291cmNlcy5cbiAgICogT25seSBhcHBsaWNhYmxlIGlmIGBpbmdyZXNzQWxiYCBpcyBzZXQgdG8gYHRydWVgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBBbGJTY2hlbWUuSU5URVJOQUxcbiAgICovXG4gIHJlYWRvbmx5IGluZ3Jlc3NBbGJTY2hlbWU/OiBBbGJTY2hlbWU7XG5cbiAgLyoqXG4gICAqIFRoZSByZW1vdmFsIHBvbGljeSBhcHBsaWVkIHRvIHRoZSBjdXN0b20gcmVzb3VyY2UgdGhhdCBtYW5hZ2VzIHRoZSBLdWJlcm5ldGVzIG1hbmlmZXN0LlxuICAgKlxuICAgKiBUaGUgcmVtb3ZhbCBwb2xpY3kgY29udHJvbHMgd2hhdCBoYXBwZW5zIHRvIHRoZSByZXNvdXJjZSBpZiBpdCBzdG9wcyBiZWluZyBtYW5hZ2VkIGJ5IENsb3VkRm9ybWF0aW9uLlxuICAgKiBUaGlzIGNhbiBoYXBwZW4gaW4gb25lIG9mIHRocmVlIHNpdHVhdGlvbnM6XG4gICAqXG4gICAqIC0gVGhlIHJlc291cmNlIGlzIHJlbW92ZWQgZnJvbSB0aGUgdGVtcGxhdGUsIHNvIENsb3VkRm9ybWF0aW9uIHN0b3BzIG1hbmFnaW5nIGl0XG4gICAqIC0gQSBjaGFuZ2UgdG8gdGhlIHJlc291cmNlIGlzIG1hZGUgdGhhdCByZXF1aXJlcyBpdCB0byBiZSByZXBsYWNlZCwgc28gQ2xvdWRGb3JtYXRpb24gc3RvcHMgbWFuYWdpbmcgaXRcbiAgICogLSBUaGUgc3RhY2sgaXMgZGVsZXRlZCwgc28gQ2xvdWRGb3JtYXRpb24gc3RvcHMgbWFuYWdpbmcgYWxsIHJlc291cmNlcyBpbiBpdFxuICAgKlxuICAgKiBAZGVmYXVsdCBSZW1vdmFsUG9saWN5LkRFU1RST1lcbiAgICovXG4gIHJlYWRvbmx5IHJlbW92YWxQb2xpY3k/OiBSZW1vdmFsUG9saWN5O1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIEt1YmVybmV0ZXNNYW5pZmVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEt1YmVybmV0ZXNNYW5pZmVzdFByb3BzIGV4dGVuZHMgS3ViZXJuZXRlc01hbmlmZXN0T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgRUtTIGNsdXN0ZXIgdG8gYXBwbHkgdGhpcyBtYW5pZmVzdCB0by5cbiAgICpcbiAgICogW2Rpc2FibGUtYXdzbGludDpyZWYtdmlhLWludGVyZmFjZV1cbiAgICovXG4gIHJlYWRvbmx5IGNsdXN0ZXI6IElDbHVzdGVyO1xuXG4gIC8qKlxuICAgKiBUaGUgbWFuaWZlc3QgdG8gYXBwbHkuXG4gICAqXG4gICAqIENvbnNpc3RzIG9mIGFueSBudW1iZXIgb2YgY2hpbGQgcmVzb3VyY2VzLlxuICAgKlxuICAgKiBXaGVuIHRoZSByZXNvdXJjZXMgYXJlIGNyZWF0ZWQvdXBkYXRlZCwgdGhpcyBtYW5pZmVzdCB3aWxsIGJlIGFwcGxpZWQgdG8gdGhlXG4gICAqIGNsdXN0ZXIgdGhyb3VnaCBga3ViZWN0bCBhcHBseWAgYW5kIHdoZW4gdGhlIHJlc291cmNlcyBvciB0aGUgc3RhY2sgaXNcbiAgICogZGVsZXRlZCwgdGhlIHJlc291cmNlcyBpbiB0aGUgbWFuaWZlc3Qgd2lsbCBiZSBkZWxldGVkIHRocm91Z2ggYGt1YmVjdGwgZGVsZXRlYC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogW3tcbiAgICogICBhcGlWZXJzaW9uOiAndjEnLFxuICAgKiAgIGtpbmQ6ICdQb2QnLFxuICAgKiAgIG1ldGFkYXRhOiB7IG5hbWU6ICdteXBvZCcgfSxcbiAgICogICBzcGVjOiB7XG4gICAqICAgICBjb250YWluZXJzOiBbIHsgbmFtZTogJ2hlbGxvJywgaW1hZ2U6ICdwYXVsYm91d2VyL2hlbGxvLWt1YmVybmV0ZXM6MS41JywgcG9ydHM6IFsgeyBjb250YWluZXJQb3J0OiA4MDgwIH0gXSB9IF1cbiAgICogICB9XG4gICAqIH1dXG4gICAqXG4gICAqL1xuICByZWFkb25seSBtYW5pZmVzdDogUmVjb3JkPHN0cmluZywgYW55PltdO1xuXG4gIC8qKlxuICAgKiBPdmVyd3JpdGUgYW55IGV4aXN0aW5nIHJlc291cmNlcy5cbiAgICpcbiAgICogSWYgdGhpcyBpcyBzZXQsIHdlIHdpbGwgdXNlIGBrdWJlY3RsIGFwcGx5YCBpbnN0ZWFkIG9mIGBrdWJlY3RsIGNyZWF0ZWBcbiAgICogd2hlbiB0aGUgcmVzb3VyY2UgaXMgY3JlYXRlZC4gT3RoZXJ3aXNlLCBpZiB0aGVyZSBpcyBhbHJlYWR5IGEgcmVzb3VyY2VcbiAgICogaW4gdGhlIGNsdXN0ZXIgd2l0aCB0aGUgc2FtZSBuYW1lLCB0aGUgb3BlcmF0aW9uIHdpbGwgZmFpbC5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IG92ZXJ3cml0ZT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIG1hbmlmZXN0IHdpdGhpbiB0aGUgS3ViZXJuZXRlcyBzeXN0ZW0uXG4gKlxuICogQWx0ZXJuYXRpdmVseSwgeW91IGNhbiB1c2UgYGNsdXN0ZXIuYWRkTWFuaWZlc3QocmVzb3VyY2VbLCByZXNvdXJjZSwgLi4uXSlgXG4gKiB0byBkZWZpbmUgcmVzb3VyY2VzIG9uIHRoaXMgY2x1c3Rlci5cbiAqXG4gKiBBcHBsaWVzL2RlbGV0ZXMgdGhlIG1hbmlmZXN0IHVzaW5nIGBrdWJlY3RsYC5cbiAqL1xuZXhwb3J0IGNsYXNzIEt1YmVybmV0ZXNNYW5pZmVzdCBleHRlbmRzIENvbnN0cnVjdCB7XG4gIC8qKlxuICAgKiBUaGUgQ2xvdWRGb3JtYXRpb24gcmVzb3VyY2UgdHlwZS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgUkVTT1VSQ0VfVFlQRSA9ICdDdXN0b206OkFXU0NESy1FS1MtS3ViZXJuZXRlc1Jlc291cmNlJztcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogS3ViZXJuZXRlc01hbmlmZXN0UHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgY29uc3Qgc3RhY2sgPSBTdGFjay5vZih0aGlzKTtcbiAgICBjb25zdCBwcm92aWRlciA9IEt1YmVjdGxQcm92aWRlci5nZXRLdWJlY3RsUHJvdmlkZXIodGhpcywgcHJvcHMuY2x1c3Rlcik7XG4gICAgaWYgKCFwcm92aWRlcikge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcignS3ViZWN0bCBQcm92aWRlciBpcyBub3QgZGVmaW5lZCBpbiB0aGlzIGNsdXN0ZXIuIERlZmluZSBpdCB3aGVuIGNyZWF0aW5nIHRoZSBjbHVzdGVyJywgdGhpcyk7XG4gICAgfVxuXG4gICAgY29uc3QgcHJ1bmUgPSBwcm9wcy5wcnVuZSA/PyBwcm9wcy5jbHVzdGVyLnBydW5lO1xuICAgIGNvbnN0IHBydW5lTGFiZWwgPSBwcnVuZVxuICAgICAgPyB0aGlzLmluamVjdFBydW5lTGFiZWwocHJvcHMubWFuaWZlc3QpXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIGlmIChwcm9wcy5pbmdyZXNzQWxiID8/IGZhbHNlKSB7XG4gICAgICB0aGlzLmluamVjdEluZ3Jlc3NBbGJBbm5vdGF0aW9ucyhwcm9wcy5tYW5pZmVzdCwgcHJvcHMuaW5ncmVzc0FsYlNjaGVtZSA/PyBBbGJTY2hlbWUuSU5URVJOQUwpO1xuICAgIH1cblxuICAgIGNvbnN0IGN1c3RvbVJlc291cmNlID0gbmV3IEN1c3RvbVJlc291cmNlKHRoaXMsICdSZXNvdXJjZScsIHtcbiAgICAgIHNlcnZpY2VUb2tlbjogcHJvdmlkZXIuc2VydmljZVRva2VuLFxuICAgICAgcmVzb3VyY2VUeXBlOiBLdWJlcm5ldGVzTWFuaWZlc3QuUkVTT1VSQ0VfVFlQRSxcbiAgICAgIHJlbW92YWxQb2xpY3k6IHByb3BzLnJlbW92YWxQb2xpY3ksXG4gICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIC8vIGB0b0pzb25TdHJpbmdgIGVuYWJsZXMgZW1iZWRkaW5nIENESyB0b2tlbnMgaW4gdGhlIG1hbmlmZXN0IGFuZCB3aWxsXG4gICAgICAgIC8vIHJlbmRlciBhIENsb3VkRm9ybWF0aW9uLWNvbXBhdGlibGUgSlNPTiBzdHJpbmcgKHNpbWlsYXIgdG9cbiAgICAgICAgLy8gU3RlcEZ1bmN0aW9ucywgQ2xvdWRXYXRjaCBEYXNoYm9hcmRzIGV0YykuXG4gICAgICAgIE1hbmlmZXN0OiBzdGFjay50b0pzb25TdHJpbmcocHJvcHMubWFuaWZlc3QpLFxuICAgICAgICBDbHVzdGVyTmFtZTogcHJvcHMuY2x1c3Rlci5jbHVzdGVyTmFtZSxcbiAgICAgICAgUHJ1bmVMYWJlbDogcHJ1bmVMYWJlbCxcbiAgICAgICAgT3ZlcndyaXRlOiBwcm9wcy5vdmVyd3JpdGUsXG4gICAgICAgIFNraXBWYWxpZGF0aW9uOiBwcm9wcy5za2lwVmFsaWRhdGlvbixcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICB0aGlzLm5vZGUuZGVmYXVsdENoaWxkID0gY3VzdG9tUmVzb3VyY2Uubm9kZS5kZWZhdWx0Q2hpbGQ7XG4gIH1cblxuICAvKipcbiAgICogSW5qZWN0cyBhIGdlbmVyYXRlZCBwcnVuZSBsYWJlbCB0byBhbGwgcmVzb3VyY2VzIGluIHRoaXMgbWFuaWZlc3QuIFRoZVxuICAgKiBsYWJlbCBuYW1lIHdpbGwgYmUgYGF3c2Nkay5la3MvbWFuaWZlc3QtQUREUmAgd2hlcmUgYEFERFJgIGlzIHRoZSBhZGRyZXNzXG4gICAqIG9mIHRoZSBjb25zdHJ1Y3QgaW4gdGhlIGNvbnN0cnVjdCB0cmVlLlxuICAgKlxuICAgKiBAcmV0dXJucyB0aGUgbGFiZWwgbmFtZVxuICAgKi9cbiAgcHJpdmF0ZSBpbmplY3RQcnVuZUxhYmVsKG1hbmlmZXN0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+W10pOiBzdHJpbmcge1xuICAgIC8vIG1heCBsYWJlbCBuYW1lIGlzIDY0IGNoYXJzIGFuZCBhZGRycyBpcyBhbHdheXMgNDIuXG4gICAgY29uc3QgcHJ1bmVMYWJlbCA9IFBSVU5FX0xBQkVMX1BSRUZJWCArIE5vZGUub2YodGhpcykuYWRkcjtcblxuICAgIGZvciAoY29uc3QgcmVzb3VyY2Ugb2YgbWFuaWZlc3QpIHtcbiAgICAgIC8vIHNraXAgcmVzb3VyY2UgaWYgaXQncyBub3QgYW4gb2JqZWN0IG9yIGlmIGl0IGRvZXMgbm90IGhhdmUgYSBcImtpbmRcIlxuICAgICAgaWYgKHR5cGVvZihyZXNvdXJjZSkgIT09ICdvYmplY3QnIHx8ICFyZXNvdXJjZS5raW5kKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXJlc291cmNlLm1ldGFkYXRhKSB7XG4gICAgICAgIHJlc291cmNlLm1ldGFkYXRhID0ge307XG4gICAgICB9XG5cbiAgICAgIGlmICghcmVzb3VyY2UubWV0YWRhdGEubGFiZWxzKSB7XG4gICAgICAgIHJlc291cmNlLm1ldGFkYXRhLmxhYmVscyA9IHt9O1xuICAgICAgfVxuXG4gICAgICByZXNvdXJjZS5tZXRhZGF0YS5sYWJlbHMgPSB7XG4gICAgICAgIFtwcnVuZUxhYmVsXTogJycsXG4gICAgICAgIC4uLnJlc291cmNlLm1ldGFkYXRhLmxhYmVscyxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHBydW5lTGFiZWw7XG4gIH1cblxuICAvKipcbiAgICogSW5qZWN0IHRoZSBuZWNlc3NhcnkgaW5ncmVzcyBhbm5vbnRhdGlvbnMgaWYgcG9zc2libGUgKGFuZCByZXF1ZXN0ZWQpLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8va3ViZXJuZXRlcy1zaWdzLmdpdGh1Yi5pby9hd3MtbG9hZC1iYWxhbmNlci1jb250cm9sbGVyL3YyLjIvZ3VpZGUvaW5ncmVzcy9hbm5vdGF0aW9ucy9cbiAgICovXG4gIHByaXZhdGUgaW5qZWN0SW5ncmVzc0FsYkFubm90YXRpb25zKG1hbmlmZXN0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+W10sIHNjaGVtZTogQWxiU2NoZW1lKSB7XG4gICAgZm9yIChjb25zdCByZXNvdXJjZSBvZiBtYW5pZmVzdCkge1xuICAgICAgLy8gc2tpcCByZXNvdXJjZSBpZiBpdCdzIG5vdCBhbiBvYmplY3Qgb3IgaWYgaXQgZG9lcyBub3QgaGF2ZSBhIFwia2luZFwiXG4gICAgICBpZiAodHlwZW9mKHJlc291cmNlKSAhPT0gJ29iamVjdCcgfHwgIXJlc291cmNlLmtpbmQpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXNvdXJjZS5raW5kID09PSAnSW5ncmVzcycpIHtcbiAgICAgICAgcmVzb3VyY2UubWV0YWRhdGEuYW5ub3RhdGlvbnMgPSB7XG4gICAgICAgICAgJ2t1YmVybmV0ZXMuaW8vaW5ncmVzcy5jbGFzcyc6ICdhbGInLFxuICAgICAgICAgICdhbGIuaW5ncmVzcy5rdWJlcm5ldGVzLmlvL3NjaGVtZSc6IHNjaGVtZSxcbiAgICAgICAgICAuLi5yZXNvdXJjZS5tZXRhZGF0YS5hbm5vdGF0aW9ucyxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdfQ==