@fjall/components-infrastructure 0.78.6 → 0.79.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,74 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.RdsDeletionWaiter = void 0;
4
- const aws_cdk_lib_1 = require("aws-cdk-lib");
5
- const aws_lambda_1 = require("aws-cdk-lib/aws-lambda");
6
- const aws_iam_1 = require("aws-cdk-lib/aws-iam");
7
- const constructs_1 = require("constructs");
8
- const customResource_1 = require("../utilities/customResource");
9
- class RdsDeletionWaiter extends constructs_1.Construct {
10
- constructor(scope, id, props) {
11
- super(scope, id);
12
- const timeout = props.timeout ?? aws_cdk_lib_1.Duration.minutes(10);
13
- this.customResource = new customResource_1.CustomResource(this, "Resource", {
14
- runtime: aws_lambda_1.Runtime.NODEJS_18_X,
15
- timeout: timeout.plus(aws_cdk_lib_1.Duration.seconds(30)),
16
- lambdaDescription: "RDS deletion waiter handler",
17
- roleDescription: "RDS deletion waiter lambda role",
18
- inlineCode: `
19
- const { RDSClient } = require('@aws-sdk/client-rds');
20
- const { waitUntilDBInstanceAvailable } = require('@aws-sdk/client-rds');
21
-
22
- exports.handler = async (event) => {
23
- console.log('Event:', JSON.stringify(event, null, 2));
24
-
25
- const instanceId = event.ResourceProperties.InstanceIdentifier;
26
- const physicalResourceId = event.PhysicalResourceId || event.LogicalResourceId || 'rds-deletion-waiter';
27
-
28
- // Only wait on Delete - Create/Update return immediately
29
- if (event.RequestType === 'Delete') {
30
- console.log('Waiting for instance to be available:', instanceId);
31
- const client = new RDSClient({});
32
-
33
- try {
34
- await waitUntilDBInstanceAvailable(
35
- { client, maxWaitTime: ${timeout.toSeconds()}, minDelay: 10, maxDelay: 30 },
36
- { DBInstanceIdentifier: instanceId }
37
- );
38
- console.log('Instance is available, deletion can proceed');
39
- } catch (error) {
40
- // Instance not found is fine - it may already be deleted or never existed
41
- if (error.name === 'ResourceNotFoundError' ||
42
- error.message?.includes('DBInstanceNotFound') ||
43
- error.state === 'FAILURE') {
44
- console.log('Instance not found or waiter failed, proceeding with deletion');
45
- } else {
46
- console.error('Error waiting for instance:', error);
47
- throw error;
48
- }
49
- }
50
- }
51
-
52
- return { PhysicalResourceId: physicalResourceId };
53
- };
54
- `,
55
- inlinePolicy: {
56
- rdsDescribe: new aws_iam_1.PolicyDocument({
57
- statements: [
58
- new aws_iam_1.PolicyStatement({
59
- effect: aws_iam_1.Effect.ALLOW,
60
- actions: ["rds:DescribeDBInstances"],
61
- resources: ["*"]
62
- })
63
- ]
64
- })
65
- },
66
- properties: {
67
- InstanceIdentifier: props.instanceIdentifier,
68
- Version: "1.0.0"
69
- }
70
- });
71
- }
72
- }
73
- exports.RdsDeletionWaiter = RdsDeletionWaiter;
74
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmRzRGVsZXRpb25XYWl0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWIvcmVzb3VyY2VzL2F3cy9kYXRhYmFzZS9yZHNEZWxldGlvbldhaXRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2Q0FBdUM7QUFDdkMsdURBQWlEO0FBQ2pELGlEQUE4RTtBQUM5RSwyQ0FBdUM7QUFDdkMsZ0VBQTZEO0FBOEI3RCxNQUFhLGlCQUFrQixTQUFRLHNCQUFTO0lBRzlDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBNkI7UUFDckUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsT0FBTyxJQUFJLHNCQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRXRELElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSwrQkFBYyxDQUFDLElBQUksRUFBRSxVQUFVLEVBQUU7WUFDekQsT0FBTyxFQUFFLG9CQUFPLENBQUMsV0FBVztZQUM1QixPQUFPLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxzQkFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUMzQyxpQkFBaUIsRUFBRSw2QkFBNkI7WUFDaEQsZUFBZSxFQUFFLGlDQUFpQztZQUNsRCxVQUFVLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7O2lDQWlCZSxPQUFPLENBQUMsU0FBUyxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O09BbUI3QztZQUNELFlBQVksRUFBRTtnQkFDWixXQUFXLEVBQUUsSUFBSSx3QkFBYyxDQUFDO29CQUM5QixVQUFVLEVBQUU7d0JBQ1YsSUFBSSx5QkFBZSxDQUFDOzRCQUNsQixNQUFNLEVBQUUsZ0JBQU0sQ0FBQyxLQUFLOzRCQUNwQixPQUFPLEVBQUUsQ0FBQyx5QkFBeUIsQ0FBQzs0QkFDcEMsU0FBUyxFQUFFLENBQUMsR0FBRyxDQUFDO3lCQUNqQixDQUFDO3FCQUNIO2lCQUNGLENBQUM7YUFDSDtZQUNELFVBQVUsRUFBRTtnQkFDVixrQkFBa0IsRUFBRSxLQUFLLENBQUMsa0JBQWtCO2dCQUM1QyxPQUFPLEVBQUUsT0FBTzthQUNqQjtTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQW5FRCw4Q0FtRUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEdXJhdGlvbiB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHsgUnVudGltZSB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbGFtYmRhXCI7XG5pbXBvcnQgeyBQb2xpY3lEb2N1bWVudCwgUG9saWN5U3RhdGVtZW50LCBFZmZlY3QgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWlhbVwiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IEN1c3RvbVJlc291cmNlIH0gZnJvbSBcIi4uL3V0aWxpdGllcy9jdXN0b21SZXNvdXJjZVwiO1xuXG4vKipcbiAqIFJEUyBEZWxldGlvbiBXYWl0ZXIgLSBFbnN1cmVzIFJEUyBpbnN0YW5jZSBpcyBzdGFibGUgYmVmb3JlIGRlbGV0aW9uXG4gKlxuICogUHJvYmxlbTogV2hlbiBhbiBSRFMgcmVhZCByZXBsaWNhIGlzIGRlbGV0ZWQsIHRoZSBwcmltYXJ5IGRhdGFiYXNlIGVudGVyc1xuICogYSBcIm1vZGlmeWluZ1wiIHN0YXRlIGFzIGl0IHVwZGF0ZXMgaXRzIHJlcGxpY2F0aW9uIGNvbmZpZ3VyYXRpb24uIElmIENsb3VkRm9ybWF0aW9uXG4gKiBpbW1lZGlhdGVseSB0cmllcyB0byBkZWxldGUgdGhlIHByaW1hcnkgd2l0aCBhIGZpbmFsIHNuYXBzaG90LCBpdCBmYWlscyBiZWNhdXNlXG4gKiBzbmFwc2hvdHMgcmVxdWlyZSB0aGUgaW5zdGFuY2UgdG8gYmUgaW4gXCJhdmFpbGFibGVcIiBzdGF0ZS5cbiAqXG4gKiBTb2x1dGlvbjogVGhpcyBjdXN0b20gcmVzb3VyY2UgYWN0cyBhcyBhIGRlcGVuZGVuY3kgZ2F0ZS4gV2hlbiBDbG91ZEZvcm1hdGlvblxuICogZGVsZXRlcyByZXNvdXJjZXMgaW4gcmV2ZXJzZSBkZXBlbmRlbmN5IG9yZGVyOlxuICogICAxLiBSZWFkIHJlcGxpY2EgaXMgZGVsZXRlZCAodHJpZ2dlcnMgcHJpbWFyeSB0byBlbnRlciBcIm1vZGlmeWluZ1wiIHN0YXRlKVxuICogICAyLiBUaGlzIHdhaXRlcidzIG9uRGVsZXRlIGlzIGludm9rZWQgLSB1c2VzIEFXUyBTREsgd2FpdGVyIHVudGlsIHByaW1hcnkgaXMgXCJhdmFpbGFibGVcIlxuICogICAzLiBQcmltYXJ5IGRhdGFiYXNlIGNhbiBub3cgYmUgc2FmZWx5IGRlbGV0ZWQgd2l0aCBhIGZpbmFsIHNuYXBzaG90XG4gKlxuICovXG5cbmludGVyZmFjZSBSZHNEZWxldGlvbldhaXRlclByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBSRFMgaW5zdGFuY2UgaWRlbnRpZmllciB0byB3YWl0IGZvciBkdXJpbmcgZGVsZXRpb25cbiAgICovXG4gIGluc3RhbmNlSWRlbnRpZmllcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBNYXhpbXVtIHRpbWUgdG8gd2FpdCBmb3IgdGhlIGluc3RhbmNlIHRvIGJlY29tZSBhdmFpbGFibGUgKGRlZmF1bHQ6IDEwIG1pbnV0ZXMpXG4gICAqL1xuICB0aW1lb3V0PzogRHVyYXRpb247XG59XG5cbmV4cG9ydCBjbGFzcyBSZHNEZWxldGlvbldhaXRlciBleHRlbmRzIENvbnN0cnVjdCB7XG4gIHB1YmxpYyByZWFkb25seSBjdXN0b21SZXNvdXJjZTogQ3VzdG9tUmVzb3VyY2U7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFJkc0RlbGV0aW9uV2FpdGVyUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgY29uc3QgdGltZW91dCA9IHByb3BzLnRpbWVvdXQgPz8gRHVyYXRpb24ubWludXRlcygxMCk7XG5cbiAgICB0aGlzLmN1c3RvbVJlc291cmNlID0gbmV3IEN1c3RvbVJlc291cmNlKHRoaXMsIFwiUmVzb3VyY2VcIiwge1xuICAgICAgcnVudGltZTogUnVudGltZS5OT0RFSlNfMThfWCxcbiAgICAgIHRpbWVvdXQ6IHRpbWVvdXQucGx1cyhEdXJhdGlvbi5zZWNvbmRzKDMwKSksXG4gICAgICBsYW1iZGFEZXNjcmlwdGlvbjogXCJSRFMgZGVsZXRpb24gd2FpdGVyIGhhbmRsZXJcIixcbiAgICAgIHJvbGVEZXNjcmlwdGlvbjogXCJSRFMgZGVsZXRpb24gd2FpdGVyIGxhbWJkYSByb2xlXCIsXG4gICAgICBpbmxpbmVDb2RlOiBgXG5jb25zdCB7IFJEU0NsaWVudCB9ID0gcmVxdWlyZSgnQGF3cy1zZGsvY2xpZW50LXJkcycpO1xuY29uc3QgeyB3YWl0VW50aWxEQkluc3RhbmNlQXZhaWxhYmxlIH0gPSByZXF1aXJlKCdAYXdzLXNkay9jbGllbnQtcmRzJyk7XG5cbmV4cG9ydHMuaGFuZGxlciA9IGFzeW5jIChldmVudCkgPT4ge1xuICBjb25zb2xlLmxvZygnRXZlbnQ6JywgSlNPTi5zdHJpbmdpZnkoZXZlbnQsIG51bGwsIDIpKTtcblxuICBjb25zdCBpbnN0YW5jZUlkID0gZXZlbnQuUmVzb3VyY2VQcm9wZXJ0aWVzLkluc3RhbmNlSWRlbnRpZmllcjtcbiAgY29uc3QgcGh5c2ljYWxSZXNvdXJjZUlkID0gZXZlbnQuUGh5c2ljYWxSZXNvdXJjZUlkIHx8IGV2ZW50LkxvZ2ljYWxSZXNvdXJjZUlkIHx8ICdyZHMtZGVsZXRpb24td2FpdGVyJztcblxuICAvLyBPbmx5IHdhaXQgb24gRGVsZXRlIC0gQ3JlYXRlL1VwZGF0ZSByZXR1cm4gaW1tZWRpYXRlbHlcbiAgaWYgKGV2ZW50LlJlcXVlc3RUeXBlID09PSAnRGVsZXRlJykge1xuICAgIGNvbnNvbGUubG9nKCdXYWl0aW5nIGZvciBpbnN0YW5jZSB0byBiZSBhdmFpbGFibGU6JywgaW5zdGFuY2VJZCk7XG4gICAgY29uc3QgY2xpZW50ID0gbmV3IFJEU0NsaWVudCh7fSk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgd2FpdFVudGlsREJJbnN0YW5jZUF2YWlsYWJsZShcbiAgICAgICAgeyBjbGllbnQsIG1heFdhaXRUaW1lOiAke3RpbWVvdXQudG9TZWNvbmRzKCl9LCBtaW5EZWxheTogMTAsIG1heERlbGF5OiAzMCB9LFxuICAgICAgICB7IERCSW5zdGFuY2VJZGVudGlmaWVyOiBpbnN0YW5jZUlkIH1cbiAgICAgICk7XG4gICAgICBjb25zb2xlLmxvZygnSW5zdGFuY2UgaXMgYXZhaWxhYmxlLCBkZWxldGlvbiBjYW4gcHJvY2VlZCcpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBJbnN0YW5jZSBub3QgZm91bmQgaXMgZmluZSAtIGl0IG1heSBhbHJlYWR5IGJlIGRlbGV0ZWQgb3IgbmV2ZXIgZXhpc3RlZFxuICAgICAgaWYgKGVycm9yLm5hbWUgPT09ICdSZXNvdXJjZU5vdEZvdW5kRXJyb3InIHx8XG4gICAgICAgICAgZXJyb3IubWVzc2FnZT8uaW5jbHVkZXMoJ0RCSW5zdGFuY2VOb3RGb3VuZCcpIHx8XG4gICAgICAgICAgZXJyb3Iuc3RhdGUgPT09ICdGQUlMVVJFJykge1xuICAgICAgICBjb25zb2xlLmxvZygnSW5zdGFuY2Ugbm90IGZvdW5kIG9yIHdhaXRlciBmYWlsZWQsIHByb2NlZWRpbmcgd2l0aCBkZWxldGlvbicpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3Igd2FpdGluZyBmb3IgaW5zdGFuY2U6JywgZXJyb3IpO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4geyBQaHlzaWNhbFJlc291cmNlSWQ6IHBoeXNpY2FsUmVzb3VyY2VJZCB9O1xufTtcbiAgICAgIGAsXG4gICAgICBpbmxpbmVQb2xpY3k6IHtcbiAgICAgICAgcmRzRGVzY3JpYmU6IG5ldyBQb2xpY3lEb2N1bWVudCh7XG4gICAgICAgICAgc3RhdGVtZW50czogW1xuICAgICAgICAgICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgICAgIGVmZmVjdDogRWZmZWN0LkFMTE9XLFxuICAgICAgICAgICAgICBhY3Rpb25zOiBbXCJyZHM6RGVzY3JpYmVEQkluc3RhbmNlc1wiXSxcbiAgICAgICAgICAgICAgcmVzb3VyY2VzOiBbXCIqXCJdXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIF1cbiAgICAgICAgfSlcbiAgICAgIH0sXG4gICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIEluc3RhbmNlSWRlbnRpZmllcjogcHJvcHMuaW5zdGFuY2VJZGVudGlmaWVyLFxuICAgICAgICBWZXJzaW9uOiBcIjEuMC4wXCJcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuIl19
@@ -1,20 +0,0 @@
1
- import { Construct } from "constructs";
2
- import { Stack, type StackProps } from "aws-cdk-lib";
3
- import { type KeyValue } from "../../../types";
4
- interface VpcEndpointProps extends StackProps {
5
- vpcId: string;
6
- service: string;
7
- tags: KeyValue;
8
- }
9
- export declare class VpcEndpoint extends Construct {
10
- private vpc;
11
- private securityGroups;
12
- constructor(scope: Construct, id: string, props: VpcEndpointProps);
13
- addVpc(vpcId: string): void;
14
- addSecurityGroup(service: string): void;
15
- addEntrypoint(props: VpcEndpointProps): void;
16
- }
17
- export declare class VpcEndpointStack extends Stack {
18
- constructor(scope: Construct, id: string, props: VpcEndpointProps);
19
- }
20
- export {};
@@ -1,59 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.VpcEndpointStack = exports.VpcEndpoint = void 0;
4
- const constructs_1 = require("constructs");
5
- const aws_ec2_1 = require("aws-cdk-lib/aws-ec2");
6
- const securityGroup_1 = require("../iam/securityGroup");
7
- const aws_cdk_lib_1 = require("aws-cdk-lib");
8
- const vpc_1 = require("./vpc");
9
- class VpcEndpoint extends constructs_1.Construct {
10
- constructor(scope, id, props) {
11
- super(scope, id);
12
- this.securityGroups = [];
13
- this.addVpc(props.vpcId);
14
- this.addSecurityGroup(props.service);
15
- this.addEntrypoint(props);
16
- }
17
- addVpc(vpcId) {
18
- this.vpc = vpc_1.Vpc.fromLookup(this, `Vpc`, {
19
- vpcId: vpcId
20
- });
21
- }
22
- addSecurityGroup(service) {
23
- const securityGroup = new securityGroup_1.SecurityGroup(this, `securityGroup`, {
24
- vpc: this.vpc,
25
- description: `Security group for the ${this.vpc.vpcId} VPC endpoint`
26
- });
27
- if (service === "com.amazonaws.us-east-1.datasync") {
28
- const ports = [80, 443, 22, { fromPort: 1024, toPort: 1064 }];
29
- ports.forEach((port) => {
30
- if (typeof port === "number") {
31
- securityGroup.addIngressRule(aws_ec2_1.Peer.anyIpv4(), aws_ec2_1.Port.tcp(port), `Allow traffic on port ${port} from the VPC endpoint`);
32
- }
33
- else {
34
- securityGroup.addIngressRule(aws_ec2_1.Peer.anyIpv4(), aws_ec2_1.Port.tcpRange(port.fromPort, port.toPort), `Allow traffic on port range ${port.fromPort}-${port.toPort} from the VPC endpoint`);
35
- }
36
- });
37
- }
38
- this.securityGroups.push(securityGroup);
39
- }
40
- addEntrypoint(props) {
41
- new aws_ec2_1.InterfaceVpcEndpoint(this, "VpcEndpoint", {
42
- vpc: this.vpc,
43
- service: new aws_ec2_1.InterfaceVpcEndpointService(props.service),
44
- lookupSupportedAzs: true,
45
- securityGroups: this.securityGroups
46
- });
47
- }
48
- }
49
- exports.VpcEndpoint = VpcEndpoint;
50
- class VpcEndpointStack extends aws_cdk_lib_1.Stack {
51
- constructor(scope, id, props) {
52
- super(scope, id, props);
53
- new VpcEndpoint(this, "VpcEndpoint", {
54
- ...props
55
- });
56
- }
57
- }
58
- exports.VpcEndpointStack = VpcEndpointStack;
59
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidnBjRW5kcG9pbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWIvcmVzb3VyY2VzL2F3cy9uZXR3b3JraW5nL3ZwY0VuZHBvaW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDJDQUF1QztBQUN2QyxpREFPNkI7QUFDN0Isd0RBQXFEO0FBQ3JELDZDQUFxRDtBQUVyRCwrQkFBNEI7QUFRNUIsTUFBYSxXQUFZLFNBQVEsc0JBQVM7SUFJeEMsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUF1QjtRQUMvRCxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBSFgsbUJBQWMsR0FBcUIsRUFBRSxDQUFDO1FBSzVDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3pCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDckMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBRUQsTUFBTSxDQUFDLEtBQWE7UUFDbEIsSUFBSSxDQUFDLEdBQUcsR0FBRyxTQUFHLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUU7WUFDckMsS0FBSyxFQUFFLEtBQUs7U0FDYixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsT0FBZTtRQUM5QixNQUFNLGFBQWEsR0FBRyxJQUFJLDZCQUFhLENBQUMsSUFBSSxFQUFFLGVBQWUsRUFBRTtZQUM3RCxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUc7WUFDYixXQUFXLEVBQUUsMEJBQTBCLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxlQUFlO1NBQ3JFLENBQUMsQ0FBQztRQUVILElBQUksT0FBTyxLQUFLLGtDQUFrQyxFQUFFLENBQUM7WUFDbkQsTUFBTSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFFOUQsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUNyQixJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO29CQUM3QixhQUFhLENBQUMsY0FBYyxDQUMxQixjQUFJLENBQUMsT0FBTyxFQUFFLEVBQ2QsY0FBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFDZCx5QkFBeUIsSUFBSSx3QkFBd0IsQ0FDdEQsQ0FBQztnQkFDSixDQUFDO3FCQUFNLENBQUM7b0JBQ04sYUFBYSxDQUFDLGNBQWMsQ0FDMUIsY0FBSSxDQUFDLE9BQU8sRUFBRSxFQUNkLGNBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQ3pDLCtCQUErQixJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxNQUFNLHdCQUF3QixDQUNwRixDQUFDO2dCQUNKLENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7UUFDRCxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQsYUFBYSxDQUFDLEtBQXVCO1FBQ25DLElBQUksOEJBQW9CLENBQUMsSUFBSSxFQUFFLGFBQWEsRUFBRTtZQUM1QyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUc7WUFDYixPQUFPLEVBQUUsSUFBSSxxQ0FBMkIsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDO1lBQ3ZELGtCQUFrQixFQUFFLElBQUk7WUFDeEIsY0FBYyxFQUFFLElBQUksQ0FBQyxjQUFjO1NBQ3BDLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQXRERCxrQ0FzREM7QUFFRCxNQUFhLGdCQUFpQixTQUFRLG1CQUFLO0lBQ3pDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBdUI7UUFDL0QsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFeEIsSUFBSSxXQUFXLENBQUMsSUFBSSxFQUFFLGFBQWEsRUFBRTtZQUNuQyxHQUFHLEtBQUs7U0FDVCxDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0Y7QUFSRCw0Q0FRQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQge1xuICBJbnRlcmZhY2VWcGNFbmRwb2ludCxcbiAgSW50ZXJmYWNlVnBjRW5kcG9pbnRTZXJ2aWNlLFxuICB0eXBlIElTZWN1cml0eUdyb3VwLFxuICB0eXBlIElWcGMsXG4gIFBlZXIsXG4gIFBvcnRcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1lYzJcIjtcbmltcG9ydCB7IFNlY3VyaXR5R3JvdXAgfSBmcm9tIFwiLi4vaWFtL3NlY3VyaXR5R3JvdXBcIjtcbmltcG9ydCB7IFN0YWNrLCB0eXBlIFN0YWNrUHJvcHMgfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7IHR5cGUgS2V5VmFsdWUgfSBmcm9tIFwiLi4vLi4vLi4vdHlwZXNcIjtcbmltcG9ydCB7IFZwYyB9IGZyb20gXCIuL3ZwY1wiO1xuXG5pbnRlcmZhY2UgVnBjRW5kcG9pbnRQcm9wcyBleHRlbmRzIFN0YWNrUHJvcHMge1xuICB2cGNJZDogc3RyaW5nO1xuICBzZXJ2aWNlOiBzdHJpbmc7XG4gIHRhZ3M6IEtleVZhbHVlO1xufVxuXG5leHBvcnQgY2xhc3MgVnBjRW5kcG9pbnQgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICBwcml2YXRlIHZwYzogSVZwYztcbiAgcHJpdmF0ZSBzZWN1cml0eUdyb3VwczogSVNlY3VyaXR5R3JvdXBbXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBWcGNFbmRwb2ludFByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIHRoaXMuYWRkVnBjKHByb3BzLnZwY0lkKTtcbiAgICB0aGlzLmFkZFNlY3VyaXR5R3JvdXAocHJvcHMuc2VydmljZSk7XG4gICAgdGhpcy5hZGRFbnRyeXBvaW50KHByb3BzKTtcbiAgfVxuXG4gIGFkZFZwYyh2cGNJZDogc3RyaW5nKSB7XG4gICAgdGhpcy52cGMgPSBWcGMuZnJvbUxvb2t1cCh0aGlzLCBgVnBjYCwge1xuICAgICAgdnBjSWQ6IHZwY0lkXG4gICAgfSk7XG4gIH1cblxuICBhZGRTZWN1cml0eUdyb3VwKHNlcnZpY2U6IHN0cmluZykge1xuICAgIGNvbnN0IHNlY3VyaXR5R3JvdXAgPSBuZXcgU2VjdXJpdHlHcm91cCh0aGlzLCBgc2VjdXJpdHlHcm91cGAsIHtcbiAgICAgIHZwYzogdGhpcy52cGMsXG4gICAgICBkZXNjcmlwdGlvbjogYFNlY3VyaXR5IGdyb3VwIGZvciB0aGUgJHt0aGlzLnZwYy52cGNJZH0gVlBDIGVuZHBvaW50YFxuICAgIH0pO1xuXG4gICAgaWYgKHNlcnZpY2UgPT09IFwiY29tLmFtYXpvbmF3cy51cy1lYXN0LTEuZGF0YXN5bmNcIikge1xuICAgICAgY29uc3QgcG9ydHMgPSBbODAsIDQ0MywgMjIsIHsgZnJvbVBvcnQ6IDEwMjQsIHRvUG9ydDogMTA2NCB9XTtcblxuICAgICAgcG9ydHMuZm9yRWFjaCgocG9ydCkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIHBvcnQgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICBzZWN1cml0eUdyb3VwLmFkZEluZ3Jlc3NSdWxlKFxuICAgICAgICAgICAgUGVlci5hbnlJcHY0KCksXG4gICAgICAgICAgICBQb3J0LnRjcChwb3J0KSxcbiAgICAgICAgICAgIGBBbGxvdyB0cmFmZmljIG9uIHBvcnQgJHtwb3J0fSBmcm9tIHRoZSBWUEMgZW5kcG9pbnRgXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzZWN1cml0eUdyb3VwLmFkZEluZ3Jlc3NSdWxlKFxuICAgICAgICAgICAgUGVlci5hbnlJcHY0KCksXG4gICAgICAgICAgICBQb3J0LnRjcFJhbmdlKHBvcnQuZnJvbVBvcnQsIHBvcnQudG9Qb3J0KSxcbiAgICAgICAgICAgIGBBbGxvdyB0cmFmZmljIG9uIHBvcnQgcmFuZ2UgJHtwb3J0LmZyb21Qb3J0fS0ke3BvcnQudG9Qb3J0fSBmcm9tIHRoZSBWUEMgZW5kcG9pbnRgXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuc2VjdXJpdHlHcm91cHMucHVzaChzZWN1cml0eUdyb3VwKTtcbiAgfVxuXG4gIGFkZEVudHJ5cG9pbnQocHJvcHM6IFZwY0VuZHBvaW50UHJvcHMpIHtcbiAgICBuZXcgSW50ZXJmYWNlVnBjRW5kcG9pbnQodGhpcywgXCJWcGNFbmRwb2ludFwiLCB7XG4gICAgICB2cGM6IHRoaXMudnBjLFxuICAgICAgc2VydmljZTogbmV3IEludGVyZmFjZVZwY0VuZHBvaW50U2VydmljZShwcm9wcy5zZXJ2aWNlKSxcbiAgICAgIGxvb2t1cFN1cHBvcnRlZEF6czogdHJ1ZSxcbiAgICAgIHNlY3VyaXR5R3JvdXBzOiB0aGlzLnNlY3VyaXR5R3JvdXBzXG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFZwY0VuZHBvaW50U3RhY2sgZXh0ZW5kcyBTdGFjayB7XG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBWcGNFbmRwb2ludFByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCBwcm9wcyk7XG5cbiAgICBuZXcgVnBjRW5kcG9pbnQodGhpcywgXCJWcGNFbmRwb2ludFwiLCB7XG4gICAgICAuLi5wcm9wc1xuICAgIH0pO1xuICB9XG59XG4iXX0=
@@ -1,71 +0,0 @@
1
- import { Construct } from "constructs";
2
- import { type IVpc, GatewayVpcEndpoint, InterfaceVpcEndpoint } from "aws-cdk-lib/aws-ec2";
3
- /**
4
- * Gateway VPC endpoint configuration for resource layer.
5
- */
6
- export interface VpcGatewayEndpointsConfig {
7
- /** Enable S3 Gateway endpoint. Default: true */
8
- s3?: boolean;
9
- /** Enable DynamoDB Gateway endpoint. Default: true */
10
- dynamodb?: boolean;
11
- }
12
- /**
13
- * Interface VPC endpoint configuration for resource layer.
14
- * Interface endpoints cost money (~$7-15/month each) but provide private connectivity.
15
- */
16
- export interface VpcInterfaceEndpointsConfig {
17
- /** ECR endpoints (dkr + api) for container image pulls. ~$15/month */
18
- ecr?: boolean;
19
- /** Secrets Manager endpoint for secret access. ~$7/month */
20
- secretsManager?: boolean;
21
- /** KMS endpoint for CMK operations. ~$7/month */
22
- kms?: boolean;
23
- /** CloudWatch Logs endpoint for log shipping. ~$7/month */
24
- cloudwatchLogs?: boolean;
25
- /** Systems Manager endpoint. ~$7/month */
26
- ssm?: boolean;
27
- /** STS endpoint for assume-role operations. ~$7/month */
28
- sts?: boolean;
29
- }
30
- /**
31
- * Props for creating VPC endpoints.
32
- */
33
- export interface VpcEndpointsProps {
34
- /** The VPC to create endpoints in. Required. */
35
- vpc: IVpc;
36
- /**
37
- * Gateway endpoints (FREE).
38
- * - Omit: enabled with defaults (s3: true, dynamodb: true)
39
- * - `{}`: enabled with defaults
40
- * - `{ s3: true, dynamodb: false }`: specific configuration
41
- * - `false`: explicitly disabled
42
- */
43
- gateway?: VpcGatewayEndpointsConfig | false;
44
- /**
45
- * Interface endpoints (cost money).
46
- * - Omit: disabled (default)
47
- * - `{}`: disabled (must specify which endpoints)
48
- * - `{ ecr: true, kms: true }`: specific endpoints
49
- * - `false`: explicitly disabled
50
- */
51
- interface?: VpcInterfaceEndpointsConfig | false;
52
- }
53
- /**
54
- * Creates VPC endpoints for AWS services.
55
- *
56
- * Gateway endpoints (S3, DynamoDB) are FREE and should always be enabled.
57
- * They route traffic directly to the service without going through NAT.
58
- *
59
- * Interface endpoints cost money but provide private connectivity to AWS services.
60
- * They're useful for:
61
- * - Security: Traffic stays within AWS network
62
- * - Cost: Avoid NAT Gateway data processing charges for high-volume services
63
- * - Latency: Direct path to service
64
- */
65
- export declare class VpcEndpoints extends Construct {
66
- readonly gatewayEndpoints: GatewayVpcEndpoint[];
67
- readonly interfaceEndpoints: InterfaceVpcEndpoint[];
68
- constructor(scope: Construct, id: string, props: VpcEndpointsProps);
69
- private addGatewayEndpoints;
70
- private addInterfaceEndpoints;
71
- }
@@ -1,125 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.VpcEndpoints = void 0;
4
- const constructs_1 = require("constructs");
5
- const aws_ec2_1 = require("aws-cdk-lib/aws-ec2");
6
- /**
7
- * Creates VPC endpoints for AWS services.
8
- *
9
- * Gateway endpoints (S3, DynamoDB) are FREE and should always be enabled.
10
- * They route traffic directly to the service without going through NAT.
11
- *
12
- * Interface endpoints cost money but provide private connectivity to AWS services.
13
- * They're useful for:
14
- * - Security: Traffic stays within AWS network
15
- * - Cost: Avoid NAT Gateway data processing charges for high-volume services
16
- * - Latency: Direct path to service
17
- */
18
- class VpcEndpoints extends constructs_1.Construct {
19
- constructor(scope, id, props) {
20
- super(scope, id);
21
- this.gatewayEndpoints = [];
22
- this.interfaceEndpoints = [];
23
- this.addGatewayEndpoints(props);
24
- this.addInterfaceEndpoints(props);
25
- }
26
- addGatewayEndpoints(props) {
27
- const gatewayConfig = props.gateway;
28
- if (gatewayConfig === false) {
29
- return;
30
- }
31
- const enableS3 = gatewayConfig?.s3 ?? true;
32
- const enableDynamodb = gatewayConfig?.dynamodb ?? true;
33
- if (enableS3) {
34
- const s3Endpoint = new aws_ec2_1.GatewayVpcEndpoint(this, "S3Endpoint", {
35
- vpc: props.vpc,
36
- service: aws_ec2_1.GatewayVpcEndpointAwsService.S3
37
- });
38
- this.gatewayEndpoints.push(s3Endpoint);
39
- }
40
- if (enableDynamodb) {
41
- const dynamoEndpoint = new aws_ec2_1.GatewayVpcEndpoint(this, "DynamoDBEndpoint", {
42
- vpc: props.vpc,
43
- service: aws_ec2_1.GatewayVpcEndpointAwsService.DYNAMODB
44
- });
45
- this.gatewayEndpoints.push(dynamoEndpoint);
46
- }
47
- }
48
- addInterfaceEndpoints(props) {
49
- const interfaceConfig = props.interface;
50
- if (interfaceConfig === false || interfaceConfig === undefined) {
51
- return;
52
- }
53
- if (interfaceConfig.ecr) {
54
- const ecrDockerEndpoint = new aws_ec2_1.InterfaceVpcEndpoint(this, "EcrDockerEndpoint", {
55
- vpc: props.vpc,
56
- service: aws_ec2_1.InterfaceVpcEndpointAwsService.ECR_DOCKER,
57
- privateDnsEnabled: true,
58
- subnets: { subnetType: aws_ec2_1.SubnetType.PRIVATE_WITH_EGRESS }
59
- });
60
- this.interfaceEndpoints.push(ecrDockerEndpoint);
61
- const ecrApiEndpoint = new aws_ec2_1.InterfaceVpcEndpoint(this, "EcrApiEndpoint", {
62
- vpc: props.vpc,
63
- service: aws_ec2_1.InterfaceVpcEndpointAwsService.ECR,
64
- privateDnsEnabled: true,
65
- subnets: { subnetType: aws_ec2_1.SubnetType.PRIVATE_WITH_EGRESS }
66
- });
67
- this.interfaceEndpoints.push(ecrApiEndpoint);
68
- }
69
- if (interfaceConfig.secretsManager) {
70
- const smEndpoint = new aws_ec2_1.InterfaceVpcEndpoint(this, "SecretsManagerEndpoint", {
71
- vpc: props.vpc,
72
- service: aws_ec2_1.InterfaceVpcEndpointAwsService.SECRETS_MANAGER,
73
- privateDnsEnabled: true,
74
- subnets: { subnetType: aws_ec2_1.SubnetType.PRIVATE_WITH_EGRESS }
75
- });
76
- this.interfaceEndpoints.push(smEndpoint);
77
- }
78
- if (interfaceConfig.kms) {
79
- const kmsEndpoint = new aws_ec2_1.InterfaceVpcEndpoint(this, "KmsEndpoint", {
80
- vpc: props.vpc,
81
- service: aws_ec2_1.InterfaceVpcEndpointAwsService.KMS,
82
- privateDnsEnabled: true,
83
- subnets: { subnetType: aws_ec2_1.SubnetType.PRIVATE_WITH_EGRESS }
84
- });
85
- this.interfaceEndpoints.push(kmsEndpoint);
86
- }
87
- if (interfaceConfig.cloudwatchLogs) {
88
- const cwLogsEndpoint = new aws_ec2_1.InterfaceVpcEndpoint(this, "CloudWatchLogsEndpoint", {
89
- vpc: props.vpc,
90
- service: aws_ec2_1.InterfaceVpcEndpointAwsService.CLOUDWATCH_LOGS,
91
- privateDnsEnabled: true,
92
- subnets: { subnetType: aws_ec2_1.SubnetType.PRIVATE_WITH_EGRESS }
93
- });
94
- this.interfaceEndpoints.push(cwLogsEndpoint);
95
- }
96
- if (interfaceConfig.ssm) {
97
- const ssmEndpoint = new aws_ec2_1.InterfaceVpcEndpoint(this, "SsmEndpoint", {
98
- vpc: props.vpc,
99
- service: aws_ec2_1.InterfaceVpcEndpointAwsService.SSM,
100
- privateDnsEnabled: true,
101
- subnets: { subnetType: aws_ec2_1.SubnetType.PRIVATE_WITH_EGRESS }
102
- });
103
- this.interfaceEndpoints.push(ssmEndpoint);
104
- // SSM also needs SSM Messages endpoint for session manager
105
- const ssmMessagesEndpoint = new aws_ec2_1.InterfaceVpcEndpoint(this, "SsmMessagesEndpoint", {
106
- vpc: props.vpc,
107
- service: aws_ec2_1.InterfaceVpcEndpointAwsService.SSM_MESSAGES,
108
- privateDnsEnabled: true,
109
- subnets: { subnetType: aws_ec2_1.SubnetType.PRIVATE_WITH_EGRESS }
110
- });
111
- this.interfaceEndpoints.push(ssmMessagesEndpoint);
112
- }
113
- if (interfaceConfig.sts) {
114
- const stsEndpoint = new aws_ec2_1.InterfaceVpcEndpoint(this, "StsEndpoint", {
115
- vpc: props.vpc,
116
- service: aws_ec2_1.InterfaceVpcEndpointAwsService.STS,
117
- privateDnsEnabled: true,
118
- subnets: { subnetType: aws_ec2_1.SubnetType.PRIVATE_WITH_EGRESS }
119
- });
120
- this.interfaceEndpoints.push(stsEndpoint);
121
- }
122
- }
123
- }
124
- exports.VpcEndpoints = VpcEndpoints;
125
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidnBjRW5kcG9pbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGliL3Jlc291cmNlcy9hd3MvbmV0d29ya2luZy92cGNFbmRwb2ludHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMkNBQXVDO0FBQ3ZDLGlEQU82QjtBQXVEN0I7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxNQUFhLFlBQWEsU0FBUSxzQkFBUztJQUl6QyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQXdCO1FBQ2hFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFKSCxxQkFBZ0IsR0FBeUIsRUFBRSxDQUFDO1FBQzVDLHVCQUFrQixHQUEyQixFQUFFLENBQUM7UUFLOUQsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRU8sbUJBQW1CLENBQUMsS0FBd0I7UUFDbEQsTUFBTSxhQUFhLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQztRQUVwQyxJQUFJLGFBQWEsS0FBSyxLQUFLLEVBQUUsQ0FBQztZQUM1QixPQUFPO1FBQ1QsQ0FBQztRQUVELE1BQU0sUUFBUSxHQUFHLGFBQWEsRUFBRSxFQUFFLElBQUksSUFBSSxDQUFDO1FBQzNDLE1BQU0sY0FBYyxHQUFHLGFBQWEsRUFBRSxRQUFRLElBQUksSUFBSSxDQUFDO1FBRXZELElBQUksUUFBUSxFQUFFLENBQUM7WUFDYixNQUFNLFVBQVUsR0FBRyxJQUFJLDRCQUFrQixDQUFDLElBQUksRUFBRSxZQUFZLEVBQUU7Z0JBQzVELEdBQUcsRUFBRSxLQUFLLENBQUMsR0FBRztnQkFDZCxPQUFPLEVBQUUsc0NBQTRCLENBQUMsRUFBRTthQUN6QyxDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FB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RztnQkFDM0MsaUJBQWlCLEVBQUUsSUFBSTtnQkFDdkIsT0FBTyxFQUFFLEVBQUUsVUFBVSxFQUFFLG9CQUFVLENBQUMsbUJBQW1CLEVBQUU7YUFDeEQsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUM1QyxDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBMUlELG9DQTBJQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQge1xuICB0eXBlIElWcGMsXG4gIEdhdGV3YXlWcGNFbmRwb2ludCxcbiAgR2F0ZXdheVZwY0VuZHBvaW50QXdzU2VydmljZSxcbiAgSW50ZXJmYWNlVnBjRW5kcG9pbnQsXG4gIEludGVyZmFjZVZwY0VuZHBvaW50QXdzU2VydmljZSxcbiAgU3VibmV0VHlwZVxufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVjMlwiO1xuXG4vKipcbiAqIEdhdGV3YXkgVlBDIGVuZHBvaW50IGNvbmZpZ3VyYXRpb24gZm9yIHJlc291cmNlIGxheWVyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZwY0dhdGV3YXlFbmRwb2ludHNDb25maWcge1xuICAvKiogRW5hYmxlIFMzIEdhdGV3YXkgZW5kcG9pbnQuIERlZmF1bHQ6IHRydWUgKi9cbiAgczM/OiBib29sZWFuO1xuICAvKiogRW5hYmxlIER5bmFtb0RCIEdhdGV3YXkgZW5kcG9pbnQuIERlZmF1bHQ6IHRydWUgKi9cbiAgZHluYW1vZGI/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEludGVyZmFjZSBWUEMgZW5kcG9pbnQgY29uZmlndXJhdGlvbiBmb3IgcmVzb3VyY2UgbGF5ZXIuXG4gKiBJbnRlcmZhY2UgZW5kcG9pbnRzIGNvc3QgbW9uZXkgKH4kNy0xNS9tb250aCBlYWNoKSBidXQgcHJvdmlkZSBwcml2YXRlIGNvbm5lY3Rpdml0eS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWcGNJbnRlcmZhY2VFbmRwb2ludHNDb25maWcge1xuICAvKiogRUNSIGVuZHBvaW50cyAoZGtyICsgYXBpKSBmb3IgY29udGFpbmVyIGltYWdlIHB1bGxzLiB+JDE1L21vbnRoICovXG4gIGVjcj86IGJvb2xlYW47XG4gIC8qKiBTZWNyZXRzIE1hbmFnZXIgZW5kcG9pbnQgZm9yIHNlY3JldCBhY2Nlc3MuIH4kNy9tb250aCAqL1xuICBzZWNyZXRzTWFuYWdlcj86IGJvb2xlYW47XG4gIC8qKiBLTVMgZW5kcG9pbnQgZm9yIENNSyBvcGVyYXRpb25zLiB+JDcvbW9udGggKi9cbiAga21zPzogYm9vbGVhbjtcbiAgLyoqIENsb3VkV2F0Y2ggTG9ncyBlbmRwb2ludCBmb3IgbG9nIHNoaXBwaW5nLiB+JDcvbW9udGggKi9cbiAgY2xvdWR3YXRjaExvZ3M/OiBib29sZWFuO1xuICAvKiogU3lzdGVtcyBNYW5hZ2VyIGVuZHBvaW50LiB+JDcvbW9udGggKi9cbiAgc3NtPzogYm9vbGVhbjtcbiAgLyoqIFNUUyBlbmRwb2ludCBmb3IgYXNzdW1lLXJvbGUgb3BlcmF0aW9ucy4gfiQ3L21vbnRoICovXG4gIHN0cz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUHJvcHMgZm9yIGNyZWF0aW5nIFZQQyBlbmRwb2ludHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVnBjRW5kcG9pbnRzUHJvcHMge1xuICAvKiogVGhlIFZQQyB0byBjcmVhdGUgZW5kcG9pbnRzIGluLiBSZXF1aXJlZC4gKi9cbiAgdnBjOiBJVnBjO1xuICAvKipcbiAgICogR2F0ZXdheSBlbmRwb2ludHMgKEZSRUUpLlxuICAgKiAtIE9taXQ6IGVuYWJsZWQgd2l0aCBkZWZhdWx0cyAoczM6IHRydWUsIGR5bmFtb2RiOiB0cnVlKVxuICAgKiAtIGB7fWA6IGVuYWJsZWQgd2l0aCBkZWZhdWx0c1xuICAgKiAtIGB7IHMzOiB0cnVlLCBkeW5hbW9kYjogZmFsc2UgfWA6IHNwZWNpZmljIGNvbmZpZ3VyYXRpb25cbiAgICogLSBgZmFsc2VgOiBleHBsaWNpdGx5IGRpc2FibGVkXG4gICAqL1xuICBnYXRld2F5PzogVnBjR2F0ZXdheUVuZHBvaW50c0NvbmZpZyB8IGZhbHNlO1xuICAvKipcbiAgICogSW50ZXJmYWNlIGVuZHBvaW50cyAoY29zdCBtb25leSkuXG4gICAqIC0gT21pdDogZGlzYWJsZWQgKGRlZmF1bHQpXG4gICAqIC0gYHt9YDogZGlzYWJsZWQgKG11c3Qgc3BlY2lmeSB3aGljaCBlbmRwb2ludHMpXG4gICAqIC0gYHsgZWNyOiB0cnVlLCBrbXM6IHRydWUgfWA6IHNwZWNpZmljIGVuZHBvaW50c1xuICAgKiAtIGBmYWxzZWA6IGV4cGxpY2l0bHkgZGlzYWJsZWRcbiAgICovXG4gIGludGVyZmFjZT86IFZwY0ludGVyZmFjZUVuZHBvaW50c0NvbmZpZyB8IGZhbHNlO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgVlBDIGVuZHBvaW50cyBmb3IgQVdTIHNlcnZpY2VzLlxuICpcbiAqIEdhdGV3YXkgZW5kcG9pbnRzIChTMywgRHluYW1vREIpIGFyZSBGUkVFIGFuZCBzaG91bGQgYWx3YXlzIGJlIGVuYWJsZWQuXG4gKiBUaGV5IHJvdXRlIHRyYWZmaWMgZGlyZWN0bHkgdG8gdGhlIHNlcnZpY2Ugd2l0aG91dCBnb2luZyB0aHJvdWdoIE5BVC5cbiAqXG4gKiBJbnRlcmZhY2UgZW5kcG9pbnRzIGNvc3QgbW9uZXkgYnV0IHByb3ZpZGUgcHJpdmF0ZSBjb25uZWN0aXZpdHkgdG8gQVdTIHNlcnZpY2VzLlxuICogVGhleSdyZSB1c2VmdWwgZm9yOlxuICogLSBTZWN1cml0eTogVHJhZmZpYyBzdGF5cyB3aXRoaW4gQVdTIG5ldHdvcmtcbiAqIC0gQ29zdDogQXZvaWQgTkFUIEdhdGV3YXkgZGF0YSBwcm9jZXNzaW5nIGNoYXJnZXMgZm9yIGhpZ2gtdm9sdW1lIHNlcnZpY2VzXG4gKiAtIExhdGVuY3k6IERpcmVjdCBwYXRoIHRvIHNlcnZpY2VcbiAqL1xuZXhwb3J0IGNsYXNzIFZwY0VuZHBvaW50cyBleHRlbmRzIENvbnN0cnVjdCB7XG4gIHB1YmxpYyByZWFkb25seSBnYXRld2F5RW5kcG9pbnRzOiBHYXRld2F5VnBjRW5kcG9pbnRbXSA9IFtdO1xuICBwdWJsaWMgcmVhZG9ubHkgaW50ZXJmYWNlRW5kcG9pbnRzOiBJbnRlcmZhY2VWcGNFbmRwb2ludFtdID0gW107XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFZwY0VuZHBvaW50c1Byb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIHRoaXMuYWRkR2F0ZXdheUVuZHBvaW50cyhwcm9wcyk7XG4gICAgdGhpcy5hZGRJbnRlcmZhY2VFbmRwb2ludHMocHJvcHMpO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRHYXRld2F5RW5kcG9pbnRzKHByb3BzOiBWcGNFbmRwb2ludHNQcm9wcykge1xuICAgIGNvbnN0IGdhdGV3YXlDb25maWcgPSBwcm9wcy5nYXRld2F5O1xuXG4gICAgaWYgKGdhdGV3YXlDb25maWcgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZW5hYmxlUzMgPSBnYXRld2F5Q29uZmlnPy5zMyA/PyB0cnVlO1xuICAgIGNvbnN0IGVuYWJsZUR5bmFtb2RiID0gZ2F0ZXdheUNvbmZpZz8uZHluYW1vZGIgPz8gdHJ1ZTtcblxuICAgIGlmIChlbmFibGVTMykge1xuICAgICAgY29uc3QgczNFbmRwb2ludCA9IG5ldyBHYXRld2F5VnBjRW5kcG9pbnQodGhpcywgXCJTM0VuZHBvaW50XCIsIHtcbiAgICAgICAgdnBjOiBwcm9wcy52cGMsXG4gICAgICAgIHNlcnZpY2U6IEdhdGV3YXlWcGNFbmRwb2ludEF3c1NlcnZpY2UuUzNcbiAgICAgIH0pO1xuICAgICAgdGhpcy5nYXRld2F5RW5kcG9pbnRzLnB1c2goczNFbmRwb2ludCk7XG4gICAgfVxuXG4gICAgaWYgKGVuYWJsZUR5bmFtb2RiKSB7XG4gICAgICBjb25zdCBkeW5hbW9FbmRwb2ludCA9IG5ldyBHYXRld2F5VnBjRW5kcG9pbnQodGhpcywgXCJEeW5hbW9EQkVuZHBvaW50XCIsIHtcbiAgICAgICAgdnBjOiBwcm9wcy52cGMsXG4gICAgICAgIHNlcnZpY2U6IEdhdGV3YXlWcGNFbmRwb2ludEF3c1NlcnZpY2UuRFlOQU1PREJcbiAgICAgIH0pO1xuICAgICAgdGhpcy5nYXRld2F5RW5kcG9pbnRzLnB1c2goZHluYW1vRW5kcG9pbnQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYWRkSW50ZXJmYWNlRW5kcG9pbnRzKHByb3BzOiBWcGNFbmRwb2ludHNQcm9wcykge1xuICAgIGNvbnN0IGludGVyZmFjZUNvbmZpZyA9IHByb3BzLmludGVyZmFjZTtcblxuICAgIGlmIChpbnRlcmZhY2VDb25maWcgPT09IGZhbHNlIHx8IGludGVyZmFjZUNvbmZpZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGludGVyZmFjZUNvbmZpZy5lY3IpIHtcbiAgICAgIGNvbnN0IGVjckRvY2tlckVuZHBvaW50ID0gbmV3IEludGVyZmFjZVZwY0VuZHBvaW50KFxuICAgICAgICB0aGlzLFxuICAgICAgICBcIkVjckRvY2tlckVuZHBvaW50XCIsXG4gICAgICAgIHtcbiAgICAgICAgICB2cGM6IHByb3BzLnZwYyxcbiAgICAgICAgICBzZXJ2aWNlOiBJbnRlcmZhY2VWcGNFbmRwb2ludEF3c1NlcnZpY2UuRUNSX0RPQ0tFUixcbiAgICAgICAgICBwcml2YXRlRG5zRW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICBzdWJuZXRzOiB7IHN1Ym5ldFR5cGU6IFN1Ym5ldFR5cGUuUFJJVkFURV9XSVRIX0VHUkVTUyB9XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgICB0aGlzLmludGVyZmFjZUVuZHBvaW50cy5wdXNoKGVjckRvY2tlckVuZHBvaW50KTtcblxuICAgICAgY29uc3QgZWNyQXBpRW5kcG9pbnQgPSBuZXcgSW50ZXJmYWNlVnBjRW5kcG9pbnQodGhpcywgXCJFY3JBcGlFbmRwb2ludFwiLCB7XG4gICAgICAgIHZwYzogcHJvcHMudnBjLFxuICAgICAgICBzZXJ2aWNlOiBJbnRlcmZhY2VWcGNFbmRwb2ludEF3c1NlcnZpY2UuRUNSLFxuICAgICAgICBwcml2YXRlRG5zRW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgc3VibmV0czogeyBzdWJuZXRUeXBlOiBTdWJuZXRUeXBlLlBSSVZBVEVfV0lUSF9FR1JFU1MgfVxuICAgICAgfSk7XG4gICAgICB0aGlzLmludGVyZmFjZUVuZHBvaW50cy5wdXNoKGVjckFwaUVuZHBvaW50KTtcbiAgICB9XG5cbiAgICBpZiAoaW50ZXJmYWNlQ29uZmlnLnNlY3JldHNNYW5hZ2VyKSB7XG4gICAgICBjb25zdCBzbUVuZHBvaW50ID0gbmV3IEludGVyZmFjZVZwY0VuZHBvaW50KFxuICAgICAgICB0aGlzLFxuICAgICAgICBcIlNlY3JldHNNYW5hZ2VyRW5kcG9pbnRcIixcbiAgICAgICAge1xuICAgICAgICAgIHZwYzogcHJvcHMudnBjLFxuICAgICAgICAgIHNlcnZpY2U6IEludGVyZmFjZVZwY0VuZHBvaW50QXdzU2VydmljZS5TRUNSRVRTX01BTkFHRVIsXG4gICAgICAgICAgcHJpdmF0ZURuc0VuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgc3VibmV0czogeyBzdWJuZXRUeXBlOiBTdWJuZXRUeXBlLlBSSVZBVEVfV0lUSF9FR1JFU1MgfVxuICAgICAgICB9XG4gICAgICApO1xuICAgICAgdGhpcy5pbnRlcmZhY2VFbmRwb2ludHMucHVzaChzbUVuZHBvaW50KTtcbiAgICB9XG5cbiAgICBpZiAoaW50ZXJmYWNlQ29uZmlnLmttcykge1xuICAgICAgY29uc3Qga21zRW5kcG9pbnQgPSBuZXcgSW50ZXJmYWNlVnBjRW5kcG9pbnQodGhpcywgXCJLbXNFbmRwb2ludFwiLCB7XG4gICAgICAgIHZwYzogcHJvcHMudnBjLFxuICAgICAgICBzZXJ2aWNlOiBJbnRlcmZhY2VWcGNFbmRwb2ludEF3c1NlcnZpY2UuS01TLFxuICAgICAgICBwcml2YXRlRG5zRW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgc3VibmV0czogeyBzdWJuZXRUeXBlOiBTdWJuZXRUeXBlLlBSSVZBVEVfV0lUSF9FR1JFU1MgfVxuICAgICAgfSk7XG4gICAgICB0aGlzLmludGVyZmFjZUVuZHBvaW50cy5wdXNoKGttc0VuZHBvaW50KTtcbiAgICB9XG5cbiAgICBpZiAoaW50ZXJmYWNlQ29uZmlnLmNsb3Vkd2F0Y2hMb2dzKSB7XG4gICAgICBjb25zdCBjd0xvZ3NFbmRwb2ludCA9IG5ldyBJbnRlcmZhY2VWcGNFbmRwb2ludChcbiAgICAgICAgdGhpcyxcbiAgICAgICAgXCJDbG91ZFdhdGNoTG9nc0VuZHBvaW50XCIsXG4gICAgICAgIHtcbiAgICAgICAgICB2cGM6IHByb3BzLnZwYyxcbiAgICAgICAgICBzZXJ2aWNlOiBJbnRlcmZhY2VWcGNFbmRwb2ludEF3c1NlcnZpY2UuQ0xPVURXQVRDSF9MT0dTLFxuICAgICAgICAgIHByaXZhdGVEbnNFbmFibGVkOiB0cnVlLFxuICAgICAgICAgIHN1Ym5ldHM6IHsgc3VibmV0VHlwZTogU3VibmV0VHlwZS5QUklWQVRFX1dJVEhfRUdSRVNTIH1cbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIHRoaXMuaW50ZXJmYWNlRW5kcG9pbnRzLnB1c2goY3dMb2dzRW5kcG9pbnQpO1xuICAgIH1cblxuICAgIGlmIChpbnRlcmZhY2VDb25maWcuc3NtKSB7XG4gICAgICBjb25zdCBzc21FbmRwb2ludCA9IG5ldyBJbnRlcmZhY2VWcGNFbmRwb2ludCh0aGlzLCBcIlNzbUVuZHBvaW50XCIsIHtcbiAgICAgICAgdnBjOiBwcm9wcy52cGMsXG4gICAgICAgIHNlcnZpY2U6IEludGVyZmFjZVZwY0VuZHBvaW50QXdzU2VydmljZS5TU00sXG4gICAgICAgIHByaXZhdGVEbnNFbmFibGVkOiB0cnVlLFxuICAgICAgICBzdWJuZXRzOiB7IHN1Ym5ldFR5cGU6IFN1Ym5ldFR5cGUuUFJJVkFURV9XSVRIX0VHUkVTUyB9XG4gICAgICB9KTtcbiAgICAgIHRoaXMuaW50ZXJmYWNlRW5kcG9pbnRzLnB1c2goc3NtRW5kcG9pbnQpO1xuXG4gICAgICAvLyBTU00gYWxzbyBuZWVkcyBTU00gTWVzc2FnZXMgZW5kcG9pbnQgZm9yIHNlc3Npb24gbWFuYWdlclxuICAgICAgY29uc3Qgc3NtTWVzc2FnZXNFbmRwb2ludCA9IG5ldyBJbnRlcmZhY2VWcGNFbmRwb2ludChcbiAgICAgICAgdGhpcyxcbiAgICAgICAgXCJTc21NZXNzYWdlc0VuZHBvaW50XCIsXG4gICAgICAgIHtcbiAgICAgICAgICB2cGM6IHByb3BzLnZwYyxcbiAgICAgICAgICBzZXJ2aWNlOiBJbnRlcmZhY2VWcGNFbmRwb2ludEF3c1NlcnZpY2UuU1NNX01FU1NBR0VTLFxuICAgICAgICAgIHByaXZhdGVEbnNFbmFibGVkOiB0cnVlLFxuICAgICAgICAgIHN1Ym5ldHM6IHsgc3VibmV0VHlwZTogU3VibmV0VHlwZS5QUklWQVRFX1dJVEhfRUdSRVNTIH1cbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIHRoaXMuaW50ZXJmYWNlRW5kcG9pbnRzLnB1c2goc3NtTWVzc2FnZXNFbmRwb2ludCk7XG4gICAgfVxuXG4gICAgaWYgKGludGVyZmFjZUNvbmZpZy5zdHMpIHtcbiAgICAgIGNvbnN0IHN0c0VuZHBvaW50ID0gbmV3IEludGVyZmFjZVZwY0VuZHBvaW50KHRoaXMsIFwiU3RzRW5kcG9pbnRcIiwge1xuICAgICAgICB2cGM6IHByb3BzLnZwYyxcbiAgICAgICAgc2VydmljZTogSW50ZXJmYWNlVnBjRW5kcG9pbnRBd3NTZXJ2aWNlLlNUUyxcbiAgICAgICAgcHJpdmF0ZURuc0VuYWJsZWQ6IHRydWUsXG4gICAgICAgIHN1Ym5ldHM6IHsgc3VibmV0VHlwZTogU3VibmV0VHlwZS5QUklWQVRFX1dJVEhfRUdSRVNTIH1cbiAgICAgIH0pO1xuICAgICAgdGhpcy5pbnRlcmZhY2VFbmRwb2ludHMucHVzaChzdHNFbmRwb2ludCk7XG4gICAgfVxuICB9XG59XG4iXX0=
@@ -1,24 +0,0 @@
1
- import { type IConstruct } from "constructs";
2
- /**
3
- * Apply tags directly to a specific resource.
4
- *
5
- * This uses CDK's native Tags.of().add() API which:
6
- * - Properly merges with existing tags from L2 constructs
7
- * - Works regardless of when it's called during construction
8
- * - Applies tags to the resource and all its children
9
- *
10
- * Use this for resources that need specific tags beyond the standard Fjall tags,
11
- * like VPC IPAM pool tags or resource-specific metadata.
12
- *
13
- * @param resource - The construct to tag
14
- * @param tags - Key-value pairs of tags to apply
15
- *
16
- * @example
17
- * // Apply specific tags to a resource
18
- * tagResource(myVpc, {
19
- * "fjall:operations:pool": "pool-123"
20
- * });
21
- */
22
- export default function tagResource(resource: IConstruct, tags: {
23
- [key: string]: string;
24
- }): void;
@@ -1,30 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.default = tagResource;
4
- const aws_cdk_lib_1 = require("aws-cdk-lib");
5
- /**
6
- * Apply tags directly to a specific resource.
7
- *
8
- * This uses CDK's native Tags.of().add() API which:
9
- * - Properly merges with existing tags from L2 constructs
10
- * - Works regardless of when it's called during construction
11
- * - Applies tags to the resource and all its children
12
- *
13
- * Use this for resources that need specific tags beyond the standard Fjall tags,
14
- * like VPC IPAM pool tags or resource-specific metadata.
15
- *
16
- * @param resource - The construct to tag
17
- * @param tags - Key-value pairs of tags to apply
18
- *
19
- * @example
20
- * // Apply specific tags to a resource
21
- * tagResource(myVpc, {
22
- * "fjall:operations:pool": "pool-123"
23
- * });
24
- */
25
- function tagResource(resource, tags) {
26
- Object.entries(tags).forEach(([key, value]) => {
27
- aws_cdk_lib_1.Tags.of(resource).add(key, value);
28
- });
29
- }
30
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFnUmVzb3VyY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvdXRpbHMvdGFnUmVzb3VyY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUF1QkEsOEJBT0M7QUE5QkQsNkNBQW1DO0FBR25DOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJHO0FBQ0gsU0FBd0IsV0FBVyxDQUNqQyxRQUFvQixFQUNwQixJQUErQjtJQUUvQixNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUU7UUFDNUMsa0JBQUksQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNwQyxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUYWdzIH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgeyB0eXBlIElDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuXG4vKipcbiAqIEFwcGx5IHRhZ3MgZGlyZWN0bHkgdG8gYSBzcGVjaWZpYyByZXNvdXJjZS5cbiAqXG4gKiBUaGlzIHVzZXMgQ0RLJ3MgbmF0aXZlIFRhZ3Mub2YoKS5hZGQoKSBBUEkgd2hpY2g6XG4gKiAtIFByb3Blcmx5IG1lcmdlcyB3aXRoIGV4aXN0aW5nIHRhZ3MgZnJvbSBMMiBjb25zdHJ1Y3RzXG4gKiAtIFdvcmtzIHJlZ2FyZGxlc3Mgb2Ygd2hlbiBpdCdzIGNhbGxlZCBkdXJpbmcgY29uc3RydWN0aW9uXG4gKiAtIEFwcGxpZXMgdGFncyB0byB0aGUgcmVzb3VyY2UgYW5kIGFsbCBpdHMgY2hpbGRyZW5cbiAqXG4gKiBVc2UgdGhpcyBmb3IgcmVzb3VyY2VzIHRoYXQgbmVlZCBzcGVjaWZpYyB0YWdzIGJleW9uZCB0aGUgc3RhbmRhcmQgRmphbGwgdGFncyxcbiAqIGxpa2UgVlBDIElQQU0gcG9vbCB0YWdzIG9yIHJlc291cmNlLXNwZWNpZmljIG1ldGFkYXRhLlxuICpcbiAqIEBwYXJhbSByZXNvdXJjZSAtIFRoZSBjb25zdHJ1Y3QgdG8gdGFnXG4gKiBAcGFyYW0gdGFncyAtIEtleS12YWx1ZSBwYWlycyBvZiB0YWdzIHRvIGFwcGx5XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEFwcGx5IHNwZWNpZmljIHRhZ3MgdG8gYSByZXNvdXJjZVxuICogdGFnUmVzb3VyY2UobXlWcGMsIHtcbiAqICAgXCJmamFsbDpvcGVyYXRpb25zOnBvb2xcIjogXCJwb29sLTEyM1wiXG4gKiB9KTtcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdGFnUmVzb3VyY2UoXG4gIHJlc291cmNlOiBJQ29uc3RydWN0LFxuICB0YWdzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9XG4pOiB2b2lkIHtcbiAgT2JqZWN0LmVudHJpZXModGFncykuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgVGFncy5vZihyZXNvdXJjZSkuYWRkKGtleSwgdmFsdWUpO1xuICB9KTtcbn1cbiJdfQ==