terraconstructs 0.0.24 → 0.1.0
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 +83665 -54911
- package/.mise.toml +1 -1
- package/.nvmrc +1 -1
- package/LICENSE +202 -674
- package/go.mod +9 -7
- package/go.sum +18 -14
- package/lib/asset-manager.d.ts +23 -0
- package/lib/asset-manager.js +3 -0
- package/lib/asset-staging.d.ts +178 -0
- package/lib/asset-staging.js +589 -0
- package/lib/assets.d.ts +359 -0
- package/lib/assets.js +55 -0
- package/lib/aws/arn.js +16 -15
- package/lib/aws/aws-asset-manager.d.ts +91 -0
- package/lib/aws/aws-asset-manager.js +244 -0
- package/lib/aws/aws-construct.js +1 -1
- package/lib/aws/aws-stack.d.ts +37 -0
- package/lib/aws/aws-stack.js +30 -9
- package/lib/aws/aws-tags.js +2 -2
- package/lib/aws/cloudwatch/actions/appscaling.d.ts +15 -0
- package/lib/aws/cloudwatch/actions/appscaling.js +24 -0
- package/lib/aws/cloudwatch/actions/ec2.js +1 -1
- package/lib/aws/cloudwatch/actions/index.d.ts +3 -0
- package/lib/aws/cloudwatch/actions/index.js +4 -4
- package/lib/aws/cloudwatch/actions/lambda.js +1 -1
- package/lib/aws/cloudwatch/actions/sns.d.ts +14 -0
- package/lib/aws/cloudwatch/actions/sns.js +23 -0
- package/lib/aws/cloudwatch/actions/ssm.d.ts +72 -0
- package/lib/aws/cloudwatch/actions/ssm.js +104 -0
- 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.js +1 -1
- 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/query-definition.js +2 -2
- package/lib/aws/cloudwatch/stats.js +1 -1
- package/lib/aws/cloudwatch/subscription-filter.js +1 -1
- package/lib/aws/cloudwatch/text.js +1 -1
- package/lib/aws/cloudwatch/variable.js +3 -3
- package/lib/aws/cloudwatch/widget.js +1 -1
- package/lib/aws/compute/access-log.d.ts +478 -0
- package/lib/aws/compute/access-log.js +649 -0
- package/lib/aws/compute/activity.js +1 -1
- package/lib/aws/compute/alb/application-listener-action.js +1 -1
- package/lib/aws/compute/alb/application-listener-certificate.js +1 -1
- package/lib/aws/compute/alb/application-listener-rule.js +1 -1
- package/lib/aws/compute/alb/application-listener.js +1 -1
- package/lib/aws/compute/alb/application-load-balancer.js +1 -1
- package/lib/aws/compute/alb/application-target-group.js +1 -1
- package/lib/aws/compute/alb/conditions.js +1 -1
- package/lib/aws/compute/alb/trust-store-revocation.js +1 -1
- package/lib/aws/compute/alb/trust-store.js +1 -1
- package/lib/aws/compute/api-definition.d.ts +106 -0
- package/lib/aws/compute/api-definition.js +200 -0
- package/lib/aws/compute/api-key.d.ts +184 -0
- package/lib/aws/compute/api-key.js +197 -0
- package/lib/aws/compute/apigateway-canned-metrics.generated.d.ts +169 -0
- package/lib/aws/compute/apigateway-canned-metrics.generated.js +63 -0
- package/lib/aws/compute/apigateway-util.d.ts +31 -0
- package/lib/aws/compute/apigateway-util.js +152 -0
- package/lib/aws/compute/architecture.js +1 -1
- package/lib/aws/compute/aspects/require-imdsv2-aspect.js +2 -2
- package/lib/aws/compute/authorizer.d.ts +35 -0
- package/lib/aws/compute/authorizer.js +28 -0
- package/lib/aws/compute/authorizers/identity-source.d.ts +37 -0
- package/lib/aws/compute/authorizers/identity-source.js +61 -0
- package/lib/aws/compute/authorizers/index.d.ts +2 -0
- package/lib/aws/compute/authorizers/index.js +20 -0
- package/lib/aws/compute/authorizers/lambda.d.ts +140 -0
- package/lib/aws/compute/authorizers/lambda.js +208 -0
- package/lib/aws/compute/base-path-mapping.d.ts +49 -0
- package/lib/aws/compute/base-path-mapping.js +52 -0
- package/lib/aws/compute/base-scalable-attribute.js +3 -3
- package/lib/aws/compute/bastion-host.js +1 -1
- package/lib/aws/compute/chain.js +1 -1
- package/lib/aws/compute/client-vpn-authorization-rule.js +1 -1
- package/lib/aws/compute/client-vpn-endpoint.js +2 -2
- package/lib/aws/compute/client-vpn-route.js +2 -2
- package/lib/aws/compute/code.d.ts +415 -0
- package/lib/aws/compute/code.js +424 -0
- package/lib/aws/compute/condition.js +1 -1
- package/lib/aws/compute/connections.js +1 -1
- package/lib/aws/compute/cors.d.ts +102 -0
- package/lib/aws/compute/cors.js +33 -0
- package/lib/aws/compute/deployment.d.ts +83 -0
- package/lib/aws/compute/deployment.js +158 -0
- package/lib/aws/compute/domain-name.d.ts +153 -0
- package/lib/aws/compute/domain-name.js +158 -0
- package/lib/aws/compute/event-invoke-config.d.ts +2 -2
- package/lib/aws/compute/event-invoke-config.js +4 -4
- package/lib/aws/compute/event-source-filter.js +2 -2
- package/lib/aws/compute/event-source-mapping.d.ts +2 -2
- package/lib/aws/compute/event-source-mapping.js +9 -7
- 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 +3 -2
- package/lib/aws/compute/fields.js +4 -4
- package/lib/aws/compute/function-alias.d.ts +1 -0
- package/lib/aws/compute/function-alias.js +8 -2
- package/lib/aws/compute/function-base.d.ts +15 -0
- package/lib/aws/compute/function-base.js +4 -4
- 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/bundling.d.ts +75 -0
- package/lib/aws/compute/function-nodejs/bundling.js +405 -0
- package/lib/aws/compute/function-nodejs/function.d.ts +99 -0
- package/lib/aws/compute/function-nodejs/function.js +175 -0
- package/lib/aws/compute/function-nodejs/index.d.ts +2 -0
- package/lib/aws/compute/function-nodejs/index.js +19 -0
- package/lib/aws/compute/function-nodejs/package-installation.d.ts +8 -0
- package/lib/aws/compute/function-nodejs/package-installation.js +36 -0
- package/lib/aws/compute/function-nodejs/package-manager.d.ts +33 -0
- package/lib/aws/compute/function-nodejs/package-manager.js +99 -0
- package/lib/aws/compute/function-nodejs/types.d.ts +410 -0
- package/lib/aws/compute/function-nodejs/types.js +81 -0
- package/lib/aws/compute/function-nodejs/util.d.ts +60 -0
- package/lib/aws/compute/function-nodejs/util.js +202 -0
- package/lib/aws/compute/function-url.d.ts +2 -2
- package/lib/aws/compute/function-url.js +4 -4
- package/lib/aws/compute/function.d.ts +34 -4
- package/lib/aws/compute/function.js +91 -17
- package/lib/aws/compute/gateway-response.d.ts +157 -0
- package/lib/aws/compute/gateway-response.js +156 -0
- package/lib/aws/compute/handler.d.ts +10 -0
- package/lib/aws/compute/handler.js +20 -0
- package/lib/aws/compute/index.d.ts +27 -0
- package/lib/aws/compute/index.js +29 -1
- package/lib/aws/compute/instance-types.js +1 -1
- package/lib/aws/compute/instance.js +1 -1
- package/lib/aws/compute/integration.d.ts +311 -0
- package/lib/aws/compute/integration.js +165 -0
- package/lib/aws/compute/integrations/aws.d.ts +72 -0
- package/lib/aws/compute/integrations/aws.js +55 -0
- package/lib/aws/compute/integrations/http.d.ts +37 -0
- package/lib/aws/compute/integrations/http.js +35 -0
- package/lib/aws/compute/integrations/index.d.ts +6 -0
- package/lib/aws/compute/integrations/index.js +24 -0
- package/lib/aws/compute/integrations/lambda.d.ts +40 -0
- package/lib/aws/compute/integrations/lambda.js +73 -0
- package/lib/aws/compute/integrations/mock.d.ts +16 -0
- package/lib/aws/compute/integrations/mock.js +30 -0
- package/lib/aws/compute/integrations/request-context.d.ts +144 -0
- package/lib/aws/compute/integrations/request-context.js +3 -0
- package/lib/aws/compute/integrations/stepfunctions.d.ts +102 -0
- package/lib/aws/compute/integrations/stepfunctions.js +268 -0
- package/lib/aws/compute/ip-addresses.js +2 -2
- package/lib/aws/compute/ipam.js +1 -1
- package/lib/aws/compute/json-schema.d.ts +75 -0
- package/lib/aws/compute/json-schema.js +23 -0
- package/lib/aws/compute/key-pair.js +1 -1
- package/lib/aws/compute/lambda-api.d.ts +46 -0
- package/lib/aws/compute/lambda-api.js +64 -0
- package/lib/aws/compute/launch-template.js +2 -2
- package/lib/aws/compute/lb-shared/base-listener.js +1 -1
- package/lib/aws/compute/lb-shared/base-load-balancer.js +2 -2
- package/lib/aws/compute/lb-shared/base-target-group.js +1 -1
- package/lib/aws/compute/lb-shared/listener-certificate.js +1 -1
- package/lib/aws/compute/lb-shared/load-balancer-targets.js +2 -2
- package/lib/aws/compute/lb-targets/alb-target.js +3 -3
- package/lib/aws/compute/lb-targets/instance-target.js +2 -2
- package/lib/aws/compute/lb-targets/ip-target.js +1 -1
- package/lib/aws/compute/lb-targets/lambda-target.js +1 -1
- package/lib/aws/compute/load-balancer.js +3 -3
- package/lib/aws/compute/machine-image/amazon-linux-2022.js +2 -2
- package/lib/aws/compute/machine-image/amazon-linux-2023.js +2 -2
- package/lib/aws/compute/machine-image/amazon-linux2.js +2 -2
- package/lib/aws/compute/machine-image/common.js +1 -1
- package/lib/aws/compute/machine-image/machine-image.js +8 -8
- package/lib/aws/compute/method.d.ts +219 -0
- package/lib/aws/compute/method.js +396 -0
- package/lib/aws/compute/methodresponse.d.ts +28 -0
- package/lib/aws/compute/methodresponse.js +3 -0
- package/lib/aws/compute/model.d.ts +143 -0
- package/lib/aws/compute/model.js +141 -0
- package/lib/aws/compute/nat.js +5 -5
- package/lib/aws/compute/network-acl-types.js +2 -2
- package/lib/aws/compute/network-acl.js +3 -3
- package/lib/aws/compute/nlb/network-listener-action.js +1 -1
- package/lib/aws/compute/nlb/network-listener.js +1 -1
- package/lib/aws/compute/nlb/network-load-balancer.js +1 -1
- package/lib/aws/compute/nlb/network-target-group.js +1 -1
- package/lib/aws/compute/peer.js +1 -1
- package/lib/aws/compute/placement-group.js +1 -1
- package/lib/aws/compute/port.js +1 -1
- package/lib/aws/compute/prefix-list.js +1 -1
- package/lib/aws/compute/requestvalidator.d.ts +50 -0
- package/lib/aws/compute/requestvalidator.js +59 -0
- package/lib/aws/compute/resource.d.ts +223 -0
- package/lib/aws/compute/resource.js +316 -0
- package/lib/aws/compute/restapi.d.ts +510 -0
- package/lib/aws/compute/restapi.js +626 -0
- package/lib/aws/compute/route.js +8 -8
- package/lib/aws/compute/runtime.d.ts +282 -0
- package/lib/aws/compute/runtime.js +337 -0
- package/lib/aws/compute/scalable-target.js +3 -3
- package/lib/aws/compute/schedule.js +3 -3
- package/lib/aws/compute/security-group.js +1 -1
- package/lib/aws/compute/stage.d.ts +350 -0
- package/lib/aws/compute/stage.js +304 -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.js +4 -4
- 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 +1 -1
- 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/step-scaling-action.js +3 -3
- package/lib/aws/compute/step-scaling-policy.js +1 -1
- package/lib/aws/compute/stepfunctions-api.d.ts +103 -0
- package/lib/aws/compute/stepfunctions-api.js +39 -0
- package/lib/aws/compute/subnet-v2.js +2 -2
- package/lib/aws/compute/subnet.js +1 -1
- package/lib/aws/compute/target-tracking-scaling-policy.js +3 -3
- 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/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 +1 -1
- package/lib/aws/compute/usage-plan.d.ts +194 -0
- package/lib/aws/compute/usage-plan.js +174 -0
- package/lib/aws/compute/user-data.js +3 -3
- package/lib/aws/compute/volume.js +2 -2
- package/lib/aws/compute/vpc-endpoint-service.js +1 -1
- package/lib/aws/compute/vpc-endpoint.js +6 -6
- package/lib/aws/compute/vpc-flow-logs.js +4 -4
- package/lib/aws/compute/vpc-link.d.ts +104 -0
- package/lib/aws/compute/vpc-link.js +137 -0
- package/lib/aws/compute/vpc-v2-base.js +1 -1
- package/lib/aws/compute/vpc-v2.js +2 -2
- package/lib/aws/compute/vpc.js +4 -4
- package/lib/aws/compute/vpn.js +3 -3
- package/lib/aws/edge/certificate.js +1 -1
- package/lib/aws/edge/distribution.js +3 -3
- package/lib/aws/edge/dns-alias-record-targets.js +3 -3
- package/lib/aws/edge/dns-record.js +13 -13
- package/lib/aws/edge/dns-zone.js +1 -1
- package/lib/aws/edge/function.js +2 -2
- package/lib/aws/edge/key-value-store.js +4 -4
- package/lib/aws/edge/origin.js +3 -3
- 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/group.js +1 -1
- package/lib/aws/iam/instance-profile.js +1 -1
- package/lib/aws/iam/managed-policy.js +1 -1
- package/lib/aws/iam/oidc-provider.js +1 -1
- package/lib/aws/iam/policy-document.js +1 -1
- package/lib/aws/iam/policy-statement.js +1 -1
- package/lib/aws/iam/policy.js +1 -1
- package/lib/aws/iam/principals.js +20 -20
- package/lib/aws/iam/role.js +1 -1
- package/lib/aws/iam/saml-provider.js +2 -2
- package/lib/aws/iam/unknown-principal.js +1 -1
- package/lib/aws/iam/user.js +5 -5
- package/lib/aws/index.d.ts +1 -0
- package/lib/aws/index.js +4 -1
- package/lib/aws/network/simple-ipv4-vpc.js +1 -1
- package/lib/aws/network/subnet-group.js +3 -3
- package/lib/aws/network/subnet.js +4 -4
- package/lib/aws/notify/archive.js +1 -1
- package/lib/aws/notify/connection.js +3 -3
- package/lib/aws/notify/event-bus.js +3 -3
- package/lib/aws/notify/event-pattern.js +1 -1
- package/lib/aws/notify/input.js +2 -2
- package/lib/aws/notify/kinesis-stream.js +1 -1
- package/lib/aws/notify/notification-rule.d.ts +1 -1
- package/lib/aws/notify/notification-rule.js +5 -5
- package/lib/aws/notify/policy.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 +1 -1
- package/lib/aws/notify/schedule.js +1 -1
- package/lib/aws/notify/subscription-filter.js +1 -1
- package/lib/aws/notify/subscription.js +4 -4
- package/lib/aws/notify/subscriptions/email.js +1 -1
- package/lib/aws/notify/subscriptions/lambda.js +1 -1
- package/lib/aws/notify/subscriptions/sms.js +1 -1
- package/lib/aws/notify/subscriptions/sqs.js +1 -1
- package/lib/aws/notify/subscriptions/url.js +1 -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/topic-base.js +1 -1
- package/lib/aws/notify/topic.js +6 -5
- package/lib/aws/partition.d.ts +21 -0
- package/lib/aws/partition.js +42 -0
- package/lib/aws/storage/assets/image-asset.d.ts +379 -0
- package/lib/aws/storage/assets/image-asset.js +247 -0
- package/lib/aws/storage/assets/index.d.ts +2 -0
- package/lib/aws/storage/assets/index.js +21 -0
- package/lib/aws/storage/assets/s3.d.ts +125 -0
- package/lib/aws/storage/assets/s3.js +80 -0
- package/lib/aws/storage/auth-token.d.ts +25 -0
- package/lib/aws/storage/auth-token.js +54 -0
- package/lib/aws/storage/billing.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.d.ts +1 -1
- package/lib/aws/storage/bucket-source.js +4 -4
- package/lib/aws/storage/bucket.d.ts +14 -6
- package/lib/aws/storage/bucket.js +48 -40
- package/lib/aws/storage/capacity.js +1 -1
- package/lib/aws/storage/ecr-lifecycle.d.ts +88 -0
- package/lib/aws/storage/ecr-lifecycle.js +23 -0
- package/lib/aws/storage/ecr-repository.d.ts +446 -0
- package/lib/aws/storage/ecr-repository.js +685 -0
- package/lib/aws/storage/encryption.js +1 -1
- package/lib/aws/storage/index.d.ts +5 -0
- package/lib/aws/storage/index.js +10 -3
- package/lib/aws/storage/location.d.ts +17 -0
- package/lib/aws/storage/location.js +4 -0
- package/lib/aws/storage/notification-targets/function.js +1 -1
- package/lib/aws/storage/notification-targets/queue.js +1 -1
- package/lib/aws/storage/origin-access-identity.js +1 -1
- package/lib/aws/storage/parameter.js +2 -2
- package/lib/aws/storage/table.js +3 -3
- package/lib/aws/storage/util.d.ts +8 -20
- package/lib/aws/storage/util.js +56 -34
- package/lib/aws/util.d.ts +1 -0
- package/lib/aws/util.js +6 -1
- package/lib/bundling.d.ts +434 -0
- package/lib/bundling.js +368 -0
- package/lib/construct-base.js +2 -2
- package/lib/duration.js +1 -1
- package/lib/expiration.js +1 -1
- package/lib/fs/copy.d.ts +2 -0
- package/lib/fs/copy.js +57 -0
- package/lib/fs/fingerprint.d.ts +21 -0
- package/lib/fs/fingerprint.js +165 -0
- package/lib/fs/ignore.d.ts +107 -0
- package/lib/fs/ignore.js +190 -0
- package/lib/fs/index.d.ts +47 -0
- package/lib/fs/index.js +88 -0
- package/lib/fs/options.d.ts +110 -0
- package/lib/fs/options.js +60 -0
- package/lib/fs/utils.d.ts +11 -0
- package/lib/fs/utils.js +34 -0
- package/lib/index.d.ts +5 -0
- package/lib/index.js +7 -1
- package/lib/private/asset-staging.d.ts +83 -0
- package/lib/private/asset-staging.js +205 -0
- package/lib/private/cache.d.ts +17 -0
- package/lib/private/cache.js +35 -0
- package/lib/private/jsii-deprecated.d.ts +2 -0
- package/lib/private/jsii-deprecated.js +19 -0
- package/lib/private/unique-resource-name.js +3 -2
- package/lib/size.js +1 -1
- package/lib/stack-base.js +1 -1
- package/lib/terra-func.js +2 -2
- package/lib/time-zone.js +1 -1
- package/node_modules/@balena/dockerignore/CHANGELOG.md +31 -0
- package/node_modules/@balena/dockerignore/LICENSE.md +206 -0
- package/node_modules/@balena/dockerignore/README.md +261 -0
- package/node_modules/@balena/dockerignore/ignore.js +363 -0
- package/node_modules/@balena/dockerignore/index.d.ts +45 -0
- package/node_modules/@balena/dockerignore/package.json +49 -0
- package/node_modules/balanced-match/.github/FUNDING.yml +2 -0
- package/node_modules/balanced-match/LICENSE.md +21 -0
- package/node_modules/balanced-match/README.md +97 -0
- package/node_modules/balanced-match/index.js +62 -0
- package/node_modules/balanced-match/package.json +48 -0
- package/node_modules/concat-map/.travis.yml +4 -0
- package/node_modules/concat-map/LICENSE +18 -0
- package/node_modules/concat-map/README.markdown +62 -0
- package/node_modules/concat-map/example/map.js +6 -0
- package/node_modules/concat-map/index.js +13 -0
- package/node_modules/concat-map/package.json +43 -0
- package/node_modules/concat-map/test/map.js +39 -0
- package/node_modules/ignore/LICENSE-MIT +21 -0
- package/node_modules/ignore/README.md +412 -0
- package/node_modules/ignore/index.d.ts +61 -0
- package/node_modules/ignore/index.js +636 -0
- package/node_modules/ignore/legacy.js +559 -0
- package/node_modules/ignore/package.json +74 -0
- package/node_modules/minimatch/LICENSE +15 -0
- package/node_modules/minimatch/README.md +230 -0
- package/node_modules/minimatch/minimatch.js +947 -0
- package/node_modules/minimatch/node_modules/brace-expansion/LICENSE +21 -0
- package/node_modules/minimatch/node_modules/brace-expansion/README.md +129 -0
- package/node_modules/minimatch/node_modules/brace-expansion/index.js +201 -0
- package/node_modules/minimatch/node_modules/brace-expansion/package.json +47 -0
- package/node_modules/minimatch/package.json +33 -0
- package/package.json +14 -5
- package/lib/aws/compute/function-nodejs.d.ts +0 -55
- package/lib/aws/compute/function-nodejs.js +0 -70
|
@@ -0,0 +1,626 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var _a, _b, _c;
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.EndpointType = exports.ApiKeySourceType = exports.RestApi = exports.SpecRestApi = exports.RestApiBase = void 0;
|
|
5
|
+
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
6
|
+
const provider_aws_1 = require("@cdktf/provider-aws");
|
|
7
|
+
const cdktf_1 = require("cdktf");
|
|
8
|
+
const api_key_1 = require("./api-key");
|
|
9
|
+
const apigateway_canned_metrics_generated_1 = require("./apigateway-canned-metrics.generated");
|
|
10
|
+
const deployment_1 = require("./deployment");
|
|
11
|
+
const domain_name_1 = require("./domain-name");
|
|
12
|
+
const gateway_response_1 = require("./gateway-response");
|
|
13
|
+
const model_1 = require("./model");
|
|
14
|
+
const requestvalidator_1 = require("./requestvalidator");
|
|
15
|
+
const resource_1 = require("./resource");
|
|
16
|
+
const stage_1 = require("./stage");
|
|
17
|
+
const arn_1 = require("../arn");
|
|
18
|
+
const usage_plan_1 = require("./usage-plan");
|
|
19
|
+
const aws_construct_1 = require("../aws-construct");
|
|
20
|
+
const aws_stack_1 = require("../aws-stack");
|
|
21
|
+
const cloudwatch = require("../cloudwatch");
|
|
22
|
+
const iam = require("../iam");
|
|
23
|
+
const RESTAPI_SYMBOL = Symbol.for("terraconstructs/lib/aws/compute.RestApiBase");
|
|
24
|
+
const APIGATEWAY_RESTAPI_SYMBOL = Symbol.for("terraconstructs/lib/aws/compute.RestApi");
|
|
25
|
+
/**
|
|
26
|
+
* Base implementation that are common to various implementations of IRestApi
|
|
27
|
+
*/
|
|
28
|
+
class RestApiBase extends aws_construct_1.AwsConstructBase {
|
|
29
|
+
/**
|
|
30
|
+
* Checks if the given object is an instance of RestApiBase.
|
|
31
|
+
* @internal
|
|
32
|
+
*/
|
|
33
|
+
static _isRestApiBase(x) {
|
|
34
|
+
return x !== null && typeof x === "object" && RESTAPI_SYMBOL in x;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* API Gateway deployment that represents the latest changes of the API.
|
|
38
|
+
* This resource will be automatically updated every time the REST API model changes.
|
|
39
|
+
* This will be undefined if `deploy` is false.
|
|
40
|
+
*/
|
|
41
|
+
get latestDeployment() {
|
|
42
|
+
return this._latestDeployment;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* The first domain name mapped to this API, if defined through the `domainName`
|
|
46
|
+
* configuration prop, or added via `addDomainName`
|
|
47
|
+
*/
|
|
48
|
+
get domainName() {
|
|
49
|
+
return this._domainName;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* The deployed root URL of this REST API.
|
|
53
|
+
*/
|
|
54
|
+
get url() {
|
|
55
|
+
return this.urlForPath();
|
|
56
|
+
}
|
|
57
|
+
constructor(scope, id, props = {}) {
|
|
58
|
+
super(scope, id, props);
|
|
59
|
+
this._allowedVpcEndpoints = new Set();
|
|
60
|
+
this.restApiName = props.restApiName ?? this.stack.uniqueResourceName(this);
|
|
61
|
+
Object.defineProperty(this, RESTAPI_SYMBOL, { value: true });
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Returns the URL for an HTTP path.
|
|
65
|
+
*
|
|
66
|
+
* Fails if `deploymentStage` is not set either by `deploy` or explicitly.
|
|
67
|
+
*/
|
|
68
|
+
urlForPath(path = "/") {
|
|
69
|
+
if (!this.deploymentStage) {
|
|
70
|
+
// TODO throw new ValidationError(
|
|
71
|
+
throw new Error('Cannot determine deployment stage for API from "deploymentStage". Use "deploy" or explicitly set "deploymentStage"');
|
|
72
|
+
}
|
|
73
|
+
return this.deploymentStage.urlForPath(path);
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Defines an API Gateway domain name and maps it to this API.
|
|
77
|
+
* @param id The construct id
|
|
78
|
+
* @param options custom domain options
|
|
79
|
+
*/
|
|
80
|
+
addDomainName(id, options) {
|
|
81
|
+
const domainName = new domain_name_1.DomainName(this, id, {
|
|
82
|
+
...options,
|
|
83
|
+
mapping: this,
|
|
84
|
+
});
|
|
85
|
+
if (!this._domainName) {
|
|
86
|
+
this._domainName = domainName;
|
|
87
|
+
}
|
|
88
|
+
return domainName;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Adds a usage plan.
|
|
92
|
+
*/
|
|
93
|
+
addUsagePlan(id, props = {}) {
|
|
94
|
+
return new usage_plan_1.UsagePlan(this, id, props);
|
|
95
|
+
}
|
|
96
|
+
arnForExecuteApi(method = "*", path = "/*", stage = "*") {
|
|
97
|
+
if (!cdktf_1.Token.isUnresolved(path) && !path.startsWith("/")) {
|
|
98
|
+
throw new Error(`"path" must begin with a "/": '${path}'`);
|
|
99
|
+
}
|
|
100
|
+
if (method.toUpperCase() === "ANY") {
|
|
101
|
+
method = "*";
|
|
102
|
+
}
|
|
103
|
+
return aws_stack_1.AwsStack.ofAwsConstruct(this).formatArn({
|
|
104
|
+
service: "execute-api",
|
|
105
|
+
resource: this.restApiId,
|
|
106
|
+
arnFormat: arn_1.ArnFormat.SLASH_RESOURCE_NAME,
|
|
107
|
+
resourceName: `${stage}/${method}${path}`,
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Adds a new gateway response.
|
|
112
|
+
*/
|
|
113
|
+
addGatewayResponse(id, options) {
|
|
114
|
+
return new gateway_response_1.GatewayResponse(this, id, {
|
|
115
|
+
restApi: this,
|
|
116
|
+
...options,
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Add an ApiKey to the deploymentStage
|
|
121
|
+
*/
|
|
122
|
+
addApiKey(id, options) {
|
|
123
|
+
if (!this.deploymentStage) {
|
|
124
|
+
throw new Error("Cannot add API key without a deployment stage. Enable `deploy` or set `deploymentStage`");
|
|
125
|
+
}
|
|
126
|
+
return new api_key_1.ApiKey(this, id, {
|
|
127
|
+
stages: [this.deploymentStage],
|
|
128
|
+
...options,
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Add a resource policy that only allows API execution from a VPC Endpoint to create a private API.
|
|
133
|
+
*
|
|
134
|
+
* @see https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-resource-policies-examples.html#apigateway-resource-policies-source-vpc-example
|
|
135
|
+
*
|
|
136
|
+
* @param vpcEndpoints the interface VPC endpoints to grant access to
|
|
137
|
+
*/
|
|
138
|
+
grantInvokeFromVpcEndpointsOnly(vpcEndpoints) {
|
|
139
|
+
vpcEndpoints.forEach((endpoint) => this._allowedVpcEndpoints.add(endpoint));
|
|
140
|
+
const endpoints = cdktf_1.Lazy.listValue({
|
|
141
|
+
produce: () => {
|
|
142
|
+
return Array.from(this._allowedVpcEndpoints).map((endpoint) => endpoint.vpcEndpointId);
|
|
143
|
+
},
|
|
144
|
+
});
|
|
145
|
+
this.addToResourcePolicy(new iam.PolicyStatement({
|
|
146
|
+
principals: [new iam.AnyPrincipal()],
|
|
147
|
+
actions: ["execute-api:Invoke"],
|
|
148
|
+
resources: ["execute-api:/*"],
|
|
149
|
+
effect: iam.Effect.DENY,
|
|
150
|
+
condition: [
|
|
151
|
+
{
|
|
152
|
+
test: "StringNotEquals",
|
|
153
|
+
variable: "aws:SourceVpce",
|
|
154
|
+
values: endpoints,
|
|
155
|
+
},
|
|
156
|
+
],
|
|
157
|
+
}));
|
|
158
|
+
this.addToResourcePolicy(new iam.PolicyStatement({
|
|
159
|
+
principals: [new iam.AnyPrincipal()],
|
|
160
|
+
actions: ["execute-api:Invoke"],
|
|
161
|
+
resources: ["execute-api:/*"],
|
|
162
|
+
effect: iam.Effect.ALLOW,
|
|
163
|
+
}));
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Returns the given named metric for this API
|
|
167
|
+
*/
|
|
168
|
+
metric(metricName, props) {
|
|
169
|
+
return new cloudwatch.Metric({
|
|
170
|
+
namespace: "AWS/ApiGateway",
|
|
171
|
+
metricName,
|
|
172
|
+
dimensionsMap: { ApiName: this.restApiName },
|
|
173
|
+
...props,
|
|
174
|
+
}).attachTo(this);
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Metric for the number of client-side errors captured in a given period.
|
|
178
|
+
*
|
|
179
|
+
* Default: sum over 5 minutes
|
|
180
|
+
*/
|
|
181
|
+
metricClientError(props) {
|
|
182
|
+
return this.cannedMetric(apigateway_canned_metrics_generated_1.ApiGatewayMetrics._4XxErrorSum, props);
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Metric for the number of server-side errors captured in a given period.
|
|
186
|
+
*
|
|
187
|
+
* Default: sum over 5 minutes
|
|
188
|
+
*/
|
|
189
|
+
metricServerError(props) {
|
|
190
|
+
return this.cannedMetric(apigateway_canned_metrics_generated_1.ApiGatewayMetrics._5XxErrorSum, props);
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Metric for the number of requests served from the API cache in a given period.
|
|
194
|
+
*
|
|
195
|
+
* Default: sum over 5 minutes
|
|
196
|
+
*/
|
|
197
|
+
metricCacheHitCount(props) {
|
|
198
|
+
return this.cannedMetric(apigateway_canned_metrics_generated_1.ApiGatewayMetrics.cacheHitCountSum, props);
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Metric for the number of requests served from the backend in a given period,
|
|
202
|
+
* when API caching is enabled.
|
|
203
|
+
*
|
|
204
|
+
* Default: sum over 5 minutes
|
|
205
|
+
*/
|
|
206
|
+
metricCacheMissCount(props) {
|
|
207
|
+
return this.cannedMetric(apigateway_canned_metrics_generated_1.ApiGatewayMetrics.cacheMissCountSum, props);
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Metric for the total number API requests in a given period.
|
|
211
|
+
*
|
|
212
|
+
* Default: sample count over 5 minutes
|
|
213
|
+
*/
|
|
214
|
+
metricCount(props) {
|
|
215
|
+
return this.cannedMetric(apigateway_canned_metrics_generated_1.ApiGatewayMetrics.countSum, {
|
|
216
|
+
statistic: "SampleCount",
|
|
217
|
+
...props,
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Metric for the time between when API Gateway relays a request to the backend
|
|
222
|
+
* and when it receives a response from the backend.
|
|
223
|
+
*
|
|
224
|
+
* Default: average over 5 minutes.
|
|
225
|
+
*/
|
|
226
|
+
metricIntegrationLatency(props) {
|
|
227
|
+
return this.cannedMetric(apigateway_canned_metrics_generated_1.ApiGatewayMetrics.integrationLatencyAverage, props);
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* The time between when API Gateway receives a request from a client
|
|
231
|
+
* and when it returns a response to the client.
|
|
232
|
+
* The latency includes the integration latency and other API Gateway overhead.
|
|
233
|
+
*
|
|
234
|
+
* Default: average over 5 minutes.
|
|
235
|
+
*/
|
|
236
|
+
metricLatency(props) {
|
|
237
|
+
return this.cannedMetric(apigateway_canned_metrics_generated_1.ApiGatewayMetrics.latencyAverage, props);
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Internal API used by `Method` to keep an inventory of methods at the API
|
|
241
|
+
* level for validation purposes.
|
|
242
|
+
*
|
|
243
|
+
* @internal
|
|
244
|
+
*/
|
|
245
|
+
_attachMethod(_method) {
|
|
246
|
+
// This method is used in the CDK to manage dependencies for deployments.
|
|
247
|
+
// In TerraConstructs, this might be handled differently, e.g., by passing method ARNs to deployment triggers.
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Associates a Deployment resource with this REST API.
|
|
251
|
+
*
|
|
252
|
+
* @internal
|
|
253
|
+
*/
|
|
254
|
+
_attachDeployment(_deployment) {
|
|
255
|
+
// Similar to _attachMethod, for managing deployment dependencies.
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Associates a Stage with this REST API
|
|
259
|
+
*
|
|
260
|
+
* @internal
|
|
261
|
+
*/
|
|
262
|
+
_attachStage(stage) {
|
|
263
|
+
if (this.cloudWatchAccount) {
|
|
264
|
+
stage.node.addDependency(this.cloudWatchAccount);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* @internal
|
|
269
|
+
*/
|
|
270
|
+
_configureCloudWatchRole(apiResource, cloudWatchRoleEnabled) {
|
|
271
|
+
// Default to true, as APIGATEWAY_DISABLE_CLOUDWATCH_ROLE feature flag is not available here.
|
|
272
|
+
const shouldCreateRole = cloudWatchRoleEnabled ?? true;
|
|
273
|
+
if (!shouldCreateRole) {
|
|
274
|
+
return;
|
|
275
|
+
}
|
|
276
|
+
const role = new iam.Role(this, "CloudWatchRole", {
|
|
277
|
+
assumedBy: new iam.ServicePrincipal("apigateway.amazonaws.com"),
|
|
278
|
+
managedPolicies: [
|
|
279
|
+
iam.ManagedPolicy.fromAwsManagedPolicyName(this, "AmazonAPIGatewayPushToCloudWatchLogs", "service-role/AmazonAPIGatewayPushToCloudWatchLogs"),
|
|
280
|
+
],
|
|
281
|
+
});
|
|
282
|
+
// role.applyRemovalPolicy(cloudWatchRoleRemovalPolicy); // Handled by Terraform lifecycle if needed
|
|
283
|
+
this.cloudWatchAccount = new provider_aws_1.apiGatewayAccount.ApiGatewayAccount(this, "Account", {
|
|
284
|
+
cloudwatchRoleArn: role.roleArn,
|
|
285
|
+
});
|
|
286
|
+
// this.cloudWatchAccount.applyRemovalPolicy(cloudWatchRoleRemovalPolicy); // Handled by Terraform lifecycle
|
|
287
|
+
this.cloudWatchAccount.node.addDependency(apiResource);
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* @internal
|
|
291
|
+
*/
|
|
292
|
+
_configureDeployment(props) {
|
|
293
|
+
const deploy = props.deploy ?? true;
|
|
294
|
+
if (deploy) {
|
|
295
|
+
this._latestDeployment = new deployment_1.Deployment(this, "Deployment", {
|
|
296
|
+
description: props.deployOptions?.description ??
|
|
297
|
+
props.description ??
|
|
298
|
+
"Automatically created by the RestApi construct",
|
|
299
|
+
api: this,
|
|
300
|
+
// TODO: Implement RemovalPolicy.RETAIN through removed block in Terraform.
|
|
301
|
+
// retainDeployments: props.retainDeployments,
|
|
302
|
+
// In Terraform, triggers are used to manage redeployment.
|
|
303
|
+
// A hash of the API definition or relevant parts would go here.
|
|
304
|
+
// For simplicity, a placeholder or a dependency on the API resource itself might be used.
|
|
305
|
+
// triggers: { redeploy = "" },
|
|
306
|
+
});
|
|
307
|
+
const stageName = (props.deployOptions && props.deployOptions.stageName) || "prod";
|
|
308
|
+
this.deploymentStage = new stage_1.Stage(this, `DeploymentStage.${stageName}`, {
|
|
309
|
+
deployment: this._latestDeployment,
|
|
310
|
+
...props.deployOptions,
|
|
311
|
+
});
|
|
312
|
+
}
|
|
313
|
+
else {
|
|
314
|
+
if (props.deployOptions) {
|
|
315
|
+
throw new Error("Cannot set 'deployOptions' if 'deploy' is disabled");
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
/**
|
|
320
|
+
* @internal
|
|
321
|
+
*/
|
|
322
|
+
_configureEndpoints(props) {
|
|
323
|
+
if (props.endpointTypes && props.endpointConfiguration) {
|
|
324
|
+
// TODO: throw new ValidationError(
|
|
325
|
+
throw new Error("Only one of the RestApi props, endpointTypes or endpointConfiguration, is allowed");
|
|
326
|
+
}
|
|
327
|
+
if (props.endpointConfiguration) {
|
|
328
|
+
return {
|
|
329
|
+
types: props.endpointConfiguration.types,
|
|
330
|
+
vpcEndpointIds: props.endpointConfiguration?.vpcEndpoints?.map((vpcEndpoint) => vpcEndpoint.vpcEndpointId),
|
|
331
|
+
};
|
|
332
|
+
}
|
|
333
|
+
if (props.endpointTypes) {
|
|
334
|
+
return { types: props.endpointTypes };
|
|
335
|
+
}
|
|
336
|
+
return undefined;
|
|
337
|
+
}
|
|
338
|
+
cannedMetric(fn, props) {
|
|
339
|
+
return new cloudwatch.Metric({
|
|
340
|
+
...fn({ ApiName: this.restApiName }),
|
|
341
|
+
...props,
|
|
342
|
+
}).attachTo(this);
|
|
343
|
+
}
|
|
344
|
+
get outputs() {
|
|
345
|
+
return {
|
|
346
|
+
restApiId: this.restApiId,
|
|
347
|
+
restApiName: this.restApiName,
|
|
348
|
+
restApiRootResourceId: this.restApiRootResourceId,
|
|
349
|
+
// this is equal to AWSCDK's "Endpoint" output
|
|
350
|
+
url: this.deploymentStage ? this.url : undefined,
|
|
351
|
+
};
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
exports.RestApiBase = RestApiBase;
|
|
355
|
+
_a = JSII_RTTI_SYMBOL_1;
|
|
356
|
+
RestApiBase[_a] = { fqn: "terraconstructs.aws.compute.RestApiBase", version: "0.1.0" };
|
|
357
|
+
/**
|
|
358
|
+
* Represents a REST API in Amazon API Gateway, created with an OpenAPI specification.
|
|
359
|
+
*
|
|
360
|
+
* Some properties normally accessible on @see `RestApi` - such as the description -
|
|
361
|
+
* must be declared in the specification. All Resources and Methods need to be defined as
|
|
362
|
+
* part of the OpenAPI specification file, and cannot be added via the CDK.
|
|
363
|
+
*
|
|
364
|
+
* By default, the API will automatically be deployed and accessible from a
|
|
365
|
+
* public endpoint.
|
|
366
|
+
*
|
|
367
|
+
*
|
|
368
|
+
* @resource aws_api_gateway_rest_api
|
|
369
|
+
*/
|
|
370
|
+
class SpecRestApi extends RestApiBase {
|
|
371
|
+
constructor(scope, id, props) {
|
|
372
|
+
super(scope, id, props);
|
|
373
|
+
const apiDefConfig = props.apiDefinition.bind(this);
|
|
374
|
+
this.internalPolicy = props.policy;
|
|
375
|
+
this.resource = new provider_aws_1.apiGatewayRestApi.ApiGatewayRestApi(this, "Resource", {
|
|
376
|
+
name: this.restApiName,
|
|
377
|
+
policy: cdktf_1.Lazy.stringValue({
|
|
378
|
+
produce: () => this.internalPolicy?.json,
|
|
379
|
+
}),
|
|
380
|
+
failOnWarnings: props.failOnWarnings,
|
|
381
|
+
minimumCompressionSize: props.minCompressionSize?.toBytes()?.toString(),
|
|
382
|
+
body: apiDefConfig.inlineDefinition, // ?? apiDefConfig.s3Location, // TF body can be inline or S3 URI
|
|
383
|
+
endpointConfiguration: this._configureEndpoints(props),
|
|
384
|
+
parameters: props.parameters,
|
|
385
|
+
disableExecuteApiEndpoint: props.disableExecuteApiEndpoint,
|
|
386
|
+
description: props.description, // Description can be set here if not in spec, or will be overridden by spec
|
|
387
|
+
});
|
|
388
|
+
// This CDK lifecycle hook is largely unused in Terraform, but can be used for custom logic after the API is created.
|
|
389
|
+
props.apiDefinition.bindAfterCreate(this, this);
|
|
390
|
+
this.node.defaultChild = this.resource;
|
|
391
|
+
this.restApiId = this.resource.id;
|
|
392
|
+
this.restApiRootResourceId = this.resource.rootResourceId;
|
|
393
|
+
this.root = new RootResource(this, {}, this.restApiRootResourceId);
|
|
394
|
+
this._configureCloudWatchRole(this.resource, props.cloudWatchRole);
|
|
395
|
+
this._configureDeployment(props);
|
|
396
|
+
if (props.domainName) {
|
|
397
|
+
this.addDomainName("CustomDomain", props.domainName);
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
addToResourcePolicy(statement) {
|
|
401
|
+
if (!this.internalPolicy) {
|
|
402
|
+
this.internalPolicy = new iam.PolicyDocument(this, "PolicyDocument");
|
|
403
|
+
}
|
|
404
|
+
if (!this.policyAttachment) {
|
|
405
|
+
this.policyAttachment =
|
|
406
|
+
new provider_aws_1.apiGatewayRestApiPolicy.ApiGatewayRestApiPolicy(this, "Policy", {
|
|
407
|
+
restApiId: this.restApiId,
|
|
408
|
+
policy: this.internalPolicy.json,
|
|
409
|
+
});
|
|
410
|
+
}
|
|
411
|
+
this.internalPolicy.addStatements(statement);
|
|
412
|
+
// Note: The policy on apiGatewayRestApi will be updated due to Lazy evaluation.
|
|
413
|
+
// If a separate ApiGatewayRestApiPolicy resource is preferred, this logic would change.
|
|
414
|
+
return { statementAdded: true, policyDependable: this.resource }; // or this
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
exports.SpecRestApi = SpecRestApi;
|
|
418
|
+
_b = JSII_RTTI_SYMBOL_1;
|
|
419
|
+
SpecRestApi[_b] = { fqn: "terraconstructs.aws.compute.SpecRestApi", version: "0.1.0" };
|
|
420
|
+
/**
|
|
421
|
+
* Represents a REST API in Amazon API Gateway.
|
|
422
|
+
*
|
|
423
|
+
* Use `addResource` and `addMethod` to configure the API model.
|
|
424
|
+
*
|
|
425
|
+
* By default, the API will automatically be deployed and accessible from a
|
|
426
|
+
* public endpoint.
|
|
427
|
+
*/
|
|
428
|
+
class RestApi extends RestApiBase {
|
|
429
|
+
/**
|
|
430
|
+
* Return whether the given object is a `RestApi`
|
|
431
|
+
*/
|
|
432
|
+
static isRestApi(x) {
|
|
433
|
+
return (x !== null && typeof x === "object" && APIGATEWAY_RESTAPI_SYMBOL in x);
|
|
434
|
+
}
|
|
435
|
+
/**
|
|
436
|
+
* Import an existing RestApi.
|
|
437
|
+
*/
|
|
438
|
+
static fromRestApiId(scope, id, restApiId) {
|
|
439
|
+
class Import extends RestApiBase {
|
|
440
|
+
constructor() {
|
|
441
|
+
super(...arguments);
|
|
442
|
+
this.restApiId = restApiId;
|
|
443
|
+
this.restApiName = id; // Defaulting to construct ID for name
|
|
444
|
+
this.restApiRootResourceId = cdktf_1.Lazy.stringValue({
|
|
445
|
+
produce: () => {
|
|
446
|
+
// This would ideally come from a data source lookup if not provided
|
|
447
|
+
throw new Error("restApiRootResourceId is not available when importing with fromRestApiId. Use fromRestApiAttributes or provide it.");
|
|
448
|
+
},
|
|
449
|
+
});
|
|
450
|
+
this.root = new RootResource(this, {}, this.restApiRootResourceId);
|
|
451
|
+
}
|
|
452
|
+
addToResourcePolicy(_statement) {
|
|
453
|
+
// Cannot add to policy of an imported RestApi through this interface
|
|
454
|
+
return { statementAdded: false };
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
return new Import(scope, id);
|
|
458
|
+
}
|
|
459
|
+
/**
|
|
460
|
+
* Import an existing RestApi that can be configured with additional Methods and Resources.
|
|
461
|
+
*/
|
|
462
|
+
static fromRestApiAttributes(scope, id, attrs) {
|
|
463
|
+
class Import extends RestApiBase {
|
|
464
|
+
constructor() {
|
|
465
|
+
super(...arguments);
|
|
466
|
+
this.restApiId = attrs.restApiId;
|
|
467
|
+
this.restApiName = attrs.restApiName ?? id;
|
|
468
|
+
this.restApiRootResourceId = attrs.rootResourceId;
|
|
469
|
+
this.root = new RootResource(this, {}, this.restApiRootResourceId);
|
|
470
|
+
}
|
|
471
|
+
addToResourcePolicy(_statement) {
|
|
472
|
+
return { statementAdded: false };
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
return new Import(scope, id);
|
|
476
|
+
}
|
|
477
|
+
constructor(scope, id, props = {}) {
|
|
478
|
+
super(scope, id, props);
|
|
479
|
+
/**
|
|
480
|
+
* The list of methods bound to this RestApi
|
|
481
|
+
*/
|
|
482
|
+
this.methods = new Array();
|
|
483
|
+
/**
|
|
484
|
+
* This list of deployments bound to this RestApi
|
|
485
|
+
*/
|
|
486
|
+
this.deployments = new Array();
|
|
487
|
+
if (props.minCompressionSize === undefined) {
|
|
488
|
+
// No equivalent for minimumCompressionSize being deprecated in favor of minCompressionSize
|
|
489
|
+
}
|
|
490
|
+
this.internalPolicy = props.policy;
|
|
491
|
+
this.resource = new provider_aws_1.apiGatewayRestApi.ApiGatewayRestApi(this, "Resource", {
|
|
492
|
+
name: this.restApiName,
|
|
493
|
+
description: props.description,
|
|
494
|
+
policy: cdktf_1.Lazy.stringValue({
|
|
495
|
+
produce: () => this.internalPolicy?.json,
|
|
496
|
+
}),
|
|
497
|
+
failOnWarnings: props.failOnWarnings,
|
|
498
|
+
minimumCompressionSize: props.minCompressionSize?.toBytes()?.toString(),
|
|
499
|
+
binaryMediaTypes: props.binaryMediaTypes,
|
|
500
|
+
endpointConfiguration: this._configureEndpoints(props),
|
|
501
|
+
apiKeySource: props.apiKeySourceType,
|
|
502
|
+
// cloneFrom: props.cloneFrom?.restApiId, // Not supported in TF aws_api_gateway_rest_api
|
|
503
|
+
parameters: props.parameters,
|
|
504
|
+
disableExecuteApiEndpoint: props.disableExecuteApiEndpoint,
|
|
505
|
+
});
|
|
506
|
+
this.node.defaultChild = this.resource;
|
|
507
|
+
this.restApiId = this.resource.id;
|
|
508
|
+
this.restApiRootResourceId = this.resource.rootResourceId;
|
|
509
|
+
// ensure the iam policy is associated with the resource.
|
|
510
|
+
if (this.internalPolicy) {
|
|
511
|
+
this.policyAttachment =
|
|
512
|
+
new provider_aws_1.apiGatewayRestApiPolicy.ApiGatewayRestApiPolicy(this, "Policy", {
|
|
513
|
+
restApiId: this.restApiId,
|
|
514
|
+
policy: this.internalPolicy.json,
|
|
515
|
+
});
|
|
516
|
+
}
|
|
517
|
+
this._configureCloudWatchRole(this.resource, props.cloudWatchRole);
|
|
518
|
+
this._configureDeployment(props);
|
|
519
|
+
if (props.domainName) {
|
|
520
|
+
this.addDomainName("CustomDomain", props.domainName);
|
|
521
|
+
}
|
|
522
|
+
this.root = new RootResource(this, props, this.restApiRootResourceId);
|
|
523
|
+
this.node.addValidation({ validate: () => this.validateRestApi() });
|
|
524
|
+
Object.defineProperty(this, APIGATEWAY_RESTAPI_SYMBOL, { value: true });
|
|
525
|
+
}
|
|
526
|
+
addToResourcePolicy(statement) {
|
|
527
|
+
if (!this.internalPolicy) {
|
|
528
|
+
this.internalPolicy = new iam.PolicyDocument(this, "PolicyDocument");
|
|
529
|
+
}
|
|
530
|
+
if (!this.policyAttachment) {
|
|
531
|
+
this.policyAttachment =
|
|
532
|
+
new provider_aws_1.apiGatewayRestApiPolicy.ApiGatewayRestApiPolicy(this, "Policy", {
|
|
533
|
+
restApiId: this.restApiId,
|
|
534
|
+
policy: this.internalPolicy.json,
|
|
535
|
+
});
|
|
536
|
+
}
|
|
537
|
+
this.internalPolicy.addStatements(statement);
|
|
538
|
+
return { statementAdded: true, policyDependable: this.resource };
|
|
539
|
+
}
|
|
540
|
+
addModel(id, props) {
|
|
541
|
+
return new model_1.Model(this, id, {
|
|
542
|
+
...props,
|
|
543
|
+
restApi: this,
|
|
544
|
+
});
|
|
545
|
+
}
|
|
546
|
+
addRequestValidator(id, props) {
|
|
547
|
+
return new requestvalidator_1.RequestValidator(this, id, {
|
|
548
|
+
...props,
|
|
549
|
+
restApi: this,
|
|
550
|
+
});
|
|
551
|
+
}
|
|
552
|
+
/**
|
|
553
|
+
* Internal API used by `Method` to keep an inventory of methods at the API
|
|
554
|
+
* level for validation purposes.
|
|
555
|
+
*
|
|
556
|
+
* @internal
|
|
557
|
+
*/
|
|
558
|
+
_attachMethod(method) {
|
|
559
|
+
// In TF, deployment triggers would handle this implicitly or explicitly
|
|
560
|
+
this.methods.push(method);
|
|
561
|
+
// add this method as a dependency to all deployments defined for this api
|
|
562
|
+
// when additional deployments are added, _attachDeployment is called and
|
|
563
|
+
// this method will be added there.
|
|
564
|
+
for (const dep of this.deployments) {
|
|
565
|
+
dep._addMethodDependency(method);
|
|
566
|
+
}
|
|
567
|
+
}
|
|
568
|
+
/** @internal */
|
|
569
|
+
_attachDeployment(deployment) {
|
|
570
|
+
// In TF, deployment triggers would handle this implicitly or explicitly
|
|
571
|
+
this.deployments.push(deployment);
|
|
572
|
+
for (const method of this.methods) {
|
|
573
|
+
deployment._addMethodDependency(method);
|
|
574
|
+
}
|
|
575
|
+
}
|
|
576
|
+
validateRestApi() {
|
|
577
|
+
if (this.methods.length === 0) {
|
|
578
|
+
return ["The REST API doesn't contain any methods"];
|
|
579
|
+
}
|
|
580
|
+
return [];
|
|
581
|
+
}
|
|
582
|
+
}
|
|
583
|
+
exports.RestApi = RestApi;
|
|
584
|
+
_c = JSII_RTTI_SYMBOL_1;
|
|
585
|
+
RestApi[_c] = { fqn: "terraconstructs.aws.compute.RestApi", version: "0.1.0" };
|
|
586
|
+
var ApiKeySourceType;
|
|
587
|
+
(function (ApiKeySourceType) {
|
|
588
|
+
ApiKeySourceType["HEADER"] = "HEADER";
|
|
589
|
+
ApiKeySourceType["AUTHORIZER"] = "AUTHORIZER";
|
|
590
|
+
})(ApiKeySourceType || (exports.ApiKeySourceType = ApiKeySourceType = {}));
|
|
591
|
+
var EndpointType;
|
|
592
|
+
(function (EndpointType) {
|
|
593
|
+
EndpointType["EDGE"] = "EDGE";
|
|
594
|
+
EndpointType["REGIONAL"] = "REGIONAL";
|
|
595
|
+
EndpointType["PRIVATE"] = "PRIVATE";
|
|
596
|
+
})(EndpointType || (exports.EndpointType = EndpointType = {}));
|
|
597
|
+
class RootResource extends resource_1.ResourceBase {
|
|
598
|
+
constructor(api, props, resourceId) {
|
|
599
|
+
super(api, "Default"); // ID 'Default' for the root resource wrapper
|
|
600
|
+
this.parentResource = undefined;
|
|
601
|
+
this.defaultIntegration = props.defaultIntegration;
|
|
602
|
+
this.defaultMethodOptions = props.defaultMethodOptions;
|
|
603
|
+
this.defaultCorsPreflightOptions = props.defaultCorsPreflightOptions;
|
|
604
|
+
this.api = api;
|
|
605
|
+
this.resourceId = resourceId;
|
|
606
|
+
this.path = "/";
|
|
607
|
+
if (RestApi.isRestApi(api)) {
|
|
608
|
+
// Check if it's the non-spec RestApi to avoid type errors if api is SpecRestApi
|
|
609
|
+
this._restApi = api;
|
|
610
|
+
}
|
|
611
|
+
if (this.defaultCorsPreflightOptions) {
|
|
612
|
+
this.addCorsPreflight(this.defaultCorsPreflightOptions);
|
|
613
|
+
}
|
|
614
|
+
}
|
|
615
|
+
/**
|
|
616
|
+
* Get the RestApi associated with this Resource.
|
|
617
|
+
* @deprecated - Throws an error if this Resource is not associated with an instance of `RestApi`. Use `api` instead.
|
|
618
|
+
*/
|
|
619
|
+
get restApi() {
|
|
620
|
+
if (!this._restApi) {
|
|
621
|
+
throw new Error("RestApi is not available on Resource not connected to an instance of RestApi. Use `api` instead");
|
|
622
|
+
}
|
|
623
|
+
return this._restApi;
|
|
624
|
+
}
|
|
625
|
+
}
|
|
626
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdGFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hd3MvY29tcHV0ZS9yZXN0YXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsc0RBSTZCO0FBQzdCLGlDQUFvQztBQUdwQyx1Q0FBMkQ7QUFDM0QsK0ZBQTBFO0FBRTFFLDZDQUEwQztBQUMxQywrQ0FBOEQ7QUFDOUQseURBQTZFO0FBRzdFLG1DQUE4QztBQUM5Qyx5REFBK0U7QUFDL0UseUNBQXNFO0FBQ3RFLG1DQUE4QztBQUU5QyxnQ0FBbUM7QUFDbkMsNkNBQXlEO0FBQ3pELG9EQUF1RTtBQUN2RSw0Q0FBd0M7QUFDeEMsNENBQTRDO0FBRTVDLDhCQUE4QjtBQUU5QixNQUFNLGNBQWMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUMvQiw2Q0FBNkMsQ0FDOUMsQ0FBQztBQUNGLE1BQU0seUJBQXlCLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FDMUMseUNBQXlDLENBQzFDLENBQUM7QUF3UEY7O0dBRUc7QUFDSCxNQUFzQixXQUNwQixTQUFRLGdDQUFnQjtJQUd4Qjs7O09BR0c7SUFDSSxNQUFNLENBQUMsY0FBYyxDQUFDLENBQU07UUFDakMsT0FBTyxDQUFDLEtBQUssSUFBSSxJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVEsSUFBSSxjQUFjLElBQUksQ0FBQyxDQUFDO0lBQ3BFLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsSUFBVyxnQkFBZ0I7UUFDekIsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUM7SUFDaEMsQ0FBQztJQUVEOzs7T0FHRztJQUNILElBQVcsVUFBVTtRQUNuQixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDMUIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBVyxHQUFHO1FBQ1osT0FBTyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQTBDRCxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLFFBQTBCLEVBQUU7UUFD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WUFDckMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1FBQzFELENBQUM7SUFDSCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsSUFBVyxPQUFPO1FBQ2hCLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbkIsTUFBTSxJQUFJLEtBQUssQ0FDYixpR0FBaUcsQ0FDbEcsQ0FBQztRQUNKLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgYXBpR2F0ZXdheUFjY291bnQsXG4gIGFwaUdhdGV3YXlSZXN0QXBpLFxuICBhcGlHYXRld2F5UmVzdEFwaVBvbGljeSxcbn0gZnJvbSBcIkBjZGt0Zi9wcm92aWRlci1hd3NcIjtcbmltcG9ydCB7IExhenksIFRva2VuIH0gZnJvbSBcImNka3RmXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHsgQXBpRGVmaW5pdGlvbiB9IGZyb20gXCIuL2FwaS1kZWZpbml0aW9uXCI7XG5pbXBvcnQgeyBBcGlLZXksIEFwaUtleU9wdGlvbnMsIElBcGlLZXkgfSBmcm9tIFwiLi9hcGkta2V5XCI7XG5pbXBvcnQgeyBBcGlHYXRld2F5TWV0cmljcyB9IGZyb20gXCIuL2FwaWdhdGV3YXktY2FubmVkLW1ldHJpY3MuZ2VuZXJhdGVkXCI7XG5pbXBvcnQgeyBDb3JzT3B0aW9ucyB9IGZyb20gXCIuL2NvcnNcIjtcbmltcG9ydCB7IERlcGxveW1lbnQgfSBmcm9tIFwiLi9kZXBsb3ltZW50XCI7XG5pbXBvcnQgeyBEb21haW5OYW1lLCBEb21haW5OYW1lT3B0aW9ucyB9IGZyb20gXCIuL2RvbWFpbi1uYW1lXCI7XG5pbXBvcnQgeyBHYXRld2F5UmVzcG9uc2UsIEdhdGV3YXlSZXNwb25zZU9wdGlvbnMgfSBmcm9tIFwiLi9nYXRld2F5LXJlc3BvbnNlXCI7XG5pbXBvcnQgeyBJbnRlZ3JhdGlvbiB9IGZyb20gXCIuL2ludGVncmF0aW9uXCI7XG5pbXBvcnQgeyBNZXRob2QsIE1ldGhvZE9wdGlvbnMgfSBmcm9tIFwiLi9tZXRob2RcIjtcbmltcG9ydCB7IE1vZGVsLCBNb2RlbE9wdGlvbnMgfSBmcm9tIFwiLi9tb2RlbFwiO1xuaW1wb3J0IHsgUmVxdWVzdFZhbGlkYXRvciwgUmVxdWVzdFZhbGlkYXRvck9wdGlvbnMgfSBmcm9tIFwiLi9yZXF1ZXN0dmFsaWRhdG9yXCI7XG5pbXBvcnQgeyBJUmVzb3VyY2UsIFJlc291cmNlQmFzZSwgUmVzb3VyY2VPcHRpb25zIH0gZnJvbSBcIi4vcmVzb3VyY2VcIjtcbmltcG9ydCB7IFN0YWdlLCBTdGFnZU9wdGlvbnMgfSBmcm9tIFwiLi9zdGFnZVwiO1xuaW1wb3J0IHsgU2l6ZSB9IGZyb20gXCIuLi8uLi9zaXplXCI7XG5pbXBvcnQgeyBBcm5Gb3JtYXQgfSBmcm9tIFwiLi4vYXJuXCI7XG5pbXBvcnQgeyBVc2FnZVBsYW4sIFVzYWdlUGxhblByb3BzIH0gZnJvbSBcIi4vdXNhZ2UtcGxhblwiO1xuaW1wb3J0IHsgQXdzQ29uc3RydWN0QmFzZSwgQXdzQ29uc3RydWN0UHJvcHMgfSBmcm9tIFwiLi4vYXdzLWNvbnN0cnVjdFwiO1xuaW1wb3J0IHsgQXdzU3RhY2sgfSBmcm9tIFwiLi4vYXdzLXN0YWNrXCI7XG5pbXBvcnQgKiBhcyBjbG91ZHdhdGNoIGZyb20gXCIuLi9jbG91ZHdhdGNoXCI7XG5pbXBvcnQgKiBhcyBlYzIgZnJvbSBcIi4uL2NvbXB1dGVcIjtcbmltcG9ydCAqIGFzIGlhbSBmcm9tIFwiLi4vaWFtXCI7XG5cbmNvbnN0IFJFU1RBUElfU1lNQk9MID0gU3ltYm9sLmZvcihcbiAgXCJ0ZXJyYWNvbnN0cnVjdHMvbGliL2F3cy9jb21wdXRlLlJlc3RBcGlCYXNlXCIsXG4pO1xuY29uc3QgQVBJR0FURVdBWV9SRVNUQVBJX1NZTUJPTCA9IFN5bWJvbC5mb3IoXG4gIFwidGVycmFjb25zdHJ1Y3RzL2xpYi9hd3MvY29tcHV0ZS5SZXN0QXBpXCIsXG4pO1xuXG5leHBvcnQgaW50ZXJmYWNlIElSZXN0QXBpIGV4dGVuZHMgaWFtLklBd3NDb25zdHJ1Y3RXaXRoUG9saWN5IHtcbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGlzIEFQSSBHYXRld2F5IFJlc3RBcGkuXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IHJlc3RBcGlJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGlzIEFQSSBHYXRld2F5IFJlc3RBcGkuXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IHJlc3RBcGlOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSByZXNvdXJjZSBJRCBvZiB0aGUgcm9vdCByZXNvdXJjZS5cbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgcmVzdEFwaVJvb3RSZXNvdXJjZUlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFQSSBHYXRld2F5IGRlcGxveW1lbnQgdGhhdCByZXByZXNlbnRzIHRoZSBsYXRlc3QgY2hhbmdlcyBvZiB0aGUgQVBJLlxuICAgKiBUaGlzIHJlc291cmNlIHdpbGwgYmUgYXV0b21hdGljYWxseSB1cGRhdGVkIGV2ZXJ5IHRpbWUgdGhlIFJFU1QgQVBJIG1vZGVsIGNoYW5nZXMuXG4gICAqIGB1bmRlZmluZWRgIHdoZW4gbm8gZGVwbG95bWVudCBpcyBjb25maWd1cmVkLlxuICAgKi9cbiAgcmVhZG9ubHkgbGF0ZXN0RGVwbG95bWVudD86IERlcGxveW1lbnQ7XG5cbiAgLyoqXG4gICAqIEFQSSBHYXRld2F5IHN0YWdlIHRoYXQgcG9pbnRzIHRvIHRoZSBsYXRlc3QgZGVwbG95bWVudCAoaWYgZGVmaW5lZCkuXG4gICAqL1xuICBkZXBsb3ltZW50U3RhZ2U6IFN0YWdlO1xuXG4gIC8qKlxuICAgKiBSZXByZXNlbnRzIHRoZSByb290IHJlc291cmNlIChcIi9cIikgb2YgdGhpcyBBUEkuIFVzZSBpdCB0byBkZWZpbmUgdGhlIEFQSSBtb2RlbDpcbiAgICpcbiAgICogICAgYXBpLnJvb3QuYWRkTWV0aG9kKCdBTlknLCByZWRpcmVjdFRvSG9tZVBhZ2UpOyAvLyBcIkFOWSAvXCJcbiAgICogICAgYXBpLnJvb3QuYWRkUmVzb3VyY2UoJ2ZyaWVuZHMnKS5hZGRNZXRob2QoJ0dFVCcsIGdldEZyaWVuZHNIYW5kbGVyKTsgLy8gXCJHRVQgL2ZyaWVuZHNcIlxuICAgKlxuICAgKi9cbiAgcmVhZG9ubHkgcm9vdDogSVJlc291cmNlO1xuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBcImV4ZWN1dGUtYXBpXCIgQVJOXG4gICAqIEByZXR1cm5zIFRoZSBcImV4ZWN1dGUtYXBpXCIgQVJOLlxuICAgKiBAZGVmYXVsdCBcIipcIiByZXR1cm5zIHRoZSBleGVjdXRlIEFQSSBBUk4gZm9yIGFsbCBtZXRob2RzL3Jlc291cmNlcyBpblxuICAgKiB0aGlzIEFQSS5cbiAgICogQHBhcmFtIG1ldGhvZCBUaGUgbWV0aG9kIChkZWZhdWx0IGAqYClcbiAgICogQHBhcmFtIHBhdGggVGhlIHJlc291cmNlIHBhdGguIE11c3Qgc3RhcnQgd2l0aCAnLycgKGRlZmF1bHQgYCpgKVxuICAgKiBAcGFyYW0gc3RhZ2UgVGhlIHN0YWdlIChkZWZhdWx0IGAqYClcbiAgICovXG4gIGFybkZvckV4ZWN1dGVBcGkobWV0aG9kPzogc3RyaW5nLCBwYXRoPzogc3RyaW5nLCBzdGFnZT86IHN0cmluZyk6IHN0cmluZztcbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBwcm9wcyB0aGF0IGFsbCBSZXN0IEFQSXMgc2hhcmVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXN0QXBpQmFzZVByb3BzIGV4dGVuZHMgQXdzQ29uc3RydWN0UHJvcHMge1xuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIGEgRGVwbG95bWVudCBzaG91bGQgYmUgYXV0b21hdGljYWxseSBjcmVhdGVkIGZvciB0aGlzIEFQSSxcbiAgICogYW5kIHJlY3JlYXRlZCB3aGVuIHRoZSBBUEkgbW9kZWwgKHJlc291cmNlcywgbWV0aG9kcykgY2hhbmdlcy5cbiAgICpcbiAgICogU2luY2UgQVBJIEdhdGV3YXkgZGVwbG95bWVudHMgYXJlIGltbXV0YWJsZSwgV2hlbiB0aGlzIG9wdGlvbiBpcyBlbmFibGVkXG4gICAqIChieSBkZWZhdWx0KSwgYW4gQVdTOjpBcGlHYXRld2F5OjpEZXBsb3ltZW50IHJlc291cmNlIHdpbGwgYXV0b21hdGljYWxseVxuICAgKiBjcmVhdGVkIHdpdGggYSBsb2dpY2FsIElEIHRoYXQgaGFzaGVzIHRoZSBBUEkgbW9kZWwgKG1ldGhvZHMsIHJlc291cmNlc1xuICAgKiBhbmQgb3B0aW9ucykuIFRoaXMgbWVhbnMgdGhhdCB3aGVuIHRoZSBtb2RlbCBjaGFuZ2VzLCB0aGUgbG9naWNhbCBJRCBvZlxuICAgKiB0aGlzIENsb3VkRm9ybWF0aW9uIHJlc291cmNlIHdpbGwgY2hhbmdlLCBhbmQgYSBuZXcgZGVwbG95bWVudCB3aWxsIGJlXG4gICAqIGNyZWF0ZWQuXG4gICAqXG4gICAqIElmIHRoaXMgaXMgc2V0LCBgbGF0ZXN0RGVwbG95bWVudGAgd2lsbCByZWZlciB0byB0aGUgYERlcGxveW1lbnRgIG9iamVjdFxuICAgKiBhbmQgYGRlcGxveW1lbnRTdGFnZWAgd2lsbCByZWZlciB0byBhIGBTdGFnZWAgdGhhdCBwb2ludHMgdG8gdGhpc1xuICAgKiBkZXBsb3ltZW50LiBUbyBjdXN0b21pemUgdGhlIHN0YWdlIG9wdGlvbnMsIHVzZSB0aGUgYGRlcGxveU9wdGlvbnNgXG4gICAqIHByb3BlcnR5LlxuICAgKlxuICAgKiBBIENsb3VkRm9ybWF0aW9uIE91dHB1dCB3aWxsIGFsc28gYmUgZGVmaW5lZCB3aXRoIHRoZSByb290IFVSTCBlbmRwb2ludFxuICAgKiBvZiB0aGlzIFJFU1QgQVBJLlxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBkZXBsb3k/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBPcHRpb25zIGZvciB0aGUgQVBJIEdhdGV3YXkgc3RhZ2UgdGhhdCB3aWxsIGFsd2F5cyBwb2ludCB0byB0aGUgbGF0ZXN0XG4gICAqIGRlcGxveW1lbnQgd2hlbiBgZGVwbG95YCBpcyBlbmFibGVkLiBJZiBgZGVwbG95YCBpcyBkaXNhYmxlZCxcbiAgICogdGhpcyB2YWx1ZSBjYW5ub3QgYmUgc2V0LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIEJhc2VkIG9uIGRlZmF1bHRzIG9mIGBTdGFnZU9wdGlvbnNgLlxuICAgKi9cbiAgcmVhZG9ubHkgZGVwbG95T3B0aW9ucz86IFN0YWdlT3B0aW9ucztcblxuICAvLyBUT0RPOiBJbXBsZW1lbnQgUmVtb3ZhbFBvbGljeS5SRVRBSU4gdGhyb3VnaCByZW1vdmVkIGJsb2NrIGluIFRlcnJhZm9ybS5cbiAgLy8gLyoqXG4gIC8vICAqIFJldGFpbnMgb2xkIGRlcGxveW1lbnQgcmVzb3VyY2VzIHdoZW4gdGhlIEFQSSBjaGFuZ2VzLiBUaGlzIGFsbG93c1xuICAvLyAgKiBtYW51YWxseSByZXZlcnRpbmcgc3RhZ2VzIHRvIHBvaW50IHRvIG9sZCBkZXBsb3ltZW50cyB2aWEgdGhlIEFXU1xuICAvLyAgKiBDb25zb2xlLlxuICAvLyAgKlxuICAvLyAgKiBAZGVmYXVsdCBmYWxzZVxuICAvLyAgKi9cbiAgLy8gcmVhZG9ubHkgcmV0YWluRGVwbG95bWVudHM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIG5hbWUgZm9yIHRoZSBBUEkgR2F0ZXdheSBSZXN0QXBpIHJlc291cmNlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIElEIG9mIHRoZSBSZXN0QXBpIGNvbnN0cnVjdC5cbiAgICovXG4gIHJlYWRvbmx5IHJlc3RBcGlOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDdXN0b20gaGVhZGVyIHBhcmFtZXRlcnMgZm9yIHRoZSByZXF1ZXN0LlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jbGkvbGF0ZXN0L3JlZmVyZW5jZS9hcGlnYXRld2F5L2ltcG9ydC1yZXN0LWFwaS5odG1sXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gcGFyYW1ldGVycy5cbiAgICovXG4gIHJlYWRvbmx5IHBhcmFtZXRlcnM/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuXG4gIC8qKlxuICAgKiBBIHBvbGljeSBkb2N1bWVudCB0aGF0IGNvbnRhaW5zIHRoZSBwZXJtaXNzaW9ucyBmb3IgdGhpcyBSZXN0QXBpXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gcG9saWN5LlxuICAgKi9cbiAgcmVhZG9ubHkgcG9saWN5PzogaWFtLlBvbGljeURvY3VtZW50O1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0byByb2xsIGJhY2sgdGhlIHJlc291cmNlIGlmIGEgd2FybmluZyBvY2N1cnMgd2hpbGUgQVBJXG4gICAqIEdhdGV3YXkgaXMgY3JlYXRpbmcgdGhlIFJlc3RBcGkgcmVzb3VyY2UuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBmYWlsT25XYXJuaW5ncz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIENvbmZpZ3VyZSBhIGN1c3RvbSBkb21haW4gbmFtZSBhbmQgbWFwIGl0IHRvIHRoaXMgQVBJLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGRvbWFpbiBuYW1lIGlzIGRlZmluZWQsIHVzZSBgYWRkRG9tYWluTmFtZWAgb3IgZGlyZWN0bHkgZGVmaW5lIGEgYERvbWFpbk5hbWVgLlxuICAgKi9cbiAgcmVhZG9ubHkgZG9tYWluTmFtZT86IERvbWFpbk5hbWVPcHRpb25zO1xuXG4gIC8qKlxuICAgKiBBdXRvbWF0aWNhbGx5IGNvbmZpZ3VyZSBhbiBBV1MgQ2xvdWRXYXRjaCByb2xlIGZvciBBUEkgR2F0ZXdheS5cbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgY2xvdWRXYXRjaFJvbGU/OiBib29sZWFuO1xuXG4gIC8vIGNsb3VkV2F0Y2hSb2xlUmVtb3ZhbFBvbGljeSBpcyBub3QgZGlyZWN0bHkgYXBwbGljYWJsZSBpbiBUZXJyYWZvcm0gYXMgaXQgbWFuYWdlcyBEZWxldGlvblBvbGljeS5cbiAgLy8gVGVycmFmb3JtJ3MgYHByZXZlbnRfZGVzdHJveWAgaW4gYGxpZmVjeWNsZWAgY2FuIGJlIHVzZWQgZm9yIHNpbWlsYXIgZWZmZWN0IG9uIHRoZSByb2xlLlxuXG4gIC8vIFRlcnJhZm9ybSBvdXRwdXRzIGRvbid0IGhhdmUgZGlyZWN0IGV4cG9ydE5hbWUgbGlrZSBDRk5cbiAgLy8gLyoqXG4gIC8vICAqIEV4cG9ydCBuYW1lIGZvciB0aGUgVGVycmFmb3JtT3V0cHV0IGNvbnRhaW5pbmcgdGhlIEFQSSBlbmRwb2ludFxuICAvLyAgKlxuICAvLyAgKiBAZGVmYXVsdCAtIHdoZW4gbm8gZXhwb3J0IG5hbWUgaXMgZ2l2ZW4sIG91dHB1dCB3aWxsIGJlIGNyZWF0ZWQgd2l0aG91dCBleHBvcnRcbiAgLy8gICovXG4gIC8vIHJlYWRvbmx5IGVuZHBvaW50RXhwb3J0TmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogQSBsaXN0IG9mIHRoZSBlbmRwb2ludCB0eXBlcyBvZiB0aGUgQVBJLiBVc2UgdGhpcyBwcm9wZXJ0eSB3aGVuIGNyZWF0aW5nXG4gICAqIGFuIEFQSS5cbiAgICpcbiAgICogQGRlZmF1bHQgRW5kcG9pbnRUeXBlLkVER0VcbiAgICovXG4gIHJlYWRvbmx5IGVuZHBvaW50VHlwZXM/OiBFbmRwb2ludFR5cGVbXTtcblxuICAvKipcbiAgICogVGhlIEVuZHBvaW50Q29uZmlndXJhdGlvbiBwcm9wZXJ0eSB0eXBlIHNwZWNpZmllcyB0aGUgZW5kcG9pbnQgdHlwZXMgb2YgYSBSRVNUIEFQSVxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVXNlckd1aWRlL2F3cy1wcm9wZXJ0aWVzLWFwaWdhdGV3YXktcmVzdGFwaS1lbmRwb2ludGNvbmZpZ3VyYXRpb24uaHRtbFxuICAgKlxuICAgKiBAZGVmYXVsdCBFbmRwb2ludFR5cGUuRURHRVxuICAgKi9cbiAgcmVhZG9ubHkgZW5kcG9pbnRDb25maWd1cmF0aW9uPzogRW5kcG9pbnRDb25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgd2hldGhlciBjbGllbnRzIGNhbiBpbnZva2UgdGhlIEFQSSB1c2luZyB0aGUgZGVmYXVsdCBleGVjdXRlLWFwaVxuICAgKiBlbmRwb2ludC4gVG8gcmVxdWlyZSB0aGF0IGNsaWVudHMgdXNlIGEgY3VzdG9tIGRvbWFpbiBuYW1lIHRvIGludm9rZSB0aGVcbiAgICogQVBJLCBkaXNhYmxlIHRoZSBkZWZhdWx0IGVuZHBvaW50LlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVXNlckd1aWRlL2F3cy1yZXNvdXJjZS1hcGlnYXRld2F5LXJlc3RhcGkuaHRtbFxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgZGlzYWJsZUV4ZWN1dGVBcGlFbmRwb2ludD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgZGVzY3JpcHRpb24gb2YgdGhlIFJlc3RBcGkgY29uc3RydWN0LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtICdBdXRvbWF0aWNhbGx5IGNyZWF0ZWQgYnkgdGhlIFJlc3RBcGkgY29uc3RydWN0J1xuICAgKi9cbiAgcmVhZG9ubHkgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUHJvcHMgdG8gY3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIFJlc3RBcGlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXN0QXBpUHJvcHMgZXh0ZW5kcyBSZXN0QXBpQmFzZVByb3BzLCBSZXNvdXJjZU9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIGxpc3Qgb2YgYmluYXJ5IG1lZGlhIG1pbWUtdHlwZXMgdGhhdCBhcmUgc3VwcG9ydGVkIGJ5IHRoZSBSZXN0QXBpXG4gICAqIHJlc291cmNlLCBzdWNoIGFzIFwiaW1hZ2UvcG5nXCIgb3IgXCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW1cIlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIFJlc3RBcGkgc3VwcG9ydHMgb25seSBVVEYtOC1lbmNvZGVkIHRleHQgcGF5bG9hZHMuXG4gICAqL1xuICByZWFkb25seSBiaW5hcnlNZWRpYVR5cGVzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEEgU2l6ZShpbiBieXRlcywga2liaWJ5dGVzLCBtZWJpYnl0ZXMgZXRjKSB0aGF0IGlzIHVzZWQgdG8gZW5hYmxlIGNvbXByZXNzaW9uICh3aXRoIG5vbi1uZWdhdGl2ZVxuICAgKiBiZXR3ZWVuIDAgYW5kIDEwNDg1NzYwICgxME0pIGJ5dGVzLCBpbmNsdXNpdmUpIG9yIGRpc2FibGUgY29tcHJlc3Npb25cbiAgICogKHdoZW4gdW5kZWZpbmVkKSBvbiBhbiBBUEkuIFdoZW4gY29tcHJlc3Npb24gaXMgZW5hYmxlZCwgY29tcHJlc3Npb24gb3JcbiAgICogZGVjb21wcmVzc2lvbiBpcyBub3QgYXBwbGllZCBvbiB0aGUgcGF5bG9hZCBpZiB0aGUgcGF5bG9hZCBzaXplIGlzXG4gICAqIHNtYWxsZXIgdGhhbiB0aGlzIHZhbHVlLiBTZXR0aW5nIGl0IHRvIHplcm8gYWxsb3dzIGNvbXByZXNzaW9uIGZvciBhbnlcbiAgICogcGF5bG9hZCBzaXplLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIENvbXByZXNzaW9uIGlzIGRpc2FibGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgbWluQ29tcHJlc3Npb25TaXplPzogU2l6ZTtcblxuICAvLyBjbG9uZUZyb20gaXMgbm90IHN1cHBvcnRlZCBieSBhd3NfYXBpX2dhdGV3YXlfcmVzdF9hcGkgaW4gVGVycmFmb3JtLlxuICAvLyByZWFkb25seSBjbG9uZUZyb20/OiBJUmVzdEFwaTtcblxuICAvKipcbiAgICogVGhlIHNvdXJjZSBvZiB0aGUgQVBJIGtleSBmb3IgbWV0ZXJpbmcgcmVxdWVzdHMgYWNjb3JkaW5nIHRvIGEgdXNhZ2VcbiAgICogcGxhbi5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBNZXRlcmluZyBpcyBkaXNhYmxlZC5cbiAgICovXG4gIHJlYWRvbmx5IGFwaUtleVNvdXJjZVR5cGU/OiBBcGlLZXlTb3VyY2VUeXBlO1xufVxuXG4vKipcbiAqIFByb3BzIHRvIGluc3RhbnRpYXRlIGEgbmV3IFNwZWNSZXN0QXBpXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3BlY1Jlc3RBcGlQcm9wcyBleHRlbmRzIFJlc3RBcGlCYXNlUHJvcHMge1xuICAvKipcbiAgICogQW4gT3BlbkFQSSBkZWZpbml0aW9uIGNvbXBhdGlibGUgd2l0aCBBUEkgR2F0ZXdheS5cbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYXBpZ2F0ZXdheS9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvYXBpLWdhdGV3YXktaW1wb3J0LWFwaS5odG1sXG4gICAqL1xuICByZWFkb25seSBhcGlEZWZpbml0aW9uOiBBcGlEZWZpbml0aW9uO1xuXG4gIC8qKlxuICAgKiBBIFNpemUoaW4gYnl0ZXMsIGtpYmlieXRlcywgbWViaWJ5dGVzIGV0YykgdGhhdCBpcyB1c2VkIHRvIGVuYWJsZSBjb21wcmVzc2lvbiAod2l0aCBub24tbmVnYXRpdmVcbiAgICogYmV0d2VlbiAwIGFuZCAxMDQ4NTc2MCAoMTBNKSBieXRlcywgaW5jbHVzaXZlKSBvciBkaXNhYmxlIGNvbXByZXNzaW9uXG4gICAqICh3aGVuIHVuZGVmaW5lZCkgb24gYW4gQVBJLiBXaGVuIGNvbXByZXNzaW9uIGlzIGVuYWJsZWQsIGNvbXByZXNzaW9uIG9yXG4gICAqIGRlY29tcHJlc3Npb24gaXMgbm90IGFwcGxpZWQgb24gdGhlIHBheWxvYWQgaWYgdGhlIHBheWxvYWQgc2l6ZSBpc1xuICAgKiBzbWFsbGVyIHRoYW4gdGhpcyB2YWx1ZS4gU2V0dGluZyBpdCB0byB6ZXJvIGFsbG93cyBjb21wcmVzc2lvbiBmb3IgYW55XG4gICAqIHBheWxvYWQgc2l6ZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBDb21wcmVzc2lvbiBpcyBkaXNhYmxlZC5cbiAgICovXG4gIHJlYWRvbmx5IG1pbkNvbXByZXNzaW9uU2l6ZT86IFNpemU7XG59XG5cbi8qKlxuICogQmFzZSBpbXBsZW1lbnRhdGlvbiB0aGF0IGFyZSBjb21tb24gdG8gdmFyaW91cyBpbXBsZW1lbnRhdGlvbnMgb2YgSVJlc3RBcGlcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFJlc3RBcGlCYXNlXG4gIGV4dGVuZHMgQXdzQ29uc3RydWN0QmFzZVxuICBpbXBsZW1lbnRzIElSZXN0QXBpLCBpYW0uSUF3c0NvbnN0cnVjdFdpdGhQb2xpY3lcbntcbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gb2JqZWN0IGlzIGFuIGluc3RhbmNlIG9mIFJlc3RBcGlCYXNlLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgX2lzUmVzdEFwaUJhc2UoeDogYW55KTogeCBpcyBSZXN0QXBpQmFzZSB7XG4gICAgcmV0dXJuIHggIT09IG51bGwgJiYgdHlwZW9mIHggPT09IFwib2JqZWN0XCIgJiYgUkVTVEFQSV9TWU1CT0wgaW4geDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBUEkgR2F0ZXdheSBkZXBsb3ltZW50IHRoYXQgcmVwcmVzZW50cyB0aGUgbGF0ZXN0IGNoYW5nZXMgb2YgdGhlIEFQSS5cbiAgICogVGhpcyByZXNvdXJjZSB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgdXBkYXRlZCBldmVyeSB0aW1lIHRoZSBSRVNUIEFQSSBtb2RlbCBjaGFuZ2VzLlxuICAgKiBUaGlzIHdpbGwgYmUgdW5kZWZpbmVkIGlmIGBkZXBsb3lgIGlzIGZhbHNlLlxuICAgKi9cbiAgcHVibGljIGdldCBsYXRlc3REZXBsb3ltZW50KCkge1xuICAgIHJldHVybiB0aGlzLl9sYXRlc3REZXBsb3ltZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBmaXJzdCBkb21haW4gbmFtZSBtYXBwZWQgdG8gdGhpcyBBUEksIGlmIGRlZmluZWQgdGhyb3VnaCB0aGUgYGRvbWFpbk5hbWVgXG4gICAqIGNvbmZpZ3VyYXRpb24gcHJvcCwgb3IgYWRkZWQgdmlhIGBhZGREb21haW5OYW1lYFxuICAgKi9cbiAgcHVibGljIGdldCBkb21haW5OYW1lKCkge1xuICAgIHJldHVybiB0aGlzLl9kb21haW5OYW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBkZXBsb3llZCByb290IFVSTCBvZiB0aGlzIFJFU1QgQVBJLlxuICAgKi9cbiAgcHVibGljIGdldCB1cmwoKSB7XG4gICAgcmV0dXJuIHRoaXMudXJsRm9yUGF0aCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGlzIEFQSSBHYXRld2F5IFJlc3RBcGkuXG4gICAqL1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgcmVzdEFwaUlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSByZXNvdXJjZSBJRCBvZiB0aGUgcm9vdCByZXNvdXJjZS5cbiAgICpcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IHJlc3RBcGlSb290UmVzb3VyY2VJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBSZXByZXNlbnRzIHRoZSByb290IHJlc291cmNlIG9mIHRoaXMgQVBJIGVuZHBvaW50ICgnLycpLlxuICAgKiBSZXNvdXJjZXMgYW5kIE1ldGhvZHMgYXJlIGFkZGVkIHRvIHRoaXMgcmVzb3VyY2UuXG4gICAqL1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgcm9vdDogSVJlc291cmNlO1xuXG4gIC8qKlxuICAgKiBBUEkgR2F0ZXdheSBzdGFnZSB0aGF0IHBvaW50cyB0byB0aGUgbGF0ZXN0IGRlcGxveW1lbnQgKGlmIGRlZmluZWQpLlxuICAgKlxuICAgKiBJZiBgZGVwbG95YCBpcyBkaXNhYmxlZCwgeW91IHdpbGwgbmVlZCB0byBleHBsaWNpdGx5IGFzc2lnbiB0aGlzIHZhbHVlIGluIG9yZGVyIHRvXG4gICAqIHNldCB1cCBpbnRlZ3JhdGlvbnMuXG4gICAqL1xuICBwdWJsaWMgZGVwbG95bWVudFN0YWdlITogU3RhZ2U7XG5cbiAgLyoqXG4gICAqIEEgaHVtYW4gZnJpZW5kbHkgbmFtZSBmb3IgdGhpcyBSZXN0IEFQSS4gTm90ZSB0aGF0IHRoaXMgaXMgZGlmZmVyZW50IGZyb20gYHJlc3RBcGlJZGAuXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSByZXN0QXBpTmFtZTogc3RyaW5nO1xuXG4gIHByaXZhdGUgX2xhdGVzdERlcGxveW1lbnQ/OiBEZXBsb3ltZW50O1xuICBwcml2YXRlIF9kb21haW5OYW1lPzogRG9tYWluTmFtZTtcbiAgcHJpdmF0ZSBfYWxsb3dlZFZwY0VuZHBvaW50czogU2V0PGVjMi5JVnBjRW5kcG9pbnQ+ID0gbmV3IFNldCgpO1xuXG4gIHByb3RlY3RlZCBjbG91ZFdhdGNoQWNjb3VudD86IGFwaUdhdGV3YXlBY2NvdW50LkFwaUdhdGV3YXlBY2NvdW50O1xuICBwcm90ZWN0ZWQgaW50ZXJuYWxQb2xpY3k/OiBpYW0uUG9saWN5RG9jdW1lbnQ7XG4gIHByb3RlY3RlZCBwb2xpY3lBdHRhY2htZW50PzogYXBpR2F0ZXdheVJlc3RBcGlQb2xpY3kuQXBpR2F0ZXdheVJlc3RBcGlQb2xpY3k7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFJlc3RBcGlCYXNlUHJvcHMgPSB7fSkge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwgcHJvcHMpO1xuICAgIHRoaXMucmVzdEFwaU5hbWUgPSBwcm9wcy5yZXN0QXBpTmFtZSA/PyB0aGlzLnN0YWNrLnVuaXF1ZVJlc291cmNlTmFtZSh0aGlzKTtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBSRVNUQVBJX1NZTUJPTCwgeyB2YWx1ZTogdHJ1ZSB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhYnN0cmFjdCBhZGRUb1Jlc291cmNlUG9saWN5KFxuICAgIHN0YXRlbWVudDogaWFtLlBvbGljeVN0YXRlbWVudCxcbiAgKTogaWFtLkFkZFRvUmVzb3VyY2VQb2xpY3lSZXN1bHQ7XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIFVSTCBmb3IgYW4gSFRUUCBwYXRoLlxuICAgKlxuICAgKiBGYWlscyBpZiBgZGVwbG95bWVudFN0YWdlYCBpcyBub3Qgc2V0IGVpdGhlciBieSBgZGVwbG95YCBvciBleHBsaWNpdGx5LlxuICAgKi9cbiAgcHVibGljIHVybEZvclBhdGgocGF0aDogc3RyaW5nID0gXCIvXCIpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5kZXBsb3ltZW50U3RhZ2UpIHtcbiAgICAgIC8vIFRPRE8gdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ0Nhbm5vdCBkZXRlcm1pbmUgZGVwbG95bWVudCBzdGFnZSBmb3IgQVBJIGZyb20gXCJkZXBsb3ltZW50U3RhZ2VcIi4gVXNlIFwiZGVwbG95XCIgb3IgZXhwbGljaXRseSBzZXQgXCJkZXBsb3ltZW50U3RhZ2VcIicsXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5kZXBsb3ltZW50U3RhZ2UudXJsRm9yUGF0aChwYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZpbmVzIGFuIEFQSSBHYXRld2F5IGRvbWFpbiBuYW1lIGFuZCBtYXBzIGl0IHRvIHRoaXMgQVBJLlxuICAgKiBAcGFyYW0gaWQgVGhlIGNvbnN0cnVjdCBpZFxuICAgKiBAcGFyYW0gb3B0aW9ucyBjdXN0b20gZG9tYWluIG9wdGlvbnNcbiAgICovXG4gIHB1YmxpYyBhZGREb21haW5OYW1lKGlkOiBzdHJpbmcsIG9wdGlvbnM6IERvbWFpbk5hbWVPcHRpb25zKTogRG9tYWluTmFtZSB7XG4gICAgY29uc3QgZG9tYWluTmFtZSA9IG5ldyBEb21haW5OYW1lKHRoaXMsIGlkLCB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgbWFwcGluZzogdGhpcyxcbiAgICB9KTtcbiAgICBpZiAoIXRoaXMuX2RvbWFpbk5hbWUpIHtcbiAgICAgIHRoaXMuX2RvbWFpbk5hbWUgPSBkb21haW5OYW1lO1xuICAgIH1cbiAgICByZXR1cm4gZG9tYWluTmFtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgdXNhZ2UgcGxhbi5cbiAgICovXG4gIHB1YmxpYyBhZGRVc2FnZVBsYW4oaWQ6IHN0cmluZywgcHJvcHM6IFVzYWdlUGxhblByb3BzID0ge30pOiBVc2FnZVBsYW4ge1xuICAgIHJldHVybiBuZXcgVXNhZ2VQbGFuKHRoaXMsIGlkLCBwcm9wcyk7XG4gIH1cblxuICBwdWJsaWMgYXJuRm9yRXhlY3V0ZUFwaShcbiAgICBtZXRob2Q6IHN0cmluZyA9IFwiKlwiLFxuICAgIHBhdGg6IHN0cmluZyA9IFwiLypcIixcbiAgICBzdGFnZTogc3RyaW5nID0gXCIqXCIsXG4gICkge1xuICAgIGlmICghVG9rZW4uaXNVbnJlc29sdmVkKHBhdGgpICYmICFwYXRoLnN0YXJ0c1dpdGgoXCIvXCIpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFwicGF0aFwiIG11c3QgYmVnaW4gd2l0aCBhIFwiL1wiOiAnJHtwYXRofSdgKTtcbiAgICB9XG5cbiAgICBpZiAobWV0aG9kLnRvVXBwZXJDYXNlKCkgPT09IFwiQU5ZXCIpIHtcbiAgICAgIG1ldGhvZCA9IFwiKlwiO1xuICAgIH1cblxuICAgIHJldHVybiBBd3NTdGFjay5vZkF3c0NvbnN0cnVjdCh0aGlzKS5mb3JtYXRBcm4oe1xuICAgICAgc2VydmljZTogXCJleGVjdXRlLWFwaVwiLFxuICAgICAgcmVzb3VyY2U6IHRoaXMucmVzdEFwaUlkLFxuICAgICAgYXJuRm9ybWF0OiBBcm5Gb3JtYXQuU0xBU0hfUkVTT1VSQ0VfTkFNRSxcbiAgICAgIHJlc291cmNlTmFtZTogYCR7c3RhZ2V9LyR7bWV0aG9kfSR7cGF0aH1gLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBuZXcgZ2F0ZXdheSByZXNwb25zZS5cbiAgICovXG4gIHB1YmxpYyBhZGRHYXRld2F5UmVzcG9uc2UoXG4gICAgaWQ6IHN0cmluZyxcbiAgICBvcHRpb25zOiBHYXRld2F5UmVzcG9uc2VPcHRpb25zLFxuICApOiBHYXRld2F5UmVzcG9uc2Uge1xuICAgIHJldHVybiBuZXcgR2F0ZXdheVJlc3BvbnNlKHRoaXMsIGlkLCB7XG4gICAgICByZXN0QXBpOiB0aGlzLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYW4gQXBpS2V5IHRvIHRoZSBkZXBsb3ltZW50U3RhZ2VcbiAgICovXG4gIHB1YmxpYyBhZGRBcGlLZXkoaWQ6IHN0cmluZywgb3B0aW9ucz86IEFwaUtleU9wdGlvbnMpOiBJQXBpS2V5IHtcbiAgICBpZiAoIXRoaXMuZGVwbG95bWVudFN0YWdlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiQ2Fubm90IGFkZCBBUEkga2V5IHdpdGhvdXQgYSBkZXBsb3ltZW50IHN0YWdlLiBFbmFibGUgYGRlcGxveWAgb3Igc2V0IGBkZXBsb3ltZW50U3RhZ2VgXCIsXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IEFwaUtleSh0aGlzLCBpZCwge1xuICAgICAgc3RhZ2VzOiBbdGhpcy5kZXBsb3ltZW50U3RhZ2VdLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSByZXNvdXJjZSBwb2xpY3kgdGhhdCBvbmx5IGFsbG93cyBBUEkgZXhlY3V0aW9uIGZyb20gYSBWUEMgRW5kcG9pbnQgdG8gY3JlYXRlIGEgcHJpdmF0ZSBBUEkuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FwaWdhdGV3YXkvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2FwaWdhdGV3YXktcmVzb3VyY2UtcG9saWNpZXMtZXhhbXBsZXMuaHRtbCNhcGlnYXRld2F5LXJlc291cmNlLXBvbGljaWVzLXNvdXJjZS12cGMtZXhhbXBsZVxuICAgKlxuICAgKiBAcGFyYW0gdnBjRW5kcG9pbnRzIHRoZSBpbnRlcmZhY2UgVlBDIGVuZHBvaW50cyB0byBncmFudCBhY2Nlc3MgdG9cbiAgICovXG4gIHB1YmxpYyBncmFudEludm9rZUZyb21WcGNFbmRwb2ludHNPbmx5KFxuICAgIHZwY0VuZHBvaW50czogZWMyLklWcGNFbmRwb2ludFtdLFxuICApOiB2b2lkIHtcbiAgICB2cGNFbmRwb2ludHMuZm9yRWFjaCgoZW5kcG9pbnQpID0+IHRoaXMuX2FsbG93ZWRWcGNFbmRwb2ludHMuYWRkKGVuZHBvaW50KSk7XG5cbiAgICBjb25zdCBlbmRwb2ludHMgPSBMYXp5Lmxpc3RWYWx1ZSh7XG4gICAgICBwcm9kdWNlOiAoKSA9PiB7XG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuX2FsbG93ZWRWcGNFbmRwb2ludHMpLm1hcChcbiAgICAgICAgICAoZW5kcG9pbnQpID0+IGVuZHBvaW50LnZwY0VuZHBvaW50SWQsXG4gICAgICAgICk7XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgdGhpcy5hZGRUb1Jlc291cmNlUG9saWN5KFxuICAgICAgbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICBwcmluY2lwYWxzOiBbbmV3IGlhbS5BbnlQcmluY2lwYWwoKV0sXG4gICAgICAgIGFjdGlvbnM6IFtcImV4ZWN1dGUtYXBpOkludm9rZVwiXSxcbiAgICAgICAgcmVzb3VyY2VzOiBbXCJleGVjdXRlLWFwaTovKlwiXSxcbiAgICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkRFTlksXG4gICAgICAgIGNvbmRpdGlvbjogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRlc3Q6IFwiU3RyaW5nTm90RXF1YWxzXCIsXG4gICAgICAgICAgICB2YXJpYWJsZTogXCJhd3M6U291cmNlVnBjZVwiLFxuICAgICAgICAgICAgdmFsdWVzOiBlbmRwb2ludHMsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0pLFxuICAgICk7XG4gICAgdGhpcy5hZGRUb1Jlc291cmNlUG9saWN5KFxuICAgICAgbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICBwcmluY2lwYWxzOiBbbmV3IGlhbS5BbnlQcmluY2lwYWwoKV0sXG4gICAgICAgIGFjdGlvbnM6IFtcImV4ZWN1dGUtYXBpOkludm9rZVwiXSxcbiAgICAgICAgcmVzb3VyY2VzOiBbXCJleGVjdXRlLWFwaTovKlwiXSxcbiAgICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBnaXZlbiBuYW1lZCBtZXRyaWMgZm9yIHRoaXMgQVBJXG4gICAqL1xuICBwdWJsaWMgbWV0cmljKFxuICAgIG1ldHJpY05hbWU6IHN0cmluZyxcbiAgICBwcm9wcz86IGNsb3Vkd2F0Y2guTWV0cmljT3B0aW9ucyxcbiAgKTogY2xvdWR3YXRjaC5NZXRyaWMge1xuICAgIHJldHVybiBuZXcgY2xvdWR3YXRjaC5NZXRyaWMoe1xuICAgICAgbmFtZXNwYWNlOiBcIkFXUy9BcGlHYXRld2F5XCIsXG4gICAgICBtZXRyaWNOYW1lLFxuICAgICAgZGltZW5zaW9uc01hcDogeyBBcGlOYW1lOiB0aGlzLnJlc3RBcGlOYW1lIH0sXG4gICAgICAuLi5wcm9wcyxcbiAgICB9KS5hdHRhY2hUbyh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRyaWMgZm9yIHRoZSBudW1iZXIgb2YgY2xpZW50LXNpZGUgZXJyb3JzIGNhcHR1cmVkIGluIGEgZ2l2ZW4gcGVyaW9kLlxuICAgKlxuICAgKiBEZWZhdWx0OiBzdW0gb3ZlciA1IG1pbnV0ZXNcbiAgICovXG4gIHB1YmxpYyBtZXRyaWNDbGllbnRFcnJvcihcbiAgICBwcm9wcz86IGNsb3Vkd2F0Y2guTWV0cmljT3B0aW9ucyxcbiAgKTogY2xvdWR3YXRjaC5NZXRyaWMge1xuICAgIHJldHVybiB0aGlzLmNhbm5lZE1ldHJpYyhBcGlHYXRld2F5TWV0cmljcy5fNFh4RXJyb3JTdW0sIHByb3BzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRyaWMgZm9yIHRoZSBudW1iZXIgb2Ygc2VydmVyLXNpZGUgZXJyb3JzIGNhcHR1cmVkIGluIGEgZ2l2ZW4gcGVyaW9kLlxuICAgKlxuICAgKiBEZWZhdWx0OiBzdW0gb3ZlciA1IG1pbnV0ZXNcbiAgICovXG4gIHB1YmxpYyBtZXRyaWNTZXJ2ZXJFcnJvcihcbiAgICBwcm9wcz86IGNsb3Vkd2F0Y2guTWV0cmljT3B0aW9ucyxcbiAgKTogY2xvdWR3YXRjaC5NZXRyaWMge1xuICAgIHJldHVybiB0aGlzLmNhbm5lZE1ldHJpYyhBcGlHYXRld2F5TWV0cmljcy5fNVh4RXJyb3JTdW0sIHByb3BzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRyaWMgZm9yIHRoZSBudW1iZXIgb2YgcmVxdWVzdHMgc2VydmVkIGZyb20gdGhlIEFQSSBjYWNoZSBpbiBhIGdpdmVuIHBlcmlvZC5cbiAgICpcbiAgICogRGVmYXVsdDogc3VtIG92ZXIgNSBtaW51dGVzXG4gICAqL1xuICBwdWJsaWMgbWV0cmljQ2FjaGVIaXRDb3VudChcbiAgICBwcm9wcz86IGNsb3Vkd2F0Y2guTWV0cmljT3B0aW9ucyxcbiAgKTogY2xvdWR3YXRjaC5NZXRyaWMge1xuICAgIHJldHVybiB0aGlzLmNhbm5lZE1ldHJpYyhBcGlHYXRld2F5TWV0cmljcy5jYWNoZUhpdENvdW50U3VtLCBwcm9wcyk7XG4gIH1cblxuICAvKipcbiAgICogTWV0cmljIGZvciB0aGUgbnVtYmVyIG9mIHJlcXVlc3RzIHNlcnZlZCBmcm9tIHRoZSBiYWNrZW5kIGluIGEgZ2l2ZW4gcGVyaW9kLFxuICAgKiB3aGVuIEFQSSBjYWNoaW5nIGlzIGVuYWJsZWQuXG4gICAqXG4gICAqIERlZmF1bHQ6IHN1bSBvdmVyIDUgbWludXRlc1xuICAgKi9cbiAgcHVibGljIG1ldHJpY0NhY2hlTWlzc0NvdW50KFxuICAgIHByb3BzPzogY2xvdWR3YXRjaC5NZXRyaWNPcHRpb25zLFxuICApOiBjbG91ZHdhdGNoLk1ldHJpYyB7XG4gICAgcmV0dXJuIHRoaXMuY2FubmVkTWV0cmljKEFwaUdhdGV3YXlNZXRyaWNzLmNhY2hlTWlzc0NvdW50U3VtLCBwcm9wcyk7XG4gIH1cblxuICAvKipcbiAgICogTWV0cmljIGZvciB0aGUgdG90YWwgbnVtYmVyIEFQSSByZXF1ZXN0cyBpbiBhIGdpdmVuIHBlcmlvZC5cbiAgICpcbiAgICogRGVmYXVsdDogc2FtcGxlIGNvdW50IG92ZXIgNSBtaW51dGVzXG4gICAqL1xuICBwdWJsaWMgbWV0cmljQ291bnQocHJvcHM/OiBjbG91ZHdhdGNoLk1ldHJpY09wdGlvbnMpOiBjbG91ZHdhdGNoLk1ldHJpYyB7XG4gICAgcmV0dXJuIHRoaXMuY2FubmVkTWV0cmljKEFwaUdhdGV3YXlNZXRyaWNzLmNvdW50U3VtLCB7XG4gICAgICBzdGF0aXN0aWM6IFwiU2FtcGxlQ291bnRcIixcbiAgICAgIC4uLnByb3BzLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldHJpYyBmb3IgdGhlIHRpbWUgYmV0d2VlbiB3aGVuIEFQSSBHYXRld2F5IHJlbGF5cyBhIHJlcXVlc3QgdG8gdGhlIGJhY2tlbmRcbiAgICogYW5kIHdoZW4gaXQgcmVjZWl2ZXMgYSByZXNwb25zZSBmcm9tIHRoZSBiYWNrZW5kLlxuICAgKlxuICAgKiBEZWZhdWx0OiBhdmVyYWdlIG92ZXIgNSBtaW51dGVzLlxuICAgKi9cbiAgcHVibGljIG1ldHJpY0ludGVncmF0aW9uTGF0ZW5jeShcbiAgICBwcm9wcz86IGNsb3Vkd2F0Y2guTWV0cmljT3B0aW9ucyxcbiAgKTogY2xvdWR3YXRjaC5NZXRyaWMge1xuICAgIHJldHVybiB0aGlzLmNhbm5lZE1ldHJpYyhcbiAgICAgIEFwaUdhdGV3YXlNZXRyaWNzLmludGVncmF0aW9uTGF0ZW5jeUF2ZXJhZ2UsXG4gICAgICBwcm9wcyxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB0aW1lIGJldHdlZW4gd2hlbiBBUEkgR2F0ZXdheSByZWNlaXZlcyBhIHJlcXVlc3QgZnJvbSBhIGNsaWVudFxuICAgKiBhbmQgd2hlbiBpdCByZXR1cm5zIGEgcmVzcG9uc2UgdG8gdGhlIGNsaWVudC5cbiAgICogVGhlIGxhdGVuY3kgaW5jbHVkZXMgdGhlIGludGVncmF0aW9uIGxhdGVuY3kgYW5kIG90aGVyIEFQSSBHYXRld2F5IG92ZXJoZWFkLlxuICAgKlxuICAgKiBEZWZhdWx0OiBhdmVyYWdlIG92ZXIgNSBtaW51dGVzLlxuICAgKi9cbiAgcHVibGljIG1ldHJpY0xhdGVuY3kocHJvcHM/OiBjbG91ZHdhdGNoLk1ldHJpY09wdGlvbnMpOiBjbG91ZHdhdGNoLk1ldHJpYyB7XG4gICAgcmV0dXJuIHRoaXMuY2FubmVkTWV0cmljKEFwaUdhdGV3YXlNZXRyaWNzLmxhdGVuY3lBdmVyYWdlLCBwcm9wcyk7XG4gIH1cblxuICAvKipcbiAgICogSW50ZXJuYWwgQVBJIHVzZWQgYnkgYE1ldGhvZGAgdG8ga2VlcCBhbiBpbnZlbnRvcnkgb2YgbWV0aG9kcyBhdCB0aGUgQVBJXG4gICAqIGxldmVsIGZvciB2YWxpZGF0aW9uIHB1cnBvc2VzLlxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBfYXR0YWNoTWV0aG9kKF9tZXRob2Q6IE1ldGhvZCkge1xuICAgIC8vIFRoaXMgbWV0aG9kIGlzIHVzZWQgaW4gdGhlIENESyB0byBtYW5hZ2UgZGVwZW5kZW5jaWVzIGZvciBkZXBsb3ltZW50cy5cbiAgICAvLyBJbiBUZXJyYUNvbnN0cnVjdHMsIHRoaXMgbWlnaHQgYmUgaGFuZGxlZCBkaWZmZXJlbnRseSwgZS5nLiwgYnkgcGFzc2luZyBtZXRob2QgQVJOcyB0byBkZXBsb3ltZW50IHRyaWdnZXJzLlxuICB9XG5cbiAgLyoqXG4gICAqIEFzc29jaWF0ZXMgYSBEZXBsb3ltZW50IHJlc291cmNlIHdpdGggdGhpcyBSRVNUIEFQSS5cbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgX2F0dGFjaERlcGxveW1lbnQoX2RlcGxveW1lbnQ6IERlcGxveW1lbnQpIHtcbiAgICAvLyBTaW1pbGFyIHRvIF9hdHRhY2hNZXRob2QsIGZvciBtYW5hZ2luZyBkZXBsb3ltZW50IGRlcGVuZGVuY2llcy5cbiAgfVxuXG4gIC8qKlxuICAgKiBBc3NvY2lhdGVzIGEgU3RhZ2Ugd2l0aCB0aGlzIFJFU1QgQVBJXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIF9hdHRhY2hTdGFnZShzdGFnZTogU3RhZ2UpIHtcbiAgICBpZiAodGhpcy5jbG91ZFdhdGNoQWNjb3VudCkge1xuICAgICAgc3RhZ2Uubm9kZS5hZGREZXBlbmRlbmN5KHRoaXMuY2xvdWRXYXRjaEFjY291bnQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHByb3RlY3RlZCBfY29uZmlndXJlQ2xvdWRXYXRjaFJvbGUoXG4gICAgYXBpUmVzb3VyY2U6IGFwaUdhdGV3YXlSZXN0QXBpLkFwaUdhdGV3YXlSZXN0QXBpLFxuICAgIGNsb3VkV2F0Y2hSb2xlRW5hYmxlZD86IGJvb2xlYW4sXG4gICAgLy8gY2xvdWRXYXRjaFJvbGVSZW1vdmFsUG9saWN5PzogUmVtb3ZhbFBvbGljeSwgLy8gUmVtb3ZhbFBvbGljeSBpcyBhIENESyBjb25jZXB0XG4gICkge1xuICAgIC8vIERlZmF1bHQgdG8gdHJ1ZSwgYXMgQVBJR0FURVdBWV9ESVNBQkxFX0NMT1VEV0FUQ0hfUk9MRSBmZWF0dXJlIGZsYWcgaXMgbm90IGF2YWlsYWJsZSBoZXJlLlxuICAgIGNvbnN0IHNob3VsZENyZWF0ZVJvbGUgPSBjbG91ZFdhdGNoUm9sZUVuYWJsZWQgPz8gdHJ1ZTtcbiAgICBpZiAoIXNob3VsZENyZWF0ZVJvbGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCByb2xlID0gbmV3IGlhbS5Sb2xlKHRoaXMsIFwiQ2xvdWRXYXRjaFJvbGVcIiwge1xuICAgICAgYXNzdW1lZEJ5OiBuZXcgaWFtLlNlcnZpY2VQcmluY2lwYWwoXCJhcGlnYXRld2F5LmFtYXpvbmF3cy5jb21cIiksXG4gICAgICBtYW5hZ2VkUG9saWNpZXM6IFtcbiAgICAgICAgaWFtLk1hbmFnZWRQb2xpY3kuZnJvbUF3c01hbmFnZWRQb2xpY3lOYW1lKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgXCJBbWF6b25BUElHYXRld2F5UHVzaFRvQ2xvdWRXYXRjaExvZ3NcIixcbiAgICAgICAgICBcInNlcnZpY2Utcm9sZS9BbWF6b25BUElHYXRld2F5UHVzaFRvQ2xvdWRXYXRjaExvZ3NcIixcbiAgICAgICAgKSxcbiAgICAgIF0sXG4gICAgfSk7XG4gICAgLy8gcm9sZS5hcHBseVJlbW92YWxQb2xpY3koY2xvdWRXYXRjaFJvbGVSZW1vdmFsUG9saWN5KTsgLy8gSGFuZGxlZCBieSBUZXJyYWZvcm0gbGlmZWN5Y2xlIGlmIG5lZWRlZFxuXG4gICAgdGhpcy5jbG91ZFdhdGNoQWNjb3VudCA9IG5ldyBhcGlHYXRld2F5QWNjb3VudC5BcGlHYXRld2F5QWNjb3VudChcbiAgICAgIHRoaXMsXG4gICAgICBcIkFjY291bnRcIixcbiAgICAgIHtcbiAgICAgICAgY2xvdWR3YXRjaFJvbGVBcm46IHJvbGUucm9sZUFybixcbiAgICAgIH0sXG4gICAgKTtcbiAgICAvLyB0aGlzLmNsb3VkV2F0Y2hBY2NvdW50LmFwcGx5UmVtb3ZhbFBvbGljeShjbG91ZFdhdGNoUm9sZVJlbW92YWxQb2xpY3kpOyAvLyBIYW5kbGVkIGJ5IFRlcnJhZm9ybSBsaWZlY3ljbGVcblxuICAgIHRoaXMuY2xvdWRXYXRjaEFjY291bnQubm9kZS5hZGREZXBlbmRlbmN5KGFwaVJlc291cmNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHByb3RlY3RlZCBfY29uZmlndXJlRGVwbG95bWVudChwcm9wczogUmVzdEFwaUJhc2VQcm9wcykge1xuICAgIGNvbnN0IGRlcGxveSA9IHByb3BzLmRlcGxveSA/PyB0cnVlO1xuICAgIGlmIChkZXBsb3kpIHtcbiAgICAgIHRoaXMuX2xhdGVzdERlcGxveW1lbnQgPSBuZXcgRGVwbG95bWVudCh0aGlzLCBcIkRlcGxveW1lbnRcIiwge1xuICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICBwcm9wcy5kZXBsb3lPcHRpb25zPy5kZXNjcmlwdGlvbiA/P1xuICAgICAgICAgIHByb3BzLmRlc2NyaXB0aW9uID8/XG4gICAgICAgICAgXCJBdXRvbWF0aWNhbGx5IGNyZWF0ZWQgYnkgdGhlIFJlc3RBcGkgY29uc3RydWN0XCIsXG4gICAgICAgIGFwaTogdGhpcyxcbiAgICAgICAgLy8gVE9ETzogSW1wbGVtZW50IFJlbW92YWxQb2xpY3kuUkVUQUlOIHRocm91Z2ggcmVtb3ZlZCBibG9jayBpbiBUZXJyYWZvcm0uXG4gICAgICAgIC8vIHJldGFpbkRlcGxveW1lbnRzOiBwcm9wcy5yZXRhaW5EZXBsb3ltZW50cyxcbiAgICAgICAgLy8gSW4gVGVycmFmb3JtLCB0cmlnZ2VycyBhcmUgdXNlZCB0byBtYW5hZ2UgcmVkZXBsb3ltZW50LlxuICAgICAgICAvLyBBIGhhc2ggb2YgdGhlIEFQSSBkZWZpbml0aW9uIG9yIHJlbGV2YW50IHBhcnRzIHdvdWxkIGdvIGhlcmUuXG4gICAgICAgIC8vIEZvciBzaW1wbGljaXR5LCBhIHBsYWNlaG9sZGVyIG9yIGEgZGVwZW5kZW5jeSBvbiB0aGUgQVBJIHJlc291cmNlIGl0c2VsZiBtaWdodCBiZSB1c2VkLlxuICAgICAgICAvLyB0cmlnZ2VyczogeyByZWRlcGxveSA9IFwiXCIgfSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBzdGFnZU5hbWUgPVxuICAgICAgICAocHJvcHMuZGVwbG95T3B0aW9ucyAmJiBwcm9wcy5kZXBsb3lPcHRpb25zLnN0YWdlTmFtZSkgfHwgXCJwcm9kXCI7XG5cbiAgICAgIHRoaXMuZGVwbG95bWVudFN0YWdlID0gbmV3IFN0YWdlKHRoaXMsIGBEZXBsb3ltZW50U3RhZ2UuJHtzdGFnZU5hbWV9YCwge1xuICAgICAgICBkZXBsb3ltZW50OiB0aGlzLl9sYXRlc3REZXBsb3ltZW50LFxuICAgICAgICAuLi5wcm9wcy5kZXBsb3lPcHRpb25zLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChwcm9wcy5kZXBsb3lPcHRpb25zKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBzZXQgJ2RlcGxveU9wdGlvbnMnIGlmICdkZXBsb3knIGlzIGRpc2FibGVkXCIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHByb3RlY3RlZCBfY29uZmlndXJlRW5kcG9pbnRzKFxuICAgIHByb3BzOiBSZXN0QXBpQmFzZVByb3BzLFxuICApOiBhcGlHYXRld2F5UmVzdEFwaS5BcGlHYXRld2F5UmVzdEFwaUVuZHBvaW50Q29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHByb3BzLmVuZHBvaW50VHlwZXMgJiYgcHJvcHMuZW5kcG9pbnRDb25maWd1cmF0aW9uKSB7XG4gICAgICAvLyBUT0RPOiB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIk9ubHkgb25lIG9mIHRoZSBSZXN0QXBpIHByb3BzLCBlbmRwb2ludFR5cGVzIG9yIGVuZHBvaW50Q29uZmlndXJhdGlvbiwgaXMgYWxsb3dlZFwiLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHByb3BzLmVuZHBvaW50Q29uZmlndXJhdGlvbikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZXM6IHByb3BzLmVuZHBvaW50Q29uZmlndXJhdGlvbi50eXBlcyxcbiAgICAgICAgdnBjRW5kcG9pbnRJZHM6IHByb3BzLmVuZHBvaW50Q29uZmlndXJhdGlvbj8udnBjRW5kcG9pbnRzPy5tYXAoXG4gICAgICAgICAgKHZwY0VuZHBvaW50KSA9PiB2cGNFbmRwb2ludC52cGNFbmRwb2ludElkLFxuICAgICAgICApLFxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKHByb3BzLmVuZHBvaW50VHlwZXMpIHtcbiAgICAgIHJldHVybiB7IHR5cGVzOiBwcm9wcy5lbmRwb2ludFR5cGVzIH07XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIGNhbm5lZE1ldHJpYyhcbiAgICBmbjogKGRpbXM6IHsgQXBpTmFtZTogc3RyaW5nIH0pID0+IGNsb3Vkd2F0Y2guTWV0cmljUHJvcHMsXG4gICAgcHJvcHM/OiBjbG91ZHdhdGNoLk1ldHJpY09wdGlvbnMsXG4gICkge1xuICAgIHJldHVybiBuZXcgY2xvdWR3YXRjaC5NZXRyaWMoe1xuICAgICAgLi4uZm4oeyBBcGlOYW1lOiB0aGlzLnJlc3RBcGlOYW1lIH0pLFxuICAgICAgLi4ucHJvcHMsXG4gICAgfSkuYXR0YWNoVG8odGhpcyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG91dHB1dHMoKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlc3RBcGlJZDogdGhpcy5yZXN0QXBpSWQsXG4gICAgICByZXN0QXBpTmFtZTogdGhpcy5yZXN0QXBpTmFtZSxcbiAgICAgIHJlc3RBcGlSb290UmVzb3VyY2VJZDogdGhpcy5yZXN0QXBpUm9vdFJlc291cmNlSWQsXG4gICAgICAvLyB0aGlzIGlzIGVxdWFsIHRvIEFXU0NESydzIFwiRW5kcG9pbnRcIiBvdXRwdXRcbiAgICAgIHVybDogdGhpcy5kZXBsb3ltZW50U3RhZ2UgPyB0aGlzLnVybCA6IHVuZGVmaW5lZCxcbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIFJFU1QgQVBJIGluIEFtYXpvbiBBUEkgR2F0ZXdheSwgY3JlYXRlZCB3aXRoIGFuIE9wZW5BUEkgc3BlY2lmaWNhdGlvbi5cbiAqXG4gKiBTb21lIHByb3BlcnRpZXMgbm9ybWFsbHkgYWNjZXNzaWJsZSBvbiBAc2VlIGBSZXN0QXBpYCAtIHN1Y2ggYXMgdGhlIGRlc2NyaXB0aW9uIC1cbiAqIG11c3QgYmUgZGVjbGFyZWQgaW4gdGhlIHNwZWNpZmljYXRpb24uIEFsbCBSZXNvdXJjZXMgYW5kIE1ldGhvZHMgbmVlZCB0byBiZSBkZWZpbmVkIGFzXG4gKiBwYXJ0IG9mIHRoZSBPcGVuQVBJIHNwZWNpZmljYXRpb24gZmlsZSwgYW5kIGNhbm5vdCBiZSBhZGRlZCB2aWEgdGhlIENESy5cbiAqXG4gKiBCeSBkZWZhdWx0LCB0aGUgQVBJIHdpbGwgYXV0b21hdGljYWxseSBiZSBkZXBsb3llZCBhbmQgYWNjZXNzaWJsZSBmcm9tIGFcbiAqIHB1YmxpYyBlbmRwb2ludC5cbiAqXG4gKlxuICogQHJlc291cmNlIGF3c19hcGlfZ2F0ZXdheV9yZXN0X2FwaVxuICovXG5leHBvcnQgY2xhc3MgU3BlY1Jlc3RBcGkgZXh0ZW5kcyBSZXN0QXBpQmFzZSB7XG4gIHB1YmxpYyByZWFkb25seSByZXN0QXBpSWQ6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IHJlc3RBcGlSb290UmVzb3VyY2VJZDogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgcm9vdDogSVJlc291cmNlO1xuICBwcml2YXRlIHJlYWRvbmx5IHJlc291cmNlOiBhcGlHYXRld2F5UmVzdEFwaS5BcGlHYXRld2F5UmVzdEFwaTtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogU3BlY1Jlc3RBcGlQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwgcHJvcHMpO1xuXG4gICAgY29uc3QgYXBpRGVmQ29uZmlnID0gcHJvcHMuYXBpRGVmaW5pdGlvbi5iaW5kKHRoaXMpO1xuICAgIHRoaXMuaW50ZXJuYWxQb2xpY3kgPSBwcm9wcy5wb2xpY3k7XG5cbiAgICB0aGlzLnJlc291cmNlID0gbmV3IGFwaUdhdGV3YXlSZXN0QXBpLkFwaUdhdGV3YXlSZXN0QXBpKHRoaXMsIFwiUmVzb3VyY2VcIiwge1xuICAgICAgbmFtZTogdGhpcy5yZXN0QXBpTmFtZSxcbiAgICAgIHBvbGljeTogTGF6eS5zdHJpbmdWYWx1ZSh7XG4gICAgICAgIHByb2R1Y2U6ICgpID0+IHRoaXMuaW50ZXJuYWxQb2xpY3k/Lmpzb24sXG4gICAgICB9KSxcbiAgICAgIGZhaWxPbldhcm5pbmdzOiBwcm9wcy5mYWlsT25XYXJuaW5ncyxcbiAgICAgIG1pbmltdW1Db21wcmVzc2lvblNpemU6IHByb3BzLm1pbkNvbXByZXNzaW9uU2l6ZT8udG9CeXRlcygpPy50b1N0cmluZygpLFxuICAgICAgYm9keTogYXBpRGVmQ29uZmlnLmlubGluZURlZmluaXRpb24sIC8vID8/IGFwaURlZkNvbmZpZy5zM0xvY2F0aW9uLCAvLyBURiBib2R5IGNhbiBiZSBpbmxpbmUgb3IgUzMgVVJJXG4gICAgICBlbmRwb2ludENvbmZpZ3VyYXRpb246IHRoaXMuX2NvbmZpZ3VyZUVuZHBvaW50cyhwcm9wcyksXG4gICAgICBwYXJhbWV0ZXJzOiBwcm9wcy5wYXJhbWV0ZXJzLFxuICAgICAgZGlzYWJsZUV4ZWN1dGVBcGlFbmRwb2ludDogcHJvcHMuZGlzYWJsZUV4ZWN1dGVBcGlFbmRwb2ludCxcbiAgICAgIGRlc2NyaXB0aW9uOiBwcm9wcy5kZXNjcmlwdGlvbiwgLy8gRGVzY3JpcHRpb24gY2FuIGJlIHNldCBoZXJlIGlmIG5vdCBpbiBzcGVjLCBvciB3aWxsIGJlIG92ZXJyaWRkZW4gYnkgc3BlY1xuICAgIH0pO1xuXG4gICAgLy8gVGhpcyBDREsgbGlmZWN5Y2xlIGhvb2sgaXMgbGFyZ2VseSB1bnVzZWQgaW4gVGVycmFmb3JtLCBidXQgY2FuIGJlIHVzZWQgZm9yIGN1c3RvbSBsb2dpYyBhZnRlciB0aGUgQVBJIGlzIGNyZWF0ZWQuXG4gICAgcHJvcHMuYXBpRGVmaW5pdGlvbi5iaW5kQWZ0ZXJDcmVhdGUodGhpcywgdGhpcyk7XG5cbiAgICB0aGlzLm5vZGUuZGVmYXVsdENoaWxkID0gdGhpcy5yZXNvdXJjZTtcbiAgICB0aGlzLnJlc3RBcGlJZCA9IHRoaXMucmVzb3VyY2UuaWQ7XG4gICAgdGhpcy5yZXN0QXBpUm9vdFJlc291cmNlSWQgPSB0aGlzLnJlc291cmNlLnJvb3RSZXNvdXJjZUlkO1xuICAgIHRoaXMucm9vdCA9IG5ldyBSb290UmVzb3VyY2UodGhpcywge30sIHRoaXMucmVzdEFwaVJvb3RSZXNvdXJjZUlkKTtcblxuICAgIHRoaXMuX2NvbmZpZ3VyZUNsb3VkV2F0Y2hSb2xlKHRoaXMucmVzb3VyY2UsIHByb3BzLmNsb3VkV2F0Y2hSb2xlKTtcbiAgICB0aGlzLl9jb25maWd1cmVEZXBsb3ltZW50KHByb3BzKTtcblxuICAgIGlmIChwcm9wcy5kb21haW5OYW1lKSB7XG4gICAgICB0aGlzLmFkZERvbWFpbk5hbWUoXCJDdXN0b21Eb21haW5cIiwgcHJvcHMuZG9tYWluTmFtZSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGFkZFRvUmVzb3VyY2VQb2xpY3koXG4gICAgc3RhdGVtZW50OiBpYW0uUG9saWN5U3RhdGVtZW50LFxuICApOiBpYW0uQWRkVG9SZXNvdXJjZVBvbGljeVJlc3VsdCB7XG4gICAgaWYgKCF0aGlzLmludGVybmFsUG9saWN5KSB7XG4gICAgICB0aGlzLmludGVybmFsUG9saWN5ID0gbmV3IGlhbS5Qb2xpY3lEb2N1bWVudCh0aGlzLCBcIlBvbGljeURvY3VtZW50XCIpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMucG9saWN5QXR0YWNobWVudCkge1xuICAgICAgdGhpcy5wb2xpY3lBdHRhY2htZW50ID1cbiAgICAgICAgbmV3IGFwaUdhdGV3YXlSZXN0QXBpUG9saWN5LkFwaUdhdGV3YXlSZXN0QXBpUG9saWN5KHRoaXMsIFwiUG9saWN5XCIsIHtcbiAgICAgICAgICByZXN0QXBpSWQ6IHRoaXMucmVzdEFwaUlkLFxuICAgICAgICAgIHBvbGljeTogdGhpcy5pbnRlcm5hbFBvbGljeS5qc29uLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5pbnRlcm5hbFBvbGljeS5hZGRTdGF0ZW1lbnRzKHN0YXRlbWVudCk7XG4gICAgLy8gTm90ZTogVGhlIHBvbGljeSBvbiBhcGlHYXRld2F5UmVzdEFwaSB3aWxsIGJlIHVwZGF0ZWQgZHVlIHRvIExhenkgZXZhbHVhdGlvbi5cbiAgICAvLyBJZiBhIHNlcGFyYXRlIEFwaUdhdGV3YXlSZXN0QXBpUG9saWN5IHJlc291cmNlIGlzIHByZWZlcnJlZCwgdGhpcyBsb2dpYyB3b3VsZCBjaGFuZ2UuXG4gICAgcmV0dXJuIHsgc3RhdGVtZW50QWRkZWQ6IHRydWUsIHBvbGljeURlcGVuZGFibGU6IHRoaXMucmVzb3VyY2UgfTsgLy8gb3IgdGhpc1xuICB9XG59XG5cbi8qKlxuICogQXR0cmlidXRlcyB0aGF0IGNhbiBiZSBzcGVjaWZpZWQgd2hlbiBpbXBvcnRpbmcgYSBSZXN0QXBpXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzdEFwaUF0dHJpYnV0ZXMge1xuICAvKipcbiAgICogVGhlIElEIG9mIHRoZSBBUEkgR2F0ZXdheSBSZXN0QXBpLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVzdEFwaUlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBBUEkgR2F0ZXdheSBSZXN0QXBpLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIElEIG9mIHRoZSBSZXN0QXBpIGNvbnN0cnVjdC5cbiAgICovXG4gIHJlYWRvbmx5IHJlc3RBcGlOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVzb3VyY2UgSUQgb2YgdGhlIHJvb3QgcmVzb3VyY2UuXG4gICAqL1xuICByZWFkb25seSByb290UmVzb3VyY2VJZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBSRVNUIEFQSSBpbiBBbWF6b24gQVBJIEdhdGV3YXkuXG4gKlxuICogVXNlIGBhZGRSZXNvdXJjZWAgYW5kIGBhZGRNZXRob2RgIHRvIGNvbmZpZ3VyZSB0aGUgQVBJIG1vZGVsLlxuICpcbiAqIEJ5IGRlZmF1bHQsIHRoZSBBUEkgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGRlcGxveWVkIGFuZCBhY2Nlc3NpYmxlIGZyb20gYVxuICogcHVibGljIGVuZHBvaW50LlxuICovXG5leHBvcnQgY2xhc3MgUmVzdEFwaSBleHRlbmRzIFJlc3RBcGlCYXNlIHtcbiAgLyoqXG4gICAqIFJldHVybiB3aGV0aGVyIHRoZSBnaXZlbiBvYmplY3QgaXMgYSBgUmVzdEFwaWBcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgaXNSZXN0QXBpKHg6IGFueSk6IHggaXMgUmVzdEFwaSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHggIT09IG51bGwgJiYgdHlwZW9mIHggPT09IFwib2JqZWN0XCIgJiYgQVBJR0FURVdBWV9SRVNUQVBJX1NZTUJPTCBpbiB4XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBvcnQgYW4gZXhpc3RpbmcgUmVzdEFwaS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbVJlc3RBcGlJZChcbiAgICBzY29wZTogQ29uc3RydWN0LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgcmVzdEFwaUlkOiBzdHJpbmcsXG4gICk6IElSZXN0QXBpIHtcbiAgICBjbGFzcyBJbXBvcnQgZXh0ZW5kcyBSZXN0QXBpQmFzZSB7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgcmVzdEFwaUlkID0gcmVzdEFwaUlkO1xuICAgICAgcHVibGljIHJlYWRvbmx5IHJlc3RBcGlOYW1lID0gaWQ7IC8vIERlZmF1bHRpbmcgdG8gY29uc3RydWN0IElEIGZvciBuYW1lXG4gICAgICBwdWJsaWMgcmVhZG9ubHkgcmVzdEFwaVJvb3RSZXNvdXJjZUlkID0gTGF6eS5zdHJpbmdWYWx1ZSh7XG4gICAgICAgIHByb2R1Y2U6ICgpID0+IHtcbiAgICAgICAgICAvLyBUaGlzIHdvdWxkIGlkZWFsbHkgY29tZSBmcm9tIGEgZGF0YSBzb3VyY2UgbG9va3VwIGlmIG5vdCBwcm92aWRlZFxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIFwicmVzdEFwaVJvb3RSZXNvdXJjZUlkIGlzIG5vdCBhdmFpbGFibGUgd2hlbiBpbXBvcnRpbmcgd2l0aCBmcm9tUmVzdEFwaUlkLiBVc2UgZnJvbVJlc3RBcGlBdHRyaWJ1dGVzIG9yIHByb3ZpZGUgaXQuXCIsXG4gICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgcHVibGljIHJlYWRvbmx5IHJvb3Q6IElSZXNvdXJjZSA9IG5ldyBSb290UmVzb3VyY2UoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIHt9LFxuICAgICAgICB0aGlzLnJlc3RBcGlSb290UmVzb3VyY2VJZCxcbiAgICAgICk7XG5cbiAgICAgIHB1YmxpYyBhZGRUb1Jlc291cmNlUG9saWN5KFxuICAgICAgICBfc3RhdGVtZW50OiBpYW0uUG9saWN5U3RhdGVtZW50LFxuICAgICAgKTogaWFtLkFkZFRvUmVzb3VyY2VQb2xpY3lSZXN1bHQge1xuICAgICAgICAvLyBDYW5ub3QgYWRkIHRvIHBvbGljeSBvZiBhbiBpbXBvcnRlZCBSZXN0QXBpIHRocm91Z2ggdGhpcyBpbnRlcmZhY2VcbiAgICAgICAgcmV0dXJuIHsgc3RhdGVtZW50QWRkZWQ6IGZhbHNlIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBJbXBvcnQoc2NvcGUsIGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBvcnQgYW4gZXhpc3RpbmcgUmVzdEFwaSB0aGF0IGNhbiBiZSBjb25maWd1cmVkIHdpdGggYWRkaXRpb25hbCBNZXRob2RzIGFuZCBSZXNvdXJjZXMuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21SZXN0QXBpQXR0cmlidXRlcyhcbiAgICBzY29wZTogQ29uc3RydWN0LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgYXR0cnM6IFJlc3RBcGlBdHRyaWJ1dGVzLFxuICApOiBJUmVzdEFwaSB7XG4gICAgY2xhc3MgSW1wb3J0IGV4dGVuZHMgUmVzdEFwaUJhc2Uge1xuICAgICAgcHVibGljIHJlYWRvbmx5IHJlc3RBcGlJZCA9IGF0dHJzLnJlc3RBcGlJZDtcbiAgICAgIHB1YmxpYyByZWFkb25seSByZXN0QXBpTmFtZSA9IGF0dHJzLnJlc3RBcGlOYW1lID8/IGlkO1xuICAgICAgcHVibGljIHJlYWRvbmx5IHJlc3RBcGlSb290UmVzb3VyY2VJZCA9IGF0dHJzLnJvb3RSZXNvdXJjZUlkO1xuICAgICAgcHVibGljIHJlYWRvbmx5IHJvb3Q6IElSZXNvdXJjZSA9IG5ldyBSb290UmVzb3VyY2UoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIHt9LFxuICAgICAgICB0aGlzLnJlc3RBcGlSb290UmVzb3VyY2VJZCxcbiAgICAgICk7XG5cbiAgICAgIHB1YmxpYyBhZGRUb1Jlc291cmNlUG9saWN5KFxuICAgICAgICBfc3RhdGVtZW50OiBpYW0uUG9saWN5U3RhdGVtZW50LFxuICAgICAgKTogaWFtLkFkZFRvUmVzb3VyY2VQb2xpY3lSZXN1bHQge1xuICAgICAgICByZXR1cm4geyBzdGF0ZW1lbnRBZGRlZDogZmFsc2UgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IEltcG9ydChzY29wZSwgaWQpO1xuICB9XG5cbiAgcHVibGljIHJlYWRvbmx5IHJlc3RBcGlJZDogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgcm9vdDogSVJlc291cmNlO1xuICBwdWJsaWMgcmVhZG9ubHkgcmVzdEFwaVJvb3RSZXNvdXJjZUlkOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVzb3VyY2U6IGFwaUdhdGV3YXlSZXN0QXBpLkFwaUdhdGV3YXlSZXN0QXBpO1xuXG4gIC8qKlxuICAgKiBUaGUgbGlzdCBvZiBtZXRob2RzIGJvdW5kIHRvIHRoaXMgUmVzdEFwaVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG1ldGhvZHMgPSBuZXcgQXJyYXk8TWV0aG9kPigpO1xuXG4gIC8qKlxuICAgKiBUaGlzIGxpc3Qgb2YgZGVwbG95bWVudHMgYm91bmQgdG8gdGhpcyBSZXN0QXBpXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGRlcGxveW1lbnRzID0gbmV3IEFycmF5PERlcGxveW1lbnQ+KCk7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFJlc3RBcGlQcm9wcyA9IHt9KSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCBwcm9wcyk7XG5cbiAgICBpZiAocHJvcHMubWluQ29tcHJlc3Npb25TaXplID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIE5vIGVxdWl2YWxlbnQgZm9yIG1pbmltdW1Db21wcmVzc2lvblNpemUgYmVpbmcgZGVwcmVjYXRlZCBpbiBmYXZvciBvZiBtaW5Db21wcmVzc2lvblNpemVcbiAgICB9XG5cbiAgICB0aGlzLmludGVybmFsUG9saWN5ID0gcHJvcHMucG9saWN5O1xuXG4gICAgdGhpcy5yZXNvdXJjZSA9IG5ldyBhcGlHYXRld2F5UmVzdEFwaS5BcGlHYXRld2F5UmVzdEFwaSh0aGlzLCBcIlJlc291cmNlXCIsIHtcbiAgICAgIG5hbWU6IHRoaXMucmVzdEFwaU5hbWUsXG4gICAgICBkZXNjcmlwdGlvbjogcHJvcHMuZGVzY3JpcHRpb24sXG4gICAgICBwb2xpY3k6IExhenkuc3RyaW5nVmFsdWUoe1xuICAgICAgICBwcm9kdWNlOiAoKSA9PiB0aGlzLmludGVybmFsUG9saWN5Py5qc29uLFxuICAgICAgfSksXG4gICAgICBmYWlsT25XYXJuaW5nczogcHJvcHMuZmFpbE9uV2FybmluZ3MsXG4gICAgICBtaW5pbXVtQ29tcHJlc3Npb25TaXplOiBwcm9wcy5taW5Db21wcmVzc2lvblNpemU/LnRvQnl0ZXMoKT8udG9TdHJpbmcoKSxcbiAgICAgIGJpbmFyeU1lZGlhVHlwZXM6IHByb3BzLmJpbmFyeU1lZGlhVHlwZXMsXG4gICAgICBlbmRwb2ludENvbmZpZ3VyYXRpb246IHRoaXMuX2NvbmZpZ3VyZUVuZHBvaW50cyhwcm9wcyksXG4gICAgICBhcGlLZXlTb3VyY2U6IHByb3BzLmFwaUtleVNvdXJjZVR5cGUsXG4gICAgICAvLyBjbG9uZUZyb206IHByb3BzLmNsb25lRnJvbT8ucmVzdEFwaUlkLCAvLyBOb3Qgc3VwcG9ydGVkIGluIFRGIGF3c19hcGlfZ2F0ZXdheV9yZXN0X2FwaVxuICAgICAgcGFyYW1ldGVyczogcHJvcHMucGFyYW1ldGVycyxcbiAgICAgIGRpc2FibGVFeGVjdXRlQXBpRW5kcG9pbnQ6IHByb3BzLmRpc2FibGVFeGVjdXRlQXBpRW5kcG9pbnQsXG4gICAgfSk7XG4gICAgdGhpcy5ub2RlLmRlZmF1bHRDaGlsZCA9IHRoaXMucmVzb3VyY2U7XG4gICAgdGhpcy5yZXN0QXBpSWQgPSB0aGlzLnJlc291cmNlLmlkO1xuICAgIHRoaXMucmVzdEFwaVJvb3RSZXNvdXJjZUlkID0gdGhpcy5yZXNvdXJjZS5yb290UmVzb3VyY2VJZDtcblxuICAgIC8vIGVuc3VyZSB0aGUgaWFtIHBvbGljeSBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIHJlc291cmNlLlxuICAgIGlmICh0aGlzLmludGVybmFsUG9saWN5KSB7XG4gICAgICB0aGlzLnBvbGljeUF0dGFjaG1lbnQgPVxuICAgICAgICBuZXcgYXBpR2F0ZXdheVJlc3RBcGlQb2xpY3kuQXBpR2F0ZXdheVJlc3RBcGlQb2xpY3kodGhpcywgXCJQb2xpY3lcIiwge1xuICAgICAgICAgIHJlc3RBcGlJZDogdGhpcy5yZXN0QXBpSWQsXG4gICAgICAgICAgcG9saWN5OiB0aGlzLmludGVybmFsUG9saWN5Lmpzb24sXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuX2NvbmZpZ3VyZUNsb3VkV2F0Y2hSb2xlKHRoaXMucmVzb3VyY2UsIHByb3BzLmNsb3VkV2F0Y2hSb2xlKTtcbiAgICB0aGlzLl9jb25maWd1cmVEZXBsb3ltZW50KHByb3BzKTtcblxuICAgIGlmIChwcm9wcy5kb21haW5OYW1lKSB7XG4gICAgICB0aGlzLmFkZERvbWFpbk5hbWUoXCJDdXN0b21Eb21haW5cIiwgcHJvcHMuZG9tYWluTmFtZSk7XG4gICAgfVxuXG4gICAgdGhpcy5yb290ID0gbmV3IFJvb3RSZXNvdXJjZSh0aGlzLCBwcm9wcywgdGhpcy5yZXN0QXBpUm9vdFJlc291cmNlSWQpO1xuXG4gICAgdGhpcy5ub2RlLmFkZFZhbGlkYXRpb24oeyB2YWxpZGF0ZTogKCkgPT4gdGhpcy52YWxpZGF0ZVJlc3RBcGkoKSB9KTtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBBUElHQVRFV0FZX1JFU1RBUElfU1lNQk9MLCB7IHZhbHVlOiB0cnVlIH0pO1xuICB9XG5cbiAgcHVibGljIGFkZFRvUmVzb3VyY2VQb2xpY3koXG4gICAgc3RhdGVtZW50OiBpYW0uUG9saWN5U3RhdGVtZW50LFxuICApOiBpYW0uQWRkVG9SZXNvdXJjZVBvbGljeVJlc3VsdCB7XG4gICAgaWYgKCF0aGlzLmludGVybmFsUG9saWN5KSB7XG4gICAgICB0aGlzLmludGVybmFsUG9saWN5ID0gbmV3IGlhbS5Qb2xpY3lEb2N1bWVudCh0aGlzLCBcIlBvbGljeURvY3VtZW50XCIpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMucG9saWN5QXR0YWNobWVudCkge1xuICAgICAgdGhpcy5wb2xpY3lBdHRhY2htZW50ID1cbiAgICAgICAgbmV3IGFwaUdhdGV3YXlSZXN0QXBpUG9saWN5LkFwaUdhdGV3YXlSZXN0QXBpUG9saWN5KHRoaXMsIFwiUG9saWN5XCIsIHtcbiAgICAgICAgICByZXN0QXBpSWQ6IHRoaXMucmVzdEFwaUlkLFxuICAgICAgICAgIHBvbGljeTogdGhpcy5pbnRlcm5hbFBvbGljeS5qc29uLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5pbnRlcm5hbFBvbGljeS5hZGRTdGF0ZW1lbnRzKHN0YXRlbWVudCk7XG4gICAgcmV0dXJuIHsgc3RhdGVtZW50QWRkZWQ6IHRydWUsIHBvbGljeURlcGVuZGFibGU6IHRoaXMucmVzb3VyY2UgfTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRNb2RlbChpZDogc3RyaW5nLCBwcm9wczogTW9kZWxPcHRpb25zKTogTW9kZWwge1xuICAgIHJldHVybiBuZXcgTW9kZWwodGhpcywgaWQsIHtcbiAgICAgIC4uLnByb3BzLFxuICAgICAgcmVzdEFwaTogdGhpcyxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRSZXF1ZXN0VmFsaWRhdG9yKFxuICAgIGlkOiBzdHJpbmcsXG4gICAgcHJvcHM6IFJlcXVlc3RWYWxpZGF0b3JPcHRpb25zLFxuICApOiBSZXF1ZXN0VmFsaWRhdG9yIHtcbiAgICByZXR1cm4gbmV3IFJlcXVlc3RWYWxpZGF0b3IodGhpcywgaWQsIHtcbiAgICAgIC4uLnByb3BzLFxuICAgICAgcmVzdEFwaTogdGhpcyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnRlcm5hbCBBUEkgdXNlZCBieSBgTWV0aG9kYCB0byBrZWVwIGFuIGludmVudG9yeSBvZiBtZXRob2RzIGF0IHRoZSBBUElcbiAgICogbGV2ZWwgZm9yIHZhbGlkYXRpb24gcHVycG9zZXMuXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIF9hdHRhY2hNZXRob2QobWV0aG9kOiBNZXRob2QpIHtcbiAgICAvLyBJbiBURiwgZGVwbG95bWVudCB0cmlnZ2VycyB3b3VsZCBoYW5kbGUgdGhpcyBpbXBsaWNpdGx5IG9yIGV4cGxpY2l0bHlcbiAgICB0aGlzLm1ldGhvZHMucHVzaChtZXRob2QpO1xuICAgIC8vIGFkZCB0aGlzIG1ldGhvZCBhcyBhIGRlcGVuZGVuY3kgdG8gYWxsIGRlcGxveW1lbnRzIGRlZmluZWQgZm9yIHRoaXMgYXBpXG4gICAgLy8gd2hlbiBhZGRpdGlvbmFsIGRlcGxveW1lbnRzIGFyZSBhZGRlZCwgX2F0dGFjaERlcGxveW1lbnQgaXMgY2FsbGVkIGFuZFxuICAgIC8vIHRoaXMgbWV0aG9kIHdpbGwgYmUgYWRkZWQgdGhlcmUuXG4gICAgZm9yIChjb25zdCBkZXAgb2YgdGhpcy5kZXBsb3ltZW50cykge1xuICAgICAgZGVwLl9hZGRNZXRob2REZXBlbmRlbmN5KG1ldGhvZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwdWJsaWMgX2F0dGFjaERlcGxveW1lbnQoZGVwbG95bWVudDogRGVwbG95bWVudCkge1xuICAgIC8vIEluIFRGLCBkZXBsb3ltZW50IHRyaWdnZXJzIHdvdWxkIGhhbmRsZSB0aGlzIGltcGxpY2l0bHkgb3IgZXhwbGljaXRseVxuICAgIHRoaXMuZGVwbG95bWVudHMucHVzaChkZXBsb3ltZW50KTtcbiAgICBmb3IgKGNvbnN0IG1ldGhvZCBvZiB0aGlzLm1ldGhvZHMpIHtcbiAgICAgIGRlcGxveW1lbnQuX2FkZE1ldGhvZERlcGVuZGVuY3kobWV0aG9kKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHZhbGlkYXRlUmVzdEFwaSgpOiBzdHJpbmdbXSB7XG4gICAgaWYgKHRoaXMubWV0aG9kcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBbXCJUaGUgUkVTVCBBUEkgZG9lc24ndCBjb250YWluIGFueSBtZXRob2RzXCJdO1xuICAgIH1cbiAgICByZXR1cm4gW107XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgZW5kcG9pbnQgY29uZmlndXJhdGlvbiBvZiBhIFJFU1QgQVBJLCBpbmNsdWRpbmcgVlBDcyBhbmQgZW5kcG9pbnQgdHlwZXMuXG4gKlxuICogRW5kcG9pbnRDb25maWd1cmF0aW9uIGlzIGEgcHJvcGVydHkgb2YgdGhlIEFXUzo6QXBpR2F0ZXdheTo6UmVzdEFwaSByZXNvdXJjZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbmRwb2ludENvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogQSBsaXN0IG9mIGVuZHBvaW50IHR5cGVzIG9mIGFuIEFQSSBvciBpdHMgY3VzdG9tIGRvbWFpbiBuYW1lLlxuICAgKlxuICAgKiBAZGVmYXVsdCBFbmRwb2ludFR5cGUuRURHRVxuICAgKi9cbiAgcmVhZG9ubHkgdHlwZXM6IEVuZHBvaW50VHlwZVtdO1xuXG4gIC8qKlxuICAgKiBBIGxpc3Qgb2YgVlBDIEVuZHBvaW50cyBhZ2FpbnN0IHdoaWNoIHRvIGNyZWF0ZSBSb3V0ZTUzIEFMSUFTZXNcbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBBTElBU2VzIGFyZSBjcmVhdGVkIGZvciB0aGUgZW5kcG9pbnQuXG4gICAqL1xuICByZWFkb25seSB2cGNFbmRwb2ludHM/OiBlYzIuSVZwY0VuZHBvaW50W107XG59XG5cbmV4cG9ydCBlbnVtIEFwaUtleVNvdXJjZVR5cGUge1xuICBIRUFERVIgPSBcIkhFQURFUlwiLFxuICBBVVRIT1JJWkVSID0gXCJBVVRIT1JJWkVSXCIsXG59XG5cbmV4cG9ydCBlbnVtIEVuZHBvaW50VHlwZSB7XG4gIEVER0UgPSBcIkVER0VcIixcbiAgUkVHSU9OQUwgPSBcIlJFR0lPTkFMXCIsXG4gIFBSSVZBVEUgPSBcIlBSSVZBVEVcIixcbn1cblxuY2xhc3MgUm9vdFJlc291cmNlIGV4dGVuZHMgUmVzb3VyY2VCYXNlIHtcbiAgcHVibGljIHJlYWRvbmx5IHBhcmVudFJlc291cmNlPzogSVJlc291cmNlO1xuICBwdWJsaWMgcmVhZG9ubHkgYXBpOiBSZXN0QXBpQmFzZTtcbiAgcHVibGljIHJlYWRvbmx5IHJlc291cmNlSWQ6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IHBhdGg6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IGRlZmF1bHRJbnRlZ3JhdGlvbj86IEludGVncmF0aW9uIHwgdW5kZWZpbmVkO1xuICBwdWJsaWMgcmVhZG9ubHkgZGVmYXVsdE1ldGhvZE9wdGlvbnM/OiBNZXRob2RPcHRpb25zIHwgdW5kZWZpbmVkO1xuICBwdWJsaWMgcmVhZG9ubHkgZGVmYXVsdENvcnNQcmVmbGlnaHRPcHRpb25zPzogQ29yc09wdGlvbnMgfCB1bmRlZmluZWQ7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfcmVzdEFwaT86IFJlc3RBcGk7XG5cbiAgY29uc3RydWN0b3IoYXBpOiBSZXN0QXBpQmFzZSwgcHJvcHM6IFJlc291cmNlT3B0aW9ucywgcmVzb3VyY2VJZDogc3RyaW5nKSB7XG4gICAgc3VwZXIoYXBpLCBcIkRlZmF1bHRcIik7IC8vIElEICdEZWZhdWx0JyBmb3IgdGhlIHJvb3QgcmVzb3VyY2Ugd3JhcHBlclxuXG4gICAgdGhpcy5wYXJlbnRSZXNvdXJjZSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmRlZmF1bHRJbnRlZ3JhdGlvbiA9IHByb3BzLmRlZmF1bHRJbnRlZ3JhdGlvbjtcbiAgICB0aGlzLmRlZmF1bHRNZXRob2RPcHRpb25zID0gcHJvcHMuZGVmYXVsdE1ldGhvZE9wdGlvbnM7XG4gICAgdGhpcy5kZWZhdWx0Q29yc1ByZWZsaWdodE9wdGlvbnMgPSBwcm9wcy5kZWZhdWx0Q29yc1ByZWZsaWdodE9wdGlvbnM7XG4gICAgdGhpcy5hcGkgPSBhcGk7XG4gICAgdGhpcy5yZXNvdXJjZUlkID0gcmVzb3VyY2VJZDtcbiAgICB0aGlzLnBhdGggPSBcIi9cIjtcblxuICAgIGlmIChSZXN0QXBpLmlzUmVzdEFwaShhcGkpKSB7XG4gICAgICAvLyBDaGVjayBpZiBpdCdzIHRoZSBub24tc3BlYyBSZXN0QXBpIHRvIGF2b2lkIHR5cGUgZXJyb3JzIGlmIGFwaSBpcyBTcGVjUmVzdEFwaVxuICAgICAgdGhpcy5fcmVzdEFwaSA9IGFwaSBhcyBSZXN0QXBpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmRlZmF1bHRDb3JzUHJlZmxpZ2h0T3B0aW9ucykge1xuICAgICAgdGhpcy5hZGRDb3JzUHJlZmxpZ2h0KHRoaXMuZGVmYXVsdENvcnNQcmVmbGlnaHRPcHRpb25zKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBSZXN0QXBpIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFJlc291cmNlLlxuICAgKiBAZGVwcmVjYXRlZCAtIFRocm93cyBhbiBlcnJvciBpZiB0aGlzIFJlc291cmNlIGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggYW4gaW5zdGFuY2Ugb2YgYFJlc3RBcGlgLiBVc2UgYGFwaWAgaW5zdGVhZC5cbiAgICovXG4gIHB1YmxpYyBnZXQgcmVzdEFwaSgpOiBSZXN0QXBpIHtcbiAgICBpZiAoIXRoaXMuX3Jlc3RBcGkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJSZXN0QXBpIGlzIG5vdCBhdmFpbGFibGUgb24gUmVzb3VyY2Ugbm90IGNvbm5lY3RlZCB0byBhbiBpbnN0YW5jZSBvZiBSZXN0QXBpLiBVc2UgYGFwaWAgaW5zdGVhZFwiLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3Jlc3RBcGk7XG4gIH1cbn1cbiJdfQ==
|