terraconstructs 0.0.11 → 0.0.12
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.
- package/.jsii +104486 -34582
- package/lib/aws/arn.js +1 -1
- package/lib/aws/aws-construct.d.ts +1 -1
- package/lib/aws/aws-construct.js +28 -2
- package/lib/aws/aws-stack.d.ts +2 -4
- package/lib/aws/aws-stack.js +21 -8
- package/lib/aws/aws-tags.d.ts +58 -0
- package/lib/aws/aws-tags.js +77 -0
- package/lib/aws/cloudwatch/actions/ec2.js +1 -1
- package/lib/aws/cloudwatch/actions/lambda.js +1 -1
- package/lib/aws/cloudwatch/alarm-base.js +1 -1
- package/lib/aws/cloudwatch/alarm-rule.js +1 -1
- package/lib/aws/cloudwatch/alarm-status-widget.js +1 -1
- package/lib/aws/cloudwatch/alarm.js +1 -1
- package/lib/aws/cloudwatch/composite-alarm.js +1 -1
- package/lib/aws/cloudwatch/dashboard.js +1 -1
- package/lib/aws/cloudwatch/data-protection-policy.js +3 -3
- package/lib/aws/cloudwatch/graph.js +8 -8
- package/lib/aws/cloudwatch/layout.js +3 -3
- package/lib/aws/cloudwatch/log-destinations/kinesis.js +1 -1
- package/lib/aws/cloudwatch/log-destinations/lambda.js +1 -1
- package/lib/aws/cloudwatch/log-group.js +1 -1
- package/lib/aws/cloudwatch/log-query.js +1 -1
- package/lib/aws/cloudwatch/log-stream.js +1 -1
- package/lib/aws/cloudwatch/metric-filter.d.ts +1 -1
- package/lib/aws/cloudwatch/metric-filter.js +4 -4
- package/lib/aws/cloudwatch/metric.js +2 -2
- package/lib/aws/cloudwatch/pattern.js +3 -3
- package/lib/aws/cloudwatch/policy.js +1 -1
- package/lib/aws/cloudwatch/private/env-tokens.js +5 -6
- package/lib/aws/cloudwatch/private/metric-util.js +4 -5
- package/lib/aws/cloudwatch/private/object.js +2 -3
- package/lib/aws/cloudwatch/private/rendering.js +3 -3
- package/lib/aws/cloudwatch/private/statistic.js +6 -7
- package/lib/aws/cloudwatch/query-definition.js +2 -2
- package/lib/aws/cloudwatch/stats.js +1 -1
- package/lib/aws/cloudwatch/subscription-filter.d.ts +1 -1
- package/lib/aws/cloudwatch/subscription-filter.js +4 -4
- package/lib/aws/cloudwatch/text.js +1 -1
- package/lib/aws/cloudwatch/variable.js +3 -3
- package/lib/aws/cloudwatch/widget.d.ts +1 -1
- package/lib/aws/cloudwatch/widget.js +4 -4
- package/lib/aws/compute/activity.js +3 -2
- package/lib/aws/compute/alb/application-listener-action.d.ts +334 -0
- package/lib/aws/compute/alb/application-listener-action.js +281 -0
- package/lib/aws/compute/alb/application-listener-certificate.d.ts +35 -0
- package/lib/aws/compute/alb/application-listener-certificate.js +35 -0
- package/lib/aws/compute/alb/application-listener-rule.d.ts +233 -0
- package/lib/aws/compute/alb/application-listener-rule.js +220 -0
- package/lib/aws/compute/alb/application-listener.d.ts +574 -0
- package/lib/aws/compute/alb/application-listener.js +538 -0
- package/lib/aws/compute/alb/application-load-balancer.d.ts +715 -0
- package/lib/aws/compute/alb/application-load-balancer.js +780 -0
- package/lib/aws/compute/alb/application-target-group.d.ts +339 -0
- package/lib/aws/compute/alb/application-target-group.js +427 -0
- package/lib/aws/compute/alb/conditions.d.ts +61 -0
- package/lib/aws/compute/alb/conditions.js +164 -0
- package/lib/aws/compute/alb/trust-store-revocation.d.ts +59 -0
- package/lib/aws/compute/alb/trust-store-revocation.js +46 -0
- package/lib/aws/compute/alb/trust-store.d.ts +86 -0
- package/lib/aws/compute/alb/trust-store.js +79 -0
- package/lib/aws/compute/architecture.js +1 -1
- package/lib/aws/compute/aspects/require-imdsv2-aspect.d.ts +75 -0
- package/lib/aws/compute/aspects/require-imdsv2-aspect.js +106 -0
- package/lib/aws/compute/bastion-host.d.ts +172 -0
- package/lib/aws/compute/bastion-host.js +114 -0
- package/lib/aws/compute/chain.js +1 -1
- package/lib/aws/compute/cidr-splits.d.ts +49 -0
- package/lib/aws/compute/cidr-splits.js +59 -0
- package/lib/aws/compute/client-vpn-authorization-rule.d.ts +43 -0
- package/lib/aws/compute/client-vpn-authorization-rule.js +30 -0
- package/lib/aws/compute/client-vpn-endpoint-types.d.ts +62 -0
- package/lib/aws/compute/client-vpn-endpoint-types.js +25 -0
- package/lib/aws/compute/client-vpn-endpoint.d.ts +239 -0
- package/lib/aws/compute/client-vpn-endpoint.js +259 -0
- package/lib/aws/compute/client-vpn-route.d.ts +67 -0
- package/lib/aws/compute/client-vpn-route.js +57 -0
- package/lib/aws/compute/condition.js +1 -1
- package/lib/aws/compute/connections.d.ts +137 -0
- package/lib/aws/compute/connections.js +208 -0
- package/lib/aws/compute/ec2-augmentations.generated.d.ts +53 -0
- package/lib/aws/compute/ec2-augmentations.generated.js +35 -0
- package/lib/aws/compute/ec2-canned-metrics.generated.d.ts +555 -0
- package/lib/aws/compute/ec2-canned-metrics.generated.js +681 -0
- package/lib/aws/compute/ec2-util-v2.d.ts +141 -0
- package/lib/aws/compute/ec2-util-v2.js +286 -0
- package/lib/aws/compute/ec2-util.d.ts +52 -0
- package/lib/aws/compute/ec2-util.js +138 -0
- package/lib/aws/compute/elasticloadbalancing-canned-metrics.generated.d.ts +176 -0
- package/lib/aws/compute/elasticloadbalancing-canned-metrics.generated.js +119 -0
- package/lib/aws/compute/elasticloadbalancingv2-canned-metrics.generated.d.ts +860 -0
- package/lib/aws/compute/elasticloadbalancingv2-canned-metrics.generated.js +597 -0
- package/lib/aws/compute/event-invoke-config.js +1 -1
- package/lib/aws/compute/event-source-filter.js +2 -2
- package/lib/aws/compute/event-source-mapping.js +1 -1
- package/lib/aws/compute/event-sources/s3-onfailure-destination.js +1 -1
- package/lib/aws/compute/event-sources/s3.js +1 -1
- package/lib/aws/compute/event-sources/sqs-dlq.js +1 -1
- package/lib/aws/compute/event-sources/sqs.js +1 -1
- package/lib/aws/compute/fields.js +4 -4
- package/lib/aws/compute/function-alias.js +1 -1
- package/lib/aws/compute/function-base.js +2 -2
- package/lib/aws/compute/function-destinations/event-bridge.js +1 -1
- package/lib/aws/compute/function-destinations/function.js +1 -1
- package/lib/aws/compute/function-destinations/sqs.js +1 -1
- package/lib/aws/compute/function-nodejs.js +1 -1
- package/lib/aws/compute/function-url.js +1 -1
- package/lib/aws/compute/function-vpc-config.generated.d.ts +3 -3
- package/lib/aws/compute/function-vpc-config.generated.js +1 -1
- package/lib/aws/compute/function.d.ts +1 -1
- package/lib/aws/compute/function.js +5 -5
- package/lib/aws/compute/index-alpha.d.ts +5 -0
- package/lib/aws/compute/index-alpha.js +22 -0
- package/lib/aws/compute/index.d.ts +60 -0
- package/lib/aws/compute/index.js +70 -2
- package/lib/aws/compute/instance-types.d.ts +1354 -0
- package/lib/aws/compute/instance-types.js +1683 -0
- package/lib/aws/compute/instance.d.ts +436 -0
- package/lib/aws/compute/instance.js +262 -0
- package/lib/aws/compute/ip-addresses.d.ts +249 -0
- package/lib/aws/compute/ip-addresses.js +248 -0
- package/lib/aws/compute/ipam.d.ts +309 -0
- package/lib/aws/compute/ipam.js +306 -0
- package/lib/aws/compute/key-pair.d.ts +178 -0
- package/lib/aws/compute/key-pair.js +194 -0
- package/lib/aws/compute/lambda-augmentations.generated.d.ts +65 -0
- package/lib/aws/compute/lambda-augmentations.generated.js +41 -0
- package/lib/aws/compute/lambda-canned-metrics.generated.d.ts +316 -0
- package/lib/aws/compute/lambda-canned-metrics.generated.js +119 -0
- package/lib/aws/compute/launch-template.d.ts +540 -0
- package/lib/aws/compute/launch-template.js +468 -0
- package/lib/aws/compute/lb-shared/access-logs-accounts.d.ts +7 -0
- package/lib/aws/compute/lb-shared/access-logs-accounts.js +46 -0
- package/lib/aws/compute/lb-shared/base-listener.d.ts +113 -0
- package/lib/aws/compute/lb-shared/base-listener.js +181 -0
- package/lib/aws/compute/lb-shared/base-load-balancer.d.ts +212 -0
- package/lib/aws/compute/lb-shared/base-load-balancer.js +290 -0
- package/lib/aws/compute/lb-shared/base-target-group.d.ts +382 -0
- package/lib/aws/compute/lb-shared/base-target-group.js +364 -0
- package/lib/aws/compute/lb-shared/enums.d.ts +282 -0
- package/lib/aws/compute/lb-shared/enums.js +301 -0
- package/lib/aws/compute/lb-shared/grid-lookup-types.d.ts +42 -0
- package/lib/aws/compute/lb-shared/grid-lookup-types.js +53 -0
- package/lib/aws/compute/lb-shared/imported.d.ts +24 -0
- package/lib/aws/compute/lb-shared/imported.js +27 -0
- package/lib/aws/compute/lb-shared/lb-listener-config.generated.d.ts +194 -0
- package/lib/aws/compute/lb-shared/lb-listener-config.generated.js +3 -0
- package/lib/aws/compute/lb-shared/lb-target-group-attachment-config.generated.d.ts +56 -0
- package/lib/aws/compute/lb-shared/lb-target-group-attachment-config.generated.js +3 -0
- package/lib/aws/compute/lb-shared/listener-action.d.ts +14 -0
- package/lib/aws/compute/lb-shared/listener-action.js +4 -0
- package/lib/aws/compute/lb-shared/listener-certificate.d.ts +28 -0
- package/lib/aws/compute/lb-shared/listener-certificate.js +29 -0
- package/lib/aws/compute/lb-shared/load-balancer-targets.d.ts +93 -0
- package/lib/aws/compute/lb-shared/load-balancer-targets.js +127 -0
- package/lib/aws/compute/lb-shared/util.d.ts +113 -0
- package/lib/aws/compute/lb-shared/util.js +264 -0
- package/lib/aws/compute/lb-targets/alb-target.d.ts +67 -0
- package/lib/aws/compute/lb-targets/alb-target.js +100 -0
- package/lib/aws/compute/lb-targets/index.d.ts +4 -0
- package/lib/aws/compute/lb-targets/index.js +22 -0
- package/lib/aws/compute/lb-targets/instance-target.d.ts +42 -0
- package/lib/aws/compute/lb-targets/instance-target.js +67 -0
- package/lib/aws/compute/lb-targets/ip-target.d.ts +55 -0
- package/lib/aws/compute/lb-targets/ip-target.js +79 -0
- package/lib/aws/compute/lb-targets/lambda-target.d.ts +25 -0
- package/lib/aws/compute/lb-targets/lambda-target.js +50 -0
- package/lib/aws/compute/load-balancer.d.ts +336 -0
- package/lib/aws/compute/load-balancer.js +287 -0
- package/lib/aws/compute/machine-image/amazon-linux-2022.d.ts +63 -0
- package/lib/aws/compute/machine-image/amazon-linux-2022.js +84 -0
- package/lib/aws/compute/machine-image/amazon-linux-2023.d.ts +63 -0
- package/lib/aws/compute/machine-image/amazon-linux-2023.js +84 -0
- package/lib/aws/compute/machine-image/amazon-linux2.d.ts +76 -0
- package/lib/aws/compute/machine-image/amazon-linux2.js +87 -0
- package/lib/aws/compute/machine-image/common.d.ts +181 -0
- package/lib/aws/compute/machine-image/common.js +122 -0
- package/lib/aws/compute/machine-image/index.d.ts +5 -0
- package/lib/aws/compute/machine-image/index.js +22 -0
- package/lib/aws/compute/machine-image/machine-image.d.ts +463 -0
- package/lib/aws/compute/machine-image/machine-image.js +566 -0
- package/lib/aws/compute/machine-image/utils.d.ts +2 -0
- package/lib/aws/compute/machine-image/utils.js +17 -0
- package/lib/aws/compute/nat.d.ts +325 -0
- package/lib/aws/compute/nat.js +455 -0
- package/lib/aws/compute/network-acl-types.d.ts +152 -0
- package/lib/aws/compute/network-acl-types.js +156 -0
- package/lib/aws/compute/network-acl.d.ts +285 -0
- package/lib/aws/compute/network-acl.js +207 -0
- package/lib/aws/compute/network-util.d.ts +116 -0
- package/lib/aws/compute/network-util.js +241 -0
- package/lib/aws/compute/nlb/network-listener-action.d.ts +92 -0
- package/lib/aws/compute/nlb/network-listener-action.js +146 -0
- package/lib/aws/compute/nlb/network-listener-certificate.d.ts +24 -0
- package/lib/aws/compute/nlb/network-listener-certificate.js +25 -0
- package/lib/aws/compute/nlb/network-listener.d.ts +248 -0
- package/lib/aws/compute/nlb/network-listener.js +217 -0
- package/lib/aws/compute/nlb/network-load-balancer.d.ts +315 -0
- package/lib/aws/compute/nlb/network-load-balancer.js +360 -0
- package/lib/aws/compute/nlb/network-target-group.d.ts +153 -0
- package/lib/aws/compute/nlb/network-target-group.js +223 -0
- package/lib/aws/compute/peer.d.ts +64 -0
- package/lib/aws/compute/peer.js +235 -0
- package/lib/aws/compute/placement-group.d.ts +161 -0
- package/lib/aws/compute/placement-group.js +133 -0
- package/lib/aws/compute/port.d.ts +287 -0
- package/lib/aws/compute/port.js +390 -0
- package/lib/aws/compute/prefix-list.d.ts +131 -0
- package/lib/aws/compute/prefix-list.js +114 -0
- package/lib/aws/compute/private/context-stub.d.ts +7 -0
- package/lib/aws/compute/private/context-stub.js +43 -0
- package/lib/aws/compute/private/ebs-util.d.ts +14 -0
- package/lib/aws/compute/private/ebs-util.js +145 -0
- package/lib/aws/compute/private/intrinstics.js +2 -1
- package/lib/aws/compute/private/json-path.js +8 -8
- package/lib/aws/compute/private/util.js +2 -3
- package/lib/aws/compute/route.d.ts +547 -0
- package/lib/aws/compute/route.js +469 -0
- package/lib/aws/compute/security-group.d.ts +414 -0
- package/lib/aws/compute/security-group.js +538 -0
- package/lib/aws/compute/state-graph.js +1 -1
- package/lib/aws/compute/state-machine-fragment.js +1 -1
- package/lib/aws/compute/state-machine.d.ts +2 -2
- package/lib/aws/compute/state-machine.js +14 -12
- package/lib/aws/compute/states/choice.js +1 -1
- package/lib/aws/compute/states/custom-state.js +1 -1
- package/lib/aws/compute/states/distributed-map/item-batcher.js +1 -1
- package/lib/aws/compute/states/distributed-map/item-reader.js +5 -5
- package/lib/aws/compute/states/distributed-map/result-writer.js +1 -1
- package/lib/aws/compute/states/distributed-map.js +1 -1
- package/lib/aws/compute/states/fail.js +1 -1
- package/lib/aws/compute/states/map-base.js +1 -1
- package/lib/aws/compute/states/map.js +1 -1
- package/lib/aws/compute/states/parallel.js +1 -1
- package/lib/aws/compute/states/pass.js +2 -2
- package/lib/aws/compute/states/state.js +5 -5
- package/lib/aws/compute/states/succeed.js +1 -1
- package/lib/aws/compute/states/task-base.js +2 -2
- package/lib/aws/compute/states/task.js +1 -1
- package/lib/aws/compute/states/wait.js +2 -2
- package/lib/aws/compute/stepfunctions-canned-metrics.generated.d.ts +83 -0
- package/lib/aws/compute/stepfunctions-canned-metrics.generated.js +127 -0
- package/lib/aws/compute/subnet-v2.d.ts +213 -0
- package/lib/aws/compute/subnet-v2.js +405 -0
- package/lib/aws/compute/subnet.d.ts +37 -0
- package/lib/aws/compute/subnet.js +181 -0
- package/lib/aws/compute/task-credentials.js +1 -1
- package/lib/aws/compute/task-input.js +1 -1
- package/lib/aws/compute/tasks/aws-sdk/call-aws-service.js +1 -1
- package/lib/aws/compute/tasks/eventbridge/put-events.js +1 -1
- package/lib/aws/compute/tasks/http/invoke.js +1 -1
- package/lib/aws/compute/tasks/lambda/invoke.js +1 -1
- package/lib/aws/compute/tasks/private/task-utils.js +3 -4
- package/lib/aws/compute/tasks/resource-arn-suffix.js +2 -3
- package/lib/aws/compute/tasks/sqs/send-message.js +1 -1
- package/lib/aws/compute/tasks/stepfunctions/invoke-activity.js +1 -1
- package/lib/aws/compute/tasks/stepfunctions/start-execution.js +1 -1
- package/lib/aws/compute/types.js +2 -2
- package/lib/aws/compute/user-data.d.ts +270 -0
- package/lib/aws/compute/user-data.js +487 -0
- package/lib/aws/compute/util.d.ts +1 -1
- package/lib/aws/compute/util.js +4 -5
- package/lib/aws/compute/volume.d.ts +480 -0
- package/lib/aws/compute/volume.js +426 -0
- package/lib/aws/compute/vpc-endpoint-service.d.ts +149 -0
- package/lib/aws/compute/vpc-endpoint-service.js +90 -0
- package/lib/aws/compute/vpc-endpoint.d.ts +742 -0
- package/lib/aws/compute/vpc-endpoint.js +811 -0
- package/lib/aws/compute/vpc-flow-logs.d.ts +551 -0
- package/lib/aws/compute/vpc-flow-logs.js +693 -0
- package/lib/aws/compute/vpc-lookup.d.ts +73 -0
- package/lib/aws/compute/vpc-lookup.js +3 -0
- package/lib/aws/compute/vpc-v2-base.d.ts +353 -0
- package/lib/aws/compute/vpc-v2-base.js +493 -0
- package/lib/aws/compute/vpc-v2.d.ts +385 -0
- package/lib/aws/compute/vpc-v2.js +408 -0
- package/lib/aws/compute/vpc.d.ts +1448 -0
- package/lib/aws/compute/vpc.js +1495 -0
- package/lib/aws/compute/vpn.d.ts +443 -0
- package/lib/aws/compute/vpn.js +397 -0
- package/lib/aws/compute/windows-versions.d.ts +418 -0
- package/lib/aws/compute/windows-versions.js +426 -0
- package/lib/aws/edge/certificate-base.d.ts +20 -0
- package/lib/aws/edge/certificate-base.js +28 -0
- package/lib/aws/edge/certificate.d.ts +23 -2
- package/lib/aws/edge/certificate.js +54 -4
- package/lib/aws/edge/distribution.js +3 -3
- package/lib/aws/edge/dns-alias-record-targets.js +2 -2
- package/lib/aws/edge/dns-record.js +16 -16
- package/lib/aws/edge/dns-zone.d.ts +20 -2
- package/lib/aws/edge/dns-zone.js +25 -10
- package/lib/aws/edge/function.js +2 -2
- package/lib/aws/edge/index.d.ts +1 -0
- package/lib/aws/edge/index.js +2 -1
- package/lib/aws/edge/key-value-store.js +4 -4
- package/lib/aws/edge/origin.js +7 -5
- package/lib/aws/edge/response-headers-policy.js +1 -1
- package/lib/aws/encryption/alias.js +1 -1
- package/lib/aws/encryption/key.js +1 -1
- package/lib/aws/encryption/via-service-principal.js +1 -1
- package/lib/aws/iam/grant.js +2 -2
- package/lib/aws/iam/index.d.ts +1 -0
- package/lib/aws/iam/index.js +2 -1
- package/lib/aws/iam/instance-profile.d.ts +155 -0
- package/lib/aws/iam/instance-profile.js +124 -0
- package/lib/aws/iam/managed-policy.js +1 -1
- package/lib/aws/iam/oidc-provider.js +1 -1
- package/lib/aws/iam/policy-document-config.generated.d.ts +8 -8
- package/lib/aws/iam/policy-document-config.generated.js +1 -1
- package/lib/aws/iam/policy-document.js +1 -1
- package/lib/aws/iam/policy-statement-props.generated.d.ts +8 -8
- package/lib/aws/iam/policy-statement-props.generated.js +1 -1
- package/lib/aws/iam/policy-statement.js +9 -9
- package/lib/aws/iam/policy.js +1 -1
- package/lib/aws/iam/principals.js +26 -26
- package/lib/aws/iam/private/assume-role-policy.js +2 -3
- package/lib/aws/iam/private/comparable-principal.js +2 -3
- package/lib/aws/iam/private/immutable-role.d.ts +2 -1
- package/lib/aws/iam/private/immutable-role.js +3 -3
- package/lib/aws/iam/private/imported-role.d.ts +1 -1
- package/lib/aws/iam/private/imported-role.js +3 -3
- package/lib/aws/iam/private/merge-statements.js +2 -3
- package/lib/aws/iam/private/util.js +4 -4
- package/lib/aws/iam/role.js +1 -1
- package/lib/aws/iam/saml-provider.d.ts +1 -1
- package/lib/aws/iam/saml-provider.js +6 -6
- package/lib/aws/iam/unknown-principal.js +1 -1
- package/lib/aws/iam/utils.js +2 -3
- package/lib/aws/index.d.ts +1 -0
- package/lib/aws/index.js +4 -1
- package/lib/aws/network/simple-ipv4-vpc.js +5 -5
- package/lib/aws/network/subnet-group.js +3 -3
- package/lib/aws/network/subnet.d.ts +1 -1
- package/lib/aws/network/subnet.js +7 -7
- package/lib/aws/notify/archive.js +3 -2
- package/lib/aws/notify/connection.js +5 -4
- package/lib/aws/notify/event-bus.js +5 -4
- package/lib/aws/notify/event-pattern.js +3 -3
- package/lib/aws/notify/index.js +3 -1
- package/lib/aws/notify/input.js +4 -3
- package/lib/aws/notify/kinesis-stream.js +3 -2
- package/lib/aws/notify/on-event-options.js +2 -1
- package/lib/aws/notify/queue-config.generated.d.ts +18 -11
- package/lib/aws/notify/queue-config.generated.js +1 -1
- package/lib/aws/notify/queue-policy.js +1 -1
- package/lib/aws/notify/queue.js +1 -1
- package/lib/aws/notify/resource-policy.js +1 -1
- package/lib/aws/notify/rule.js +3 -2
- package/lib/aws/notify/schedule.js +2 -2
- package/lib/aws/notify/sqs-augmentations.generated.d.ts +125 -0
- package/lib/aws/notify/sqs-augmentations.generated.js +74 -0
- package/lib/aws/notify/target.js +2 -1
- package/lib/aws/notify/targets/event-bus.js +1 -1
- package/lib/aws/notify/targets/function.js +1 -1
- package/lib/aws/notify/targets/log-group.js +2 -2
- package/lib/aws/notify/targets/sqs.js +1 -1
- package/lib/aws/notify/targets/state-machine.js +1 -1
- package/lib/aws/notify/targets/util.d.ts +1 -1
- package/lib/aws/notify/targets/util.js +10 -11
- package/lib/aws/notify/util.js +4 -4
- package/lib/aws/provider-config.generated.d.ts +33 -33
- package/lib/aws/provider-config.generated.js +1 -1
- package/lib/aws/storage/bucket-notifications.js +1 -1
- package/lib/aws/storage/bucket-policy.js +1 -1
- package/lib/aws/storage/bucket-source.js +1 -1
- package/lib/aws/storage/bucket.d.ts +298 -65
- package/lib/aws/storage/bucket.js +548 -225
- package/lib/aws/storage/cors-config.generated.d.ts +3 -3
- package/lib/aws/storage/cors-config.generated.js +1 -1
- package/lib/aws/storage/cors-rule-config.generated.d.ts +5 -5
- package/lib/aws/storage/cors-rule-config.generated.js +1 -1
- package/lib/aws/storage/index.d.ts +1 -0
- package/lib/aws/storage/index.js +2 -1
- package/lib/aws/storage/lifecycle-config.generated.d.ts +11 -11
- package/lib/aws/storage/lifecycle-config.generated.js +1 -1
- package/lib/aws/storage/notification-targets/function.js +6 -6
- package/lib/aws/storage/notification-targets/queue.js +1 -1
- package/lib/aws/storage/origin-access-identity.d.ts +1 -1
- package/lib/aws/storage/origin-access-identity.js +5 -4
- package/lib/aws/storage/parameter-util.d.ts +12 -0
- package/lib/aws/storage/parameter-util.js +65 -0
- package/lib/aws/storage/parameter.d.ts +526 -0
- package/lib/aws/storage/parameter.js +606 -0
- package/lib/aws/storage/s3-canned-metrics.generated.d.ts +22 -0
- package/lib/aws/storage/s3-canned-metrics.generated.js +23 -0
- package/lib/aws/storage/util.d.ts +25 -3
- package/lib/aws/storage/util.js +84 -17
- package/lib/aws/storage/website-config.generated.d.ts +5 -5
- package/lib/aws/storage/website-config.generated.js +1 -1
- package/lib/aws/util.js +2 -3
- package/lib/construct-base.d.ts +10 -1
- package/lib/construct-base.js +9 -6
- package/lib/duration.js +1 -1
- package/lib/expiration.d.ts +48 -0
- package/lib/expiration.js +68 -0
- package/lib/helpers-internal/index.d.ts +1 -0
- package/lib/helpers-internal/index.js +7 -0
- package/lib/index.d.ts +2 -0
- package/lib/index.js +3 -1
- package/lib/private/md5.d.ts +4 -0
- package/lib/private/md5.js +14 -0
- package/lib/private/unique-resource-name.js +3 -4
- package/lib/size.js +2 -2
- package/lib/stack-base.d.ts +4 -23
- package/lib/stack-base.js +9 -30
- package/lib/terra-func.d.ts +103 -0
- package/lib/terra-func.js +170 -0
- package/lib/token.js +5 -5
- package/package.json +15 -8
- package/bun.lockb +0 -0
|
@@ -0,0 +1,493 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var _a;
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.VpcV2Base = void 0;
|
|
5
|
+
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
6
|
+
// https://github.com/aws/aws-cdk/blob/v2.175.1/packages/@aws-cdk/aws-ec2-alpha/lib/vpc-v2-base.ts
|
|
7
|
+
const provider_aws_1 = require("@cdktf/provider-aws");
|
|
8
|
+
const cdktf_1 = require("cdktf");
|
|
9
|
+
const constructs_1 = require("constructs");
|
|
10
|
+
const subnet_1 = require("./subnet");
|
|
11
|
+
const aws_construct_1 = require("../aws-construct");
|
|
12
|
+
const aws_stack_1 = require("../aws-stack");
|
|
13
|
+
const client_vpn_endpoint_1 = require("./client-vpn-endpoint");
|
|
14
|
+
const ec2_util_1 = require("./ec2-util");
|
|
15
|
+
const route_1 = require("./route");
|
|
16
|
+
const vpc_1 = require("./vpc");
|
|
17
|
+
const vpc_endpoint_1 = require("./vpc-endpoint");
|
|
18
|
+
const vpc_flow_logs_1 = require("./vpc-flow-logs");
|
|
19
|
+
const vpn_1 = require("./vpn");
|
|
20
|
+
const iam_1 = require("../iam");
|
|
21
|
+
/**
|
|
22
|
+
* Base class for creating a VPC (Virtual Private Cloud) in AWS.
|
|
23
|
+
*
|
|
24
|
+
* For more information, see the {@link https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2.Vpc.html|AWS CDK Documentation on VPCs}.
|
|
25
|
+
*/
|
|
26
|
+
class VpcV2Base extends aws_construct_1.AwsConstructBase {
|
|
27
|
+
constructor() {
|
|
28
|
+
super(...arguments);
|
|
29
|
+
/**
|
|
30
|
+
* List of public subnets in this VPC
|
|
31
|
+
*/
|
|
32
|
+
this.publicSubnets = [];
|
|
33
|
+
/**
|
|
34
|
+
* List of private subnets in this VPC
|
|
35
|
+
*/
|
|
36
|
+
this.privateSubnets = [];
|
|
37
|
+
/**
|
|
38
|
+
* AZs for this VPC
|
|
39
|
+
*/
|
|
40
|
+
this.availabilityZones = [];
|
|
41
|
+
/**
|
|
42
|
+
* Dependable that can be depended upon to force internet connectivity established on the VPC
|
|
43
|
+
* Add igw to this if its a public subnet
|
|
44
|
+
* @internal
|
|
45
|
+
*/
|
|
46
|
+
this._internetConnectivityEstablished = new constructs_1.DependencyGroup();
|
|
47
|
+
/**
|
|
48
|
+
* If this is set to true, don't error out on trying to select subnets
|
|
49
|
+
*/
|
|
50
|
+
this.incompleteSubnetDefinition = false;
|
|
51
|
+
/**
|
|
52
|
+
* Mutable private field for the internetGatewayId
|
|
53
|
+
* @internal
|
|
54
|
+
*/
|
|
55
|
+
this._internetGatewayId = "";
|
|
56
|
+
}
|
|
57
|
+
get vpcOutputs() {
|
|
58
|
+
return {
|
|
59
|
+
availabilityZones: this.availabilityZones,
|
|
60
|
+
isolatedSubnetIds: this.isolatedSubnets.map((s) => s.subnetId),
|
|
61
|
+
privateSubnetIds: this.privateSubnets.map((s) => s.subnetId),
|
|
62
|
+
publicSubnetIds: this.publicSubnets.map((s) => s.subnetId),
|
|
63
|
+
vpcArn: this.vpcArn,
|
|
64
|
+
vpcCidrBlock: this.vpcCidrBlock,
|
|
65
|
+
vpcId: this.vpcId,
|
|
66
|
+
vpnGatewayId: this.vpnGatewayId,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
get outputs() {
|
|
70
|
+
return this.vpcOutputs;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Return information on the subnets appropriate for the given selection strategy
|
|
74
|
+
*
|
|
75
|
+
* Requires that at least one subnet is matched, throws a descriptive
|
|
76
|
+
* error message otherwise.
|
|
77
|
+
*/
|
|
78
|
+
selectSubnets(selection = {}) {
|
|
79
|
+
const subnets = this.selectSubnetObjects(selection);
|
|
80
|
+
const pubs = new Set(this.publicSubnets);
|
|
81
|
+
return {
|
|
82
|
+
subnetIds: subnets.map((s) => s.subnetId),
|
|
83
|
+
get availabilityZones() {
|
|
84
|
+
return subnets.map((s) => s.availabilityZone);
|
|
85
|
+
},
|
|
86
|
+
internetConnectivityEstablished: tap(new CompositeDependable(), (d) => subnets.forEach((s) => d.add(s.internetConnectivityEstablished))),
|
|
87
|
+
subnets,
|
|
88
|
+
hasPublic: subnets.some((s) => pubs.has(s)),
|
|
89
|
+
isPendingLookup: this.incompleteSubnetDefinition,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Adds a VPN Gateway to this VPC
|
|
94
|
+
* @deprecated use enableVpnGatewayV2 for compatibility with VPCV2.Route
|
|
95
|
+
*/
|
|
96
|
+
enableVpnGateway(options) {
|
|
97
|
+
if (this.vpnGatewayId) {
|
|
98
|
+
throw new Error("The VPN Gateway has already been enabled.");
|
|
99
|
+
}
|
|
100
|
+
const vpnGateway = new vpn_1.VpnGateway(this, "VpnGateway", {
|
|
101
|
+
amazonSideAsn: options.amazonSideAsn,
|
|
102
|
+
type: vpn_1.VpnConnectionType.IPSEC_1,
|
|
103
|
+
});
|
|
104
|
+
this._vpnGatewayId = vpnGateway.gatewayId;
|
|
105
|
+
const attachment = new provider_aws_1.vpnGatewayAttachment.VpnGatewayAttachment(this, "VPCVPNGW", {
|
|
106
|
+
vpcId: this.vpcId,
|
|
107
|
+
vpnGatewayId: this._vpnGatewayId,
|
|
108
|
+
});
|
|
109
|
+
// Propagate routes on route tables associated with the right subnets
|
|
110
|
+
const vpnRoutePropagation = options.vpnRoutePropagation ?? [{}];
|
|
111
|
+
const routeTableIds = (0, ec2_util_1.allRouteTableIds)((0, ec2_util_1.flatten)(vpnRoutePropagation.map((s) => this.selectSubnets(s).subnets)));
|
|
112
|
+
if (routeTableIds.length === 0) {
|
|
113
|
+
cdktf_1.Annotations.of(this).addError(`enableVpnGateway: no subnets matching selection: '${JSON.stringify(vpnRoutePropagation)}'. Select other subnets to add routes to.`);
|
|
114
|
+
}
|
|
115
|
+
for (let i = 0; i < routeTableIds.length; i++) {
|
|
116
|
+
const routePropagation = new provider_aws_1.vpnGatewayRoutePropagation.VpnGatewayRoutePropagation(this, `RoutePropagation${i}`, {
|
|
117
|
+
routeTableId: routeTableIds[i],
|
|
118
|
+
vpnGatewayId: this._vpnGatewayId,
|
|
119
|
+
});
|
|
120
|
+
// The AWS::EC2::VPNGatewayRoutePropagation resource cannot use the VPN gateway
|
|
121
|
+
// until it has successfully attached to the VPC.
|
|
122
|
+
// See https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpn-gatewayrouteprop.html
|
|
123
|
+
routePropagation.node.addDependency(attachment);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Adds VPNGAtewayV2 to this VPC
|
|
128
|
+
*/
|
|
129
|
+
enableVpnGatewayV2(options) {
|
|
130
|
+
if (this.vpnGatewayId) {
|
|
131
|
+
throw new Error("The VPN Gateway has already been enabled.");
|
|
132
|
+
}
|
|
133
|
+
const vpnGateway = new route_1.VPNGatewayV2(this, "VpnGateway", {
|
|
134
|
+
vpc: this,
|
|
135
|
+
...options,
|
|
136
|
+
});
|
|
137
|
+
this._internetConnectivityEstablished.add(vpnGateway);
|
|
138
|
+
this._vpnGatewayId = vpnGateway.routerTargetId;
|
|
139
|
+
return vpnGateway;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Adds a new VPN connection to this VPC
|
|
143
|
+
*/
|
|
144
|
+
addVpnConnection(id, options) {
|
|
145
|
+
return new vpn_1.VpnConnection(this, id, {
|
|
146
|
+
vpc: this,
|
|
147
|
+
...options,
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Adds a new client VPN endpoint to this VPC
|
|
152
|
+
*/
|
|
153
|
+
addClientVpnEndpoint(id, options) {
|
|
154
|
+
return new client_vpn_endpoint_1.ClientVpnEndpoint(this, id, {
|
|
155
|
+
...options,
|
|
156
|
+
vpc: this,
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Adds a new interface endpoint to this VPC
|
|
161
|
+
*/
|
|
162
|
+
addInterfaceEndpoint(id, options) {
|
|
163
|
+
return new vpc_endpoint_1.InterfaceVpcEndpoint(this, id, {
|
|
164
|
+
vpc: this,
|
|
165
|
+
...options,
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Adds a new gateway endpoint to this VPC
|
|
170
|
+
*/
|
|
171
|
+
addGatewayEndpoint(id, options) {
|
|
172
|
+
return new vpc_endpoint_1.GatewayVpcEndpoint(this, id, {
|
|
173
|
+
vpc: this,
|
|
174
|
+
...options,
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Adds a new Egress Only Internet Gateway to this VPC and defines a new route
|
|
179
|
+
* to the route table of given subnets.
|
|
180
|
+
*
|
|
181
|
+
* @default - in case of no input subnets, no route is created
|
|
182
|
+
*/
|
|
183
|
+
addEgressOnlyInternetGateway(options) {
|
|
184
|
+
const egw = new route_1.EgressOnlyInternetGateway(this, "EgressOnlyGW", {
|
|
185
|
+
vpc: this,
|
|
186
|
+
egressOnlyInternetGatewayName: options?.egressOnlyInternetGatewayName,
|
|
187
|
+
});
|
|
188
|
+
let useIpv6;
|
|
189
|
+
if (this.secondaryCidrBlock) {
|
|
190
|
+
useIpv6 = this.secondaryCidrBlock.some((secondaryAddress) => secondaryAddress.amazonProvidedIpv6CidrBlock === true ||
|
|
191
|
+
secondaryAddress.ipv6IpamPoolId != undefined);
|
|
192
|
+
}
|
|
193
|
+
if (!useIpv6) {
|
|
194
|
+
throw new Error("Egress only IGW can only be added to Ipv6 enabled VPC");
|
|
195
|
+
}
|
|
196
|
+
if (options?.subnets) {
|
|
197
|
+
const subnets = (0, ec2_util_1.flatten)(options.subnets.map((s) => this.selectSubnets(s).subnets));
|
|
198
|
+
subnets.forEach((subnet) => {
|
|
199
|
+
this.createEgressRoute(subnet, egw, options.destination);
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Creates a route for EGW with destination set to outbound IPv6('::/0') or custom ipv6 address.
|
|
205
|
+
* @internal
|
|
206
|
+
*/
|
|
207
|
+
createEgressRoute(subnet, egw, destination) {
|
|
208
|
+
const destinationIpv6 = destination ?? "::/0";
|
|
209
|
+
new route_1.Route(this, `${subnet.node.id}-EgressRoute`, {
|
|
210
|
+
routeTable: subnet.routeTable,
|
|
211
|
+
destination: destinationIpv6, // IPv6 default route
|
|
212
|
+
target: { gateway: egw },
|
|
213
|
+
routeName: "CDKEIGWRoute",
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Adds a new Internet Gateway to this VPC
|
|
218
|
+
*
|
|
219
|
+
* @default - creates a new route for public subnets(with all outbound access) to the Internet Gateway.
|
|
220
|
+
*/
|
|
221
|
+
addInternetGateway(options) {
|
|
222
|
+
if (this._internetGatewayId) {
|
|
223
|
+
throw new Error("The Internet Gateway has already been enabled.");
|
|
224
|
+
}
|
|
225
|
+
const igw = new route_1.InternetGateway(this, "InternetGateway", {
|
|
226
|
+
vpc: this,
|
|
227
|
+
internetGatewayName: options?.internetGatewayName,
|
|
228
|
+
});
|
|
229
|
+
this._internetConnectivityEstablished.add(igw);
|
|
230
|
+
this._internetGatewayId = igw.routerTargetId;
|
|
231
|
+
// If there are no public subnets defined, no default route will be added
|
|
232
|
+
if (this.publicSubnets) {
|
|
233
|
+
this.publicSubnets.forEach((s) => this.addDefaultInternetRoute(s, igw, options));
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Adds default route for the internet gateway
|
|
238
|
+
* @internal
|
|
239
|
+
*/
|
|
240
|
+
addDefaultInternetRoute(subnet, igw, options) {
|
|
241
|
+
if (subnet.subnetType !== vpc_1.SubnetType.PUBLIC) {
|
|
242
|
+
throw new Error("No public subnets defined to add route for internet gateway");
|
|
243
|
+
}
|
|
244
|
+
// Add default route to IGW for IPv6
|
|
245
|
+
if (subnet.ipv6CidrBlock) {
|
|
246
|
+
new route_1.Route(this, `${subnet.node.id}-DefaultIPv6Route`, {
|
|
247
|
+
routeTable: subnet.routeTable,
|
|
248
|
+
destination: options?.ipv6Destination ?? "::/0",
|
|
249
|
+
target: { gateway: igw },
|
|
250
|
+
routeName: "CDKDefaultIPv6Route",
|
|
251
|
+
});
|
|
252
|
+
}
|
|
253
|
+
//Add default route to IGW for IPv4
|
|
254
|
+
new route_1.Route(this, `${subnet.node.id}-DefaultRoute`, {
|
|
255
|
+
routeTable: subnet.routeTable,
|
|
256
|
+
destination: options?.ipv4Destination ?? "0.0.0.0/0",
|
|
257
|
+
target: { gateway: igw },
|
|
258
|
+
routeName: "CDKDefaultIPv4Route",
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Adds a new NAT Gateway to the given subnet of this VPC
|
|
263
|
+
* of given subnets.
|
|
264
|
+
*/
|
|
265
|
+
addNatGateway(options) {
|
|
266
|
+
if (options.connectivityType === route_1.NatConnectivityType.PUBLIC &&
|
|
267
|
+
!this._internetGatewayId) {
|
|
268
|
+
throw new Error("Cannot add a Public NAT Gateway without an Internet Gateway enabled on VPC");
|
|
269
|
+
}
|
|
270
|
+
return new route_1.NatGateway(this, "NATGateway", {
|
|
271
|
+
vpc: this,
|
|
272
|
+
...options,
|
|
273
|
+
});
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* Adds a new flow log to this VPC
|
|
277
|
+
*/
|
|
278
|
+
addFlowLog(id, options) {
|
|
279
|
+
return new vpc_flow_logs_1.FlowLog(this, id, {
|
|
280
|
+
resourceType: vpc_flow_logs_1.FlowLogResourceType.fromVpc(this),
|
|
281
|
+
...options,
|
|
282
|
+
});
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* Creates peering connection role for acceptor VPC
|
|
286
|
+
*/
|
|
287
|
+
createAcceptorVpcRole(requestorAccountId) {
|
|
288
|
+
const peeringRole = new iam_1.Role(this, "VpcPeeringRole", {
|
|
289
|
+
assumedBy: new iam_1.AccountPrincipal(requestorAccountId),
|
|
290
|
+
roleName: "VpcPeeringRole",
|
|
291
|
+
description: "Restrictive role for VPC peering",
|
|
292
|
+
});
|
|
293
|
+
peeringRole.addToPolicy(new iam_1.PolicyStatement({
|
|
294
|
+
effect: iam_1.Effect.ALLOW,
|
|
295
|
+
actions: ["ec2:AcceptVpcPeeringConnection"],
|
|
296
|
+
resources: [
|
|
297
|
+
`arn:${aws_stack_1.AwsStack.ofAwsConstruct(this).partition}:ec2:${this.region}:${this.ownerAccountId}:vpc/${this.vpcId}`,
|
|
298
|
+
],
|
|
299
|
+
}));
|
|
300
|
+
peeringRole.addToPolicy(new iam_1.PolicyStatement({
|
|
301
|
+
actions: ["ec2:AcceptVpcPeeringConnection"],
|
|
302
|
+
effect: iam_1.Effect.ALLOW,
|
|
303
|
+
resources: [
|
|
304
|
+
`arn:${aws_stack_1.AwsStack.ofAwsConstruct(this).partition}:ec2:${this.region}:${this.ownerAccountId}:vpc-peering-connection/*`,
|
|
305
|
+
],
|
|
306
|
+
condition: [
|
|
307
|
+
{
|
|
308
|
+
test: "StringEquals",
|
|
309
|
+
variable: "ec2:AccepterVpc",
|
|
310
|
+
values: [
|
|
311
|
+
`arn:${aws_stack_1.AwsStack.ofAwsConstruct(this).partition}:ec2:${this.region}:${this.ownerAccountId}:vpc/${this.vpcId}`,
|
|
312
|
+
],
|
|
313
|
+
},
|
|
314
|
+
],
|
|
315
|
+
}));
|
|
316
|
+
return peeringRole;
|
|
317
|
+
}
|
|
318
|
+
/**
|
|
319
|
+
* Creates a peering connection
|
|
320
|
+
*/
|
|
321
|
+
createPeeringConnection(id, options) {
|
|
322
|
+
return new route_1.VPCPeeringConnection(this, id, {
|
|
323
|
+
requestorVpc: this,
|
|
324
|
+
...options,
|
|
325
|
+
});
|
|
326
|
+
}
|
|
327
|
+
/**
|
|
328
|
+
* Returns the id of the VPN Gateway (if enabled)
|
|
329
|
+
*/
|
|
330
|
+
get vpnGatewayId() {
|
|
331
|
+
return this._vpnGatewayId;
|
|
332
|
+
}
|
|
333
|
+
/**
|
|
334
|
+
* Returns the id of the Internet Gateway (if enabled)
|
|
335
|
+
*/
|
|
336
|
+
get internetGatewayId() {
|
|
337
|
+
return this._internetGatewayId;
|
|
338
|
+
}
|
|
339
|
+
/**
|
|
340
|
+
* Return the subnets appropriate for the placement strategy
|
|
341
|
+
*/
|
|
342
|
+
selectSubnetObjects(selection = {}) {
|
|
343
|
+
selection = this.reifySelectionDefaults(selection);
|
|
344
|
+
if (selection.subnets !== undefined) {
|
|
345
|
+
return selection.subnets;
|
|
346
|
+
}
|
|
347
|
+
let subnets;
|
|
348
|
+
if (selection.subnetGroupName !== undefined) {
|
|
349
|
+
// Select by name
|
|
350
|
+
subnets = this.selectSubnetObjectsByName(selection.subnetGroupName);
|
|
351
|
+
}
|
|
352
|
+
else {
|
|
353
|
+
// Or specify by type
|
|
354
|
+
const type = selection.subnetType || vpc_1.SubnetType.PRIVATE_WITH_EGRESS;
|
|
355
|
+
subnets = this.selectSubnetObjectsByType(type);
|
|
356
|
+
}
|
|
357
|
+
// Apply all the filters
|
|
358
|
+
subnets = this.applySubnetFilters(subnets, selection.subnetFilters ?? []);
|
|
359
|
+
return subnets;
|
|
360
|
+
}
|
|
361
|
+
applySubnetFilters(subnets, filters) {
|
|
362
|
+
let filtered = subnets;
|
|
363
|
+
// Apply each filter in sequence
|
|
364
|
+
for (const filter of filters) {
|
|
365
|
+
filtered = filter.selectSubnets(filtered);
|
|
366
|
+
}
|
|
367
|
+
return filtered;
|
|
368
|
+
}
|
|
369
|
+
selectSubnetObjectsByName(groupName) {
|
|
370
|
+
const allSubnets = [
|
|
371
|
+
...this.publicSubnets,
|
|
372
|
+
...this.privateSubnets,
|
|
373
|
+
...this.isolatedSubnets,
|
|
374
|
+
];
|
|
375
|
+
const subnets = allSubnets.filter((s) => (0, ec2_util_1.subnetGroupNameFromConstructId)(s) === groupName);
|
|
376
|
+
if (subnets.length === 0 && !this.incompleteSubnetDefinition) {
|
|
377
|
+
const names = Array.from(new Set(allSubnets.map(ec2_util_1.subnetGroupNameFromConstructId)));
|
|
378
|
+
throw new Error(`There are no subnet groups with name '${groupName}' in this VPC. Available names: ${names}`);
|
|
379
|
+
}
|
|
380
|
+
return subnets;
|
|
381
|
+
}
|
|
382
|
+
selectSubnetObjectsByType(subnetType) {
|
|
383
|
+
const allSubnets = {
|
|
384
|
+
[vpc_1.SubnetType.PRIVATE_ISOLATED]: this.isolatedSubnets,
|
|
385
|
+
[vpc_1.SubnetType.ISOLATED]: this.isolatedSubnets,
|
|
386
|
+
[vpc_1.SubnetType.PRIVATE_WITH_NAT]: this.privateSubnets,
|
|
387
|
+
[vpc_1.SubnetType.PRIVATE_WITH_EGRESS]: this.privateSubnets,
|
|
388
|
+
[vpc_1.SubnetType.PRIVATE]: this.privateSubnets,
|
|
389
|
+
[vpc_1.SubnetType.PUBLIC]: this.publicSubnets,
|
|
390
|
+
};
|
|
391
|
+
const subnets = allSubnets[subnetType];
|
|
392
|
+
// Force merge conflict here with https://github.com/aws/aws-cdk/pull/4089
|
|
393
|
+
// see ImportedVpc
|
|
394
|
+
if (subnets.length === 0 && !this.incompleteSubnetDefinition) {
|
|
395
|
+
const availableTypes = Object.entries(allSubnets)
|
|
396
|
+
.filter(([_, subs]) => subs.length > 0)
|
|
397
|
+
.map(([typeName, _]) => typeName);
|
|
398
|
+
throw new Error(`There are no '${subnetType}' subnet groups in this VPC. Available types: ${availableTypes}`);
|
|
399
|
+
}
|
|
400
|
+
return subnets;
|
|
401
|
+
}
|
|
402
|
+
/**
|
|
403
|
+
* Validate the fields in a SubnetSelection object, and reify defaults if necessary
|
|
404
|
+
*
|
|
405
|
+
* In case of default selection, select the first type of PRIVATE, ISOLATED,
|
|
406
|
+
* PUBLIC (in that order) that has any subnets.
|
|
407
|
+
*/
|
|
408
|
+
reifySelectionDefaults(placement) {
|
|
409
|
+
// TODO: throw error as new VpcV2 cannot support subnetName or subnetGroupName anymore
|
|
410
|
+
if (placement.subnetName !== undefined) {
|
|
411
|
+
if (placement.subnetGroupName !== undefined) {
|
|
412
|
+
throw new Error("Please use only 'subnetGroupName' ('subnetName' is deprecated and has the same behavior)");
|
|
413
|
+
}
|
|
414
|
+
else {
|
|
415
|
+
// "@aws-cdk/aws-ec2:subnetNameDeprecated",
|
|
416
|
+
cdktf_1.Annotations.of(this).addWarning("Usage of 'subnetName' in SubnetSelection is deprecated, use 'subnetGroupName' instead");
|
|
417
|
+
}
|
|
418
|
+
placement = { ...placement, subnetGroupName: placement.subnetName };
|
|
419
|
+
}
|
|
420
|
+
const exclusiveSelections = [
|
|
421
|
+
"subnets",
|
|
422
|
+
"subnetType",
|
|
423
|
+
"subnetGroupName",
|
|
424
|
+
];
|
|
425
|
+
const providedSelections = exclusiveSelections.filter((key) => placement[key] !== undefined);
|
|
426
|
+
if (providedSelections.length > 1) {
|
|
427
|
+
throw new Error(`Only one of '${providedSelections}' can be supplied to subnet selection.`);
|
|
428
|
+
}
|
|
429
|
+
if (placement.subnetType === undefined &&
|
|
430
|
+
placement.subnetGroupName === undefined &&
|
|
431
|
+
placement.subnets === undefined) {
|
|
432
|
+
// Return default subnet type based on subnets that actually exist
|
|
433
|
+
let subnetType = this.privateSubnets.length
|
|
434
|
+
? vpc_1.SubnetType.PRIVATE_WITH_EGRESS
|
|
435
|
+
: this.isolatedSubnets.length
|
|
436
|
+
? vpc_1.SubnetType.PRIVATE_ISOLATED
|
|
437
|
+
: vpc_1.SubnetType.PUBLIC;
|
|
438
|
+
placement = { ...placement, subnetType: subnetType };
|
|
439
|
+
}
|
|
440
|
+
// Establish which subnet filters are going to be used
|
|
441
|
+
let subnetFilters = placement.subnetFilters ?? [];
|
|
442
|
+
// Backwards compatibility with existing `availabilityZones` and `onePerAz` functionality
|
|
443
|
+
if (placement.availabilityZones !== undefined) {
|
|
444
|
+
// Filter by AZs, if specified
|
|
445
|
+
subnetFilters.push(subnet_1.SubnetFilter.availabilityZones(placement.availabilityZones));
|
|
446
|
+
}
|
|
447
|
+
if (!!placement.onePerAz) {
|
|
448
|
+
// Ensure one per AZ if specified
|
|
449
|
+
subnetFilters.push(subnet_1.SubnetFilter.onePerAz());
|
|
450
|
+
}
|
|
451
|
+
// Overwrite the provided placement filters and remove the availabilityZones and onePerAz properties
|
|
452
|
+
placement = {
|
|
453
|
+
...placement,
|
|
454
|
+
subnetFilters: subnetFilters,
|
|
455
|
+
availabilityZones: undefined,
|
|
456
|
+
onePerAz: undefined,
|
|
457
|
+
};
|
|
458
|
+
const { availabilityZones, onePerAz, ...rest } = placement;
|
|
459
|
+
return rest;
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
exports.VpcV2Base = VpcV2Base;
|
|
463
|
+
_a = JSII_RTTI_SYMBOL_1;
|
|
464
|
+
VpcV2Base[_a] = { fqn: "terraconstructs.aws.compute.alpha.VpcV2Base", version: "0.0.12" };
|
|
465
|
+
class CompositeDependable {
|
|
466
|
+
constructor() {
|
|
467
|
+
this.dependables = new Array();
|
|
468
|
+
const self = this;
|
|
469
|
+
constructs_1.Dependable.implement(this, {
|
|
470
|
+
get dependencyRoots() {
|
|
471
|
+
const ret = new Array();
|
|
472
|
+
for (const dep of self.dependables) {
|
|
473
|
+
ret.push(...constructs_1.Dependable.of(dep).dependencyRoots);
|
|
474
|
+
}
|
|
475
|
+
return ret;
|
|
476
|
+
},
|
|
477
|
+
});
|
|
478
|
+
}
|
|
479
|
+
/**
|
|
480
|
+
* Add a construct to the dependency roots
|
|
481
|
+
*/
|
|
482
|
+
add(dep) {
|
|
483
|
+
this.dependables.push(dep);
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
/**
|
|
487
|
+
* Invoke a function on a value (for its side effect) and return the value
|
|
488
|
+
*/
|
|
489
|
+
function tap(x, fn) {
|
|
490
|
+
fn(x);
|
|
491
|
+
return x;
|
|
492
|
+
}
|
|
493
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidnBjLXYyLWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXdzL2NvbXB1dGUvdnBjLXYyLWJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxrR0FBa0c7QUFFbEcsc0RBRzZCO0FBQzdCLGlDQUFvQztBQUNwQywyQ0FLb0I7QUFDcEIscUNBQXdDO0FBQ3hDLG9EQUFvRDtBQUNwRCw0Q0FBd0M7QUFDeEMsK0RBRytCO0FBQy9CLHlDQUlvQjtBQUNwQixtQ0FVaUI7QUFFakIsK0JBT2U7QUFDZixpREFLd0I7QUFDeEIsbURBQStFO0FBQy9FLCtCQU1lO0FBQ2YsZ0NBQXlFO0FBNEx6RTs7OztHQUlHO0FBQ0gsTUFBc0IsU0FBVSxTQUFRLGdDQUFnQjtJQUF4RDs7UUFnQkU7O1dBRUc7UUFDYSxrQkFBYSxHQUFjLEVBQUUsQ0FBQztRQUU5Qzs7V0FFRztRQUNhLG1CQUFjLEdBQWMsRUFBRSxDQUFDO1FBTy9DOztXQUVHO1FBQ2Esc0JBQWlCLEdBQWEsRUFBRSxDQUFDO1FBT2pEOzs7O1dBSUc7UUFDZ0IscUNBQWdDLEdBQUcsSUFBSSw0QkFBZSxFQUFFLENBQUM7UUFzRDVFOztXQUVHO1FBQ08sK0JBQTBCLEdBQVksS0FBSyxDQUFDO1FBUXREOzs7V0FHRztRQUNPLHVCQUFrQixHQUFHLEVBQUUsQ0FBQztLQStnQm5DO0lBOWlCQyxJQUFXLFVBQVU7UUFDbkIsT0FBTztZQUNMLGlCQUFpQixFQUFFLElBQUksQ0FBQyxpQkFBaUI7WUFDekMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7WUFDOUQsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7WUFDNUQsZUFBZSxFQUFFLElBQUks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T0FBTyxDQUFDLENBQUM7QUFDWCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2Jsb2IvdjIuMTc1LjEvcGFja2FnZXMvQGF3cy1jZGsvYXdzLWVjMi1hbHBoYS9saWIvdnBjLXYyLWJhc2UudHNcblxuaW1wb3J0IHtcbiAgdnBuR2F0ZXdheUF0dGFjaG1lbnQsXG4gIHZwbkdhdGV3YXlSb3V0ZVByb3BhZ2F0aW9uLFxufSBmcm9tIFwiQGNka3RmL3Byb3ZpZGVyLWF3c1wiO1xuaW1wb3J0IHsgQW5ub3RhdGlvbnMgfSBmcm9tIFwiY2RrdGZcIjtcbmltcG9ydCB7XG4gIElEZXBlbmRhYmxlLFxuICBEZXBlbmRhYmxlLFxuICBJQ29uc3RydWN0LFxuICBEZXBlbmRlbmN5R3JvdXAsXG59IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgeyBTdWJuZXRGaWx0ZXIgfSBmcm9tIFwiLi9zdWJuZXRcIjtcbmltcG9ydCB7IEF3c0NvbnN0cnVjdEJhc2UgfSBmcm9tIFwiLi4vYXdzLWNvbnN0cnVjdFwiO1xuaW1wb3J0IHsgQXdzU3RhY2sgfSBmcm9tIFwiLi4vYXdzLXN0YWNrXCI7XG5pbXBvcnQge1xuICBDbGllbnRWcG5FbmRwb2ludE9wdGlvbnMsXG4gIENsaWVudFZwbkVuZHBvaW50LFxufSBmcm9tIFwiLi9jbGllbnQtdnBuLWVuZHBvaW50XCI7XG5pbXBvcnQge1xuICBhbGxSb3V0ZVRhYmxlSWRzLFxuICBmbGF0dGVuLFxuICBzdWJuZXRHcm91cE5hbWVGcm9tQ29uc3RydWN0SWQsXG59IGZyb20gXCIuL2VjMi11dGlsXCI7XG5pbXBvcnQge1xuICBFZ3Jlc3NPbmx5SW50ZXJuZXRHYXRld2F5LFxuICBJbnRlcm5ldEdhdGV3YXksXG4gIE5hdENvbm5lY3Rpdml0eVR5cGUsXG4gIE5hdEdhdGV3YXksXG4gIE5hdEdhdGV3YXlPcHRpb25zLFxuICBSb3V0ZSxcbiAgVlBDUGVlcmluZ0Nvbm5lY3Rpb24sXG4gIFZQQ1BlZXJpbmdDb25uZWN0aW9uT3B0aW9ucyxcbiAgVlBOR2F0ZXdheVYyLFxufSBmcm9tIFwiLi9yb3V0ZVwiO1xuaW1wb3J0IHsgSVN1Ym5ldFYyIH0gZnJvbSBcIi4vc3VibmV0LXYyXCI7XG5pbXBvcnQge1xuICBWcGNPdXRwdXRzLFxuICBJVnBjLFxuICBJU3VibmV0LFxuICBTdWJuZXRTZWxlY3Rpb24sXG4gIFNlbGVjdGVkU3VibmV0cyxcbiAgU3VibmV0VHlwZSxcbn0gZnJvbSBcIi4vdnBjXCI7XG5pbXBvcnQge1xuICBJbnRlcmZhY2VWcGNFbmRwb2ludE9wdGlvbnMsXG4gIEludGVyZmFjZVZwY0VuZHBvaW50LFxuICBHYXRld2F5VnBjRW5kcG9pbnRPcHRpb25zLFxuICBHYXRld2F5VnBjRW5kcG9pbnQsXG59IGZyb20gXCIuL3ZwYy1lbmRwb2ludFwiO1xuaW1wb3J0IHsgRmxvd0xvZ09wdGlvbnMsIEZsb3dMb2csIEZsb3dMb2dSZXNvdXJjZVR5cGUgfSBmcm9tIFwiLi92cGMtZmxvdy1sb2dzXCI7XG5pbXBvcnQge1xuICBFbmFibGVWcG5HYXRld2F5T3B0aW9ucyxcbiAgVnBuQ29ubmVjdGlvbixcbiAgVnBuQ29ubmVjdGlvbk9wdGlvbnMsXG4gIFZwbkNvbm5lY3Rpb25UeXBlLFxuICBWcG5HYXRld2F5LFxufSBmcm9tIFwiLi92cG5cIjtcbmltcG9ydCB7IEFjY291bnRQcmluY2lwYWwsIEVmZmVjdCwgUG9saWN5U3RhdGVtZW50LCBSb2xlIH0gZnJvbSBcIi4uL2lhbVwiO1xuaW1wb3J0IHsgSVZQQ0NpZHJCbG9jayB9IGZyb20gXCIuL3ZwYy12MlwiO1xuXG4vKipcbiAqIE9wdGlvbnMgdG8gZGVmaW5lIEVncmVzc09ubHlJbnRlcm5ldEdhdGV3YXkgZm9yIFZQQ1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEVncmVzc09ubHlJbnRlcm5ldEdhdGV3YXlPcHRpb25zIHtcbiAgLyoqXG4gICAqIExpc3Qgb2Ygc3VibmV0cyB3aGVyZSByb3V0ZSB0byBFR1cgd2lsbCBiZSBhZGRlZFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIHJvdXRlIGNyZWF0ZWRcbiAgICovXG4gIHJlYWRvbmx5IHN1Ym5ldHM/OiBTdWJuZXRTZWxlY3Rpb25bXTtcblxuICAvKipcbiAgICogRGVzdGluYXRpb24gSXB2NiBhZGRyZXNzIGZvciBFR1cgcm91dGVcbiAgICpcbiAgICogQGRlZmF1bHQgLSAnOjovMCcgYWxsIElwdjYgdHJhZmZpY1xuICAgKi9cbiAgcmVhZG9ubHkgZGVzdGluYXRpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSByZXNvdXJjZSBuYW1lIG9mIHRoZSBlZ3Jlc3Mtb25seSBpbnRlcm5ldCBnYXRld2F5LlxuICAgKiBQcm92aWRlZCBuYW1lIHdpbGwgYmUgdXNlZCBmb3IgdGFnZ2luZ1xuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIG5hbWUgdGFnIGFzc29jaWF0ZWQgYW5kIHByb3Zpc2lvbmVkIHdpdGhvdXQgYSByZXNvdXJjZSBuYW1lXG4gICAqL1xuICByZWFkb25seSBlZ3Jlc3NPbmx5SW50ZXJuZXRHYXRld2F5TmFtZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBPcHRpb25zIHRvIGRlZmluZSBJbnRlcm5ldEdhdGV3YXkgZm9yIFZQQ1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEludGVybmV0R2F0ZXdheU9wdGlvbnMge1xuICAvKipcbiAgICogRGVzdGluYXRpb24gSXB2NiBhZGRyZXNzIGZvciBFR1cgcm91dGVcbiAgICpcbiAgICogQGRlZmF1bHQgLSAnMC4wLjAuMCcgYWxsIElwdjQgdHJhZmZpY1xuICAgKi9cbiAgcmVhZG9ubHkgaXB2NERlc3RpbmF0aW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBEZXN0aW5hdGlvbiBJcHY2IGFkZHJlc3MgZm9yIEVHVyByb3V0ZVxuICAgKlxuICAgKiBAZGVmYXVsdCAtICc6Oi8wJyBhbGwgSXB2NiB0cmFmZmljXG4gICAqL1xuICByZWFkb25seSBpcHY2RGVzdGluYXRpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSByZXNvdXJjZSBuYW1lIG9mIHRoZSBpbnRlcm5ldCBnYXRld2F5LlxuICAgKiBQcm92aWRlZCBuYW1lIHdpbGwgYmUgdXNlZCBmb3IgdGFnZ2luZ1xuICAgKlxuICAgKiBAZGVmYXVsdCAtIHByb3Zpc2lvbmVkIHdpdGhvdXQgYSByZXNvdXJjZSBuYW1lXG4gICAqL1xuICByZWFkb25seSBpbnRlcm5ldEdhdGV3YXlOYW1lPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgdG8gZGVmaW5lIFZQTkdhdGV3YXlWMiBmb3IgVlBDXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVlBOR2F0ZXdheVYyT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiBWUE4gY29ubmVjdGlvbiB0aGUgdmlydHVhbCBwcml2YXRlIGdhdGV3YXkgc3VwcG9ydHMuXG4gICAqIEBzZWUgaHR0cDovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTQ2xvdWRGb3JtYXRpb24vbGF0ZXN0L1VzZXJHdWlkZS9hd3MtcmVzb3VyY2UtZWMyLXZwbmdhdGV3YXkuaHRtbCNjZm4tZWMyLXZwbmdhdGV3YXktdHlwZVxuICAgKi9cbiAgcmVhZG9ubHkgdHlwZTogVnBuQ29ubmVjdGlvblR5cGU7XG5cbiAgLyoqXG4gICAqIFRoZSBwcml2YXRlIEF1dG9ub21vdXMgU3lzdGVtIE51bWJlciAoQVNOKSBmb3IgdGhlIEFtYXpvbiBzaWRlIG9mIGEgQkdQIHNlc3Npb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gQVNOIHNldCBmb3IgQkdQIHNlc3Npb25cbiAgICovXG4gIHJlYWRvbmx5IGFtYXpvblNpZGVBc24/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSByZXNvdXJjZSBuYW1lIG9mIHRoZSBWUE4gZ2F0ZXdheS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSByZXNvdXJjZSBwcm92aXNpb25lZCB3aXRob3V0IGFueSBuYW1lXG4gICAqL1xuICByZWFkb25seSB2cG5HYXRld2F5TmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogU3VibmV0cyB3aGVyZSB0aGUgcm91dGUgcHJvcGFnYXRpb24gc2hvdWxkIGJlIGFkZGVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIHByb3BvZ2F0aW9uIGZvciByb3V0ZXNcbiAgICovXG4gIHJlYWRvbmx5IHZwblJvdXRlUHJvcGFnYXRpb24/OiBTdWJuZXRTZWxlY3Rpb25bXTtcbn1cblxuLyoqXG4gKiBQbGFjZWhvbGRlciB0byBzZWUgd2hhdCBleHRyYSBwcm9wcyB3ZSBtaWdodCBuZWVkLFxuICogd2lsbCBiZSBhZGRlZCB0byBvcmlnaW5hbCBJVlBDXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSVZwY1YyIGV4dGVuZHMgSVZwYyB7XG4gIC8qKlxuICAgKiBUaGUgc2Vjb25kYXJ5IENJRFIgYmxvY2tzIGFzc29jaWF0ZWQgd2l0aCB0aGUgVlBDLlxuICAgKlxuICAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHRoZSB7QGxpbmsgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3ZwYy9sYXRlc3QvdXNlcmd1aWRlL3ZwYy1jaWRyLWJsb2Nrcy5odG1sI3ZwYy1yZXNpemV9LlxuICAgKi9cbiAgcmVhZG9ubHkgc2Vjb25kYXJ5Q2lkckJsb2NrPzogSVZQQ0NpZHJCbG9ja1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgcHJpbWFyeSBJUHY0IENJRFIgYmxvY2sgYXNzb2NpYXRlZCB3aXRoIHRoZSBWUEMuXG4gICAqIE5lZWRlZCBpbiBvcmRlciB0byB2YWxpZGF0ZSB0aGUgdnBjIHJhbmdlIG9mIHN1Ym5ldFxuICAgKiBjdXJyZW50IHByb3AgdnBjQ2lkckJsb2NrIHJlZmVycyB0byB0aGUgdG9rZW4gdmFsdWVcbiAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGUge0BsaW5rIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS92cGMvbGF0ZXN0L3VzZXJndWlkZS92cGMtY2lkci1ibG9ja3MuaHRtbCN2cGMtc2l6aW5nLWlwdjR9LlxuICAgKi9cbiAgcmVhZG9ubHkgaXB2NENpZHJCbG9jazogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBPcHRpb25hbCB0byBvdmVycmlkZSBpbmZlcnJlZCByZWdpb25cbiAgICpcbiAgICogQGRlZmF1bHQgLSBjdXJyZW50IHN0YWNrJ3MgZW52aXJvbm1lbnQgcmVnaW9uXG4gICAqL1xuICByZWFkb25seSByZWdpb246IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIElEIG9mIHRoZSBBV1MgYWNjb3VudCB0aGF0IG93bnMgdGhlIFZQQ1xuICAgKlxuICAgKiBAZGVmYXVsdCAtIHRoZSBhY2NvdW50IGlkIG9mIHRoZSBwYXJlbnQgc3RhY2tcbiAgICovXG4gIHJlYWRvbmx5IG93bmVyQWNjb3VudElkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIElQdjQgQ0lEUiBwcm92aXNpb25lZCB1bmRlciBwb29sXG4gICAqIFJlcXVpcmVkIHRvIGNoZWNrIGZvciBvdmVybGFwcGluZyBDSURScyBhZnRlciBwcm92aXNpb25pbmdcbiAgICogaXMgY29tcGxldGUgdW5kZXIgSVBBTSBwb29sXG4gICAqL1xuICByZWFkb25seSBpcHY0SXBhbVByb3Zpc2lvbmVkQ2lkcnM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVnBjTmFtZSB0byBiZSB1c2VkIGZvciB0YWdnaW5nIGl0cyBjb21wb25lbnRzXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IHZwY05hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFkZCBhbiBFZ3Jlc3Mgb25seSBJbnRlcm5ldCBHYXRld2F5IHRvIGN1cnJlbnQgVlBDLlxuICAgKiBDYW4gb25seSBiZSB1c2VkIGZvciBpcHY2IGVuYWJsZWQgVlBDcy5cbiAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGUge0BsaW5rIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS92cGMvbGF0ZXN0L3VzZXJndWlkZS9lZ3Jlc3Mtb25seS1pbnRlcm5ldC1nYXRld2F5LWJhc2ljcy5odG1sfS5cbiAgICovXG4gIGFkZEVncmVzc09ubHlJbnRlcm5ldEdhdGV3YXkoXG4gICAgb3B0aW9ucz86IEVncmVzc09ubHlJbnRlcm5ldEdhdGV3YXlPcHRpb25zLFxuICApOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBBZGRzIGFuIEludGVybmV0IEdhdGV3YXkgdG8gY3VycmVudCBWUEMuXG4gICAqIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgdGhlIHtAbGluayBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vdnBjL2xhdGVzdC91c2VyZ3VpZGUvdnBjLWlndy1pbnRlcm5ldC1hY2Nlc3MuaHRtbH0uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gZGVmaW5lcyByb3V0ZSBmb3IgYWxsIGlwdjQoJzAuMC4wLjAnKSBhbmQgaXB2NiBhZGRyZXNzZXMoJzo6LzAnKVxuICAgKi9cbiAgYWRkSW50ZXJuZXRHYXRld2F5KG9wdGlvbnM/OiBJbnRlcm5ldEdhdGV3YXlPcHRpb25zKTogdm9pZDtcblxuICAvKipcbiAgICogQWRkcyBWUE4gR2F0ZXdheSB0byBWUEMgYW5kIHNldCByb3V0ZSBwcm9wb2dhdGlvbi5cbiAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGUge0BsaW5rIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVXNlckd1aWRlL2F3cy1yZXNvdXJjZS1lYzItdnBuZ2F0ZXdheS5odG1sfS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyByb3V0ZSBwcm9wb2dhdGlvblxuICAgKi9cbiAgZW5hYmxlVnBuR2F0ZXdheVYyKG9wdGlvbnM6IFZQTkdhdGV3YXlWMk9wdGlvbnMpOiBWUE5HYXRld2F5VjI7XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBuZXcgTkFUIEdhdGV3YXkgdG8gVlBDXG4gICAqIEEgTkFUIGdhdGV3YXkgaXMgYSBOZXR3b3JrIEFkZHJlc3MgVHJhbnNsYXRpb24gKE5BVCkgc2VydmljZS4gTkFUIEdhdGV3YXkgQ29ubmVjdGl2aXR5IGNhbiBiZSBvZiB0eXBlIGBQdWJsaWNgIG9yIGBQcml2YXRlYC5cbiAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGUge0BsaW5rIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS92cGMvbGF0ZXN0L3VzZXJndWlkZS92cGMtbmF0LWdhdGV3YXkuaHRtbH0uXG4gICAqXG4gICAqIEBkZWZhdWx0IENvbm5lY3Rpdml0eVR5cGUuUHVibGljXG4gICAqL1xuICBhZGROYXRHYXRld2F5KG9wdGlvbnM6IE5hdEdhdGV3YXlPcHRpb25zKTogTmF0R2F0ZXdheTtcblxuICAvKipcbiAgICogQWRkcyBhIG5ldyByb2xlIHRvIGFjY2VwdG9yIFZQQyBhY2NvdW50XG4gICAqIEEgY3Jvc3MgYWNjb3VudCByb2xlIGlzIHJlcXVpcmVkIGZvciB0aGUgVlBDIHRvIHBlZXIgd2l0aCBhbm90aGVyIGFjY291bnQuXG4gICAqIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgdGhlIHtAbGluayBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTQ2xvdWRGb3JtYXRpb24vbGF0ZXN0L1VzZXJHdWlkZS9wZWVyLXdpdGgtdnBjLWluLWFub3RoZXItYWNjb3VudC5odG1sfS5cbiAgICovXG4gIGNyZWF0ZUFjY2VwdG9yVnBjUm9sZShyZXF1ZXN0b3JBY2NvdW50SWQ6IHN0cmluZyk6IFJvbGU7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgcGVlcmluZyBjb25uZWN0aW9uXG4gICAqIEEgcGVlcmluZyBjb25uZWN0aW9uIGlzIGEgcHJpdmF0ZSB2aXJ0dWFsIG5ldHdvcmsgZXN0YWJsaXNoZWQgYmV0d2VlbiB0d28gVlBDcy5cbiAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGUge0BsaW5rIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS92cGMvbGF0ZXN0L3BlZXJpbmcvd2hhdC1pcy12cGMtcGVlcmluZy5odG1sfS5cbiAgICovXG4gIGNyZWF0ZVBlZXJpbmdDb25uZWN0aW9uKFxuICAgIGlkOiBzdHJpbmcsXG4gICAgb3B0aW9uczogVlBDUGVlcmluZ0Nvbm5lY3Rpb25PcHRpb25zLFxuICApOiBWUENQZWVyaW5nQ29ubmVjdGlvbjtcbn1cblxuLyoqXG4gKiBCYXNlIGNsYXNzIGZvciBjcmVhdGluZyBhIFZQQyAoVmlydHVhbCBQcml2YXRlIENsb3VkKSBpbiBBV1MuXG4gKlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGUge0BsaW5rIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jZGsvYXBpL3YyL2RvY3MvYXdzLWNkay1saWIuYXdzX2VjMi5WcGMuaHRtbHxBV1MgQ0RLIERvY3VtZW50YXRpb24gb24gVlBDc30uXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBWcGNWMkJhc2UgZXh0ZW5kcyBBd3NDb25zdHJ1Y3RCYXNlIGltcGxlbWVudHMgSVZwY1YyIHtcbiAgLyoqXG4gICAqIElkZW50aWZpZXIgZm9yIHRoaXMgVlBDXG4gICAqL1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgdnBjSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogQXJuIG9mIHRoaXMgVlBDXG4gICAqL1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgdnBjQXJuOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENJRFIgcmFuZ2UgZm9yIHRoaXMgVlBDXG4gICAqL1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgdnBjQ2lkckJsb2NrOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIExpc3Qgb2YgcHVibGljIHN1Ym5ldHMgaW4gdGhpcyBWUENcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwdWJsaWNTdWJuZXRzOiBJU3VibmV0W10gPSBbXTtcblxuICAvKipcbiAgICogTGlzdCBvZiBwcml2YXRlIHN1Ym5ldHMgaW4gdGhpcyBWUENcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwcml2YXRlU3VibmV0czogSVN1Ym5ldFtdID0gW107XG5cbiAgLyoqXG4gICAqIExpc3Qgb2YgaXNvbGF0ZWQgc3VibmV0cyBpbiB0aGlzIFZQQ1xuICAgKi9cbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IGlzb2xhdGVkU3VibmV0czogSVN1Ym5ldFtdO1xuXG4gIC8qKlxuICAgKiBBWnMgZm9yIHRoaXMgVlBDXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYXZhaWxhYmlsaXR5Wm9uZXM6IHN0cmluZ1tdID0gW107XG5cbiAgLyoqXG4gICAqIERlcGVuZGFibGUgdGhhdCBjYW4gYmUgZGVwZW5kZWQgdXBvbiB0byBmb3JjZSBpbnRlcm5ldCBjb25uZWN0aXZpdHkgZXN0YWJsaXNoZWQgb24gdGhlIFZQQ1xuICAgKi9cbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IGludGVybmV0Q29ubmVjdGl2aXR5RXN0YWJsaXNoZWQ6IElEZXBlbmRhYmxlO1xuXG4gIC8qKlxuICAgKiBEZXBlbmRhYmxlIHRoYXQgY2FuIGJlIGRlcGVuZGVkIHVwb24gdG8gZm9yY2UgaW50ZXJuZXQgY29ubmVjdGl2aXR5IGVzdGFibGlzaGVkIG9uIHRoZSBWUENcbiAgICogQWRkIGlndyB0byB0aGlzIGlmIGl0cyBhIHB1YmxpYyBzdWJuZXRcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgX2ludGVybmV0Q29ubmVjdGl2aXR5RXN0YWJsaXNoZWQgPSBuZXcgRGVwZW5kZW5jeUdyb3VwKCk7XG5cbiAgLyoqXG4gICAqIFNlY29uZGFyeSBJUHMgZm9yIHRoZSBWUEMsIGNhbiBiZSBtdWx0aXBsZSBJcHY0IG9yIElwdjZcbiAgICogSXB2NCBzaG91bGQgYmUgd2l0aGluIFJGQyMxOTE4IHJhbmdlXG4gICAqL1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgc2Vjb25kYXJ5Q2lkckJsb2NrPzogSVZQQ0NpZHJCbG9ja1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgcHJpbWFyeSBJUHY0IENJRFIgYmxvY2sgYXNzb2NpYXRlZCB3aXRoIHRoZSBWUEMuXG4gICAqIE5lZWRlZCBpbiBvcmRlciB0byB2YWxpZGF0ZSB0aGUgdnBjIHJhbmdlIG9mIHN1Ym5ldFxuICAgKiBjdXJyZW50IHByb3AgdnBjQ2lkckJsb2NrIHJlZmVycyB0byB0aGUgdG9rZW4gdmFsdWVcbiAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGUge0BsaW5rIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS92cGMvbGF0ZXN0L3VzZXJndWlkZS92cGMtY2lkci1ibG9ja3MuaHRtbCN2cGMtc2l6aW5nLWlwdjR9LlxuICAgKi9cbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IGlwdjRDaWRyQmxvY2s6IHN0cmluZztcblxuICAvKipcbiAgICogVnBjTmFtZSB0byBiZSB1c2VkIGZvciB0YWdnaW5nIGl0cyBjb21wb25lbnRzXG4gICAqL1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgdnBjTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogUmVnaW9uIGZvciB0aGlzIFZQQ1xuICAgKi9cbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IHJlZ2lvbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJZGVudGlmaWVyIG9mIHRoZSBvd25lciBmb3IgdGhpcyBWUENcbiAgICovXG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBvd25lckFjY291bnRJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJUHY0IENJRFIgcHJvdmlzaW9uZWQgdW5kZXIgcG9vbFxuICAgKiBSZXF1aXJlZCB0byBjaGVjayBmb3Igb3ZlcmxhcHBpbmcgQ0lEUnMgYWZ0ZXIgcHJvdmlzaW9uaW5nXG4gICAqIGlzIGNvbXBsZXRlIHVuZGVyIElQQU0gcG9vbFxuICAgKi9cbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IGlwdjRJcGFtUHJvdmlzaW9uZWRDaWRycz86IHN0cmluZ1tdO1xuXG4gIHB1YmxpYyBnZXQgdnBjT3V0cHV0cygpOiBWcGNPdXRwdXRzIHtcbiAgICByZXR1cm4ge1xuICAgICAgYXZhaWxhYmlsaXR5Wm9uZXM6IHRoaXMuYXZhaWxhYmlsaXR5Wm9uZXMsXG4gICAgICBpc29sYXRlZFN1Ym5ldElkczogdGhpcy5pc29sYXRlZFN1Ym5ldHMubWFwKChzKSA9PiBzLnN1Ym5ldElkKSxcbiAgICAgIHByaXZhdGVTdWJuZXRJZHM6IHRoaXMucHJpdmF0ZVN1Ym5ldHMubWFwKChzKSA9PiBzLnN1Ym5ldElkKSxcbiAgICAgIHB1YmxpY1N1Ym5ldElkczogdGhpcy5wdWJsaWNTdWJuZXRzLm1hcCgocykgPT4gcy5zdWJuZXRJZCksXG4gICAgICB2cGNBcm46IHRoaXMudnBjQXJuLFxuICAgICAgdnBjQ2lkckJsb2NrOiB0aGlzLnZwY0NpZHJCbG9jayxcbiAgICAgIHZwY0lkOiB0aGlzLnZwY0lkLFxuICAgICAgdnBuR2F0ZXdheUlkOiB0aGlzLnZwbkdhdGV3YXlJZCxcbiAgICB9O1xuICB9XG4gIHB1YmxpYyBnZXQgb3V0cHV0cygpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICByZXR1cm4gdGhpcy52cGNPdXRwdXRzO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIHRoaXMgaXMgc2V0IHRvIHRydWUsIGRvbid0IGVycm9yIG91dCBvbiB0cnlpbmcgdG8gc2VsZWN0IHN1Ym5ldHNcbiAgICovXG4gIHByb3RlY3RlZCBpbmNvbXBsZXRlU3VibmV0RGVmaW5pdGlvbjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBNdXRhYmxlIHByaXZhdGUgZmllbGQgZm9yIHRoZSB2cG5HYXRld2F5SWRcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwcm90ZWN0ZWQgX3ZwbkdhdGV3YXlJZD86IHN0cmluZztcblxuICAvKipcbiAgICogTXV0YWJsZSBwcml2YXRlIGZpZWxkIGZvciB0aGUgaW50ZXJuZXRHYXRld2F5SWRcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwcm90ZWN0ZWQgX2ludGVybmV0R2F0ZXdheUlkID0gXCJcIjtcblxuICAvKipcbiAgICogUmV0dXJuIGluZm9ybWF0aW9uIG9uIHRoZSBzdWJuZXRzIGFwcHJvcHJpYXRlIGZvciB0aGUgZ2l2ZW4gc2VsZWN0aW9uIHN0cmF0ZWd5XG4gICAqXG4gICAqIFJlcXVpcmVzIHRoYXQgYXQgbGVhc3Qgb25lIHN1Ym5ldCBpcyBtYXRjaGVkLCB0aHJvd3MgYSBkZXNjcmlwdGl2ZVxuICAgKiBlcnJvciBtZXNzYWdlIG90aGVyd2lzZS5cbiAgICovXG4gIHB1YmxpYyBzZWxlY3RTdWJuZXRzKHNlbGVjdGlvbjogU3VibmV0U2VsZWN0aW9uID0ge30pOiBTZWxlY3RlZFN1Ym5ldHMge1xuICAgIGNvbnN0IHN1Ym5ldHMgPSB0aGlzLnNlbGVjdFN1Ym5ldE9iamVjdHMoc2VsZWN0aW9uKTtcbiAgICBjb25zdCBwdWJzID0gbmV3IFNldCh0aGlzLnB1YmxpY1N1Ym5ldHMpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Ym5ldElkczogc3VibmV0cy5tYXAoKHMpID0+IHMuc3VibmV0SWQpLFxuICAgICAgZ2V0IGF2YWlsYWJpbGl0eVpvbmVzKCk6IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIHN1Ym5ldHMubWFwKChzKSA9PiBzLmF2YWlsYWJpbGl0eVpvbmUpO1xuICAgICAgfSxcbiAgICAgIGludGVybmV0Q29ubmVjdGl2aXR5RXN0YWJsaXNoZWQ6IHRhcChuZXcgQ29tcG9zaXRlRGVwZW5kYWJsZSgpLCAoZCkgPT5cbiAgICAgICAgc3VibmV0cy5mb3JFYWNoKChzKSA9PiBkLmFkZChzLmludGVybmV0Q29ubmVjdGl2aXR5RXN0YWJsaXNoZWQpKSxcbiAgICAgICksXG4gICAgICBzdWJuZXRzLFxuICAgICAgaGFzUHVibGljOiBzdWJuZXRzLnNvbWUoKHMpID0+IHB1YnMuaGFzKHMpKSxcbiAgICAgIGlzUGVuZGluZ0xvb2t1cDogdGhpcy5pbmNvbXBsZXRlU3VibmV0RGVmaW5pdGlvbixcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBWUE4gR2F0ZXdheSB0byB0aGlzIFZQQ1xuICAgKiBAZGVwcmVjYXRlZCB1c2UgZW5hYmxlVnBuR2F0ZXdheVYyIGZvciBjb21wYXRpYmlsaXR5IHdpdGggVlBDVjIuUm91dGVcbiAgICovXG4gIHB1YmxpYyBlbmFibGVWcG5HYXRld2F5KG9wdGlvbnM6IEVuYWJsZVZwbkdhdGV3YXlPcHRpb25zKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudnBuR2F0ZXdheUlkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgVlBOIEdhdGV3YXkgaGFzIGFscmVhZHkgYmVlbiBlbmFibGVkLlwiKTtcbiAgICB9XG5cbiAgICBjb25zdCB2cG5HYXRld2F5ID0gbmV3IFZwbkdhdGV3YXkodGhpcywgXCJWcG5HYXRld2F5XCIsIHtcbiAgICAgIGFtYXpvblNpZGVBc246IG9wdGlvbnMuYW1hem9uU2lkZUFzbixcbiAgICAgIHR5cGU6IFZwbkNvbm5lY3Rpb25UeXBlLklQU0VDXzEsXG4gICAgfSk7XG5cbiAgICB0aGlzLl92cG5HYXRld2F5SWQgPSB2cG5HYXRld2F5LmdhdGV3YXlJZDtcblxuICAgIGNvbnN0IGF0dGFjaG1lbnQgPSBuZXcgdnBuR2F0ZXdheUF0dGFjaG1lbnQuVnBuR2F0ZXdheUF0dGFjaG1lbnQoXG4gICAgICB0aGlzLFxuICAgICAgXCJWUENWUE5HV1wiLFxuICAgICAge1xuICAgICAgICB2cGNJZDogdGhpcy52cGNJZCxcbiAgICAgICAgdnBuR2F0ZXdheUlkOiB0aGlzLl92cG5HYXRld2F5SWQsXG4gICAgICB9LFxuICAgICk7XG5cbiAgICAvLyBQcm9wYWdhdGUgcm91dGVzIG9uIHJvdXRlIHRhYmxlcyBhc3NvY2lhdGVkIHdpdGggdGhlIHJpZ2h0IHN1Ym5ldHNcbiAgICBjb25zdCB2cG5Sb3V0ZVByb3BhZ2F0aW9uID0gb3B0aW9ucy52cG5Sb3V0ZVByb3BhZ2F0aW9uID8/IFt7fV07XG4gICAgY29uc3Qgcm91dGVUYWJsZUlkcyA9IGFsbFJvdXRlVGFibGVJZHMoXG4gICAgICBmbGF0dGVuKHZwblJvdXRlUHJvcGFnYXRpb24ubWFwKChzKSA9PiB0aGlzLnNlbGVjdFN1Ym5ldHMocykuc3VibmV0cykpLFxuICAgICk7XG5cbiAgICBpZiAocm91dGVUYWJsZUlkcy5sZW5ndGggPT09IDApIHtcbiAgICAgIEFubm90YXRpb25zLm9mKHRoaXMpLmFkZEVycm9yKFxuICAgICAgICBgZW5hYmxlVnBuR2F0ZXdheTogbm8gc3VibmV0cyBtYXRjaGluZyBzZWxlY3Rpb246ICcke0pTT04uc3RyaW5naWZ5KHZwblJvdXRlUHJvcGFnYXRpb24pfScuIFNlbGVjdCBvdGhlciBzdWJuZXRzIHRvIGFkZCByb3V0ZXMgdG8uYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByb3V0ZVRhYmxlSWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCByb3V0ZVByb3BhZ2F0aW9uID1cbiAgICAgICAgbmV3IHZwbkdhdGV3YXlSb3V0ZVByb3BhZ2F0aW9uLlZwbkdhdGV3YXlSb3V0ZVByb3BhZ2F0aW9uKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgYFJvdXRlUHJvcGFnYXRpb24ke2l9YCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICByb3V0ZVRhYmxlSWQ6IHJvdXRlVGFibGVJZHNbaV0sXG4gICAgICAgICAgICB2cG5HYXRld2F5SWQ6IHRoaXMuX3ZwbkdhdGV3YXlJZCxcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgICAgLy8gVGhlIEFXUzo6RUMyOjpWUE5HYXRld2F5Um91dGVQcm9wYWdhdGlvbiByZXNvdXJjZSBjYW5ub3QgdXNlIHRoZSBWUE4gZ2F0ZXdheVxuICAgICAgLy8gdW50aWwgaXQgaGFzIHN1Y2Nlc3NmdWxseSBhdHRhY2hlZCB0byB0aGUgVlBDLlxuICAgICAgLy8gU2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVXNlckd1aWRlL2F3cy1yZXNvdXJjZS1lYzItdnBuLWdhdGV3YXlyb3V0ZXByb3AuaHRtbFxuICAgICAgcm91dGVQcm9wYWdhdGlvbi5ub2RlLmFkZERlcGVuZGVuY3koYXR0YWNobWVudCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgVlBOR0F0ZXdheVYyIHRvIHRoaXMgVlBDXG4gICAqL1xuICBwdWJsaWMgZW5hYmxlVnBuR2F0ZXdheVYyKG9wdGlvbnM6IFZQTkdhdGV3YXlWMk9wdGlvbnMpOiBWUE5HYXRld2F5VjIge1xuICAgIGlmICh0aGlzLnZwbkdhdGV3YXlJZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIFZQTiBHYXRld2F5IGhhcyBhbHJlYWR5IGJlZW4gZW5hYmxlZC5cIik7XG4gICAgfVxuXG4gICAgY29uc3QgdnBuR2F0ZXdheSA9IG5ldyBWUE5HYXRld2F5VjIodGhpcywgXCJWcG5HYXRld2F5XCIsIHtcbiAgICAgIHZwYzogdGhpcyxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfSk7XG5cbiAgICB0aGlzLl9pbnRlcm5ldENvbm5lY3Rpdml0eUVzdGFibGlzaGVkLmFkZCh2cG5HYXRld2F5KTtcbiAgICB0aGlzLl92cG5HYXRld2F5SWQgPSB2cG5HYXRld2F5LnJvdXRlclRhcmdldElkO1xuXG4gICAgcmV0dXJuIHZwbkdhdGV3YXk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIG5ldyBWUE4gY29ubmVjdGlvbiB0byB0aGlzIFZQQ1xuICAgKi9cbiAgcHVibGljIGFkZFZwbkNvbm5lY3Rpb24oXG4gICAgaWQ6IHN0cmluZyxcbiAgICBvcHRpb25zOiBWcG5Db25uZWN0aW9uT3B0aW9ucyxcbiAgKTogVnBuQ29ubmVjdGlvbiB7XG4gICAgcmV0dXJuIG5ldyBWcG5Db25uZWN0aW9uKHRoaXMsIGlkLCB7XG4gICAgICB2cGM6IHRoaXMsXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBuZXcgY2xpZW50IFZQTiBlbmRwb2ludCB0byB0aGlzIFZQQ1xuICAgKi9cbiAgcHVibGljIGFkZENsaWVudFZwbkVuZHBvaW50KFxuICAgIGlkOiBzdHJpbmcsXG4gICAgb3B0aW9uczogQ2xpZW50VnBuRW5kcG9pbnRPcHRpb25zLFxuICApOiBDbGllbnRWcG5FbmRwb2ludCB7XG4gICAgcmV0dXJuIG5ldyBDbGllbnRWcG5FbmRwb2ludCh0aGlzLCBpZCwge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIHZwYzogdGhpcyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgbmV3IGludGVyZmFjZSBlbmRwb2ludCB0byB0aGlzIFZQQ1xuICAgKi9cbiAgcHVibGljIGFkZEludGVyZmFjZUVuZHBvaW50KFxuICAgIGlkOiBzdHJpbmcsXG4gICAgb3B0aW9uczogSW50ZXJmYWNlVnBjRW5kcG9pbnRPcHRpb25zLFxuICApOiBJbnRlcmZhY2VWcGNFbmRwb2ludCB7XG4gICAgcmV0dXJuIG5ldyBJbnRlcmZhY2VWcGNFbmRwb2ludCh0aGlzLCBpZCwge1xuICAgICAgdnBjOiB0aGlzLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgbmV3IGdhdGV3YXkgZW5kcG9pbnQgdG8gdGhpcyBWUENcbiAgICovXG4gIHB1YmxpYyBhZGRHYXRld2F5RW5kcG9pbnQoXG4gICAgaWQ6IHN0cmluZyxcbiAgICBvcHRpb25zOiBHYXRld2F5VnBjRW5kcG9pbnRPcHRpb25zLFxuICApOiBHYXRld2F5VnBjRW5kcG9pbnQge1xuICAgIHJldHVybiBuZXcgR2F0ZXdheVZwY0VuZHBvaW50KHRoaXMsIGlkLCB7XG4gICAgICB2cGM6IHRoaXMsXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBuZXcgRWdyZXNzIE9ubHkgSW50ZXJuZXQgR2F0ZXdheSB0byB0aGlzIFZQQyBhbmQgZGVmaW5lcyBhIG5ldyByb3V0ZVxuICAgKiB0byB0aGUgcm91dGUgdGFibGUgb2YgZ2l2ZW4gc3VibmV0cy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBpbiBjYXNlIG9mIG5vIGlucHV0IHN1Ym5ldHMsIG5vIHJvdXRlIGlzIGNyZWF0ZWRcbiAgICovXG4gIHB1YmxpYyBhZGRFZ3Jlc3NPbmx5SW50ZXJuZXRHYXRld2F5KFxuICAgIG9wdGlvbnM/OiBFZ3Jlc3NPbmx5SW50ZXJuZXRHYXRld2F5T3B0aW9ucyxcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgZWd3ID0gbmV3IEVncmVzc09ubHlJbnRlcm5ldEdhdGV3YXkodGhpcywgXCJFZ3Jlc3NPbmx5R1dcIiwge1xuICAgICAgdnBjOiB0aGlzLFxuICAgICAgZWdyZXNzT25seUludGVybmV0R2F0ZXdheU5hbWU6IG9wdGlvbnM/LmVncmVzc09ubHlJbnRlcm5ldEdhdGV3YXlOYW1lLFxuICAgIH0pO1xuXG4gICAgbGV0IHVzZUlwdjY7XG4gICAgaWYgKHRoaXMuc2Vjb25kYXJ5Q2lkckJsb2NrKSB7XG4gICAgICB1c2VJcHY2ID0gdGhpcy5zZWNvbmRhcnlDaWRyQmxvY2suc29tZShcbiAgICAgICAgKHNlY29uZGFyeUFkZHJlc3MpID0+XG4gICAgICAgICAgc2Vjb25kYXJ5QWRkcmVzcy5hbWF6b25Qcm92aWRlZElwdjZDaWRyQmxvY2sgPT09IHRydWUgfHxcbiAgICAgICAgICBzZWNvbmRhcnlBZGRyZXNzLmlwdjZJcGFtUG9vbElkICE9IHVuZGVmaW5lZCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCF1c2VJcHY2KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFZ3Jlc3Mgb25seSBJR1cgY2FuIG9ubHkgYmUgYWRkZWQgdG8gSXB2NiBlbmFibGVkIFZQQ1wiKTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucz8uc3VibmV0cykge1xuICAgICAgY29uc3Qgc3VibmV0cyA9IGZsYXR0ZW4oXG4gICAgICAgIG9wdGlvbnMuc3VibmV0cy5tYXAoKHMpID0+IHRoaXMuc2VsZWN0U3VibmV0cyhzKS5zdWJuZXRzKSxcbiAgICAgICk7XG4gICAgICBzdWJuZXRzLmZvckVhY2goKHN1Ym5ldCkgPT4ge1xuICAgICAgICB0aGlzLmNyZWF0ZUVncmVzc1JvdXRlKHN1Ym5ldCwgZWd3LCBvcHRpb25zLmRlc3RpbmF0aW9uKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgcm91dGUgZm9yIEVHVyB3aXRoIGRlc3RpbmF0aW9uIHNldCB0byBvdXRib3VuZCBJUHY2KCc6Oi8wJykgb3IgY3VzdG9tIGlwdjYgYWRkcmVzcy5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUVncmVzc1JvdXRlKFxuICAgIHN1Ym5ldDogSVN1Ym5ldFYyLFxuICAgIGVndzogRWdyZXNzT25seUludGVybmV0R2F0ZXdheSxcbiAgICBkZXN0aW5hdGlvbj86IHN0cmluZyxcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgZGVzdGluYXRpb25JcHY2ID0gZGVzdGluYXRpb24gPz8gXCI6Oi8wXCI7XG4gICAgbmV3IFJvdXRlKHRoaXMsIGAke3N1Ym5ldC5ub2RlLmlkfS1FZ3Jlc3NSb3V0ZWAsIHtcbiAgICAgIHJvdXRlVGFibGU6IHN1Ym5ldC5yb3V0ZVRhYmxlLFxuICAgICAgZGVzdGluYXRpb246IGRlc3RpbmF0aW9uSXB2NiwgLy8gSVB2NiBkZWZhdWx0IHJvdXRlXG4gICAgICB0YXJnZXQ6IHsgZ2F0ZXdheTogZWd3IH0sXG4gICAgICByb3V0ZU5hbWU6IFwiQ0RLRUlHV1JvdXRlXCIsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIG5ldyBJbnRlcm5ldCBHYXRld2F5IHRvIHRoaXMgVlBDXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gY3JlYXRlcyBhIG5ldyByb3V0ZSBmb3IgcHVibGljIHN1Ym5ldHMod2l0aCBhbGwgb3V0Ym91bmQgYWNjZXNzKSB0byB0aGUgSW50ZXJuZXQgR2F0ZXdheS5cbiAgICovXG4gIHB1YmxpYyBhZGRJbnRlcm5ldEdhdGV3YXkob3B0aW9ucz86IEludGVybmV0R2F0ZXdheU9wdGlvbnMpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5faW50ZXJuZXRHYXRld2F5SWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBJbnRlcm5ldCBHYXRld2F5IGhhcyBhbHJlYWR5IGJlZW4gZW5hYmxlZC5cIik7XG4gICAgfVxuXG4gICAgY29uc3QgaWd3ID0gbmV3IEludGVybmV0R2F0ZXdheSh0aGlzLCBcIkludGVybmV0R2F0ZXdheVwiLCB7XG4gICAgICB2cGM6IHRoaXMsXG4gICAgICBpbnRlcm5ldEdhdGV3YXlOYW1lOiBvcHRpb25zPy5pbnRlcm5ldEdhdGV3YXlOYW1lLFxuICAgIH0pO1xuXG4gICAgdGhpcy5faW50ZXJuZXRDb25uZWN0aXZpdHlFc3RhYmxpc2hlZC5hZGQoaWd3KTtcbiAgICB0aGlzLl9pbnRlcm5ldEdhdGV3YXlJZCA9IGlndy5yb3V0ZXJUYXJnZXRJZDtcblxuICAgIC8vIElmIHRoZXJlIGFyZSBubyBwdWJsaWMgc3VibmV0cyBkZWZpbmVkLCBubyBkZWZhdWx0IHJvdXRlIHdpbGwgYmUgYWRkZWRcbiAgICBpZiAodGhpcy5wdWJsaWNTdWJuZXRzKSB7XG4gICAgICB0aGlzLnB1YmxpY1N1Ym5ldHMuZm9yRWFjaCgocykgPT5cbiAgICAgICAgdGhpcy5hZGREZWZhdWx0SW50ZXJuZXRSb3V0ZShzLCBpZ3csIG9wdGlvbnMpLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBkZWZhdWx0IHJvdXRlIGZvciB0aGUgaW50ZXJuZXQgZ2F0ZXdheVxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHByaXZhdGUgYWRkRGVmYXVsdEludGVybmV0Um91dGUoXG4gICAgc3VibmV0OiBJU3VibmV0VjIsXG4gICAgaWd3OiBJbnRlcm5ldEdhdGV3YXksXG4gICAgb3B0aW9ucz86IEludGVybmV0R2F0ZXdheU9wdGlvbnMsXG4gICk6IHZvaWQge1xuICAgIGlmIChzdWJuZXQuc3VibmV0VHlwZSAhPT0gU3VibmV0VHlwZS5QVUJMSUMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJObyBwdWJsaWMgc3VibmV0cyBkZWZpbmVkIHRvIGFkZCByb3V0ZSBmb3IgaW50ZXJuZXQgZ2F0ZXdheVwiLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBBZGQgZGVmYXVsdCByb3V0ZSB0byBJR1cgZm9yIElQdjZcbiAgICBpZiAoc3VibmV0LmlwdjZDaWRyQmxvY2spIHtcbiAgICAgIG5ldyBSb3V0ZSh0aGlzLCBgJHtzdWJuZXQubm9kZS5pZH0tRGVmYXVsdElQdjZSb3V0ZWAsIHtcbiAgICAgICAgcm91dGVUYWJsZTogc3VibmV0LnJvdXRlVGFibGUsXG4gICAgICAgIGRlc3RpbmF0aW9uOiBvcHRpb25zPy5pcHY2RGVzdGluYXRpb24gPz8gXCI6Oi8wXCIsXG4gICAgICAgIHRhcmdldDogeyBnYXRld2F5OiBpZ3cgfSxcbiAgICAgICAgcm91dGVOYW1lOiBcIkNES0RlZmF1bHRJUHY2Um91dGVcIixcbiAgICAgIH0pO1xuICAgIH1cbiAgICAvL0FkZCBkZWZhdWx0IHJvdXRlIHRvIElHVyBmb3IgSVB2NFxuICAgIG5ldyBSb3V0ZSh0aGlzLCBgJHtzdWJuZXQubm9kZS5pZH0tRGVmYXVsdFJvdXRlYCwge1xuICAgICAgcm91dGVUYWJsZTogc3VibmV0LnJvdXRlVGFibGUsXG4gICAgICBkZXN0aW5hdGlvbjogb3B0aW9ucz8uaXB2NERlc3RpbmF0aW9uID8/IFwiMC4wLjAuMC8wXCIsXG4gICAgICB0YXJnZXQ6IHsgZ2F0ZXdheTogaWd3IH0sXG4gICAgICByb3V0ZU5hbWU6IFwiQ0RLRGVmYXVsdElQdjRSb3V0ZVwiLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBuZXcgTkFUIEdhdGV3YXkgdG8gdGhlIGdpdmVuIHN1Ym5ldCBvZiB0aGlzIFZQQ1xuICAgKiBvZiBnaXZlbiBzdWJuZXRzLlxuICAgKi9cbiAgcHVibGljIGFkZE5hdEdhdGV3YXkob3B0aW9uczogTmF0R2F0ZXdheU9wdGlvbnMpOiBOYXRHYXRld2F5IHtcbiAgICBpZiAoXG4gICAgICBvcHRpb25zLmNvbm5lY3Rpdml0eVR5cGUgPT09IE5hdENvbm5lY3Rpdml0eVR5cGUuUFVCTElDICYmXG4gICAgICAhdGhpcy5faW50ZXJuZXRHYXRld2F5SWRcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJDYW5ub3QgYWRkIGEgUHVibGljIE5BVCBHYXRld2F5IHdpdGhvdXQgYW4gSW50ZXJuZXQgR2F0ZXdheSBlbmFibGVkIG9uIFZQQ1wiLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBOYXRHYXRld2F5KHRoaXMsIFwiTkFUR2F0ZXdheVwiLCB7XG4gICAgICB2cGM6IHRoaXMsXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBuZXcgZmxvdyBsb2cgdG8gdGhpcyBWUENcbiAgICovXG4gIHB1YmxpYyBhZGRGbG93TG9nKGlkOiBzdHJpbmcsIG9wdGlvbnM/OiBGbG93TG9nT3B0aW9ucyk6IEZsb3dMb2cge1xuICAgIHJldHVybiBuZXcgRmxvd0xvZyh0aGlzLCBpZCwge1xuICAgICAgcmVzb3VyY2VUeXBlOiBGbG93TG9nUmVzb3VyY2VUeXBlLmZyb21WcGModGhpcyksXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgcGVlcmluZyBjb25uZWN0aW9uIHJvbGUgZm9yIGFjY2VwdG9yIFZQQ1xuICAgKi9cbiAgcHVibGljIGNyZWF0ZUFjY2VwdG9yVnBjUm9sZShyZXF1ZXN0b3JBY2NvdW50SWQ6IHN0cmluZyk6IFJvbGUge1xuICAgIGNvbnN0IHBlZXJpbmdSb2xlID0gbmV3IFJvbGUodGhpcywgXCJWcGNQZWVyaW5nUm9sZVwiLCB7XG4gICAgICBhc3N1bWVkQnk6IG5ldyBBY2NvdW50UHJpbmNpcGFsKHJlcXVlc3RvckFjY291bnRJZCksXG4gICAgICByb2xlTmFtZTogXCJWcGNQZWVyaW5nUm9sZVwiLFxuICAgICAgZGVzY3JpcHRpb246IFwiUmVzdHJpY3RpdmUgcm9sZSBmb3IgVlBDIHBlZXJpbmdcIixcbiAgICB9KTtcblxuICAgIHBlZXJpbmdSb2xlLmFkZFRvUG9saWN5KFxuICAgICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGVmZmVjdDogRWZmZWN0LkFMTE9XLFxuICAgICAgICBhY3Rpb25zOiBbXCJlYzI6QWNjZXB0VnBjUGVlcmluZ0Nvbm5lY3Rpb25cIl0sXG4gICAgICAgIHJlc291cmNlczogW1xuICAgICAgICAgIGBhcm46JHtBd3NTdGFjay5vZkF3c0NvbnN0cnVjdCh0aGlzKS5wYXJ0aXRpb259OmVjMjoke3RoaXMucmVnaW9ufToke3RoaXMub3duZXJBY2NvdW50SWR9OnZwYy8ke3RoaXMudnBjSWR9YCxcbiAgICAgICAgXSxcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICBwZWVyaW5nUm9sZS5hZGRUb1BvbGljeShcbiAgICAgIG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICBhY3Rpb25zOiBbXCJlYzI6QWNjZXB0VnBjUGVlcmluZ0Nvbm5lY3Rpb25cIl0sXG4gICAgICAgIGVmZmVjdDogRWZmZWN0LkFMTE9XLFxuICAgICAgICByZXNvdXJjZXM6IFtcbiAgICAgICAgICBgYXJuOiR7QXdzU3RhY2sub2ZBd3NDb25zdHJ1Y3QodGhpcykucGFydGl0aW9ufTplYzI6JHt0aGlzLnJlZ2lvbn06JHt0aGlzLm93bmVyQWNjb3VudElkfTp2cGMtcGVlcmluZy1jb25uZWN0aW9uLypgLFxuICAgICAgICBdLFxuICAgICAgICBjb25kaXRpb246IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0ZXN0OiBcIlN0cmluZ0VxdWFsc1wiLFxuICAgICAgICAgICAgdmFyaWFibGU6IFwiZWMyOkFjY2VwdGVyVnBjXCIsXG4gICAgICAgICAgICB2YWx1ZXM6IFtcbiAgICAgICAgICAgICAgYGFybjoke0F3c1N0YWNrLm9mQXdzQ29uc3RydWN0KHRoaXMpLnBhcnRpdGlvbn06ZWMyOiR7dGhpcy5yZWdpb259OiR7dGhpcy5vd25lckFjY291bnRJZH06dnBjLyR7dGhpcy52cGNJZH1gLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSksXG4gICAgKTtcblxuICAgIHJldHVybiBwZWVyaW5nUm9sZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgcGVlcmluZyBjb25uZWN0aW9uXG4gICAqL1xuICBwdWJsaWMgY3JlYXRlUGVlcmluZ0Nvbm5lY3Rpb24oXG4gICAgaWQ6IHN0cmluZyxcbiAgICBvcHRpb25zOiBWUENQZWVyaW5nQ29ubmVjdGlvbk9wdGlvbnMsXG4gICk6IFZQQ1BlZXJpbmdDb25uZWN0aW9uIHtcbiAgICByZXR1cm4gbmV3IFZQQ1BlZXJpbmdDb25uZWN0aW9uKHRoaXMsIGlkLCB7XG4gICAgICByZXF1ZXN0b3JWcGM6IHRoaXMsXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGlkIG9mIHRoZSBWUE4gR2F0ZXdheSAoaWYgZW5hYmxlZClcbiAgICovXG4gIHB1YmxpYyBnZXQgdnBuR2F0ZXdheUlkKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3ZwbkdhdGV3YXlJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBpZCBvZiB0aGUgSW50ZXJuZXQgR2F0ZXdheSAoaWYgZW5hYmxlZClcbiAgICovXG4gIHB1YmxpYyBnZXQgaW50ZXJuZXRHYXRld2F5SWQoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5faW50ZXJuZXRHYXRld2F5SWQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBzdWJuZXRzIGFwcHJvcHJpYXRlIGZvciB0aGUgcGxhY2VtZW50IHN0cmF0ZWd5XG4gICAqL1xuICBwcm90ZWN0ZWQgc2VsZWN0U3VibmV0T2JqZWN0cyhzZWxlY3Rpb246IFN1Ym5ldFNlbGVjdGlvbiA9IHt9KTogSVN1Ym5ldFtdIHtcbiAgICBzZWxlY3Rpb24gPSB0aGlzLnJlaWZ5U2VsZWN0aW9uRGVmYXVsdHMoc2VsZWN0aW9uKTtcblxuICAgIGlmIChzZWxlY3Rpb24uc3VibmV0cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gc2VsZWN0aW9uLnN1Ym5ldHM7XG4gICAgfVxuXG4gICAgbGV0IHN1Ym5ldHM7XG5cbiAgICBpZiAoc2VsZWN0aW9uLnN1Ym5ldEdyb3VwTmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBTZWxlY3QgYnkgbmFtZVxuICAgICAgc3VibmV0cyA9IHRoaXMuc2VsZWN0U3VibmV0T2JqZWN0c0J5TmFtZShzZWxlY3Rpb24uc3VibmV0R3JvdXBOYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gT3Igc3BlY2lmeSBieSB0eXBlXG4gICAgICBjb25zdCB0eXBlID0gc2VsZWN0aW9uLnN1Ym5ldFR5cGUgfHwgU3VibmV0VHlwZS5QUklWQVRFX1dJVEhfRUdSRVNTO1xuICAgICAgc3VibmV0cyA9IHRoaXMuc2VsZWN0U3VibmV0T2JqZWN0c0J5VHlwZSh0eXBlKTtcbiAgICB9XG5cbiAgICAvLyBBcHBseSBhbGwgdGhlIGZpbHRlcnNcbiAgICBzdWJuZXRzID0gdGhpcy5hcHBseVN1Ym5ldEZpbHRlcnMoc3VibmV0cywgc2VsZWN0aW9uLnN1Ym5ldEZpbHRlcnMgPz8gW10pO1xuXG4gICAgcmV0dXJuIHN1Ym5ldHM7XG4gIH1cblxuICBwcml2YXRlIGFwcGx5U3VibmV0RmlsdGVycyhcbiAgICBzdWJuZXRzOiBJU3VibmV0W10sXG4gICAgZmlsdGVyczogU3VibmV0RmlsdGVyW10sXG4gICk6IElTdWJuZXRbXSB7XG4gICAgbGV0IGZpbHRlcmVkID0gc3VibmV0cztcbiAgICAvLyBBcHBseSBlYWNoIGZpbHRlciBpbiBzZXF1ZW5jZVxuICAgIGZvciAoY29uc3QgZmlsdGVyIG9mIGZpbHRlcnMpIHtcbiAgICAgIGZpbHRlcmVkID0gZmlsdGVyLnNlbGVjdFN1Ym5ldHMoZmlsdGVyZWQpO1xuICAgIH1cbiAgICByZXR1cm4gZmlsdGVyZWQ7XG4gIH1cblxuICBwcml2YXRlIHNlbGVjdFN1Ym5ldE9iamVjdHNCeU5hbWUoZ3JvdXBOYW1lOiBzdHJpbmcpIHtcbiAgICBjb25zdCBhbGxTdWJuZXRzID0gW1xuICAgICAgLi4udGhpcy5wdWJsaWNTdWJuZXRzLFxuICAgICAgLi4udGhpcy5wcml2YXRlU3VibmV0cyxcbiAgICAgIC4uLnRoaXMuaXNvbGF0ZWRTdWJuZXRzLFxuICAgIF07XG4gICAgY29uc3Qgc3VibmV0cyA9IGFsbFN1Ym5ldHMuZmlsdGVyKFxuICAgICAgKHMpID0+IHN1Ym5ldEdyb3VwTmFtZUZyb21Db25zdHJ1Y3RJZChzKSA9PT0gZ3JvdXBOYW1lLFxuICAgICk7XG5cbiAgICBpZiAoc3VibmV0cy5sZW5ndGggPT09IDAgJiYgIXRoaXMuaW5jb21wbGV0ZVN1Ym5ldERlZmluaXRpb24pIHtcbiAgICAgIGNvbnN0IG5hbWVzID0gQXJyYXkuZnJvbShcbiAgICAgICAgbmV3IFNldChhbGxTdWJuZXRzLm1hcChzdWJuZXRHcm91cE5hbWVGcm9tQ29uc3RydWN0SWQpKSxcbiAgICAgICk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUaGVyZSBhcmUgbm8gc3VibmV0IGdyb3VwcyB3aXRoIG5hbWUgJyR7Z3JvdXBOYW1lfScgaW4gdGhpcyBWUEMuIEF2YWlsYWJsZSBuYW1lczogJHtuYW1lc31gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3VibmV0cztcbiAgfVxuXG4gIHByaXZhdGUgc2VsZWN0U3VibmV0T2JqZWN0c0J5VHlwZShzdWJuZXRUeXBlOiBTdWJuZXRUeXBlKSB7XG4gICAgY29uc3QgYWxsU3VibmV0cyA9IHtcbiAgICAgIFtTdWJuZXRUeXBlLlBSSVZBVEVfSVNPTEFURURdOiB0aGlzLmlzb2xhdGVkU3VibmV0cyxcbiAgICAgIFtTdWJuZXRUeXBlLklTT0xBVEVEXTogdGhpcy5pc29sYXRlZFN1Ym5ldHMsXG4gICAgICBbU3VibmV0VHlwZS5QUklWQVRFX1dJVEhfTkFUXTogdGhpcy5wcml2YXRlU3VibmV0cyxcbiAgICAgIFtTdWJuZXRUeXBlLlBSSVZBVEVfV0lUSF9FR1JFU1NdOiB0aGlzLnByaXZhdGVTdWJuZXRzLFxuICAgICAgW1N1Ym5ldFR5cGUuUFJJVkFURV06IHRoaXMucHJpdmF0ZVN1Ym5ldHMsXG4gICAgICBbU3VibmV0VHlwZS5QVUJMSUNdOiB0aGlzLnB1YmxpY1N1Ym5ldHMsXG4gICAgfTtcblxuICAgIGNvbnN0IHN1Ym5ldHMgPSBhbGxTdWJuZXRzW3N1Ym5ldFR5cGVdO1xuXG4gICAgLy8gRm9yY2UgbWVyZ2UgY29uZmxpY3QgaGVyZSB3aXRoIGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9wdWxsLzQwODlcbiAgICAvLyBzZWUgSW1wb3J0ZWRWcGNcblxuICAgIGlmIChzdWJuZXRzLmxlbmd0aCA9PT0gMCAmJiAhdGhpcy5pbmNvbXBsZXRlU3VibmV0RGVmaW5pdGlvbikge1xuICAgICAgY29uc3QgYXZhaWxhYmxlVHlwZXMgPSBPYmplY3QuZW50cmllcyhhbGxTdWJuZXRzKVxuICAgICAgICAuZmlsdGVyKChbXywgc3Vic10pID0+IHN1YnMubGVuZ3RoID4gMClcbiAgICAgICAgLm1hcCgoW3R5cGVOYW1lLCBfXSkgPT4gdHlwZU5hbWUpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVGhlcmUgYXJlIG5vICcke3N1Ym5ldFR5cGV9JyBzdWJuZXQgZ3JvdXBzIGluIHRoaXMgVlBDLiBBdmFpbGFibGUgdHlwZXM6ICR7YXZhaWxhYmxlVHlwZXN9YCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN1Ym5ldHM7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgdGhlIGZpZWxkcyBpbiBhIFN1Ym5ldFNlbGVjdGlvbiBvYmplY3QsIGFuZCByZWlmeSBkZWZhdWx0cyBpZiBuZWNlc3NhcnlcbiAgICpcbiAgICogSW4gY2FzZSBvZiBkZWZhdWx0IHNlbGVjdGlvbiwgc2VsZWN0IHRoZSBmaXJzdCB0eXBlIG9mIFBSSVZBVEUsIElTT0xBVEVELFxuICAgKiBQVUJMSUMgKGluIHRoYXQgb3JkZXIpIHRoYXQgaGFzIGFueSBzdWJuZXRzLlxuICAgKi9cbiAgcHJpdmF0ZSByZWlmeVNlbGVjdGlvbkRlZmF1bHRzKHBsYWNlbWVudDogU3VibmV0U2VsZWN0aW9uKTogU3VibmV0U2VsZWN0aW9uIHtcbiAgICAvLyBUT0RPOiB0aHJvdyBlcnJvciBhcyBuZXcgVnBjVjIgY2Fubm90IHN1cHBvcnQgc3VibmV0TmFtZSBvciBzdWJuZXRHcm91cE5hbWUgYW55bW9yZVxuICAgIGlmIChwbGFjZW1lbnQuc3VibmV0TmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAocGxhY2VtZW50LnN1Ym5ldEdyb3VwTmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBcIlBsZWFzZSB1c2Ugb25seSAnc3VibmV0R3JvdXBOYW1lJyAoJ3N1Ym5ldE5hbWUnIGlzIGRlcHJlY2F0ZWQgYW5kIGhhcyB0aGUgc2FtZSBiZWhhdmlvcilcIixcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFwiQGF3cy1jZGsvYXdzLWVjMjpzdWJuZXROYW1lRGVwcmVjYXRlZFwiLFxuICAgICAgICBBbm5vdGF0aW9ucy5vZih0aGlzKS5hZGRXYXJuaW5nKFxuICAgICAgICAgIFwiVXNhZ2Ugb2YgJ3N1Ym5ldE5hbWUnIGluIFN1Ym5ldFNlbGVjdGlvbiBpcyBkZXByZWNhdGVkLCB1c2UgJ3N1Ym5ldEdyb3VwTmFtZScgaW5zdGVhZFwiLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcGxhY2VtZW50ID0geyAuLi5wbGFjZW1lbnQsIHN1Ym5ldEdyb3VwTmFtZTogcGxhY2VtZW50LnN1Ym5ldE5hbWUgfTtcbiAgICB9XG5cbiAgICBjb25zdCBleGNsdXNpdmVTZWxlY3Rpb25zOiBBcnJheTxrZXlvZiBTdWJuZXRTZWxlY3Rpb24+ID0gW1xuICAgICAgXCJzdWJuZXRzXCIsXG4gICAgICBcInN1Ym5ldFR5cGVcIixcbiAgICAgIFwic3VibmV0R3JvdXBOYW1lXCIsXG4gICAgXTtcbiAgICBjb25zdCBwcm92aWRlZFNlbGVjdGlvbnMgPSBleGNsdXNpdmVTZWxlY3Rpb25zLmZpbHRlcihcbiAgICAgIChrZXkpID0+IHBsYWNlbWVudFtrZXldICE9PSB1bmRlZmluZWQsXG4gICAgKTtcbiAgICBpZiAocHJvdmlkZWRTZWxlY3Rpb25zLmxlbmd0aCA+IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYE9ubHkgb25lIG9mICcke3Byb3ZpZGVkU2VsZWN0aW9uc30nIGNhbiBiZSBzdXBwbGllZCB0byBzdWJuZXQgc2VsZWN0aW9uLmAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIHBsYWNlbWVudC5zdWJuZXRUeXBlID09PSB1bmRlZmluZWQgJiZcbiAgICAgIHBsYWNlbWVudC5zdWJuZXRHcm91cE5hbWUgPT09IHVuZGVmaW5lZCAmJlxuICAgICAgcGxhY2VtZW50LnN1Ym5ldHMgPT09IHVuZGVmaW5lZFxuICAgICkge1xuICAgICAgLy8gUmV0dXJuIGRlZmF1bHQgc3VibmV0IHR5cGUgYmFzZWQgb24gc3VibmV0cyB0aGF0IGFjdHVhbGx5IGV4aXN0XG4gICAgICBsZXQgc3VibmV0VHlwZSA9IHRoaXMucHJpdmF0ZVN1Ym5ldHMubGVuZ3RoXG4gICAgICAgID8gU3VibmV0VHlwZS5QUklWQVRFX1dJVEhfRUdSRVNTXG4gICAgICAgIDogdGhpcy5pc29sYXRlZFN1Ym5ldHMubGVuZ3RoXG4gICAgICAgICAgPyBTdWJuZXRUeXBlLlBSSVZBVEVfSVNPTEFURURcbiAgICAgICAgICA6IFN1Ym5ldFR5cGUuUFVCTElDO1xuICAgICAgcGxhY2VtZW50ID0geyAuLi5wbGFjZW1lbnQsIHN1Ym5ldFR5cGU6IHN1Ym5ldFR5cGUgfTtcbiAgICB9XG5cbiAgICAvLyBFc3RhYmxpc2ggd2hpY2ggc3VibmV0IGZpbHRlcnMgYXJlIGdvaW5nIHRvIGJlIHVzZWRcbiAgICBsZXQgc3VibmV0RmlsdGVycyA9IHBsYWNlbWVudC5zdWJuZXRGaWx0ZXJzID8/IFtdO1xuXG4gICAgLy8gQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCBleGlzdGluZyBgYXZhaWxhYmlsaXR5Wm9uZXNgIGFuZCBgb25lUGVyQXpgIGZ1bmN0aW9uYWxpdHlcbiAgICBpZiAocGxhY2VtZW50LmF2YWlsYWJpbGl0eVpvbmVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIEZpbHRlciBieSBBWnMsIGlmIHNwZWNpZmllZFxuICAgICAgc3VibmV0RmlsdGVycy5wdXNoKFxuICAgICAgICBTdWJuZXRGaWx0ZXIuYXZhaWxhYmlsaXR5Wm9uZXMocGxhY2VtZW50LmF2YWlsYWJpbGl0eVpvbmVzKSxcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICghIXBsYWNlbWVudC5vbmVQZXJBeikge1xuICAgICAgLy8gRW5zdXJlIG9uZSBwZXIgQVogaWYgc3BlY2lmaWVkXG4gICAgICBzdWJuZXRGaWx0ZXJzLnB1c2goU3VibmV0RmlsdGVyLm9uZVBlckF6KCkpO1xuICAgIH1cblxuICAgIC8vIE92ZXJ3cml0ZSB0aGUgcHJvdmlkZWQgcGxhY2VtZW50IGZpbHRlcnMgYW5kIHJlbW92ZSB0aGUgYXZhaWxhYmlsaXR5Wm9uZXMgYW5kIG9uZVBlckF6IHByb3BlcnRpZXNcbiAgICBwbGFjZW1lbnQgPSB7XG4gICAgICAuLi5wbGFjZW1lbnQsXG4gICAgICBzdWJuZXRGaWx0ZXJzOiBzdWJuZXRGaWx0ZXJzLFxuICAgICAgYXZhaWxhYmlsaXR5Wm9uZXM6IHVuZGVmaW5lZCxcbiAgICAgIG9uZVBlckF6OiB1bmRlZmluZWQsXG4gICAgfTtcbiAgICBjb25zdCB7IGF2YWlsYWJpbGl0eVpvbmVzLCBvbmVQZXJBeiwgLi4ucmVzdCB9ID0gcGxhY2VtZW50O1xuXG4gICAgcmV0dXJuIHJlc3Q7XG4gIH1cbn1cblxuY2xhc3MgQ29tcG9zaXRlRGVwZW5kYWJsZSBpbXBsZW1lbnRzIElEZXBlbmRhYmxlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBkZXBlbmRhYmxlcyA9IG5ldyBBcnJheTxJRGVwZW5kYWJsZT4oKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICBEZXBlbmRhYmxlLmltcGxlbWVudCh0aGlzLCB7XG4gICAgICBnZXQgZGVwZW5kZW5jeVJvb3RzKCkge1xuICAgICAgICBjb25zdCByZXQgPSBuZXcgQXJyYXk8SUNvbnN0cnVjdD4oKTtcbiAgICAgICAgZm9yIChjb25zdCBkZXAgb2Ygc2VsZi5kZXBlbmRhYmxlcykge1xuICAgICAgICAgIHJldC5wdXNoKC4uLkRlcGVuZGFibGUub2YoZGVwKS5kZXBlbmRlbmN5Um9vdHMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIGNvbnN0cnVjdCB0byB0aGUgZGVwZW5kZW5jeSByb290c1xuICAgKi9cbiAgcHVibGljIGFkZChkZXA6IElEZXBlbmRhYmxlKSB7XG4gICAgdGhpcy5kZXBlbmRhYmxlcy5wdXNoKGRlcCk7XG4gIH1cbn1cblxuLyoqXG4gKiBJbnZva2UgYSBmdW5jdGlvbiBvbiBhIHZhbHVlIChmb3IgaXRzIHNpZGUgZWZmZWN0KSBhbmQgcmV0dXJuIHRoZSB2YWx1ZVxuICovXG5mdW5jdGlvbiB0YXA8VD4oeDogVCwgZm46ICh4OiBUKSA9PiB2b2lkKTogVCB7XG4gIGZuKHgpO1xuICByZXR1cm4geDtcbn1cbiJdfQ==
|