terraconstructs 0.0.8
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/.envrc +5 -0
- package/.jsii +79780 -0
- package/.mise.toml +8 -0
- package/.nvmrc +1 -0
- package/.terraform-version +1 -0
- package/.terraform.d/plugin-cache/.gitignore +5 -0
- package/LICENSE +674 -0
- package/NOTICE.txt +12 -0
- package/README.md +42 -0
- package/bun.lockb +0 -0
- package/go.mod +158 -0
- package/go.sum +1206 -0
- package/lib/aws/arn.d.ts +187 -0
- package/lib/aws/arn.js +383 -0
- package/lib/aws/aws-construct.d.ts +76 -0
- package/lib/aws/aws-construct.js +38 -0
- package/lib/aws/aws-stack.d.ts +201 -0
- package/lib/aws/aws-stack.js +303 -0
- package/lib/aws/cloudwatch/actions/ec2.d.ts +35 -0
- package/lib/aws/cloudwatch/actions/ec2.js +48 -0
- package/lib/aws/cloudwatch/actions/index.d.ts +2 -0
- package/lib/aws/cloudwatch/actions/index.js +24 -0
- package/lib/aws/cloudwatch/actions/lambda.d.ts +16 -0
- package/lib/aws/cloudwatch/actions/lambda.js +48 -0
- package/lib/aws/cloudwatch/alarm-action.d.ts +23 -0
- package/lib/aws/cloudwatch/alarm-action.js +4 -0
- package/lib/aws/cloudwatch/alarm-base.d.ts +84 -0
- package/lib/aws/cloudwatch/alarm-base.js +64 -0
- package/lib/aws/cloudwatch/alarm-rule.d.ts +61 -0
- package/lib/aws/cloudwatch/alarm-rule.js +116 -0
- package/lib/aws/cloudwatch/alarm-status-widget.d.ts +77 -0
- package/lib/aws/cloudwatch/alarm-status-widget.js +62 -0
- package/lib/aws/cloudwatch/alarm.d.ts +158 -0
- package/lib/aws/cloudwatch/alarm.js +410 -0
- package/lib/aws/cloudwatch/composite-alarm.d.ts +88 -0
- package/lib/aws/cloudwatch/composite-alarm.js +98 -0
- package/lib/aws/cloudwatch/dashboard.d.ts +137 -0
- package/lib/aws/cloudwatch/dashboard.js +141 -0
- package/lib/aws/cloudwatch/data-protection-policy.d.ts +184 -0
- package/lib/aws/cloudwatch/data-protection-policy.js +246 -0
- package/lib/aws/cloudwatch/graph.d.ts +792 -0
- package/lib/aws/cloudwatch/graph.js +537 -0
- package/lib/aws/cloudwatch/index.d.ts +26 -0
- package/lib/aws/cloudwatch/index.js +49 -0
- package/lib/aws/cloudwatch/layout.d.ts +89 -0
- package/lib/aws/cloudwatch/layout.js +147 -0
- package/lib/aws/cloudwatch/log-destinations/index.d.ts +2 -0
- package/lib/aws/cloudwatch/log-destinations/index.js +20 -0
- package/lib/aws/cloudwatch/log-destinations/kinesis.d.ts +29 -0
- package/lib/aws/cloudwatch/log-destinations/kinesis.js +52 -0
- package/lib/aws/cloudwatch/log-destinations/lambda.d.ts +22 -0
- package/lib/aws/cloudwatch/log-destinations/lambda.js +46 -0
- package/lib/aws/cloudwatch/log-group.d.ts +453 -0
- package/lib/aws/cloudwatch/log-group.js +350 -0
- package/lib/aws/cloudwatch/log-query.d.ts +91 -0
- package/lib/aws/cloudwatch/log-query.js +85 -0
- package/lib/aws/cloudwatch/log-stream.d.ts +57 -0
- package/lib/aws/cloudwatch/log-stream.js +57 -0
- package/lib/aws/cloudwatch/metric-filter.d.ts +30 -0
- package/lib/aws/cloudwatch/metric-filter.js +69 -0
- package/lib/aws/cloudwatch/metric-types.d.ts +407 -0
- package/lib/aws/cloudwatch/metric-types.js +151 -0
- package/lib/aws/cloudwatch/metric.d.ts +492 -0
- package/lib/aws/cloudwatch/metric.js +493 -0
- package/lib/aws/cloudwatch/pattern.d.ts +195 -0
- package/lib/aws/cloudwatch/pattern.js +412 -0
- package/lib/aws/cloudwatch/policy.d.ts +43 -0
- package/lib/aws/cloudwatch/policy.js +50 -0
- package/lib/aws/cloudwatch/private/drop-empty-object-at-the-end-of-an-array-token.d.ts +14 -0
- package/lib/aws/cloudwatch/private/drop-empty-object-at-the-end-of-an-array-token.js +37 -0
- package/lib/aws/cloudwatch/private/env-tokens.d.ts +8 -0
- package/lib/aws/cloudwatch/private/env-tokens.js +48 -0
- package/lib/aws/cloudwatch/private/metric-util.d.ts +60 -0
- package/lib/aws/cloudwatch/private/metric-util.js +132 -0
- package/lib/aws/cloudwatch/private/object.d.ts +1 -0
- package/lib/aws/cloudwatch/private/object.js +18 -0
- package/lib/aws/cloudwatch/private/rendering.d.ts +60 -0
- package/lib/aws/cloudwatch/private/rendering.js +181 -0
- package/lib/aws/cloudwatch/private/statistic.d.ts +51 -0
- package/lib/aws/cloudwatch/private/statistic.js +176 -0
- package/lib/aws/cloudwatch/query-definition.d.ts +150 -0
- package/lib/aws/cloudwatch/query-definition.js +114 -0
- package/lib/aws/cloudwatch/stats.d.ts +150 -0
- package/lib/aws/cloudwatch/stats.js +207 -0
- package/lib/aws/cloudwatch/subscription-filter.d.ts +75 -0
- package/lib/aws/cloudwatch/subscription-filter.js +51 -0
- package/lib/aws/cloudwatch/text.d.ts +52 -0
- package/lib/aws/cloudwatch/text.js +53 -0
- package/lib/aws/cloudwatch/variable.d.ts +156 -0
- package/lib/aws/cloudwatch/variable.js +156 -0
- package/lib/aws/cloudwatch/widget.d.ts +62 -0
- package/lib/aws/cloudwatch/widget.js +45 -0
- package/lib/aws/compute/activity.d.ts +81 -0
- package/lib/aws/compute/activity.js +132 -0
- package/lib/aws/compute/architecture.d.ts +33 -0
- package/lib/aws/compute/architecture.js +42 -0
- package/lib/aws/compute/chain.d.ts +52 -0
- package/lib/aws/compute/chain.js +68 -0
- package/lib/aws/compute/condition.d.ts +202 -0
- package/lib/aws/compute/condition.js +409 -0
- package/lib/aws/compute/event-invoke-config.d.ts +74 -0
- package/lib/aws/compute/event-invoke-config.js +63 -0
- package/lib/aws/compute/event-source-filter.d.ts +64 -0
- package/lib/aws/compute/event-source-filter.js +86 -0
- package/lib/aws/compute/event-source-mapping.d.ts +310 -0
- package/lib/aws/compute/event-source-mapping.js +267 -0
- package/lib/aws/compute/event-sources/index.d.ts +4 -0
- package/lib/aws/compute/event-sources/index.js +28 -0
- package/lib/aws/compute/event-sources/s3-onfailure-destination.d.ts +13 -0
- package/lib/aws/compute/event-sources/s3-onfailure-destination.js +26 -0
- package/lib/aws/compute/event-sources/s3.d.ts +24 -0
- package/lib/aws/compute/event-sources/s3.js +25 -0
- package/lib/aws/compute/event-sources/sqs-dlq.d.ts +13 -0
- package/lib/aws/compute/event-sources/sqs-dlq.js +26 -0
- package/lib/aws/compute/event-sources/sqs.d.ts +75 -0
- package/lib/aws/compute/event-sources/sqs.js +84 -0
- package/lib/aws/compute/fields.d.ts +367 -0
- package/lib/aws/compute/fields.js +546 -0
- package/lib/aws/compute/function-alias.d.ts +148 -0
- package/lib/aws/compute/function-alias.js +176 -0
- package/lib/aws/compute/function-base.d.ts +314 -0
- package/lib/aws/compute/function-base.js +421 -0
- package/lib/aws/compute/function-destination.d.ts +42 -0
- package/lib/aws/compute/function-destination.js +18 -0
- package/lib/aws/compute/function-destinations/event-bridge.d.ts +19 -0
- package/lib/aws/compute/function-destinations/event-bridge.js +46 -0
- package/lib/aws/compute/function-destinations/function.d.ts +34 -0
- package/lib/aws/compute/function-destinations/function.js +55 -0
- package/lib/aws/compute/function-destinations/index.d.ts +3 -0
- package/lib/aws/compute/function-destinations/index.js +22 -0
- package/lib/aws/compute/function-destinations/sqs.d.ts +14 -0
- package/lib/aws/compute/function-destinations/sqs.js +27 -0
- package/lib/aws/compute/function-nodejs.d.ts +55 -0
- package/lib/aws/compute/function-nodejs.js +70 -0
- package/lib/aws/compute/function-permission.d.ts +83 -0
- package/lib/aws/compute/function-permission.js +3 -0
- package/lib/aws/compute/function-url.d.ts +210 -0
- package/lib/aws/compute/function-url.js +148 -0
- package/lib/aws/compute/function-vpc-config.generated.d.ts +36 -0
- package/lib/aws/compute/function-vpc-config.generated.js +3 -0
- package/lib/aws/compute/function.d.ts +492 -0
- package/lib/aws/compute/function.js +692 -0
- package/lib/aws/compute/index.d.ts +42 -0
- package/lib/aws/compute/index.js +64 -0
- package/lib/aws/compute/private/intrinstics.d.ts +86 -0
- package/lib/aws/compute/private/intrinstics.js +220 -0
- package/lib/aws/compute/private/json-path.d.ts +57 -0
- package/lib/aws/compute/private/json-path.js +351 -0
- package/lib/aws/compute/private/util.d.ts +1 -0
- package/lib/aws/compute/private/util.js +38 -0
- package/lib/aws/compute/state-graph.d.ts +100 -0
- package/lib/aws/compute/state-graph.js +177 -0
- package/lib/aws/compute/state-machine-fragment.d.ts +61 -0
- package/lib/aws/compute/state-machine-fragment.js +56 -0
- package/lib/aws/compute/state-machine.d.ts +323 -0
- package/lib/aws/compute/state-machine.js +392 -0
- package/lib/aws/compute/states/choice.d.ts +94 -0
- package/lib/aws/compute/states/choice.js +81 -0
- package/lib/aws/compute/states/custom-state.d.ts +55 -0
- package/lib/aws/compute/states/custom-state.js +114 -0
- package/lib/aws/compute/states/distributed-map/item-batcher.d.ts +64 -0
- package/lib/aws/compute/states/distributed-map/item-batcher.js +58 -0
- package/lib/aws/compute/states/distributed-map/item-reader.d.ts +256 -0
- package/lib/aws/compute/states/distributed-map/item-reader.js +253 -0
- package/lib/aws/compute/states/distributed-map/result-writer.d.ts +41 -0
- package/lib/aws/compute/states/distributed-map/result-writer.js +66 -0
- package/lib/aws/compute/states/distributed-map.d.ts +153 -0
- package/lib/aws/compute/states/distributed-map.js +207 -0
- package/lib/aws/compute/states/fail.d.ts +74 -0
- package/lib/aws/compute/states/fail.js +83 -0
- package/lib/aws/compute/states/map-base.d.ts +145 -0
- package/lib/aws/compute/states/map-base.js +109 -0
- package/lib/aws/compute/states/map.d.ts +76 -0
- package/lib/aws/compute/states/map.js +110 -0
- package/lib/aws/compute/states/parallel.d.ts +113 -0
- package/lib/aws/compute/states/parallel.js +100 -0
- package/lib/aws/compute/states/pass.d.ts +122 -0
- package/lib/aws/compute/states/pass.js +99 -0
- package/lib/aws/compute/states/private/state-type.d.ts +13 -0
- package/lib/aws/compute/states/private/state-type.js +19 -0
- package/lib/aws/compute/states/state.d.ts +276 -0
- package/lib/aws/compute/states/state.js +482 -0
- package/lib/aws/compute/states/succeed.d.ts +51 -0
- package/lib/aws/compute/states/succeed.js +32 -0
- package/lib/aws/compute/states/task-base.d.ts +225 -0
- package/lib/aws/compute/states/task-base.js +160 -0
- package/lib/aws/compute/states/task.d.ts +127 -0
- package/lib/aws/compute/states/task.js +92 -0
- package/lib/aws/compute/states/wait.d.ts +78 -0
- package/lib/aws/compute/states/wait.js +90 -0
- package/lib/aws/compute/step-functions-task.d.ts +78 -0
- package/lib/aws/compute/step-functions-task.js +27 -0
- package/lib/aws/compute/task-credentials.d.ts +45 -0
- package/lib/aws/compute/task-credentials.js +52 -0
- package/lib/aws/compute/task-input.d.ts +86 -0
- package/lib/aws/compute/task-input.js +107 -0
- package/lib/aws/compute/tasks/aws-sdk/call-aws-service.d.ts +73 -0
- package/lib/aws/compute/tasks/aws-sdk/call-aws-service.js +69 -0
- package/lib/aws/compute/tasks/eventbridge/put-events.d.ts +74 -0
- package/lib/aws/compute/tasks/eventbridge/put-events.js +94 -0
- package/lib/aws/compute/tasks/http/invoke.d.ts +104 -0
- package/lib/aws/compute/tasks/http/invoke.js +117 -0
- package/lib/aws/compute/tasks/index.d.ts +7 -0
- package/lib/aws/compute/tasks/index.js +42 -0
- package/lib/aws/compute/tasks/lambda/invoke.d.ts +106 -0
- package/lib/aws/compute/tasks/lambda/invoke.js +125 -0
- package/lib/aws/compute/tasks/private/task-utils.d.ts +8 -0
- package/lib/aws/compute/tasks/private/task-utils.js +36 -0
- package/lib/aws/compute/tasks/resource-arn-suffix.d.ts +3 -0
- package/lib/aws/compute/tasks/resource-arn-suffix.js +25 -0
- package/lib/aws/compute/tasks/sqs/send-message.d.ts +62 -0
- package/lib/aws/compute/tasks/sqs/send-message.js +70 -0
- package/lib/aws/compute/tasks/stepfunctions/invoke-activity.d.ts +36 -0
- package/lib/aws/compute/tasks/stepfunctions/invoke-activity.js +45 -0
- package/lib/aws/compute/tasks/stepfunctions/start-execution.d.ts +63 -0
- package/lib/aws/compute/tasks/stepfunctions/start-execution.js +123 -0
- package/lib/aws/compute/types.d.ts +214 -0
- package/lib/aws/compute/types.js +103 -0
- package/lib/aws/compute/util.d.ts +12 -0
- package/lib/aws/compute/util.js +29 -0
- package/lib/aws/edge/certificate.d.ts +144 -0
- package/lib/aws/edge/certificate.js +191 -0
- package/lib/aws/edge/distribution.d.ts +505 -0
- package/lib/aws/edge/distribution.js +444 -0
- package/lib/aws/edge/dns-alias-record-targets.d.ts +29 -0
- package/lib/aws/edge/dns-alias-record-targets.js +46 -0
- package/lib/aws/edge/dns-record.d.ts +536 -0
- package/lib/aws/edge/dns-record.js +532 -0
- package/lib/aws/edge/dns-zone.d.ts +169 -0
- package/lib/aws/edge/dns-zone.js +149 -0
- package/lib/aws/edge/function.d.ts +185 -0
- package/lib/aws/edge/function.js +141 -0
- package/lib/aws/edge/index.d.ts +8 -0
- package/lib/aws/edge/index.js +25 -0
- package/lib/aws/edge/key-value-store.d.ts +162 -0
- package/lib/aws/edge/key-value-store.js +163 -0
- package/lib/aws/edge/origin.d.ts +160 -0
- package/lib/aws/edge/origin.js +245 -0
- package/lib/aws/encryption/alias.d.ts +137 -0
- package/lib/aws/encryption/alias.js +216 -0
- package/lib/aws/encryption/index.d.ts +4 -0
- package/lib/aws/encryption/index.js +21 -0
- package/lib/aws/encryption/key-lookup.d.ts +11 -0
- package/lib/aws/encryption/key-lookup.js +4 -0
- package/lib/aws/encryption/key.d.ts +461 -0
- package/lib/aws/encryption/key.js +586 -0
- package/lib/aws/encryption/private/perms.d.ts +5 -0
- package/lib/aws/encryption/private/perms.js +30 -0
- package/lib/aws/encryption/via-service-principal.d.ts +11 -0
- package/lib/aws/encryption/via-service-principal.js +39 -0
- package/lib/aws/iam/grant.d.ts +221 -0
- package/lib/aws/iam/grant.js +239 -0
- package/lib/aws/iam/identity-base.d.ts +20 -0
- package/lib/aws/iam/identity-base.js +3 -0
- package/lib/aws/iam/index.d.ts +16 -0
- package/lib/aws/iam/index.js +34 -0
- package/lib/aws/iam/managed-policy.d.ts +227 -0
- package/lib/aws/iam/managed-policy.js +237 -0
- package/lib/aws/iam/oidc-provider.d.ts +120 -0
- package/lib/aws/iam/oidc-provider.js +82 -0
- package/lib/aws/iam/policy-document-config.generated.d.ts +78 -0
- package/lib/aws/iam/policy-document-config.generated.js +3 -0
- package/lib/aws/iam/policy-document.d.ts +150 -0
- package/lib/aws/iam/policy-document.js +172 -0
- package/lib/aws/iam/policy-statement-props.generated.d.ts +55 -0
- package/lib/aws/iam/policy-statement-props.generated.js +3 -0
- package/lib/aws/iam/policy-statement.d.ts +451 -0
- package/lib/aws/iam/policy-statement.js +947 -0
- package/lib/aws/iam/policy.d.ts +122 -0
- package/lib/aws/iam/policy.js +192 -0
- package/lib/aws/iam/principals.d.ts +668 -0
- package/lib/aws/iam/principals.js +1032 -0
- package/lib/aws/iam/private/adapter.d.ts +21 -0
- package/lib/aws/iam/private/adapter.js +51 -0
- package/lib/aws/iam/private/assume-role-policy.d.ts +8 -0
- package/lib/aws/iam/private/assume-role-policy.js +27 -0
- package/lib/aws/iam/private/comparable-principal.d.ts +6 -0
- package/lib/aws/iam/private/comparable-principal.js +20 -0
- package/lib/aws/iam/private/immutable-role.d.ts +43 -0
- package/lib/aws/iam/private/immutable-role.js +76 -0
- package/lib/aws/iam/private/imported-role.d.ts +49 -0
- package/lib/aws/iam/private/imported-role.js +103 -0
- package/lib/aws/iam/private/merge-statements.d.ts +44 -0
- package/lib/aws/iam/private/merge-statements.js +214 -0
- package/lib/aws/iam/private/postprocess-policy-document.d.ts +15 -0
- package/lib/aws/iam/private/postprocess-policy-document.js +102 -0
- package/lib/aws/iam/private/util.d.ts +37 -0
- package/lib/aws/iam/private/util.js +87 -0
- package/lib/aws/iam/role.d.ts +425 -0
- package/lib/aws/iam/role.js +407 -0
- package/lib/aws/iam/saml-provider.d.ts +79 -0
- package/lib/aws/iam/saml-provider.js +79 -0
- package/lib/aws/iam/unknown-principal.d.ts +32 -0
- package/lib/aws/iam/unknown-principal.js +45 -0
- package/lib/aws/iam/utils.d.ts +12 -0
- package/lib/aws/iam/utils.js +41 -0
- package/lib/aws/index.d.ts +13 -0
- package/lib/aws/index.js +34 -0
- package/lib/aws/log-retention.d.ts +97 -0
- package/lib/aws/log-retention.js +103 -0
- package/lib/aws/network/index.d.ts +4 -0
- package/lib/aws/network/index.js +21 -0
- package/lib/aws/network/network.d.ts +77 -0
- package/lib/aws/network/network.js +3 -0
- package/lib/aws/network/simple-ipv4-vpc.d.ts +84 -0
- package/lib/aws/network/simple-ipv4-vpc.js +236 -0
- package/lib/aws/network/subnet-group.d.ts +42 -0
- package/lib/aws/network/subnet-group.js +72 -0
- package/lib/aws/network/subnet.d.ts +95 -0
- package/lib/aws/network/subnet.js +123 -0
- package/lib/aws/notify/archive.d.ts +77 -0
- package/lib/aws/notify/archive.js +62 -0
- package/lib/aws/notify/connection.d.ts +276 -0
- package/lib/aws/notify/connection.js +261 -0
- package/lib/aws/notify/event-bus.d.ts +298 -0
- package/lib/aws/notify/event-bus.js +326 -0
- package/lib/aws/notify/event-pattern.d.ts +220 -0
- package/lib/aws/notify/event-pattern.js +197 -0
- package/lib/aws/notify/index.d.ts +15 -0
- package/lib/aws/notify/index.js +35 -0
- package/lib/aws/notify/input.d.ts +126 -0
- package/lib/aws/notify/input.js +282 -0
- package/lib/aws/notify/kinesis-canned-metrics.generated.d.ts +68 -0
- package/lib/aws/notify/kinesis-canned-metrics.generated.js +103 -0
- package/lib/aws/notify/kinesis-fixed-canned-metrics.d.ts +195 -0
- package/lib/aws/notify/kinesis-fixed-canned-metrics.js +155 -0
- package/lib/aws/notify/kinesis-stream.d.ts +705 -0
- package/lib/aws/notify/kinesis-stream.js +541 -0
- package/lib/aws/notify/on-event-options.d.ts +54 -0
- package/lib/aws/notify/on-event-options.js +3 -0
- package/lib/aws/notify/queue-config.generated.d.ts +85 -0
- package/lib/aws/notify/queue-config.generated.js +3 -0
- package/lib/aws/notify/queue-policy.d.ts +35 -0
- package/lib/aws/notify/queue-policy.js +39 -0
- package/lib/aws/notify/queue.d.ts +355 -0
- package/lib/aws/notify/queue.js +305 -0
- package/lib/aws/notify/resource-policy.d.ts +41 -0
- package/lib/aws/notify/resource-policy.js +43 -0
- package/lib/aws/notify/rule.d.ts +153 -0
- package/lib/aws/notify/rule.js +227 -0
- package/lib/aws/notify/schedule.d.ts +83 -0
- package/lib/aws/notify/schedule.js +116 -0
- package/lib/aws/notify/target.d.ts +102 -0
- package/lib/aws/notify/target.js +3 -0
- package/lib/aws/notify/targets/event-bus.d.ts +39 -0
- package/lib/aws/notify/targets/event-bus.js +40 -0
- package/lib/aws/notify/targets/function.d.ts +31 -0
- package/lib/aws/notify/targets/function.js +36 -0
- package/lib/aws/notify/targets/index.d.ts +6 -0
- package/lib/aws/notify/targets/index.js +37 -0
- package/lib/aws/notify/targets/log-group.d.ts +89 -0
- package/lib/aws/notify/targets/log-group.js +110 -0
- package/lib/aws/notify/targets/sqs.d.ts +45 -0
- package/lib/aws/notify/targets/sqs.js +73 -0
- package/lib/aws/notify/targets/state-machine.d.ts +36 -0
- package/lib/aws/notify/targets/state-machine.js +39 -0
- package/lib/aws/notify/targets/util.d.ts +71 -0
- package/lib/aws/notify/targets/util.js +130 -0
- package/lib/aws/notify/util.d.ts +13 -0
- package/lib/aws/notify/util.js +69 -0
- package/lib/aws/provider-config.generated.d.ts +220 -0
- package/lib/aws/provider-config.generated.js +3 -0
- package/lib/aws/storage/bucket-destination.d.ts +41 -0
- package/lib/aws/storage/bucket-destination.js +13 -0
- package/lib/aws/storage/bucket-notifications.d.ts +58 -0
- package/lib/aws/storage/bucket-notifications.js +169 -0
- package/lib/aws/storage/bucket-perms.d.ts +9 -0
- package/lib/aws/storage/bucket-perms.js +33 -0
- package/lib/aws/storage/bucket-policy.d.ts +51 -0
- package/lib/aws/storage/bucket-policy.js +53 -0
- package/lib/aws/storage/bucket-source.d.ts +41 -0
- package/lib/aws/storage/bucket-source.js +79 -0
- package/lib/aws/storage/bucket.d.ts +941 -0
- package/lib/aws/storage/bucket.js +869 -0
- package/lib/aws/storage/cors-config.generated.d.ts +57 -0
- package/lib/aws/storage/cors-config.generated.js +3 -0
- package/lib/aws/storage/cors-rule-config.generated.d.ts +38 -0
- package/lib/aws/storage/cors-rule-config.generated.js +3 -0
- package/lib/aws/storage/index.d.ts +12 -0
- package/lib/aws/storage/index.js +31 -0
- package/lib/aws/storage/lifecycle-config.generated.d.ts +55 -0
- package/lib/aws/storage/lifecycle-config.generated.js +3 -0
- package/lib/aws/storage/notification-targets/function.d.ts +11 -0
- package/lib/aws/storage/notification-targets/function.js +48 -0
- package/lib/aws/storage/notification-targets/index.d.ts +2 -0
- package/lib/aws/storage/notification-targets/index.js +21 -0
- package/lib/aws/storage/notification-targets/queue.d.ts +15 -0
- package/lib/aws/storage/notification-targets/queue.js +58 -0
- package/lib/aws/storage/origin-access-identity.d.ts +91 -0
- package/lib/aws/storage/origin-access-identity.js +76 -0
- package/lib/aws/storage/util.d.ts +40 -0
- package/lib/aws/storage/util.js +85 -0
- package/lib/aws/storage/website-config.generated.d.ts +73 -0
- package/lib/aws/storage/website-config.generated.js +3 -0
- package/lib/aws/util.d.ts +4 -0
- package/lib/aws/util.js +25 -0
- package/lib/construct-base.d.ts +69 -0
- package/lib/construct-base.js +89 -0
- package/lib/duration.d.ts +160 -0
- package/lib/duration.js +327 -0
- package/lib/index.d.ts +5 -0
- package/lib/index.js +24 -0
- package/lib/private/index.d.ts +2 -0
- package/lib/private/index.js +19 -0
- package/lib/private/terraform-dependables-aspect.d.ts +20 -0
- package/lib/private/terraform-dependables-aspect.js +95 -0
- package/lib/private/unique-resource-name.d.ts +9 -0
- package/lib/private/unique-resource-name.js +145 -0
- package/lib/size.d.ts +146 -0
- package/lib/size.js +220 -0
- package/lib/stack-base.d.ts +188 -0
- package/lib/stack-base.js +183 -0
- package/lib/token.d.ts +32 -0
- package/lib/token.js +54 -0
- package/node_modules/camel-case/LICENSE +21 -0
- package/node_modules/camel-case/README.md +47 -0
- package/node_modules/camel-case/dist/index.d.ts +5 -0
- package/node_modules/camel-case/dist/index.js +23 -0
- package/node_modules/camel-case/dist/index.js.map +1 -0
- package/node_modules/camel-case/dist/index.spec.d.ts +1 -0
- package/node_modules/camel-case/dist/index.spec.js +26 -0
- package/node_modules/camel-case/dist/index.spec.js.map +1 -0
- package/node_modules/camel-case/dist.es2015/index.d.ts +5 -0
- package/node_modules/camel-case/dist.es2015/index.js +17 -0
- package/node_modules/camel-case/dist.es2015/index.js.map +1 -0
- package/node_modules/camel-case/dist.es2015/index.spec.d.ts +1 -0
- package/node_modules/camel-case/dist.es2015/index.spec.js +24 -0
- package/node_modules/camel-case/dist.es2015/index.spec.js.map +1 -0
- package/node_modules/camel-case/package.json +89 -0
- package/node_modules/capital-case/LICENSE +21 -0
- package/node_modules/capital-case/README.md +37 -0
- package/node_modules/capital-case/dist/index.d.ts +4 -0
- package/node_modules/capital-case/dist/index.js +16 -0
- package/node_modules/capital-case/dist/index.js.map +1 -0
- package/node_modules/capital-case/dist/index.spec.d.ts +1 -0
- package/node_modules/capital-case/dist/index.spec.js +24 -0
- package/node_modules/capital-case/dist/index.spec.js.map +1 -0
- package/node_modules/capital-case/dist.es2015/index.d.ts +4 -0
- package/node_modules/capital-case/dist.es2015/index.js +11 -0
- package/node_modules/capital-case/dist.es2015/index.js.map +1 -0
- package/node_modules/capital-case/dist.es2015/index.spec.d.ts +1 -0
- package/node_modules/capital-case/dist.es2015/index.spec.js +22 -0
- package/node_modules/capital-case/dist.es2015/index.spec.js.map +1 -0
- package/node_modules/capital-case/package.json +90 -0
- package/node_modules/change-case/LICENSE +21 -0
- package/node_modules/change-case/README.md +44 -0
- package/node_modules/change-case/dist/index.d.ts +11 -0
- package/node_modules/change-case/dist/index.js +15 -0
- package/node_modules/change-case/dist/index.js.map +1 -0
- package/node_modules/change-case/dist/index.spec.d.ts +1 -0
- package/node_modules/change-case/dist/index.spec.js +9 -0
- package/node_modules/change-case/dist/index.spec.js.map +1 -0
- package/node_modules/change-case/dist.es2015/index.d.ts +11 -0
- package/node_modules/change-case/dist.es2015/index.js +12 -0
- package/node_modules/change-case/dist.es2015/index.js.map +1 -0
- package/node_modules/change-case/dist.es2015/index.spec.d.ts +1 -0
- package/node_modules/change-case/dist.es2015/index.spec.js +7 -0
- package/node_modules/change-case/dist.es2015/index.spec.js.map +1 -0
- package/node_modules/change-case/package.json +101 -0
- package/node_modules/constant-case/LICENSE +21 -0
- package/node_modules/constant-case/README.md +37 -0
- package/node_modules/constant-case/dist/index.d.ts +3 -0
- package/node_modules/constant-case/dist/index.js +12 -0
- package/node_modules/constant-case/dist/index.js.map +1 -0
- package/node_modules/constant-case/dist/index.spec.d.ts +1 -0
- package/node_modules/constant-case/dist/index.spec.js +26 -0
- package/node_modules/constant-case/dist/index.spec.js.map +1 -0
- package/node_modules/constant-case/dist.es2015/index.d.ts +3 -0
- package/node_modules/constant-case/dist.es2015/index.js +8 -0
- package/node_modules/constant-case/dist.es2015/index.js.map +1 -0
- package/node_modules/constant-case/dist.es2015/index.spec.d.ts +1 -0
- package/node_modules/constant-case/dist.es2015/index.spec.js +24 -0
- package/node_modules/constant-case/dist.es2015/index.spec.js.map +1 -0
- package/node_modules/constant-case/package.json +90 -0
- package/node_modules/dot-case/LICENSE +21 -0
- package/node_modules/dot-case/README.md +37 -0
- package/node_modules/dot-case/dist/index.d.ts +3 -0
- package/node_modules/dot-case/dist/index.js +11 -0
- package/node_modules/dot-case/dist/index.js.map +1 -0
- package/node_modules/dot-case/dist/index.spec.d.ts +1 -0
- package/node_modules/dot-case/dist/index.spec.js +26 -0
- package/node_modules/dot-case/dist/index.spec.js.map +1 -0
- package/node_modules/dot-case/dist.es2015/index.d.ts +3 -0
- package/node_modules/dot-case/dist.es2015/index.js +7 -0
- package/node_modules/dot-case/dist.es2015/index.js.map +1 -0
- package/node_modules/dot-case/dist.es2015/index.spec.d.ts +1 -0
- package/node_modules/dot-case/dist.es2015/index.spec.js +24 -0
- package/node_modules/dot-case/dist.es2015/index.spec.js.map +1 -0
- package/node_modules/dot-case/package.json +89 -0
- package/node_modules/esbuild-wasm/LICENSE.md +21 -0
- package/node_modules/esbuild-wasm/README.md +3 -0
- package/node_modules/esbuild-wasm/bin/esbuild +91 -0
- package/node_modules/esbuild-wasm/esbuild.wasm +0 -0
- package/node_modules/esbuild-wasm/esm/browser.d.ts +705 -0
- package/node_modules/esbuild-wasm/esm/browser.js +2370 -0
- package/node_modules/esbuild-wasm/esm/browser.min.js +20 -0
- package/node_modules/esbuild-wasm/lib/browser.d.ts +705 -0
- package/node_modules/esbuild-wasm/lib/browser.js +2415 -0
- package/node_modules/esbuild-wasm/lib/browser.min.js +22 -0
- package/node_modules/esbuild-wasm/lib/main.d.ts +705 -0
- package/node_modules/esbuild-wasm/lib/main.js +2051 -0
- package/node_modules/esbuild-wasm/package.json +19 -0
- package/node_modules/esbuild-wasm/wasm_exec.js +561 -0
- package/node_modules/esbuild-wasm/wasm_exec_node.js +39 -0
- package/node_modules/header-case/LICENSE +21 -0
- package/node_modules/header-case/README.md +37 -0
- package/node_modules/header-case/dist/index.d.ts +3 -0
- package/node_modules/header-case/dist/index.js +11 -0
- package/node_modules/header-case/dist/index.js.map +1 -0
- package/node_modules/header-case/dist/index.spec.d.ts +1 -0
- package/node_modules/header-case/dist/index.spec.js +24 -0
- package/node_modules/header-case/dist/index.spec.js.map +1 -0
- package/node_modules/header-case/dist.es2015/index.d.ts +3 -0
- package/node_modules/header-case/dist.es2015/index.js +7 -0
- package/node_modules/header-case/dist.es2015/index.js.map +1 -0
- package/node_modules/header-case/dist.es2015/index.spec.d.ts +1 -0
- package/node_modules/header-case/dist.es2015/index.spec.js +22 -0
- package/node_modules/header-case/dist.es2015/index.spec.js.map +1 -0
- package/node_modules/header-case/package.json +89 -0
- package/node_modules/lower-case/LICENSE +21 -0
- package/node_modules/lower-case/README.md +35 -0
- package/node_modules/lower-case/dist/index.d.ts +8 -0
- package/node_modules/lower-case/dist/index.js +53 -0
- package/node_modules/lower-case/dist/index.js.map +1 -0
- package/node_modules/lower-case/dist/index.spec.d.ts +1 -0
- package/node_modules/lower-case/dist/index.spec.js +36 -0
- package/node_modules/lower-case/dist/index.spec.js.map +1 -0
- package/node_modules/lower-case/dist.es2015/index.d.ts +8 -0
- package/node_modules/lower-case/dist.es2015/index.js +48 -0
- package/node_modules/lower-case/dist.es2015/index.js.map +1 -0
- package/node_modules/lower-case/dist.es2015/index.spec.d.ts +1 -0
- package/node_modules/lower-case/dist.es2015/index.spec.js +34 -0
- package/node_modules/lower-case/dist.es2015/index.spec.js.map +1 -0
- package/node_modules/lower-case/package.json +87 -0
- package/node_modules/mime-db/HISTORY.md +507 -0
- package/node_modules/mime-db/LICENSE +23 -0
- package/node_modules/mime-db/README.md +100 -0
- package/node_modules/mime-db/db.json +8519 -0
- package/node_modules/mime-db/index.js +12 -0
- package/node_modules/mime-db/package.json +60 -0
- package/node_modules/mime-types/HISTORY.md +397 -0
- package/node_modules/mime-types/LICENSE +23 -0
- package/node_modules/mime-types/README.md +113 -0
- package/node_modules/mime-types/index.js +188 -0
- package/node_modules/mime-types/package.json +44 -0
- package/node_modules/no-case/LICENSE +21 -0
- package/node_modules/no-case/README.md +37 -0
- package/node_modules/no-case/dist/index.d.ts +10 -0
- package/node_modules/no-case/dist/index.js +35 -0
- package/node_modules/no-case/dist/index.js.map +1 -0
- package/node_modules/no-case/dist/index.spec.d.ts +1 -0
- package/node_modules/no-case/dist/index.spec.js +59 -0
- package/node_modules/no-case/dist/index.spec.js.map +1 -0
- package/node_modules/no-case/dist.es2015/index.d.ts +10 -0
- package/node_modules/no-case/dist.es2015/index.js +31 -0
- package/node_modules/no-case/dist.es2015/index.js.map +1 -0
- package/node_modules/no-case/dist.es2015/index.spec.d.ts +1 -0
- package/node_modules/no-case/dist.es2015/index.spec.js +57 -0
- package/node_modules/no-case/dist.es2015/index.spec.js.map +1 -0
- package/node_modules/no-case/package.json +85 -0
- package/node_modules/param-case/LICENSE +21 -0
- package/node_modules/param-case/README.md +37 -0
- package/node_modules/param-case/dist/index.d.ts +3 -0
- package/node_modules/param-case/dist/index.js +11 -0
- package/node_modules/param-case/dist/index.js.map +1 -0
- package/node_modules/param-case/dist/index.spec.d.ts +1 -0
- package/node_modules/param-case/dist/index.spec.js +24 -0
- package/node_modules/param-case/dist/index.spec.js.map +1 -0
- package/node_modules/param-case/dist.es2015/index.d.ts +3 -0
- package/node_modules/param-case/dist.es2015/index.js +7 -0
- package/node_modules/param-case/dist.es2015/index.js.map +1 -0
- package/node_modules/param-case/dist.es2015/index.spec.d.ts +1 -0
- package/node_modules/param-case/dist.es2015/index.spec.js +22 -0
- package/node_modules/param-case/dist.es2015/index.spec.js.map +1 -0
- package/node_modules/param-case/package.json +91 -0
- package/node_modules/pascal-case/LICENSE +21 -0
- package/node_modules/pascal-case/README.md +47 -0
- package/node_modules/pascal-case/dist/index.d.ts +5 -0
- package/node_modules/pascal-case/dist/index.js +24 -0
- package/node_modules/pascal-case/dist/index.js.map +1 -0
- package/node_modules/pascal-case/dist/index.spec.d.ts +1 -0
- package/node_modules/pascal-case/dist/index.spec.js +25 -0
- package/node_modules/pascal-case/dist/index.spec.js.map +1 -0
- package/node_modules/pascal-case/dist.es2015/index.d.ts +5 -0
- package/node_modules/pascal-case/dist.es2015/index.js +18 -0
- package/node_modules/pascal-case/dist.es2015/index.js.map +1 -0
- package/node_modules/pascal-case/dist.es2015/index.spec.d.ts +1 -0
- package/node_modules/pascal-case/dist.es2015/index.spec.js +23 -0
- package/node_modules/pascal-case/dist.es2015/index.spec.js.map +1 -0
- package/node_modules/pascal-case/package.json +90 -0
- package/node_modules/path-case/LICENSE +21 -0
- package/node_modules/path-case/README.md +37 -0
- package/node_modules/path-case/dist/index.d.ts +3 -0
- package/node_modules/path-case/dist/index.js +11 -0
- package/node_modules/path-case/dist/index.js.map +1 -0
- package/node_modules/path-case/dist/index.spec.d.ts +1 -0
- package/node_modules/path-case/dist/index.spec.js +24 -0
- package/node_modules/path-case/dist/index.spec.js.map +1 -0
- package/node_modules/path-case/dist.es2015/index.d.ts +3 -0
- package/node_modules/path-case/dist.es2015/index.js +7 -0
- package/node_modules/path-case/dist.es2015/index.js.map +1 -0
- package/node_modules/path-case/dist.es2015/index.spec.d.ts +1 -0
- package/node_modules/path-case/dist.es2015/index.spec.js +22 -0
- package/node_modules/path-case/dist.es2015/index.spec.js.map +1 -0
- package/node_modules/path-case/package.json +88 -0
- package/node_modules/sentence-case/LICENSE +21 -0
- package/node_modules/sentence-case/README.md +37 -0
- package/node_modules/sentence-case/dist/index.d.ts +4 -0
- package/node_modules/sentence-case/dist/index.js +19 -0
- package/node_modules/sentence-case/dist/index.js.map +1 -0
- package/node_modules/sentence-case/dist/index.spec.d.ts +1 -0
- package/node_modules/sentence-case/dist/index.spec.js +24 -0
- package/node_modules/sentence-case/dist/index.spec.js.map +1 -0
- package/node_modules/sentence-case/dist.es2015/index.d.ts +4 -0
- package/node_modules/sentence-case/dist.es2015/index.js +14 -0
- package/node_modules/sentence-case/dist.es2015/index.js.map +1 -0
- package/node_modules/sentence-case/dist.es2015/index.spec.d.ts +1 -0
- package/node_modules/sentence-case/dist.es2015/index.spec.js +22 -0
- package/node_modules/sentence-case/dist.es2015/index.spec.js.map +1 -0
- package/node_modules/sentence-case/package.json +89 -0
- package/node_modules/snake-case/LICENSE +21 -0
- package/node_modules/snake-case/README.md +37 -0
- package/node_modules/snake-case/dist/index.d.ts +3 -0
- package/node_modules/snake-case/dist/index.js +11 -0
- package/node_modules/snake-case/dist/index.js.map +1 -0
- package/node_modules/snake-case/dist/index.spec.d.ts +1 -0
- package/node_modules/snake-case/dist/index.spec.js +25 -0
- package/node_modules/snake-case/dist/index.spec.js.map +1 -0
- package/node_modules/snake-case/dist.es2015/index.d.ts +3 -0
- package/node_modules/snake-case/dist.es2015/index.js +7 -0
- package/node_modules/snake-case/dist.es2015/index.js.map +1 -0
- package/node_modules/snake-case/dist.es2015/index.spec.d.ts +1 -0
- package/node_modules/snake-case/dist.es2015/index.spec.js +23 -0
- package/node_modules/snake-case/dist.es2015/index.spec.js.map +1 -0
- package/node_modules/snake-case/package.json +90 -0
- package/node_modules/tslib/CopyrightNotice.txt +15 -0
- package/node_modules/tslib/LICENSE.txt +12 -0
- package/node_modules/tslib/README.md +164 -0
- package/node_modules/tslib/SECURITY.md +41 -0
- package/node_modules/tslib/modules/index.d.ts +37 -0
- package/node_modules/tslib/modules/index.js +68 -0
- package/node_modules/tslib/modules/package.json +3 -0
- package/node_modules/tslib/package.json +47 -0
- package/node_modules/tslib/tslib.d.ts +453 -0
- package/node_modules/tslib/tslib.es6.html +1 -0
- package/node_modules/tslib/tslib.es6.js +374 -0
- package/node_modules/tslib/tslib.es6.mjs +373 -0
- package/node_modules/tslib/tslib.html +1 -0
- package/node_modules/tslib/tslib.js +424 -0
- package/node_modules/upper-case/README.md +34 -0
- package/node_modules/upper-case/dist/index.d.ts +8 -0
- package/node_modules/upper-case/dist/index.js +49 -0
- package/node_modules/upper-case/dist/index.js.map +1 -0
- package/node_modules/upper-case/dist/index.spec.d.ts +1 -0
- package/node_modules/upper-case/dist/index.spec.js +34 -0
- package/node_modules/upper-case/dist/index.spec.js.map +1 -0
- package/node_modules/upper-case/dist.es2015/index.d.ts +8 -0
- package/node_modules/upper-case/dist.es2015/index.js +44 -0
- package/node_modules/upper-case/dist.es2015/index.js.map +1 -0
- package/node_modules/upper-case/dist.es2015/index.spec.d.ts +1 -0
- package/node_modules/upper-case/dist.es2015/index.spec.js +32 -0
- package/node_modules/upper-case/dist.es2015/index.spec.js.map +1 -0
- package/node_modules/upper-case/package.json +86 -0
- package/node_modules/upper-case-first/LICENSE +21 -0
- package/node_modules/upper-case-first/README.md +32 -0
- package/node_modules/upper-case-first/dist/index.d.ts +4 -0
- package/node_modules/upper-case-first/dist/index.js +11 -0
- package/node_modules/upper-case-first/dist/index.js.map +1 -0
- package/node_modules/upper-case-first/dist/index.spec.d.ts +1 -0
- package/node_modules/upper-case-first/dist/index.spec.js +20 -0
- package/node_modules/upper-case-first/dist/index.spec.js.map +1 -0
- package/node_modules/upper-case-first/dist.es2015/index.d.ts +4 -0
- package/node_modules/upper-case-first/dist.es2015/index.js +7 -0
- package/node_modules/upper-case-first/dist.es2015/index.js.map +1 -0
- package/node_modules/upper-case-first/dist.es2015/index.spec.d.ts +1 -0
- package/node_modules/upper-case-first/dist.es2015/index.spec.js +18 -0
- package/node_modules/upper-case-first/dist.es2015/index.spec.js.map +1 -0
- package/node_modules/upper-case-first/package.json +87 -0
- package/package.json +152 -0
- package/setup.js +2 -0
|
@@ -0,0 +1,407 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var _a;
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.Role = 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 arn_1 = require("../arn");
|
|
9
|
+
const aws_construct_1 = require("../aws-construct");
|
|
10
|
+
const aws_stack_1 = require("../aws-stack");
|
|
11
|
+
const grant_1 = require("./grant");
|
|
12
|
+
const policy_1 = require("./policy");
|
|
13
|
+
const policy_document_1 = require("./policy-document");
|
|
14
|
+
const principals_1 = require("./principals");
|
|
15
|
+
const adapter_1 = require("./private/adapter");
|
|
16
|
+
const assume_role_policy_1 = require("./private/assume-role-policy");
|
|
17
|
+
const immutable_role_1 = require("./private/immutable-role");
|
|
18
|
+
const imported_role_1 = require("./private/imported-role");
|
|
19
|
+
// import { PrecreatedRole } from "./private/precreated-role";
|
|
20
|
+
const util_1 = require("./private/util");
|
|
21
|
+
const token_1 = require("../../token");
|
|
22
|
+
// TODO: Re-Add LazyRole?
|
|
23
|
+
// ref: https://github.com/aws/aws-cdk/blob/v2.156.0/packages/aws-cdk-lib/aws-iam/lib/lazy-role.ts
|
|
24
|
+
// TODO: re-implement iam role policy splitting
|
|
25
|
+
// const MAX_INLINE_SIZE = 10000;
|
|
26
|
+
// const MAX_MANAGEDPOL_SIZE = 6000;
|
|
27
|
+
const IAM_ROLE_SYMBOL = Symbol.for("terraconstructs/lib/aws/iam.Role");
|
|
28
|
+
/**
|
|
29
|
+
* IAM Role
|
|
30
|
+
*
|
|
31
|
+
* Defines an IAM role. The role is created with an assume policy document associated with
|
|
32
|
+
* the specified AWS service principal defined in `serviceAssumeRole`.
|
|
33
|
+
*/
|
|
34
|
+
class Role extends aws_construct_1.AwsConstructBase {
|
|
35
|
+
/**
|
|
36
|
+
* Import an external role by ARN.
|
|
37
|
+
*
|
|
38
|
+
* If the imported Role ARN is a Token (such as a
|
|
39
|
+
* `CfnParameter.valueAsString` or a `Fn.importValue()`) *and* the referenced
|
|
40
|
+
* role has a `path` (like `arn:...:role/AdminRoles/Alice`), the
|
|
41
|
+
* `roleName` property will not resolve to the correct value. Instead it
|
|
42
|
+
* will resolve to the first path component. We unfortunately cannot express
|
|
43
|
+
* the correct calculation of the full path name as a CloudFormation
|
|
44
|
+
* expression. In this scenario the Role ARN should be supplied without the
|
|
45
|
+
* `path` in order to resolve the correct role resource.
|
|
46
|
+
*
|
|
47
|
+
* @param scope construct scope
|
|
48
|
+
* @param id construct id
|
|
49
|
+
* @param roleArn the ARN of the role to import
|
|
50
|
+
* @param options allow customizing the behavior of the returned role
|
|
51
|
+
*/
|
|
52
|
+
static fromRoleArn(scope, id, roleArn, options = {}) {
|
|
53
|
+
const scopeStack = aws_stack_1.AwsStack.ofAwsConstruct(scope);
|
|
54
|
+
const parsedArn = scopeStack.splitArn(roleArn, arn_1.ArnFormat.SLASH_RESOURCE_NAME);
|
|
55
|
+
const resourceName = parsedArn.resourceName;
|
|
56
|
+
const roleAccount = parsedArn.account;
|
|
57
|
+
// service roles have an ARN like 'arn:aws:iam::<account>:role/service-role/<roleName>'
|
|
58
|
+
// or 'arn:aws:iam::<account>:role/service-role/servicename.amazonaws.com/service-role/<roleName>'
|
|
59
|
+
// we want to support these as well, so we just use the element after the last slash as role name
|
|
60
|
+
const roleName = resourceName.split("/").pop();
|
|
61
|
+
// if (getCustomizeRolesConfig(scope).enabled) {
|
|
62
|
+
// return new PrecreatedRole(scope, id, {
|
|
63
|
+
// rolePath: `${scope.node.path}/${id}`,
|
|
64
|
+
// role: new ImportedRole(scope, `Import${id}`, {
|
|
65
|
+
// account: roleAccount,
|
|
66
|
+
// roleArn,
|
|
67
|
+
// roleName,
|
|
68
|
+
// ...options,
|
|
69
|
+
// }),
|
|
70
|
+
// });
|
|
71
|
+
// }
|
|
72
|
+
if (options.addGrantsToResources !== undefined &&
|
|
73
|
+
options.mutable !== false) {
|
|
74
|
+
throw new Error("'addGrantsToResources' can only be passed if 'mutable: false'");
|
|
75
|
+
}
|
|
76
|
+
const roleArnAndScopeStackAccountComparison = (0, token_1.tokenCompareStrings)(roleAccount ?? "", scopeStack.account);
|
|
77
|
+
const equalOrAnyUnresolved = roleArnAndScopeStackAccountComparison === token_1.TokenComparison.SAME ||
|
|
78
|
+
roleArnAndScopeStackAccountComparison ===
|
|
79
|
+
token_1.TokenComparison.BOTH_UNRESOLVED ||
|
|
80
|
+
roleArnAndScopeStackAccountComparison === token_1.TokenComparison.ONE_UNRESOLVED;
|
|
81
|
+
// if we are returning an immutable role then the 'importedRole' is just a throwaway construct
|
|
82
|
+
// so give it a different id
|
|
83
|
+
const mutableRoleId = options.mutable !== false && equalOrAnyUnresolved
|
|
84
|
+
? id
|
|
85
|
+
: `MutableRole${id}`;
|
|
86
|
+
const importedRole = new imported_role_1.ImportedRole(scope, mutableRoleId, {
|
|
87
|
+
roleArn,
|
|
88
|
+
roleName,
|
|
89
|
+
account: roleAccount,
|
|
90
|
+
...options,
|
|
91
|
+
});
|
|
92
|
+
// we only return an immutable Role if both accounts were explicitly provided, and different
|
|
93
|
+
return options.mutable !== false && equalOrAnyUnresolved
|
|
94
|
+
? importedRole
|
|
95
|
+
: new immutable_role_1.ImmutableRole(scope, id, importedRole, options.addGrantsToResources ?? false);
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Return whether the given object is a Role
|
|
99
|
+
*/
|
|
100
|
+
static isRole(x) {
|
|
101
|
+
return x !== null && typeof x === "object" && IAM_ROLE_SYMBOL in x;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Import an external role by name.
|
|
105
|
+
*
|
|
106
|
+
* The imported role is assumed to exist in the same account as the account
|
|
107
|
+
* the scope's containing Stack is being deployed to.
|
|
108
|
+
|
|
109
|
+
* @param scope construct scope
|
|
110
|
+
* @param id construct id
|
|
111
|
+
* @param roleName the name of the role to import
|
|
112
|
+
* @param options allow customizing the behavior of the returned role
|
|
113
|
+
*/
|
|
114
|
+
static fromRoleName(scope, id, roleName, options = {}) {
|
|
115
|
+
return Role.fromRoleArn(scope, id, aws_stack_1.AwsStack.ofAwsConstruct(scope).formatArn({
|
|
116
|
+
region: "",
|
|
117
|
+
service: "iam",
|
|
118
|
+
resource: "role",
|
|
119
|
+
resourceName: roleName,
|
|
120
|
+
}), options);
|
|
121
|
+
}
|
|
122
|
+
/** Strongly typed Outputs */
|
|
123
|
+
get roleOutputs() {
|
|
124
|
+
return {
|
|
125
|
+
arn: this.roleArn,
|
|
126
|
+
name: this.roleName,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
get outputs() {
|
|
130
|
+
return this.roleOutputs;
|
|
131
|
+
}
|
|
132
|
+
constructor(scope, id, props) {
|
|
133
|
+
super(scope, id, props);
|
|
134
|
+
// TODO: Support custom role creation
|
|
135
|
+
// https://github.com/aws/aws-cdk/blob/v2.143.0/packages/aws-cdk-lib/aws-iam/lib/role.ts#L355
|
|
136
|
+
this.grantPrincipal = this;
|
|
137
|
+
this.principalAccount = this.env.account;
|
|
138
|
+
this.assumeRoleAction = "sts:AssumeRole";
|
|
139
|
+
this.managedPolicies = [];
|
|
140
|
+
this.attachedPolicies = new util_1.AttachedPolicies();
|
|
141
|
+
if (props.roleName &&
|
|
142
|
+
!cdktf_1.Token.isUnresolved(props.roleName) &&
|
|
143
|
+
!/^[\w+=,.@-]{1,64}$/.test(props.roleName)) {
|
|
144
|
+
throw new Error("Invalid roleName. The name must be a string of characters consisting of upper and lowercase alphanumeric characters with no spaces. You can also include any of the following characters: _+=,.@-. Length must be between 1 and 64 characters.");
|
|
145
|
+
}
|
|
146
|
+
if (props.roleName && props.roleNamePrefix) {
|
|
147
|
+
throw new Error("Cannot specify both 'roleName' and 'roleNamePrefix'. Use only one.");
|
|
148
|
+
}
|
|
149
|
+
const externalIds = props.externalIds || [];
|
|
150
|
+
if (props.externalId) {
|
|
151
|
+
externalIds.push(props.externalId);
|
|
152
|
+
}
|
|
153
|
+
this.assumeRolePolicy = createAssumeRolePolicy(this, "AssumeRolePolicy", props.assumedBy, externalIds);
|
|
154
|
+
this.managedPolicies.push(...(props.managedPolicies || []));
|
|
155
|
+
this.inlinePolicies = props.inlinePolicies || {};
|
|
156
|
+
this.permissionsBoundary = props.permissionsBoundary;
|
|
157
|
+
const maxSessionDuration = props.maxSessionDuration && props.maxSessionDuration.toSeconds();
|
|
158
|
+
validateMaxSessionDuration(maxSessionDuration);
|
|
159
|
+
const description = props.description && props.description?.length > 0
|
|
160
|
+
? props.description
|
|
161
|
+
: undefined;
|
|
162
|
+
if (description && description.length > 1000) {
|
|
163
|
+
throw new Error("Role description must be no longer than 1000 characters.");
|
|
164
|
+
}
|
|
165
|
+
validateRolePath(props.path);
|
|
166
|
+
// pre-created role snipped
|
|
167
|
+
// https://github.com/aws/aws-cdk/blob/v2.143.0/packages/aws-cdk-lib/aws-iam/lib/role.ts#L439
|
|
168
|
+
const namePrefix = this.stack.uniqueResourceNamePrefix(this, {
|
|
169
|
+
prefix: props.roleNamePrefix ?? this.gridUUID + "-",
|
|
170
|
+
allowedSpecialCharacters: "_+=,.@-",
|
|
171
|
+
maxLength: 64,
|
|
172
|
+
});
|
|
173
|
+
this.resource = new provider_aws_1.iamRole.IamRole(this, "Resource", {
|
|
174
|
+
...props, // copy over Terraform Meta Arguments from ConstructProps
|
|
175
|
+
assumeRolePolicy: this.assumeRolePolicy.json,
|
|
176
|
+
managedPolicyArns: util_1.UniqueStringSet.from(() => this.managedPolicies.map((p) => p.managedPolicyArn)),
|
|
177
|
+
inlinePolicy: _flatten(this.inlinePolicies),
|
|
178
|
+
path: props.path,
|
|
179
|
+
permissionsBoundary: this.permissionsBoundary
|
|
180
|
+
? this.permissionsBoundary.managedPolicyArn
|
|
181
|
+
: undefined,
|
|
182
|
+
name: props.roleName,
|
|
183
|
+
namePrefix: !props.roleName ? namePrefix : undefined,
|
|
184
|
+
maxSessionDuration,
|
|
185
|
+
description,
|
|
186
|
+
forceDetachPolicies: props.forceDetachPolicies,
|
|
187
|
+
});
|
|
188
|
+
// Stable and unique string identifying the role.
|
|
189
|
+
this._roleId = this.resource.uniqueId;
|
|
190
|
+
// TODO: Need to handle cross env ARN refs?
|
|
191
|
+
// CDK: https://github.com/aws/aws-cdk/blob/v2.143.0/packages/aws-cdk-lib/core/lib/resource.ts#L288
|
|
192
|
+
this.roleArn = this.resource.arn;
|
|
193
|
+
// TODO: Need to handle cross env Name refs?
|
|
194
|
+
// CDK: https://github.com/aws/aws-cdk/blob/v2.143.0/packages/aws-cdk-lib/core/lib/resource.ts#L254
|
|
195
|
+
this.roleName = this.resource.name;
|
|
196
|
+
// TODO: Re-add policy splitting?
|
|
197
|
+
// Aspects.of(this).add({
|
|
198
|
+
// visit: (c) => {
|
|
199
|
+
// if (c === this) {
|
|
200
|
+
// this.splitLargePolicy();
|
|
201
|
+
// }
|
|
202
|
+
// },
|
|
203
|
+
// });
|
|
204
|
+
this.policyFragment = new principals_1.ArnPrincipal(this.roleArn).policyFragment;
|
|
205
|
+
function _flatten(policies) {
|
|
206
|
+
if (policies == null || Object.keys(policies).length === 0) {
|
|
207
|
+
return undefined;
|
|
208
|
+
}
|
|
209
|
+
const result = new Array();
|
|
210
|
+
for (const policyName of Object.keys(policies)) {
|
|
211
|
+
const policyDocument = policies[policyName];
|
|
212
|
+
result.push({
|
|
213
|
+
name: policyName,
|
|
214
|
+
policy: policyDocument.json,
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
return result;
|
|
218
|
+
}
|
|
219
|
+
this.node.addValidation({ validate: () => this.validateRole() });
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Adds a permission to the role's default policy document.
|
|
223
|
+
* If there is no default policy attached to this role, it will be created.
|
|
224
|
+
* @param statement The permission statement to add to the policy document
|
|
225
|
+
*/
|
|
226
|
+
addToPrincipalPolicy(statement) {
|
|
227
|
+
if (!this.defaultPolicy) {
|
|
228
|
+
this.defaultPolicy = new policy_1.Policy(this, "DefaultPolicy");
|
|
229
|
+
this.attachInlinePolicy(this.defaultPolicy);
|
|
230
|
+
}
|
|
231
|
+
this.defaultPolicy.addStatements(statement);
|
|
232
|
+
// // We might split this statement off into a different policy, so we'll need to
|
|
233
|
+
// // late-bind the dependable.
|
|
234
|
+
// const policyDependable = new DependencyGroup();
|
|
235
|
+
// this.dependables.set(statement, policyDependable);
|
|
236
|
+
return { statementAdded: true, policyDependable: this };
|
|
237
|
+
}
|
|
238
|
+
addToPolicy(statement) {
|
|
239
|
+
return this.addToPrincipalPolicy(statement).statementAdded;
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Attaches a managed policy to this role.
|
|
243
|
+
*
|
|
244
|
+
* NOTE: Using this method will force the role to take over
|
|
245
|
+
* exclusive management of the role's ManagedPolicy attachments
|
|
246
|
+
* These arguments are incompatible with other ways of managing
|
|
247
|
+
* a role's such as attaching the policy to the role through its
|
|
248
|
+
* `policy.attachToRole(role)` method.
|
|
249
|
+
*
|
|
250
|
+
* If you attempt to manage a role's policies by multiple means,
|
|
251
|
+
* you will get resource cycling and/or errors.
|
|
252
|
+
*
|
|
253
|
+
* ```typescript
|
|
254
|
+
* const policy1 = new iam.ManagedPolicy(this, 'Policy', {
|
|
255
|
+
* managedPolicyName: 'MyPolicy1',
|
|
256
|
+
* description: 'A description of the policy',
|
|
257
|
+
* });
|
|
258
|
+
* const policy2 = new iam.ManagedPolicy(this, 'Policy', {
|
|
259
|
+
* managedPolicyName: 'MyPolicy2',
|
|
260
|
+
* description: 'A description of the policy',
|
|
261
|
+
* });
|
|
262
|
+
*
|
|
263
|
+
* const role = new iam.Role(this, 'Role', {
|
|
264
|
+
* assumedBy: new iam.ServicePrincipal('sns.amazonaws.com'),
|
|
265
|
+
* });
|
|
266
|
+
* // role becomes the manager of all attached policies
|
|
267
|
+
* role.addManagedPolicy(iam.ManagedPolicy.fromAwsManagedPolicyName('SecurityAudit'));
|
|
268
|
+
* role.addManagedPolicy(policy1);
|
|
269
|
+
*
|
|
270
|
+
* // this introduces resource cycling
|
|
271
|
+
* // DON'T DO THIS
|
|
272
|
+
* policy2.attachToRole(role);
|
|
273
|
+
*
|
|
274
|
+
* // DO THIS INSTEAD
|
|
275
|
+
* role.addManagedPolicy(policy2);
|
|
276
|
+
* ```
|
|
277
|
+
* @param policy The the managed policy to attach.
|
|
278
|
+
*/
|
|
279
|
+
addManagedPolicy(policy) {
|
|
280
|
+
if (this.managedPolicies.some((mp) => mp.managedPolicyArn === policy.managedPolicyArn)) {
|
|
281
|
+
return;
|
|
282
|
+
}
|
|
283
|
+
this.managedPolicies.push(policy);
|
|
284
|
+
}
|
|
285
|
+
/**
|
|
286
|
+
* Attaches a policy to this role.
|
|
287
|
+
*
|
|
288
|
+
* NOTE: Using this method will force the role to take over
|
|
289
|
+
* exclusive management of the role's inline Policy attachments
|
|
290
|
+
* These arguments are incompatible with other ways of managing
|
|
291
|
+
* a role's such as attaching a policy to the role.
|
|
292
|
+
* If you attempt to manage a role's policies by multiple means,
|
|
293
|
+
* you will get resource cycling and/or errors.
|
|
294
|
+
*
|
|
295
|
+
* @param policy The policy to attach
|
|
296
|
+
*/
|
|
297
|
+
attachInlinePolicy(policy) {
|
|
298
|
+
this.attachedPolicies.attach(policy);
|
|
299
|
+
policy.attachToRole(this);
|
|
300
|
+
}
|
|
301
|
+
/**
|
|
302
|
+
* Grant the actions defined in actions to the identity Principal on this resource.
|
|
303
|
+
*/
|
|
304
|
+
grant(grantee, ...actions) {
|
|
305
|
+
return grant_1.Grant.addToPrincipal({
|
|
306
|
+
grantee,
|
|
307
|
+
actions,
|
|
308
|
+
resourceArns: [this.roleArn],
|
|
309
|
+
scope: this,
|
|
310
|
+
});
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* Grant permissions to the given principal to pass this role.
|
|
314
|
+
*/
|
|
315
|
+
grantPassRole(identity) {
|
|
316
|
+
return this.grant(identity, "iam:PassRole");
|
|
317
|
+
}
|
|
318
|
+
/**
|
|
319
|
+
* Grant permissions to the given principal to assume this role.
|
|
320
|
+
*/
|
|
321
|
+
grantAssumeRole(identity) {
|
|
322
|
+
// Service and account principals must use assumeRolePolicy
|
|
323
|
+
if (identity instanceof principals_1.ServicePrincipal ||
|
|
324
|
+
identity instanceof principals_1.AccountPrincipal) {
|
|
325
|
+
throw new Error("Cannot use a service or account principal with grantAssumeRole, use assumeRolePolicy instead.");
|
|
326
|
+
}
|
|
327
|
+
return this.grant(identity, "sts:AssumeRole");
|
|
328
|
+
}
|
|
329
|
+
/**
|
|
330
|
+
* Returns the stable and unique string identifying the role. For example,
|
|
331
|
+
* AIDAJQABLZS4A3QDU576Q.
|
|
332
|
+
*
|
|
333
|
+
* @attribute
|
|
334
|
+
*/
|
|
335
|
+
get roleId() {
|
|
336
|
+
return this._roleId;
|
|
337
|
+
}
|
|
338
|
+
/**
|
|
339
|
+
* Return a copy of this Role object whose Policies will not be updated
|
|
340
|
+
*
|
|
341
|
+
* Use the object returned by this method if you want this Role to be used by
|
|
342
|
+
* a construct without it automatically updating the Role's Policies.
|
|
343
|
+
*
|
|
344
|
+
* If you do, you are responsible for adding the correct statements to the
|
|
345
|
+
* Role's policies yourself.
|
|
346
|
+
*/
|
|
347
|
+
withoutPolicyUpdates(options = {}) {
|
|
348
|
+
if (!this.immutableRole) {
|
|
349
|
+
this.immutableRole = new immutable_role_1.ImmutableRole(this.node.scope, `ImmutableRole${this.node.id}`, this, options.addGrantsToResources ?? false);
|
|
350
|
+
}
|
|
351
|
+
return this.immutableRole;
|
|
352
|
+
}
|
|
353
|
+
validateRole() {
|
|
354
|
+
const errors = new Array();
|
|
355
|
+
errors.push(...(this.assumeRolePolicy?.validateForResourcePolicy() ?? []));
|
|
356
|
+
for (const policy of Object.values(this.inlinePolicies)) {
|
|
357
|
+
errors.push(...policy.validateForIdentityPolicy());
|
|
358
|
+
}
|
|
359
|
+
return errors;
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
exports.Role = Role;
|
|
363
|
+
_a = JSII_RTTI_SYMBOL_1;
|
|
364
|
+
Role[_a] = { fqn: "terraconstructs.aws.iam.Role", version: "0.0.8" };
|
|
365
|
+
function createAssumeRolePolicy(scope, id, principal, externalIds) {
|
|
366
|
+
const actualDoc = new policy_document_1.PolicyDocument(scope, id);
|
|
367
|
+
// If requested, add externalIds to every statement added to this doc
|
|
368
|
+
const addDoc = externalIds.length === 0
|
|
369
|
+
? actualDoc
|
|
370
|
+
: new adapter_1.MutatingPolicyDocumentAdapter(actualDoc, (statement) => {
|
|
371
|
+
statement.addCondition({
|
|
372
|
+
test: "StringEquals",
|
|
373
|
+
variable: "sts:ExternalId",
|
|
374
|
+
values: externalIds,
|
|
375
|
+
});
|
|
376
|
+
return statement;
|
|
377
|
+
});
|
|
378
|
+
(0, assume_role_policy_1.defaultAddPrincipalToAssumeRole)(principal, addDoc);
|
|
379
|
+
return actualDoc;
|
|
380
|
+
}
|
|
381
|
+
function validateRolePath(path) {
|
|
382
|
+
if (path === undefined || cdktf_1.Token.isUnresolved(path)) {
|
|
383
|
+
return;
|
|
384
|
+
}
|
|
385
|
+
const validRolePath = /^(\/|\/[\u0021-\u007F]+\/)$/;
|
|
386
|
+
if (path.length == 0 || path.length > 512) {
|
|
387
|
+
throw new Error(`Role path must be between 1 and 512 characters. The provided role path is ${path.length} characters.`);
|
|
388
|
+
}
|
|
389
|
+
else if (!validRolePath.test(path)) {
|
|
390
|
+
throw new Error("Role path must be either a slash or valid characters (alphanumerics and symbols) surrounded by slashes. " +
|
|
391
|
+
`Valid characters are unicode characters in [\\u0021-\\u007F]. However, ${path} is provided.`);
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
function validateMaxSessionDuration(duration) {
|
|
395
|
+
if (duration === undefined) {
|
|
396
|
+
return;
|
|
397
|
+
}
|
|
398
|
+
if (duration < 3600 || duration > 43200) {
|
|
399
|
+
throw new Error(`maxSessionDuration is set to ${duration}, but must be >= 3600sec (1hr) and <= 43200sec (12hrs)`);
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
Object.defineProperty(Role.prototype, IAM_ROLE_SYMBOL, {
|
|
403
|
+
value: true,
|
|
404
|
+
enumerable: false,
|
|
405
|
+
writable: false,
|
|
406
|
+
});
|
|
407
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm9sZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hd3MvaWFtL3JvbGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxzREFBOEM7QUFDOUMsaUNBQThCO0FBRTlCLGdDQUFtQztBQUNuQyxvREFBdUU7QUFDdkUsNENBQXdDO0FBQ3hDLG1DQUFnQztBQUdoQyxxQ0FBa0M7QUFDbEMsdURBQW1EO0FBRW5ELDZDQU9zQjtBQUV0QiwrQ0FBa0U7QUFDbEUscUVBQStFO0FBQy9FLDZEQUF5RDtBQUN6RCwyREFBdUQ7QUFDdkQsOERBQThEO0FBQzlELHlDQUFtRTtBQUNuRSx1Q0FBbUU7QUFFbkUseUJBQXlCO0FBQ3pCLGtHQUFrRztBQUVsRywrQ0FBK0M7QUFDL0MsaUNBQWlDO0FBQ2pDLG9DQUFvQztBQUNwQyxNQUFNLGVBQWUsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLGtDQUFrQyxDQUFDLENBQUM7QUErTXZFOzs7OztHQUtHO0FBQ0gsTUFBYSxJQUFLLFNBQVEsZ0NBQWdCO0lBQ3hDOzs7Ozs7Ozs7Ozs7Ozs7O09BZ0JHO0lBQ0ksTUFBTSxDQUFDLFdBQVcsQ0FDdkIsS0FBZ0IsRUFDaEIsRUFBVSxFQUNWLE9BQWUsRUFDZixVQUE4QixFQUFFO1FBRWhDLE1BQU0sVUFBVSxHQUFHLG9CQUFRLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2xELE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQyxRQUFRLENBQ25DLE9BQU8sRUFDUCxlQUFTLENBQUMsbUJBQW1CLENBQzlCLENBQUM7UUFDRixNQUFNLFlBQVksR0FBRyxTQUFTLENBQUMsWUFBYSxDQUFDO1FBQzdDLE1BQU0sV0FBVyxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUM7UUFDdEMsdUZBQXVGO1FBQ3ZGLGtHQUFrRztRQUNsRyxpR0FBaUc7UUFDakcsTUFBTSxRQUFRLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxH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TUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLGVBQWUsRUFBRTtJQUNyRCxLQUFLLEVBQUUsSUFBSTtJQUNYLFVBQVUsRUFBRSxLQUFLO0lBQ2pCLFFBQVEsRUFBRSxLQUFLO0NBQ2hCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGlhbVJvbGUgfSBmcm9tIFwiQGNka3RmL3Byb3ZpZGVyLWF3c1wiO1xuaW1wb3J0IHsgVG9rZW4gfSBmcm9tIFwiY2RrdGZcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgeyBBcm5Gb3JtYXQgfSBmcm9tIFwiLi4vYXJuXCI7XG5pbXBvcnQgeyBBd3NDb25zdHJ1Y3RCYXNlLCBBd3NDb25zdHJ1Y3RQcm9wcyB9IGZyb20gXCIuLi9hd3MtY29uc3RydWN0XCI7XG5pbXBvcnQgeyBBd3NTdGFjayB9IGZyb20gXCIuLi9hd3Mtc3RhY2tcIjtcbmltcG9ydCB7IEdyYW50IH0gZnJvbSBcIi4vZ3JhbnRcIjtcbmltcG9ydCB7IElJZGVudGl0eSB9IGZyb20gXCIuL2lkZW50aXR5LWJhc2VcIjtcbmltcG9ydCB7IElNYW5hZ2VkUG9saWN5IH0gZnJvbSBcIi4vbWFuYWdlZC1wb2xpY3lcIjtcbmltcG9ydCB7IFBvbGljeSB9IGZyb20gXCIuL3BvbGljeVwiO1xuaW1wb3J0IHsgUG9saWN5RG9jdW1lbnQgfSBmcm9tIFwiLi9wb2xpY3ktZG9jdW1lbnRcIjtcbmltcG9ydCB7IFBvbGljeVN0YXRlbWVudCB9IGZyb20gXCIuL3BvbGljeS1zdGF0ZW1lbnRcIjtcbmltcG9ydCB7XG4gIEFjY291bnRQcmluY2lwYWwsXG4gIEFkZFRvUHJpbmNpcGFsUG9saWN5UmVzdWx0LFxuICBBcm5QcmluY2lwYWwsXG4gIElQcmluY2lwYWwsXG4gIFByaW5jaXBhbFBvbGljeUZyYWdtZW50LFxuICBTZXJ2aWNlUHJpbmNpcGFsLFxufSBmcm9tIFwiLi9wcmluY2lwYWxzXCI7XG5pbXBvcnQgeyBEdXJhdGlvbiB9IGZyb20gXCIuLi8uLlwiO1xuaW1wb3J0IHsgTXV0YXRpbmdQb2xpY3lEb2N1bWVudEFkYXB0ZXIgfSBmcm9tIFwiLi9wcml2YXRlL2FkYXB0ZXJcIjtcbmltcG9ydCB7IGRlZmF1bHRBZGRQcmluY2lwYWxUb0Fzc3VtZVJvbGUgfSBmcm9tIFwiLi9wcml2YXRlL2Fzc3VtZS1yb2xlLXBvbGljeVwiO1xuaW1wb3J0IHsgSW1tdXRhYmxlUm9sZSB9IGZyb20gXCIuL3ByaXZhdGUvaW1tdXRhYmxlLXJvbGVcIjtcbmltcG9ydCB7IEltcG9ydGVkUm9sZSB9IGZyb20gXCIuL3ByaXZhdGUvaW1wb3J0ZWQtcm9sZVwiO1xuLy8gaW1wb3J0IHsgUHJlY3JlYXRlZFJvbGUgfSBmcm9tIFwiLi9wcml2YXRlL3ByZWNyZWF0ZWQtcm9sZVwiO1xuaW1wb3J0IHsgQXR0YWNoZWRQb2xpY2llcywgVW5pcXVlU3RyaW5nU2V0IH0gZnJvbSBcIi4vcHJpdmF0ZS91dGlsXCI7XG5pbXBvcnQgeyBUb2tlbkNvbXBhcmlzb24sIHRva2VuQ29tcGFyZVN0cmluZ3MgfSBmcm9tIFwiLi4vLi4vdG9rZW5cIjtcblxuLy8gVE9ETzogUmUtQWRkIExhenlSb2xlP1xuLy8gcmVmOiBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvYmxvYi92Mi4xNTYuMC9wYWNrYWdlcy9hd3MtY2RrLWxpYi9hd3MtaWFtL2xpYi9sYXp5LXJvbGUudHNcblxuLy8gVE9ETzogcmUtaW1wbGVtZW50IGlhbSByb2xlIHBvbGljeSBzcGxpdHRpbmdcbi8vIGNvbnN0IE1BWF9JTkxJTkVfU0laRSA9IDEwMDAwO1xuLy8gY29uc3QgTUFYX01BTkFHRURQT0xfU0laRSA9IDYwMDA7XG5jb25zdCBJQU1fUk9MRV9TWU1CT0wgPSBTeW1ib2wuZm9yKFwidGVycmFjb25zdHJ1Y3RzL2xpYi9hd3MvaWFtLlJvbGVcIik7XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgZGVmaW5pbmcgYW4gSUFNIFJvbGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSb2xlUHJvcHMgZXh0ZW5kcyBBd3NDb25zdHJ1Y3RQcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgSUFNIHByaW5jaXBhbCAoaS5lLiBgbmV3IFNlcnZpY2VQcmluY2lwYWwoJ3Nucy5hbWF6b25hd3MuY29tJylgKVxuICAgKiB3aGljaCBjYW4gYXNzdW1lIHRoaXMgcm9sZS5cbiAgICpcbiAgICogWW91IGNhbiBsYXRlciBtb2RpZnkgdGhlIGFzc3VtZSByb2xlIHBvbGljeSBkb2N1bWVudCBieSBhY2Nlc3NpbmcgaXQgdmlhXG4gICAqIHRoZSBgYXNzdW1lUm9sZVBvbGljeWAgcHJvcGVydHkuXG4gICAqL1xuICByZWFkb25seSBhc3N1bWVkQnk6IElQcmluY2lwYWw7XG5cbiAgLyoqXG4gICAqIElEIHRoYXQgdGhlIHJvbGUgYXNzdW1lciBuZWVkcyB0byBwcm92aWRlIHdoZW4gYXNzdW1pbmcgdGhpcyByb2xlXG4gICAqXG4gICAqIElmIHRoZSBjb25maWd1cmVkIGFuZCBwcm92aWRlZCBleHRlcm5hbCBJRHMgZG8gbm90IG1hdGNoLCB0aGVcbiAgICogQXNzdW1lUm9sZSBvcGVyYXRpb24gd2lsbCBmYWlsLlxuICAgKlxuICAgKiBAZGVwcmVjYXRlZCBzZWUgYGV4dGVybmFsSWRzYFxuICAgKlxuICAgKiBAZGVmYXVsdCBObyBleHRlcm5hbCBJRCByZXF1aXJlZFxuICAgKi9cbiAgcmVhZG9ubHkgZXh0ZXJuYWxJZD86IHN0cmluZztcblxuICAvKipcbiAgICogTGlzdCBvZiBJRHMgdGhhdCB0aGUgcm9sZSBhc3N1bWVyIG5lZWRzIHRvIHByb3ZpZGUgb25lIG9mIHdoZW4gYXNzdW1pbmcgdGhpcyByb2xlXG4gICAqXG4gICAqIElmIHRoZSBjb25maWd1cmVkIGFuZCBwcm92aWRlZCBleHRlcm5hbCBJRHMgZG8gbm90IG1hdGNoLCB0aGVcbiAgICogQXNzdW1lUm9sZSBvcGVyYXRpb24gd2lsbCBmYWlsLlxuICAgKlxuICAgKiBAZGVmYXVsdCBObyBleHRlcm5hbCBJRCByZXF1aXJlZFxuICAgKi9cbiAgcmVhZG9ubHkgZXh0ZXJuYWxJZHM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogQSBsaXN0IG9mIG1hbmFnZWQgcG9saWNpZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcm9sZS5cbiAgICpcbiAgICogWW91IGNhbiBhZGQgbWFuYWdlZCBwb2xpY2llcyBsYXRlciB1c2luZ1xuICAgKiBgYWRkTWFuYWdlZFBvbGljeShNYW5hZ2VkUG9saWN5LmZyb21Bd3NNYW5hZ2VkUG9saWN5TmFtZShwb2xpY3lOYW1lKSlgLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIG1hbmFnZWQgcG9saWNpZXMuXG4gICAqL1xuICByZWFkb25seSBtYW5hZ2VkUG9saWNpZXM/OiBJTWFuYWdlZFBvbGljeVtdO1xuXG4gIC8qKlxuICAgKiBBIGxpc3Qgb2YgbmFtZWQgcG9saWNpZXMgdG8gaW5saW5lIGludG8gdGhpcyByb2xlLiBUaGVzZSBwb2xpY2llcyB3aWxsIGJlXG4gICAqIGNyZWF0ZWQgd2l0aCB0aGUgcm9sZSwgd2hlcmVhcyB0aG9zZSBhZGRlZCBieSBgYGFkZFRvUG9saWN5YGAgYXJlIGFkZGVkXG4gICAqIHVzaW5nIGEgc2VwYXJhdGUgQ2xvdWRGb3JtYXRpb24gcmVzb3VyY2UgKGFsbG93aW5nIGEgd2F5IGFyb3VuZCBjaXJjdWxhclxuICAgKiBkZXBlbmRlbmNpZXMgdGhhdCBjb3VsZCBvdGhlcndpc2UgYmUgaW50cm9kdWNlZCkuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gcG9saWN5IGlzIGlubGluZWQgaW4gdGhlIFJvbGUgcmVzb3VyY2UuXG4gICAqL1xuICByZWFkb25seSBpbmxpbmVQb2xpY2llcz86IHsgW25hbWU6IHN0cmluZ106IFBvbGljeURvY3VtZW50IH07XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJvbGUuIEZvciBpbmZvcm1hdGlvbiBhYm91dCBJQU0gcGF0aHMsIHNlZVxuICAgKiBGcmllbmRseSBOYW1lcyBhbmQgUGF0aHMgaW4gSUFNIFVzZXIgR3VpZGUuXG4gICAqXG4gICAqIEBkZWZhdWx0IC9cbiAgICovXG4gIHJlYWRvbmx5IHBhdGg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFXUyBzdXBwb3J0cyBwZXJtaXNzaW9ucyBib3VuZGFyaWVzIGZvciBJQU0gZW50aXRpZXMgKHVzZXJzIG9yIHJvbGVzKS5cbiAgICogQSBwZXJtaXNzaW9ucyBib3VuZGFyeSBpcyBhbiBhZHZhbmNlZCBmZWF0dXJlIGZvciB1c2luZyBhIG1hbmFnZWQgcG9saWN5XG4gICAqIHRvIHNldCB0aGUgbWF4aW11bSBwZXJtaXNzaW9ucyB0aGF0IGFuIGlkZW50aXR5LWJhc2VkIHBvbGljeSBjYW4gZ3JhbnQgdG9cbiAgICogYW4gSUFNIGVudGl0eS4gQW4gZW50aXR5J3MgcGVybWlzc2lvbnMgYm91bmRhcnkgYWxsb3dzIGl0IHRvIHBlcmZvcm0gb25seVxuICAgKiB0aGUgYWN0aW9ucyB0aGF0IGFyZSBhbGxvd2VkIGJ5IGJvdGggaXRzIGlkZW50aXR5LWJhc2VkIHBvbGljaWVzIGFuZCBpdHNcbiAgICogcGVybWlzc2lvbnMgYm91bmRhcmllcy5cbiAgICpcbiAgICogQGxpbmsgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0Nsb3VkRm9ybWF0aW9uL2xhdGVzdC9Vc2VyR3VpZGUvYXdzLXJlc291cmNlLWlhbS1yb2xlLmh0bWwjY2ZuLWlhbS1yb2xlLXBlcm1pc3Npb25zYm91bmRhcnlcbiAgICogQGxpbmsgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL2FjY2Vzc19wb2xpY2llc19ib3VuZGFyaWVzLmh0bWxcbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBwZXJtaXNzaW9ucyBib3VuZGFyeS5cbiAgICovXG4gIHJlYWRvbmx5IHBlcm1pc3Npb25zQm91bmRhcnk/OiBJTWFuYWdlZFBvbGljeTtcblxuICAvKipcbiAgICogQSBuYW1lIGZvciB0aGUgSUFNIHJvbGUuIEZvciB2YWxpZCB2YWx1ZXMsIHNlZSB0aGUgUm9sZU5hbWUgcGFyYW1ldGVyIGZvclxuICAgKiB0aGUgQ3JlYXRlUm9sZSBhY3Rpb24gaW4gdGhlIElBTSBBUEkgUmVmZXJlbmNlLlxuICAgKlxuICAgKiBJTVBPUlRBTlQ6IElmIHlvdSBzcGVjaWZ5IGEgbmFtZSwgeW91IGNhbm5vdCBwZXJmb3JtIHVwZGF0ZXMgdGhhdCByZXF1aXJlXG4gICAqIHJlcGxhY2VtZW50IG9mIHRoaXMgcmVzb3VyY2UuIFlvdSBjYW4gcGVyZm9ybSB1cGRhdGVzIHRoYXQgcmVxdWlyZSBubyBvclxuICAgKiBzb21lIGludGVycnVwdGlvbi4gSWYgeW91IG11c3QgcmVwbGFjZSB0aGUgcmVzb3VyY2UsIHNwZWNpZnkgYSBuZXcgbmFtZS5cbiAgICpcbiAgICogVXNlIFtUZXJyYWZvcm0gUmVzb3VyY2UgTWV0YSBBcmd1bWVudHNdKGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL3Jlc291cmNlcy9zeW50YXgjbWV0YS1hcmd1bWVudHMpXG4gICAqIHRvIGNvbnRyb2wgbGlmZWN5Y2xlIHdoZW4gcmVwbGFjaW5nIHRoZSByb2xlLlxuICAgKlxuICAgKiBTZWUgW0lBTSBJZGVudGlmaWVyc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL1VzaW5nX0lkZW50aWZpZXJzLmh0bWwpXG4gICAqIGZvciBtb3JlIGluZm9ybWF0aW9uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gSWYgb21pdHRlZCwgUmVmZXIgdG8gYHJvbGVOYW1lUHJlZml4YC5cbiAgICovXG4gIHJlYWRvbmx5IHJvbGVOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgdW5pcXVlIG5hbWUgYmVnaW5uaW5nIHdpdGggdGhlIHNwZWNpZmllZCBwcmVmaXguXG4gICAqIENvbmZsaWN0cyB3aXRoIGByb2xlTmFtZWAuXG4gICAqXG4gICAqIElNUE9SVEFOVDogSWYgeW91IHNwZWNpZnkgYSBuYW1lUHJlZml4LCB5b3UgY2Fubm90IHBlcmZvcm0gdXBkYXRlcyB0aGF0IHJlcXVpcmVcbiAgICogcmVwbGFjZW1lbnQgb2YgdGhpcyByZXNvdXJjZS4gWW91IGNhbiBwZXJmb3JtIHVwZGF0ZXMgdGhhdCByZXF1aXJlIG5vIG9yXG4gICAqIHNvbWUgaW50ZXJydXB0aW9uLiBJZiB5b3UgbXVzdCByZXBsYWNlIHRoZSByZXNvdXJjZSwgc3BlY2lmeSBhIG5ldyBuYW1lLlxuICAgKlxuICAgKiBVc2UgW1RlcnJhZm9ybSBSZXNvdXJjZSBNZXRhIEFyZ3VtZW50c10oaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvcmVzb3VyY2VzL3N5bnRheCNtZXRhLWFyZ3VtZW50cylcbiAgICogdG8gY29udHJvbCBsaWZlY3ljbGUgd2hlbiByZXBsYWNpbmcgdGhlIHJvbGUuXG4gICAqXG4gICAqIFNlZSBbSUFNIElkZW50aWZpZXJzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvVXNpbmdfSWRlbnRpZmllcnMuaHRtbClcbiAgICogZm9yIG1vcmUgaW5mb3JtYXRpb25cbiAgICpcbiAgICogQGRlZmF1bHQgLSBJZiBvbWl0dGVkLCBFVCB3aWxsIGFzc2lnbiBhIHJhbmRvbSwgdW5pcXVlIG5hbWUgcHJlZml4ZWQgYnkgR3JpZFVVSUQuXG4gICAqL1xuICByZWFkb25seSByb2xlTmFtZVByZWZpeD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG1heGltdW0gc2Vzc2lvbiBkdXJhdGlvbiBpbiBzZWNvbmRzIHRoYXQgeW91IHdhbnQgdG8gc2V0IGZvciB0aGUgc3BlY2lmaWVkIHJvbGUuXG4gICAqIFRoaXMgc2V0dGluZyBjYW4gaGF2ZSBhIHZhbHVlIGZyb20gMSBob3VyICgzNjAwc2VjKSB0byAxMiAoNDMyMDBzZWMpIGhvdXJzLlxuICAgKlxuICAgKiBBbnlvbmUgd2hvIGFzc3VtZXMgdGhlIHJvbGUgZnJvbSB0aGUgQVdTIENMSSBvciBBUEkgY2FuIHVzZSB0aGVcbiAgICogRHVyYXRpb25TZWNvbmRzIEFQSSBwYXJhbWV0ZXIgb3IgdGhlIGR1cmF0aW9uLXNlY29uZHMgQ0xJIHBhcmFtZXRlciB0b1xuICAgKiByZXF1ZXN0IGEgbG9uZ2VyIHNlc3Npb24uIFRoZSBNYXhTZXNzaW9uRHVyYXRpb24gc2V0dGluZyBkZXRlcm1pbmVzIHRoZVxuICAgKiBtYXhpbXVtIGR1cmF0aW9uIHRoYXQgY2FuIGJlIHJlcXVlc3RlZCB1c2luZyB0aGUgRHVyYXRpb25TZWNvbmRzXG4gICAqIHBhcmFtZXRlci5cbiAgICpcbiAgICogSWYgdXNlcnMgZG9uJ3Qgc3BlY2lmeSBhIHZhbHVlIGZvciB0aGUgRHVyYXRpb25TZWNvbmRzIHBhcmFtZXRlciwgdGhlaXJcbiAgICogc2VjdXJpdHkgY3JlZGVudGlhbHMgYXJlIHZhbGlkIGZvciBvbmUgaG91ciBieSBkZWZhdWx0LiBUaGlzIGFwcGxpZXMgd2hlblxuICAgKiB5b3UgdXNlIHRoZSBBc3N1bWVSb2xlKiBBUEkgb3BlcmF0aW9ucyBvciB0aGUgYXNzdW1lLXJvbGUqIENMSSBvcGVyYXRpb25zXG4gICAqIGJ1dCBkb2VzIG5vdCBhcHBseSB3aGVuIHlvdSB1c2UgdGhvc2Ugb3BlcmF0aW9ucyB0byBjcmVhdGUgYSBjb25zb2xlIFVSTC5cbiAgICpcbiAgICogQGxpbmsgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL2lkX3JvbGVzX3VzZS5odG1sXG4gICAqXG4gICAqIEBkZWZhdWx0IER1cmF0aW9uLmhvdXJzKDEpXG4gICAqL1xuICByZWFkb25seSBtYXhTZXNzaW9uRHVyYXRpb24/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogQSBkZXNjcmlwdGlvbiBvZiB0aGUgcm9sZS4gSXQgY2FuIGJlIHVwIHRvIDEwMDAgY2hhcmFjdGVycyBsb25nLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIGRlc2NyaXB0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZm9yY2UgZGV0YWNoaW5nIGFueSBwb2xpY2llcyB0aGUgcm9sZSBoYXMgYmVmb3JlIGRlc3Ryb3lpbmcgaXRcbiAgICogSWYgcG9saWNpZXMgYXJlIGF0dGFjaGVkIHRvIHRoZSByb2xlIHZpYSB0aGUgYGF3c19pYW1fcG9saWN5X2F0dGFjaG1lbnRgXG4gICAqIHJlc291cmNlIGFuZCB5b3UgYXJlIG1vZGlmeWluZyB0aGUgcm9sZSBgbmFtZWAgb3IgYHBhdGhgLCB0aGlzIG11c3QgYmVcbiAgICogc2V0IHRvIGB0cnVlYCBhbmQgYXBwbGllZCBiZWZvcmUgYXR0ZW1wdGluZyB0aGUgb3BlcmF0aW9uIG90aGVyd2lzZSB5b3VcbiAgICogd2lsbCBlbmNvdW50ZXIgYSBgRGVsZXRlQ29uZmxpY3RgIGVycm9yLlxuICAgKlxuICAgKiBUaGUgYGF3c19pYW1fcm9sZV9wb2xpY3lfYXR0YWNobWVudGAgcmVzb3VyY2UgKHJlY29tbWVuZGVkKSBkb2VzIG5vdFxuICAgKiBoYXZlIHRoaXMgcmVxdWlyZW1lbnQuXG4gICAqXG4gICAqIE5PVEU6IFRoZSBgaWFtLlBvbGljeWAgdXNlcyBgYXdzX2lhbV9yb2xlX3BvbGljeV9hdHRhY2htZW50YCB1bmRlclxuICAgKiB0aGUgaG9vZCBhbmQgdGhpcyBzaG91bGQgbm90IGJlIGEgY29uY2Vybi5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgZm9yY2VEZXRhY2hQb2xpY2llcz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogT3B0aW9ucyBhbGxvd2luZyBjdXN0b21pemluZyB0aGUgYmVoYXZpb3Igb2YgYFJvbGUuZnJvbVJvbGVBcm5gLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZyb21Sb2xlQXJuT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBpbXBvcnRlZCByb2xlIGNhbiBiZSBtb2RpZmllZCBieSBhdHRhY2hpbmcgcG9saWN5IHJlc291cmNlcyB0byBpdC5cbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgbXV0YWJsZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEZvciBpbW11dGFibGUgcm9sZXM6IGFkZCBncmFudHMgdG8gcmVzb3VyY2VzIGluc3RlYWQgb2YgZHJvcHBpbmcgdGhlbVxuICAgKlxuICAgKiBJZiB0aGlzIGlzIGBmYWxzZWAgb3Igbm90IHNwZWNpZmllZCwgZ3JhbnQgcGVybWlzc2lvbnMgYWRkZWQgdG8gdGhpcyByb2xlIGFyZSBpZ25vcmVkLlxuICAgKiBJdCBpcyB5b3VyIG93biByZXNwb25zaWJpbGl0eSB0byBtYWtlIHN1cmUgdGhlIHJvbGUgaGFzIHRoZSByZXF1aXJlZCBwZXJtaXNzaW9ucy5cbiAgICpcbiAgICogSWYgdGhpcyBpcyBgdHJ1ZWAsIGFueSBncmFudCBwZXJtaXNzaW9ucyB3aWxsIGJlIGFkZGVkIHRvIHRoZSByZXNvdXJjZSBpbnN0ZWFkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgYWRkR3JhbnRzVG9SZXNvdXJjZXM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBbnkgcG9saWNpZXMgY3JlYXRlZCBieSB0aGlzIHJvbGUgd2lsbCB1c2UgdGhpcyB2YWx1ZSBhcyB0aGVpciBJRCwgaWYgc3BlY2lmaWVkLlxuICAgKiBTcGVjaWZ5IHRoaXMgaWYgaW1wb3J0aW5nIHRoZSBzYW1lIHJvbGUgaW4gbXVsdGlwbGUgc3RhY2tzLCBhbmQgZ3JhbnRpbmcgaXRcbiAgICogZGlmZmVyZW50IHBlcm1pc3Npb25zIGluIGF0IGxlYXN0IHR3byBzdGFja3MuIElmIHRoaXMgaXMgbm90IHNwZWNpZmllZFxuICAgKiAob3IgaWYgdGhlIHNhbWUgbmFtZSBpcyBzcGVjaWZpZWQgaW4gbW9yZSB0aGFuIG9uZSBzdGFjayksXG4gICAqIGEgVGVycmFmb3JtIGlzc3VlIHdpbGwgcmVzdWx0IGluIHRoZSBwb2xpY3kgY3JlYXRlZCBpbiB3aGljaGV2ZXIgc3RhY2tcbiAgICogaXMgZGVwbG95ZWQgbGFzdCBvdmVyd3JpdGluZyB0aGUgcG9saWNpZXMgY3JlYXRlZCBieSB0aGUgb3RoZXJzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAnUG9saWN5J1xuICAgKi9cbiAgcmVhZG9ubHkgZGVmYXVsdFBvbGljeU5hbWU/OiBzdHJpbmc7XG59XG5cbi8vIFRPRE86IHN1cHBvcnQgZm9yIHByZS1jcmVhdGVkIHJvbGVzP1xuLy8gcmVmOiBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvYmxvYi92Mi4xNDMuMC9wYWNrYWdlcy9hd3MtY2RrLWxpYi9hd3MtaWFtL2xpYi9yb2xlLnRzI0wxODZcbi8vIE5PVEU6IGluIFRlcnJhQ29uc3RydWN0IHByZS1jcmVhdGVkIHJvbGVzIGFyZSBwYXNzZWQgaW4gdGhyb3VnaCB0aGUgR3JpZCwgc28gdGhpcyBzZWVtcyBub3QgbmVlZGVkLlxuXG4vKipcbiAqIE9wdGlvbnMgYWxsb3dpbmcgY3VzdG9taXppbmcgdGhlIGJlaGF2aW9yIG9mIGBSb2xlLmZyb21Sb2xlTmFtZWAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRnJvbVJvbGVOYW1lT3B0aW9ucyBleHRlbmRzIEZyb21Sb2xlQXJuT3B0aW9ucyB7fVxuXG4vKipcbiAqIElBTSBSb2xlXG4gKlxuICogRGVmaW5lcyBhbiBJQU0gcm9sZS4gVGhlIHJvbGUgaXMgY3JlYXRlZCB3aXRoIGFuIGFzc3VtZSBwb2xpY3kgZG9jdW1lbnQgYXNzb2NpYXRlZCB3aXRoXG4gKiB0aGUgc3BlY2lmaWVkIEFXUyBzZXJ2aWNlIHByaW5jaXBhbCBkZWZpbmVkIGluIGBzZXJ2aWNlQXNzdW1lUm9sZWAuXG4gKi9cbmV4cG9ydCBjbGFzcyBSb2xlIGV4dGVuZHMgQXdzQ29uc3RydWN0QmFzZSBpbXBsZW1lbnRzIElSb2xlIHtcbiAgLyoqXG4gICAqIEltcG9ydCBhbiBleHRlcm5hbCByb2xlIGJ5IEFSTi5cbiAgICpcbiAgICogSWYgdGhlIGltcG9ydGVkIFJvbGUgQVJOIGlzIGEgVG9rZW4gKHN1Y2ggYXMgYVxuICAgKiBgQ2ZuUGFyYW1ldGVyLnZhbHVlQXNTdHJpbmdgIG9yIGEgYEZuLmltcG9ydFZhbHVlKClgKSAqYW5kKiB0aGUgcmVmZXJlbmNlZFxuICAgKiByb2xlIGhhcyBhIGBwYXRoYCAobGlrZSBgYXJuOi4uLjpyb2xlL0FkbWluUm9sZXMvQWxpY2VgKSwgdGhlXG4gICAqIGByb2xlTmFtZWAgcHJvcGVydHkgd2lsbCBub3QgcmVzb2x2ZSB0byB0aGUgY29ycmVjdCB2YWx1ZS4gSW5zdGVhZCBpdFxuICAgKiB3aWxsIHJlc29sdmUgdG8gdGhlIGZpcnN0IHBhdGggY29tcG9uZW50LiBXZSB1bmZvcnR1bmF0ZWx5IGNhbm5vdCBleHByZXNzXG4gICAqIHRoZSBjb3JyZWN0IGNhbGN1bGF0aW9uIG9mIHRoZSBmdWxsIHBhdGggbmFtZSBhcyBhIENsb3VkRm9ybWF0aW9uXG4gICAqIGV4cHJlc3Npb24uIEluIHRoaXMgc2NlbmFyaW8gdGhlIFJvbGUgQVJOIHNob3VsZCBiZSBzdXBwbGllZCB3aXRob3V0IHRoZVxuICAgKiBgcGF0aGAgaW4gb3JkZXIgdG8gcmVzb2x2ZSB0aGUgY29ycmVjdCByb2xlIHJlc291cmNlLlxuICAgKlxuICAgKiBAcGFyYW0gc2NvcGUgY29uc3RydWN0IHNjb3BlXG4gICAqIEBwYXJhbSBpZCBjb25zdHJ1Y3QgaWRcbiAgICogQHBhcmFtIHJvbGVBcm4gdGhlIEFSTiBvZiB0aGUgcm9sZSB0byBpbXBvcnRcbiAgICogQHBhcmFtIG9wdGlvbnMgYWxsb3cgY3VzdG9taXppbmcgdGhlIGJlaGF2aW9yIG9mIHRoZSByZXR1cm5lZCByb2xlXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21Sb2xlQXJuKFxuICAgIHNjb3BlOiBDb25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICByb2xlQXJuOiBzdHJpbmcsXG4gICAgb3B0aW9uczogRnJvbVJvbGVBcm5PcHRpb25zID0ge30sXG4gICk6IElSb2xlIHtcbiAgICBjb25zdCBzY29wZVN0YWNrID0gQXdzU3RhY2sub2ZBd3NDb25zdHJ1Y3Qoc2NvcGUpO1xuICAgIGNvbnN0IHBhcnNlZEFybiA9IHNjb3BlU3RhY2suc3BsaXRBcm4oXG4gICAgICByb2xlQXJuLFxuICAgICAgQXJuRm9ybWF0LlNMQVNIX1JFU09VUkNFX05BTUUsXG4gICAgKTtcbiAgICBjb25zdCByZXNvdXJjZU5hbWUgPSBwYXJzZWRBcm4ucmVzb3VyY2VOYW1lITtcbiAgICBjb25zdCByb2xlQWNjb3VudCA9IHBhcnNlZEFybi5hY2NvdW50O1xuICAgIC8vIHNlcnZpY2Ugcm9sZXMgaGF2ZSBhbiBBUk4gbGlrZSAnYXJuOmF3czppYW06OjxhY2NvdW50Pjpyb2xlL3NlcnZpY2Utcm9sZS88cm9sZU5hbWU+J1xuICAgIC8vIG9yICdhcm46YXdzOmlhbTo6PGFjY291bnQ+OnJvbGUvc2VydmljZS1yb2xlL3NlcnZpY2VuYW1lLmFtYXpvbmF3cy5jb20vc2VydmljZS1yb2xlLzxyb2xlTmFtZT4nXG4gICAgLy8gd2Ugd2FudCB0byBzdXBwb3J0IHRoZXNlIGFzIHdlbGwsIHNvIHdlIGp1c3QgdXNlIHRoZSBlbGVtZW50IGFmdGVyIHRoZSBsYXN0IHNsYXNoIGFzIHJvbGUgbmFtZVxuICAgIGNvbnN0IHJvbGVOYW1lID0gcmVzb3VyY2VOYW1lLnNwbGl0KFwiL1wiKS5wb3AoKSE7XG5cbiAgICAvLyBpZiAoZ2V0Q3VzdG9taXplUm9sZXNDb25maWcoc2NvcGUpLmVuYWJsZWQpIHtcbiAgICAvLyAgIHJldHVybiBuZXcgUHJlY3JlYXRlZFJvbGUoc2NvcGUsIGlkLCB7XG4gICAgLy8gICAgIHJvbGVQYXRoOiBgJHtzY29wZS5ub2RlLnBhdGh9LyR7aWR9YCxcbiAgICAvLyAgICAgcm9sZTogbmV3IEltcG9ydGVkUm9sZShzY29wZSwgYEltcG9ydCR7aWR9YCwge1xuICAgIC8vICAgICAgIGFjY291bnQ6IHJvbGVBY2NvdW50LFxuICAgIC8vICAgICAgIHJvbGVBcm4sXG4gICAgLy8gICAgICAgcm9sZU5hbWUsXG4gICAgLy8gICAgICAgLi4ub3B0aW9ucyxcbiAgICAvLyAgICAgfSksXG4gICAgLy8gICB9KTtcbiAgICAvLyB9XG5cbiAgICBpZiAoXG4gICAgICBvcHRpb25zLmFkZEdyYW50c1RvUmVzb3VyY2VzICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIG9wdGlvbnMubXV0YWJsZSAhPT0gZmFsc2VcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCInYWRkR3JhbnRzVG9SZXNvdXJjZXMnIGNhbiBvbmx5IGJlIHBhc3NlZCBpZiAnbXV0YWJsZTogZmFsc2UnXCIsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHJvbGVBcm5BbmRTY29wZVN0YWNrQWNjb3VudENvbXBhcmlzb24gPSB0b2tlbkNvbXBhcmVTdHJpbmdzKFxuICAgICAgcm9sZUFjY291bnQgPz8gXCJcIixcbiAgICAgIHNjb3BlU3RhY2suYWNjb3VudCxcbiAgICApO1xuICAgIGNvbnN0IGVxdWFsT3JBbnlVbnJlc29sdmVkID1cbiAgICAgIHJvbGVBcm5BbmRTY29wZVN0YWNrQWNjb3VudENvbXBhcmlzb24gPT09IFRva2VuQ29tcGFyaXNvbi5TQU1FIHx8XG4gICAgICByb2xlQXJuQW5kU2NvcGVTdGFja0FjY291bnRDb21wYXJpc29uID09PVxuICAgICAgICBUb2tlbkNvbXBhcmlzb24uQk9USF9VTlJFU09MVkVEIHx8XG4gICAgICByb2xlQXJuQW5kU2NvcGVTdGFja0FjY291bnRDb21wYXJpc29uID09PSBUb2tlbkNvbXBhcmlzb24uT05FX1VOUkVTT0xWRUQ7XG5cbiAgICAvLyBpZiB3ZSBhcmUgcmV0dXJuaW5nIGFuIGltbXV0YWJsZSByb2xlIHRoZW4gdGhlICdpbXBvcnRlZFJvbGUnIGlzIGp1c3QgYSB0aHJvd2F3YXkgY29uc3RydWN0XG4gICAgLy8gc28gZ2l2ZSBpdCBhIGRpZmZlcmVudCBpZFxuICAgIGNvbnN0IG11dGFibGVSb2xlSWQgPVxuICAgICAgb3B0aW9ucy5tdXRhYmxlICE9PSBmYWxzZSAmJiBlcXVhbE9yQW55VW5yZXNvbHZlZFxuICAgICAgICA/IGlkXG4gICAgICAgIDogYE11dGFibGVSb2xlJHtpZH1gO1xuICAgIGNvbnN0IGltcG9ydGVkUm9sZSA9IG5ldyBJbXBvcnRlZFJvbGUoc2NvcGUsIG11dGFibGVSb2xlSWQsIHtcbiAgICAgIHJvbGVBcm4sXG4gICAgICByb2xlTmFtZSxcbiAgICAgIGFjY291bnQ6IHJvbGVBY2NvdW50LFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9KTtcblxuICAgIC8vIHdlIG9ubHkgcmV0dXJuIGFuIGltbXV0YWJsZSBSb2xlIGlmIGJvdGggYWNjb3VudHMgd2VyZSBleHBsaWNpdGx5IHByb3ZpZGVkLCBhbmQgZGlmZmVyZW50XG4gICAgcmV0dXJuIG9wdGlvbnMubXV0YWJsZSAhPT0gZmFsc2UgJiYgZXF1YWxPckFueVVucmVzb2x2ZWRcbiAgICAgID8gaW1wb3J0ZWRSb2xlXG4gICAgICA6IG5ldyBJbW11dGFibGVSb2xlKFxuICAgICAgICAgIHNjb3BlLFxuICAgICAgICAgIGlkLFxuICAgICAgICAgIGltcG9ydGVkUm9sZSxcbiAgICAgICAgICBvcHRpb25zLmFkZEdyYW50c1RvUmVzb3VyY2VzID8/IGZhbHNlLFxuICAgICAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB3aGV0aGVyIHRoZSBnaXZlbiBvYmplY3QgaXMgYSBSb2xlXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGlzUm9sZSh4OiBhbnkpOiB4IGlzIFJvbGUge1xuICAgIHJldHVybiB4ICE9PSBudWxsICYmIHR5cGVvZiB4ID09PSBcIm9iamVjdFwiICYmIElBTV9ST0xFX1NZTUJPTCBpbiB4O1xuICB9XG5cbiAgLyoqXG4gICAqIEltcG9ydCBhbiBleHRlcm5hbCByb2xlIGJ5IG5hbWUuXG4gICAqXG4gICAqIFRoZSBpbXBvcnRlZCByb2xlIGlzIGFzc3VtZWQgdG8gZXhpc3QgaW4gdGhlIHNhbWUgYWNjb3VudCBhcyB0aGUgYWNjb3VudFxuICAgKiB0aGUgc2NvcGUncyBjb250YWluaW5nIFN0YWNrIGlzIGJlaW5nIGRlcGxveWVkIHRvLlxuXG4gICAqIEBwYXJhbSBzY29wZSBjb25zdHJ1Y3Qgc2NvcGVcbiAgICogQHBhcmFtIGlkIGNvbnN0cnVjdCBpZFxuICAgKiBAcGFyYW0gcm9sZU5hbWUgdGhlIG5hbWUgb2YgdGhlIHJvbGUgdG8gaW1wb3J0XG4gICAqIEBwYXJhbSBvcHRpb25zIGFsbG93IGN1c3RvbWl6aW5nIHRoZSBiZWhhdmlvciBvZiB0aGUgcmV0dXJuZWQgcm9sZVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tUm9sZU5hbWUoXG4gICAgc2NvcGU6IENvbnN0cnVjdCxcbiAgICBpZDogc3RyaW5nLFxuICAgIHJvbGVOYW1lOiBzdHJpbmcsXG4gICAgb3B0aW9uczogRnJvbVJvbGVOYW1lT3B0aW9ucyA9IHt9LFxuICApIHtcbiAgICByZXR1cm4gUm9sZS5mcm9tUm9sZUFybihcbiAgICAgIHNjb3BlLFxuICAgICAgaWQsXG4gICAgICBBd3NTdGFjay5vZkF3c0NvbnN0cnVjdChzY29wZSkuZm9ybWF0QXJuKHtcbiAgICAgICAgcmVnaW9uOiBcIlwiLFxuICAgICAgICBzZXJ2aWNlOiBcImlhbVwiLFxuICAgICAgICByZXNvdXJjZTogXCJyb2xlXCIsXG4gICAgICAgIHJlc291cmNlTmFtZTogcm9sZU5hbWUsXG4gICAgICB9KSxcbiAgICAgIG9wdGlvbnMsXG4gICAgKTtcbiAgfVxuXG4gIC8vIFRPRE86IFN1cHBvcnQgY3VzdG9tIHJvbGUgY3JlYXRpb25cbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2Jsb2IvdjIuMTQzLjAvcGFja2FnZXMvYXdzLWNkay1saWIvYXdzLWlhbS9saWIvcm9sZS50cyNMMzU1XG5cbiAgcHVibGljIHJlYWRvbmx5IGdyYW50UHJpbmNpcGFsOiBJUHJpbmNpcGFsID0gdGhpcztcbiAgcHVibGljIHJlYWRvbmx5IHByaW5jaXBhbEFjY291bnQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHRoaXMuZW52LmFjY291bnQ7XG5cbiAgcHVibGljIHJlYWRvbmx5IGFzc3VtZVJvbGVBY3Rpb246IHN0cmluZyA9IFwic3RzOkFzc3VtZVJvbGVcIjtcblxuICAvKipcbiAgICogVGhlIGFzc3VtZSByb2xlIHBvbGljeSBkb2N1bWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyByb2xlLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGFzc3VtZVJvbGVQb2xpY3k/OiBQb2xpY3lEb2N1bWVudDtcblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgQVJOIG9mIHRoaXMgcm9sZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSByb2xlQXJuOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHJvbGUuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcm9sZU5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgcm9sZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwb2xpY3lGcmFnbWVudDogUHJpbmNpcGFsUG9saWN5RnJhZ21lbnQ7XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHBlcm1pc3Npb25zIGJvdW5kYXJ5IGF0dGFjaGVkIHRvIHRoaXMgcm9sZVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHBlcm1pc3Npb25zQm91bmRhcnk/OiBJTWFuYWdlZFBvbGljeTtcblxuICAvKiogU3Ryb25nbHkgdHlwZWQgT3V0cHV0cyAqL1xuICBwdWJsaWMgZ2V0IHJvbGVPdXRwdXRzKCk6IFJvbGVPdXRwdXRzIHtcbiAgICByZXR1cm4ge1xuICAgICAgYXJuOiB0aGlzLnJvbGVBcm4sXG4gICAgICBuYW1lOiB0aGlzLnJvbGVOYW1lLFxuICAgIH07XG4gIH1cbiAgcHVibGljIGdldCBvdXRwdXRzKCk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgIHJldHVybiB0aGlzLnJvbGVPdXRwdXRzO1xuICB9XG4gIC8qKlxuICAgKiBEaXJlY3QgYWNjZXNzIHRvIHRoZSB1bmRlcmx5aW5nIFRlcnJhZm9ybSByZXNvdXJjZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSByZXNvdXJjZTogaWFtUm9sZS5JYW1Sb2xlO1xuICBwcml2YXRlIGRlZmF1bHRQb2xpY3k/OiBQb2xpY3k7XG4gIHByaXZhdGUgcmVhZG9ubHkgbWFuYWdlZFBvbGljaWVzOiBJTWFuYWdlZFBvbGljeVtdID0gW107XG4gIHByaXZhdGUgcmVhZG9ubHkgYXR0YWNoZWRQb2xpY2llcyA9IG5ldyBBdHRhY2hlZFBvbGljaWVzKCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgaW5saW5lUG9saWNpZXM6IHsgW25hbWU6IHN0cmluZ106IFBvbGljeURvY3VtZW50IH07XG4gIC8vIHByaXZhdGUgcmVhZG9ubHkgZGVwZW5kYWJsZXMgPSBuZXcgTWFwPFBvbGljeVN0YXRlbWVudCwgRGVwZW5kZW5jeUdyb3VwPigpO1xuICBwcml2YXRlIGltbXV0YWJsZVJvbGU/OiBJUm9sZTtcbiAgLy8gcHJpdmF0ZSBfZGlkU3BsaXQgPSBmYWxzZTtcbiAgcHJpdmF0ZSByZWFkb25seSBfcm9sZUlkOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFJvbGVQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwgcHJvcHMpO1xuXG4gICAgaWYgKFxuICAgICAgcHJvcHMucm9sZU5hbWUgJiZcbiAgICAgICFUb2tlbi5pc1VucmVzb2x2ZWQocHJvcHMucm9sZU5hbWUpICYmXG4gICAgICAhL15bXFx3Kz0sLkAtXXsxLDY0fSQvLnRlc3QocHJvcHMucm9sZU5hbWUpXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiSW52YWxpZCByb2xlTmFtZS4gVGhlIG5hbWUgbXVzdCBiZSBhIHN0cmluZyBvZiBjaGFyYWN0ZXJzIGNvbnNpc3Rpbmcgb2YgdXBwZXIgYW5kIGxvd2VyY2FzZSBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyB3aXRoIG5vIHNwYWNlcy4gWW91IGNhbiBhbHNvIGluY2x1ZGUgYW55IG9mIHRoZSBmb2xsb3dpbmcgY2hhcmFjdGVyczogXys9LC5ALS4gTGVuZ3RoIG11c3QgYmUgYmV0d2VlbiAxIGFuZCA2NCBjaGFyYWN0ZXJzLlwiLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAocHJvcHMucm9sZU5hbWUgJiYgcHJvcHMucm9sZU5hbWVQcmVmaXgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJDYW5ub3Qgc3BlY2lmeSBib3RoICdyb2xlTmFtZScgYW5kICdyb2xlTmFtZVByZWZpeCcuIFVzZSBvbmx5IG9uZS5cIixcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgZXh0ZXJuYWxJZHMgPSBwcm9wcy5leHRlcm5hbElkcyB8fCBbXTtcbiAgICBpZiAocHJvcHMuZXh0ZXJuYWxJZCkge1xuICAgICAgZXh0ZXJuYWxJZHMucHVzaChwcm9wcy5leHRlcm5hbElkKTtcbiAgICB9XG5cbiAgICB0aGlzLmFzc3VtZVJvbGVQb2xpY3kgPSBjcmVhdGVBc3N1bWVSb2xlUG9saWN5KFxuICAgICAgdGhpcyxcbiAgICAgIFwiQXNzdW1lUm9sZVBvbGljeVwiLFxuICAgICAgcHJvcHMuYXNzdW1lZEJ5LFxuICAgICAgZXh0ZXJuYWxJZHMsXG4gICAgKTtcbiAgICB0aGlzLm1hbmFnZWRQb2xpY2llcy5wdXNoKC4uLihwcm9wcy5tYW5hZ2VkUG9saWNpZXMgfHwgW10pKTtcbiAgICB0aGlzLmlubGluZVBvbGljaWVzID0gcHJvcHMuaW5saW5lUG9saWNpZXMgfHwge307XG4gICAgdGhpcy5wZXJtaXNzaW9uc0JvdW5kYXJ5ID0gcHJvcHMucGVybWlzc2lvbnNCb3VuZGFyeTtcbiAgICBjb25zdCBtYXhTZXNzaW9uRHVyYXRpb24gPVxuICAgICAgcHJvcHMubWF4U2Vzc2lvbkR1cmF0aW9uICYmIHByb3BzLm1heFNlc3Npb25EdXJhdGlvbi50b1NlY29uZHMoKTtcbiAgICB2YWxpZGF0ZU1heFNlc3Npb25EdXJhdGlvbihtYXhTZXNzaW9uRHVyYXRpb24pO1xuICAgIGNvbnN0IGRlc2NyaXB0aW9uID1cbiAgICAgIHByb3BzLmRlc2NyaXB0aW9uICYmIHByb3BzLmRlc2NyaXB0aW9uPy5sZW5ndGggPiAwXG4gICAgICAgID8gcHJvcHMuZGVzY3JpcHRpb25cbiAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICBpZiAoZGVzY3JpcHRpb24gJiYgZGVzY3JpcHRpb24ubGVuZ3RoID4gMTAwMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIlJvbGUgZGVzY3JpcHRpb24gbXVzdCBiZSBubyBsb25nZXIgdGhhbiAxMDAwIGNoYXJhY3RlcnMuXCIsXG4gICAgICApO1xuICAgIH1cblxuICAgIHZhbGlkYXRlUm9sZVBhdGgocHJvcHMucGF0aCk7XG5cbiAgICAvLyBwcmUtY3JlYXRlZCByb2xlIHNuaXBwZWRcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvYmxvYi92Mi4xNDMuMC9wYWNrYWdlcy9hd3MtY2RrLWxpYi9hd3MtaWFtL2xpYi9yb2xlLnRzI0w0MzlcblxuICAgIGNvbnN0IG5hbWVQcmVmaXggPSB0aGlzLnN0YWNrLnVuaXF1ZVJlc291cmNlTmFtZVByZWZpeCh0aGlzLCB7XG4gICAgICBwcmVmaXg6IHByb3BzLnJvbGVOYW1lUHJlZml4ID8/IHRoaXMuZ3JpZFVVSUQgKyBcIi1cIixcbiAgICAgIGFsbG93ZWRTcGVjaWFsQ2hhcmFjdGVyczogXCJfKz0sLkAtXCIsXG4gICAgICBtYXhMZW5ndGg6IDY0LFxuICAgIH0pO1xuXG4gICAgdGhpcy5yZXNvdXJjZSA9IG5ldyBpYW1Sb2xlLklhbVJvbGUodGhpcywgXCJSZXNvdXJjZVwiLCB7XG4gICAgICAuLi5wcm9wcywgLy8gY29weSBvdmVyIFRlcnJhZm9ybSBNZXRhIEFyZ3VtZW50cyBmcm9tIENvbnN0cnVjdFByb3BzXG4gICAgICBhc3N1bWVSb2xlUG9saWN5OiB0aGlzLmFzc3VtZVJvbGVQb2xpY3kuanNvbixcbiAgICAgIG1hbmFnZWRQb2xpY3lBcm5zOiBVbmlxdWVTdHJpbmdTZXQuZnJvbSgoKSA9PlxuICAgICAgICB0aGlzLm1hbmFnZWRQb2xpY2llcy5tYXAoKHApID0+IHAubWFuYWdlZFBvbGljeUFybiksXG4gICAgICApLFxuICAgICAgaW5saW5lUG9saWN5OiBfZmxhdHRlbih0aGlzLmlubGluZVBvbGljaWVzKSxcbiAgICAgIHBhdGg6IHByb3BzLnBhdGgsXG4gICAgICBwZXJtaXNzaW9uc0JvdW5kYXJ5OiB0aGlzLnBlcm1pc3Npb25zQm91bmRhcnlcbiAgICAgICAgPyB0aGlzLnBlcm1pc3Npb25zQm91bmRhcnkubWFuYWdlZFBvbGljeUFyblxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIG5hbWU6IHByb3BzLnJvbGVOYW1lLFxuICAgICAgbmFtZVByZWZpeDogIXByb3BzLnJvbGVOYW1lID8gbmFtZVByZWZpeCA6IHVuZGVmaW5lZCxcbiAgICAgIG1heFNlc3Npb25EdXJhdGlvbixcbiAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgZm9yY2VEZXRhY2hQb2xpY2llczogcHJvcHMuZm9yY2VEZXRhY2hQb2xpY2llcyxcbiAgICB9KTtcblxuICAgIC8vIFN0YWJsZSBhbmQgdW5pcXVlIHN0cmluZyBpZGVudGlmeWluZyB0aGUgcm9sZS5cbiAgICB0aGlzLl9yb2xlSWQgPSB0aGlzLnJlc291cmNlLnVuaXF1ZUlkO1xuXG4gICAgLy8gVE9ETzogTmVlZCB0byBoYW5kbGUgY3Jvc3MgZW52IEFSTiByZWZzP1xuICAgIC8vIENESzogaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2Jsb2IvdjIuMTQzLjAvcGFja2FnZXMvYXdzLWNkay1saWIvY29yZS9saWIvcmVzb3VyY2UudHMjTDI4OFxuICAgIHRoaXMucm9sZUFybiA9IHRoaXMucmVzb3VyY2UuYXJuO1xuICAgIC8vIFRPRE86IE5lZWQgdG8gaGFuZGxlIGNyb3NzIGVudiBOYW1lIHJlZnM/XG4gICAgLy8gQ0RLOiBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvYmxvYi92Mi4xNDMuMC9wYWNrYWdlcy9hd3MtY2RrLWxpYi9jb3JlL2xpYi9yZXNvdXJjZS50cyNMMjU0XG4gICAgdGhpcy5yb2xlTmFtZSA9IHRoaXMucmVzb3VyY2UubmFtZTtcblxuICAgIC8vIFRPRE86IFJlLWFkZCBwb2xpY3kgc3BsaXR0aW5nP1xuICAgIC8vIEFzcGVjdHMub2YodGhpcykuYWRkKHtcbiAgICAvLyAgIHZpc2l0OiAoYykgPT4ge1xuICAgIC8vICAgICBpZiAoYyA9PT0gdGhpcykge1xuICAgIC8vICAgICAgIHRoaXMuc3BsaXRMYXJnZVBvbGljeSgpO1xuICAgIC8vICAgICB9XG4gICAgLy8gICB9LFxuICAgIC8vIH0pO1xuXG4gICAgdGhpcy5wb2xpY3lGcmFnbWVudCA9IG5ldyBBcm5QcmluY2lwYWwodGhpcy5yb2xlQXJuKS5wb2xpY3lGcmFnbWVudDtcblxuICAgIGZ1bmN0aW9uIF9mbGF0dGVuKHBvbGljaWVzPzogeyBbbmFtZTogc3RyaW5nXTogUG9saWN5RG9jdW1lbnQgfSkge1xuICAgICAgaWYgKHBvbGljaWVzID09IG51bGwgfHwgT2JqZWN0LmtleXMocG9saWNpZXMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IEFycmF5PGlhbVJvbGUuSWFtUm9sZUlubGluZVBvbGljeT4oKTtcbiAgICAgIGZvciAoY29uc3QgcG9saWN5TmFtZSBvZiBPYmplY3Qua2V5cyhwb2xpY2llcykpIHtcbiAgICAgICAgY29uc3QgcG9saWN5RG9jdW1lbnQgPSBwb2xpY2llc1twb2xpY3lOYW1lXTtcbiAgICAgICAgcmVzdWx0LnB1c2goe1xuICAgICAgICAgIG5hbWU6IHBvbGljeU5hbWUsXG4gICAgICAgICAgcG9saWN5OiBwb2xpY3lEb2N1bWVudC5qc29uLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgdGhpcy5ub2RlLmFkZFZhbGlkYXRpb24oeyB2YWxpZGF0ZTogKCkgPT4gdGhpcy52YWxpZGF0ZVJvbGUoKSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcGVybWlzc2lvbiB0byB0aGUgcm9sZSdzIGRlZmF1bHQgcG9saWN5IGRvY3VtZW50LlxuICAgKiBJZiB0aGVyZSBpcyBubyBkZWZhdWx0IHBvbGljeSBhdHRhY2hlZCB0byB0aGlzIHJvbGUsIGl0IHdpbGwgYmUgY3JlYXRlZC5cbiAgICogQHBhcmFtIHN0YXRlbWVudCBUaGUgcGVybWlzc2lvbiBzdGF0ZW1lbnQgdG8gYWRkIHRvIHRoZSBwb2xpY3kgZG9jdW1lbnRcbiAgICovXG4gIHB1YmxpYyBhZGRUb1ByaW5jaXBhbFBvbGljeShcbiAgICBzdGF0ZW1lbnQ6IFBvbGljeVN0YXRlbWVudCxcbiAgKTogQWRkVG9QcmluY2lwYWxQb2xpY3lSZXN1bHQge1xuICAgIGlmICghdGhpcy5kZWZhdWx0UG9saWN5KSB7XG4gICAgICB0aGlzLmRlZmF1bHRQb2xpY3kgPSBuZXcgUG9saWN5KHRoaXMsIFwiRGVmYXVsdFBvbGljeVwiKTtcbiAgICAgIHRoaXMuYXR0YWNoSW5saW5lUG9saWN5KHRoaXMuZGVmYXVsdFBvbGljeSk7XG4gICAgfVxuICAgIHRoaXMuZGVmYXVsdFBvbGljeS5hZGRTdGF0ZW1lbnRzKHN0YXRlbWVudCk7XG5cbiAgICAvLyAvLyBXZSBtaWdodCBzcGxpdCB0aGlzIHN0YXRlbWVudCBvZmYgaW50byBhIGRpZmZlcmVudCBwb2xpY3ksIHNvIHdlJ2xsIG5lZWQgdG9cbiAgICAvLyAvLyBsYXRlLWJpbmQgdGhlIGRlcGVuZGFibGUuXG4gICAgLy8gY29uc3QgcG9saWN5RGVwZW5kYWJsZSA9IG5ldyBEZXBlbmRlbmN5R3JvdXAoKTtcbiAgICAvLyB0aGlzLmRlcGVuZGFibGVzLnNldChzdGF0ZW1lbnQsIHBvbGljeURlcGVuZGFibGUpO1xuXG4gICAgcmV0dXJuIHsgc3RhdGVtZW50QWRkZWQ6IHRydWUsIHBvbGljeURlcGVuZGFibGU6IHRoaXMgfTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRUb1BvbGljeShzdGF0ZW1lbnQ6IFBvbGljeVN0YXRlbWVudCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmFkZFRvUHJpbmNpcGFsUG9saWN5KHN0YXRlbWVudCkuc3RhdGVtZW50QWRkZWQ7XG4gIH1cblxuICAvKipcbiAgICogQXR0YWNoZXMgYSBtYW5hZ2VkIHBvbGljeSB0byB0aGlzIHJvbGUuXG4gICAqXG4gICAqIE5PVEU6IFVzaW5nIHRoaXMgbWV0aG9kIHdpbGwgZm9yY2UgdGhlIHJvbGUgdG8gdGFrZSBvdmVyXG4gICAqIGV4Y2x1c2l2ZSBtYW5hZ2VtZW50IG9mIHRoZSByb2xlJ3MgTWFuYWdlZFBvbGljeSBhdHRhY2htZW50c1xuICAgKiBUaGVzZSBhcmd1bWVudHMgYXJlIGluY29tcGF0aWJsZSB3aXRoIG90aGVyIHdheXMgb2YgbWFuYWdpbmdcbiAgICogYSByb2xlJ3Mgc3VjaCBhcyBhdHRhY2hpbmcgdGhlIHBvbGljeSB0byB0aGUgcm9sZSB0aHJvdWdoIGl0c1xuICAgKiBgcG9saWN5LmF0dGFjaFRvUm9sZShyb2xlKWAgbWV0aG9kLlxuICAgKlxuICAgKiBJZiB5b3UgYXR0ZW1wdCB0byBtYW5hZ2UgYSByb2xlJ3MgcG9saWNpZXMgYnkgbXVsdGlwbGUgbWVhbnMsXG4gICAqIHlvdSB3aWxsIGdldCByZXNvdXJjZSBjeWNsaW5nIGFuZC9vciBlcnJvcnMuXG4gICAqXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgcG9saWN5MSA9IG5ldyBpYW0uTWFuYWdlZFBvbGljeSh0aGlzLCAnUG9saWN5Jywge1xuICAgKiAgIG1hbmFnZWRQb2xpY3lOYW1lOiAnTXlQb2xpY3kxJyxcbiAgICogICBkZXNjcmlwdGlvbjogJ0EgZGVzY3JpcHRpb24gb2YgdGhlIHBvbGljeScsXG4gICAqIH0pO1xuICAgKiBjb25zdCBwb2xpY3kyID0gbmV3IGlhbS5NYW5hZ2VkUG9saWN5KHRoaXMsICdQb2xpY3knLCB7XG4gICAqICAgbWFuYWdlZFBvbGljeU5hbWU6ICdNeVBvbGljeTInLFxuICAgKiAgIGRlc2NyaXB0aW9uOiAnQSBkZXNjcmlwdGlvbiBvZiB0aGUgcG9saWN5JyxcbiAgICogfSk7XG4gICAqXG4gICAqIGNvbnN0IHJvbGUgPSBuZXcgaWFtLlJvbGUodGhpcywgJ1JvbGUnLCB7XG4gICAqICBhc3N1bWVkQnk6IG5ldyBpYW0uU2VydmljZVByaW5jaXBhbCgnc25zLmFtYXpvbmF3cy5jb20nKSxcbiAgICogfSk7XG4gICAqIC8vIHJvbGUgYmVjb21lcyB0aGUgbWFuYWdlciBvZiBhbGwgYXR0YWNoZWQgcG9saWNpZXNcbiAgICogcm9sZS5hZGRNYW5hZ2VkUG9saWN5KGlhbS5NYW5hZ2VkUG9saWN5LmZyb21Bd3NNYW5hZ2VkUG9saWN5TmFtZSgnU2VjdXJpdHlBdWRpdCcpKTtcbiAgICogcm9sZS5hZGRNYW5hZ2VkUG9saWN5KHBvbGljeTEpO1xuICAgKlxuICAgKiAvLyB0aGlzIGludHJvZHVjZXMgcmVzb3VyY2UgY3ljbGluZ1xuICAgKiAvLyBET04nVCBETyBUSElTXG4gICAqIHBvbGljeTIuYXR0YWNoVG9Sb2xlKHJvbGUpO1xuICAgKlxuICAgKiAvLyBETyBUSElTIElOU1RFQURcbiAgICogcm9sZS5hZGRNYW5hZ2VkUG9saWN5KHBvbGljeTIpO1xuICAgKiBgYGBcbiAgICogQHBhcmFtIHBvbGljeSBUaGUgdGhlIG1hbmFnZWQgcG9saWN5IHRvIGF0dGFjaC5cbiAgICovXG4gIHB1YmxpYyBhZGRNYW5hZ2VkUG9saWN5KHBvbGljeTogSU1hbmFnZWRQb2xpY3kpIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLm1hbmFnZWRQb2xpY2llcy5zb21lKFxuICAgICAgICAobXApID0+IG1wLm1hbmFnZWRQb2xpY3lBcm4gPT09IHBvbGljeS5tYW5hZ2VkUG9saWN5QXJuLFxuICAgICAgKVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLm1hbmFnZWRQb2xpY2llcy5wdXNoKHBvbGljeSk7XG4gIH1cblxuICAvKipcbiAgICogQXR0YWNoZXMgYSBwb2xpY3kgdG8gdGhpcyByb2xlLlxuICAgKlxuICAgKiBOT1RFOiBVc2luZyB0aGlzIG1ldGhvZCB3aWxsIGZvcmNlIHRoZSByb2xlIHRvIHRha2Ugb3ZlclxuICAgKiBleGNsdXNpdmUgbWFuYWdlbWVudCBvZiB0aGUgcm9sZSdzIGlubGluZSBQb2xpY3kgYXR0YWNobWVudHNcbiAgICogVGhlc2UgYXJndW1lbnRzIGFyZSBpbmNvbXBhdGlibGUgd2l0aCBvdGhlciB3YXlzIG9mIG1hbmFnaW5nXG4gICAqIGEgcm9sZSdzIHN1Y2ggYXMgYXR0YWNoaW5nIGEgcG9saWN5IHRvIHRoZSByb2xlLlxuICAgKiBJZiB5b3UgYXR0ZW1wdCB0byBtYW5hZ2UgYSByb2xlJ3MgcG9saWNpZXMgYnkgbXVsdGlwbGUgbWVhbnMsXG4gICAqIHlvdSB3aWxsIGdldCByZXNvdXJjZSBjeWNsaW5nIGFuZC9vciBlcnJvcnMuXG4gICAqXG4gICAqIEBwYXJhbSBwb2xpY3kgVGhlIHBvbGljeSB0byBhdHRhY2hcbiAgICovXG4gIHB1YmxpYyBhdHRhY2hJbmxpbmVQb2xpY3kocG9saWN5OiBQb2xpY3kpIHtcbiAgICB0aGlzLmF0dGFjaGVkUG9saWNpZXMuYXR0YWNoKHBvbGljeSk7XG4gICAgcG9saWN5LmF0dGFjaFRvUm9sZSh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudCB0aGUgYWN0aW9ucyBkZWZpbmVkIGluIGFjdGlvbnMgdG8gdGhlIGlkZW50aXR5IFByaW5jaXBhbCBvbiB0aGlzIHJlc291cmNlLlxuICAgKi9cbiAgcHVibGljIGdyYW50KGdyYW50ZWU6IElQcmluY2lwYWwsIC4uLmFjdGlvbnM6IHN0cmluZ1tdKSB7XG4gICAgcmV0dXJuIEdyYW50LmFkZFRvUHJpbmNpcGFsKHtcbiAgICAgIGdyYW50ZWUsXG4gICAgICBhY3Rpb25zLFxuICAgICAgcmVzb3VyY2VBcm5zOiBbdGhpcy5yb2xlQXJuXSxcbiAgICAgIHNjb3BlOiB0aGlzLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50IHBlcm1pc3Npb25zIHRvIHRoZSBnaXZlbiBwcmluY2lwYWwgdG8gcGFzcyB0aGlzIHJvbGUuXG4gICAqL1xuICBwdWJsaWMgZ3JhbnRQYXNzUm9sZShpZGVudGl0eTogSVByaW5jaXBhbCkge1xuICAgIHJldHVybiB0aGlzLmdyYW50KGlkZW50aXR5LCBcImlhbTpQYXNzUm9sZVwiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudCBwZXJtaXNzaW9ucyB0byB0aGUgZ2l2ZW4gcHJpbmNpcGFsIHRvIGFzc3VtZSB0aGlzIHJvbGUuXG4gICAqL1xuICBwdWJsaWMgZ3JhbnRBc3N1bWVSb2xlKGlkZW50aXR5OiBJUHJpbmNpcGFsKSB7XG4gICAgLy8gU2VydmljZSBhbmQgYWNjb3VudCBwcmluY2lwYWxzIG11c3QgdXNlIGFzc3VtZVJvbGVQb2xpY3lcbiAgICBpZiAoXG4gICAgICBpZGVudGl0eSBpbnN0YW5jZW9mIFNlcnZpY2VQcmluY2lwYWwgfHxcbiAgICAgIGlkZW50aXR5IGluc3RhbmNlb2YgQWNjb3VudFByaW5jaXBhbFxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIkNhbm5vdCB1c2UgYSBzZXJ2aWNlIG9yIGFjY291bnQgcHJpbmNpcGFsIHdpdGggZ3JhbnRBc3N1bWVSb2xlLCB1c2UgYXNzdW1lUm9sZVBvbGljeSBpbnN0ZWFkLlwiLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZ3JhbnQoaWRlbnRpdHksIFwic3RzOkFzc3VtZVJvbGVcIik7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgc3RhYmxlIGFuZCB1bmlxdWUgc3RyaW5nIGlkZW50aWZ5aW5nIHRoZSByb2xlLiBGb3IgZXhhbXBsZSxcbiAgICogQUlEQUpRQUJMWlM0QTNRRFU1NzZRLlxuICAgKlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICBwdWJsaWMgZ2V0IHJvbGVJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9yb2xlSWQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGEgY29weSBvZiB0aGlzIFJvbGUgb2JqZWN0IHdob3NlIFBvbGljaWVzIHdpbGwgbm90IGJlIHVwZGF0ZWRcbiAgICpcbiAgICogVXNlIHRoZSBvYmplY3QgcmV0dXJuZWQgYnkgdGhpcyBtZXRob2QgaWYgeW91IHdhbnQgdGhpcyBSb2xlIHRvIGJlIHVzZWQgYnlcbiAgICogYSBjb25zdHJ1Y3Qgd2l0aG91dCBpdCBhdXRvbWF0aWNhbGx5IHVwZGF0aW5nIHRoZSBSb2xlJ3MgUG9saWNpZXMuXG4gICAqXG4gICAqIElmIHlvdSBkbywgeW91IGFyZSByZXNwb25zaWJsZSBmb3IgYWRkaW5nIHRoZSBjb3JyZWN0IHN0YXRlbWVudHMgdG8gdGhlXG4gICAqIFJvbGUncyBwb2xpY2llcyB5b3Vyc2VsZi5cbiAgICovXG4gIHB1YmxpYyB3aXRob3V0UG9saWN5VXBkYXRlcyhcbiAgICBvcHRpb25zOiBXaXRob3V0UG9saWN5VXBkYXRlc09wdGlvbnMgPSB7fSxcbiAgKTogSVJvbGUge1xuICAgIGlmICghdGhpcy5pbW11dGFibGVSb2xlKSB7XG4gICAgICB0aGlzLmltbXV0YWJsZVJvbGUgPSBuZXcgSW1tdXRhYmxlUm9sZShcbiAgICAgICAgdGhpcy5ub2RlLnNjb3BlIGFzIENvbnN0cnVjdCxcbiAgICAgICAgYEltbXV0YWJsZVJvbGUke3RoaXMubm9kZS5pZH1gLFxuICAgICAgICB0aGlzLFxuICAgICAgICBvcHRpb25zLmFkZEdyYW50c1RvUmVzb3VyY2VzID8/IGZhbHNlLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5pbW11dGFibGVSb2xlO1xuICB9XG5cbiAgcHJpdmF0ZSB2YWxpZGF0ZVJvbGUoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGVycm9ycyA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG4gICAgZXJyb3JzLnB1c2goLi4uKHRoaXMuYXNzdW1lUm9sZVBvbGljeT8udmFsaWRhdGVGb3JSZXNvdXJjZVBvbGljeSgpID8/IFtdKSk7XG4gICAgZm9yIChjb25zdCBwb2xpY3kgb2YgT2JqZWN0LnZhbHVlcyh0aGlzLmlubGluZVBvbGljaWVzKSkge1xuICAgICAgZXJyb3JzLnB1c2goLi4ucG9saWN5LnZhbGlkYXRlRm9ySWRlbnRpdHlQb2xpY3koKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVycm9ycztcbiAgfVxuXG4gIC8vIC8qKlxuICAvLyAgKiBTcGxpdCBsYXJnZSBpbmxpbmUgcG9saWNpZXMgaW50byBtYW5hZ2VkIHBvbGljaWVzXG4gIC8vICAqXG4gIC8vICAqIFRoaXMgZ2V0cyBhcm91bmQgdGhlIDEwayBieXRlcyBsaW1pdCBvbiByb2xlIHBvbGljaWVzLlxuICAvLyAgKi9cbiAgLy8gcHJpdmF0ZSBzcGxpdExhcmdlUG9saWN5KCkge1xuICAvLyAgIGlmICghdGhpcy5kZWZhdWx0UG9saWN5IHx8IHRoaXMuX2RpZFNwbGl0KSB7XG4gIC8vICAgICByZXR1cm47XG4gIC8vICAgfVxuICAvLyAgIHRoaXMuX2RpZFNwbGl0ID0gdHJ1ZTtcblxuICAvLyAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAvLyAgIGNvbnN0IG9yaWdpbmFsRG9jID0gdGhpcy5kZWZhdWx0UG9saWN5LmRvY3VtZW50O1xuXG4gIC8vICAgY29uc3Qgc3BsaXRPZmZEb2NzID0gb3JpZ2luYWxEb2MuX3NwbGl0RG9jdW1lbnQoXG4gIC8vICAgICB0aGlzLFxuICAvLyAgICAgTUFYX0lOTElORV9TSVpFLFxuICAvLyAgICAgTUFYX01BTkFHRURQT0xfU0laRSxcbiAgLy8gICApO1xuICAvLyAgIC8vIEluY2x1ZGVzIHRoZSBcImN1cnJlbnRcIiBkb2N1bWVudFxuXG4gIC8vICAgY29uc3QgbXBDb3VudCA9IHRoaXMubWFuYWdlZFBvbGljaWVzLmxlbmd0aCArIChzcGxpdE9mZkRvY3Muc2l6ZSAtIDEpO1xuICAvLyAgIGlmIChtcENvdW50ID4gMjApIHtcbiAgLy8gICAgIEFubm90YXRpb25zLm9mKHRoaXMpLmFkZFdhcm5pbmdWMihcbiAgLy8gICAgICAgXCJAYXdzLWNkay9hd3MtaWFtOnJvbGVQb2xpY3lUb29MYXJnZVwiLFxuICAvLyAgICAgICBgUG9saWN5IHRvbyBsYXJnZTogJHttcENvdW50fSBleGNlZWRzIHRoZSBtYXhpbXVtIG9mIDIwIG1hbmFnZWQgcG9saWNpZXMgYXR0YWNoZWQgdG8gYSBSb2xlYCxcbiAgLy8gICAgICk7XG4gIC8vICAgfSBlbHNlIGlmIChtcENvdW50ID4gMTApIHtcbiAgLy8gICAgIEFubm90YXRpb25zLm9mKHRoaXMpLmFkZFdhcm5pbmdWMihcbiAgLy8gICAgICAgXCJAYXdzLWNkay9hd3MtaWFtOnJvbGVQb2xpY3lMYXJnZVwiLFxuICAvLyAgICAgICBgUG9saWN5IGxhcmdlOiAke21wQ291bnR9IGV4Y2VlZHMgMTAgbWFuYWdlZCBwb2xpY2llcyBhdHRhY2hlZCB0byBhIFJvbGUsIHRoaXMgcmVxdWlyZXMgYSBxdW90YSBpbmNyZWFzZWAsXG4gIC8vICAgICApO1xuICAvLyAgIH1cblxuICAvLyAgIC8vIENyZWF0ZSB0aGUgbWFuYWdlZCBwb2xpY2llcyBhbmQgZml4IHVwIHRoZSBkZXBlbmRlbmNpZXNcbiAgLy8gICBtYXJrRGVjbGFyaW5nQ29uc3RydWN0KG9yaWdpbmFsRG9jLCB0aGlzLmRlZmF1bHRQb2xpY3kpO1xuXG4gIC8vICAgbGV0IGkgPSAxO1xuICAvLyAgIGZvciAoY29uc3QgbmV3RG9jIG9mIHNwbGl0T2ZmRG9jcy5rZXlzKCkpIHtcbiAgLy8gICAgIGlmIChuZXdEb2MgPT09IG9yaWdpbmFsRG9jKSB7XG4gIC8vICAgICAgIGNvbnRpbnVlO1xuICAvLyAgICAgfVxuXG4gIC8vICAgICBjb25zdCBtcCA9IG5ldyBBd3NNYW5hZ2VkUG9saWN5KHRoaXMsIGBPdmVyZmxvd1BvbGljeSR7aSsrfWAsIHtcbiAgLy8gICAgICAgZGVzY3JpcHRpb246IGBQYXJ0IG9mIHRoZSBwb2xpY2llcyBmb3IgJHt0aGlzLm5vZGUucGF0aH1gLFxuICAvLyAgICAgICBkb2N1bWVudDogbmV3RG9jLFxuICAvLyAgICAgICByb2xlczogW3RoaXNdLFxuICAvLyAgICAgfSk7XG4gIC8vICAgICBtYXJrRGVjbGFyaW5nQ29uc3RydWN0KG5ld0RvYywgbXApO1xuICAvLyAgIH1cblxuICAvLyAgIC8qKlxuICAvLyAgICAqIFVwZGF0ZSB0aGUgRGVwZW5kYWJsZXMgZm9yIHRoZSBzdGF0ZW1lbnRzIGluIHRoZSBnaXZlbiBQb2xpY3lEb2N1bWVudCB0byBwb2ludCB0byB0aGUgYWN0dWFsIGRlY2xhcmluZyBjb25zdHJ1Y3RcbiAgLy8gICAgKi9cbiAgLy8gICBmdW5jdGlvbiBtYXJrRGVjbGFyaW5nQ29uc3RydWN0KFxuICAvLyAgICAgZG9jOiBQb2xpY3lEb2N1bWVudCxcbiAgLy8gICAgIGRlY2xhcmluZ0NvbnN0cnVjdDogSUNvbnN0cnVjdCxcbiAgLy8gICApIHtcbiAgLy8gICAgIGZvciAoY29uc3Qgb3JpZ2luYWwgb2Ygc3BsaXRPZmZEb2NzLmdldChkb2MpID8/IFtdKSB7XG4gIC8vICAgICAgIHNlbGYuZGVwZW5kYWJsZXMuZ2V0KG9yaWdpbmFsKT8uYWRkKGRlY2xhcmluZ0NvbnN0cnVjdCk7XG4gIC8vICAgICB9XG4gIC8vICAgfVxuICAvLyB9XG59XG5cbi8qKlxuICogT3V0cHV0cyB3aGljaCBtYXkgYmUgcmVnaXN0ZXJlZCBmb3Igb3V0cHV0IHZpYSB0aGUgR3JpZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSb2xlT3V0cHV0cyB7XG4gIHJlYWRvbmx5IGFybjogc3RyaW5nO1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBSb2xlIG9iamVjdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIElSb2xlIGV4dGVuZHMgSUlkZW50aXR5IHtcbiAgLyoqXG4gICAqIHN0cm9uZ2x5IHR5cGVkIHJvbGVPdXRwdXRzXG4gICAqXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IHJvbGVPdXRwdXRzOiBSb2xlT3V0cHV0cztcbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIEFSTiBvZiB0aGlzIHJvbGUuXG4gICAqXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IHJvbGVBcm46IHN0cmluZztcblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGlzIHJvbGUuXG4gICAqXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IHJvbGVOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEdyYW50IHRoZSBhY3Rpb25zIGRlZmluZWQgaW4gYWN0aW9ucyB0byB0aGUgaWRlbnRpdHkgUHJpbmNpcGFsIG9uIHRoaXMgcmVzb3VyY2UuXG4gICAqL1xuICBncmFudChncmFudGVlOiBJUHJpbmNpcGFsLCAuLi5hY3Rpb25zOiBzdHJpbmdbXSk6IEdyYW50O1xuXG4gIC8qKlxuICAgKiBHcmFudCBwZXJtaXNzaW9ucyB0byB0aGUgZ2l2ZW4gcHJpbmNpcGFsIHRvIHBhc3MgdGhpcyByb2xlLlxuICAgKi9cbiAgZ3JhbnRQYXNzUm9sZShncmFudGVlOiBJUHJpbmNpcGFsKTogR3JhbnQ7XG5cbiAgLyoqXG4gICAqIEdyYW50IHBlcm1pc3Npb25zIHRvIHRoZSBnaXZlbiBwcmluY2lwYWwgdG8gYXNzdW1lIHRoaXMgcm9sZS5cbiAgICovXG4gIGdyYW50QXNzdW1lUm9sZShncmFudGVlOiBJUHJpbmNpcGFsKTogR3JhbnQ7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUFzc3VtZVJvbGVQb2xpY3koXG4gIHNjb3BlOiBDb25zdHJ1Y3QsXG4gIGlkOiBzdHJpbmcsXG4gIHByaW5jaXBhbDogSVByaW5jaXBhbCxcbiAgZXh0ZXJuYWxJZHM6IHN0cmluZ1tdLFxuKSB7XG4gIGNvbnN0IGFjdHVhbERvYyA9IG5ldyBQb2xpY3lEb2N1bWVudChzY29wZSwgaWQpO1xuXG4gIC8vIElmIHJlcXVlc3RlZCwgYWRkIGV4dGVybmFsSWRzIHRvIGV2ZXJ5IHN0YXRlbWVudCBhZGRlZCB0byB0aGlzIGRvY1xuICBjb25zdCBhZGREb2MgPVxuICAgIGV4dGVybmFsSWRzLmxlbmd0aCA9PT0gMFxuICAgICAgPyBhY3R1YWxEb2NcbiAgICAgIDogbmV3IE11dGF0aW5nUG9saWN5RG9jdW1lbnRBZGFwdGVyKGFjdHVhbERvYywgKHN0YXRlbWVudCkgPT4ge1xuICAgICAgICAgIHN0YXRlbWVudC5hZGRDb25kaXRpb24oe1xuICAgICAgICAgICAgdGVzdDogXCJTdHJpbmdFcXVhbHNcIixcbiAgICAgICAgICAgIHZhcmlhYmxlOiBcInN0czpFeHRlcm5hbElkXCIsXG4gICAgICAgICAgICB2YWx1ZXM6IGV4dGVybmFsSWRzLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiBzdGF0ZW1lbnQ7XG4gICAgICAgIH0pO1xuXG4gIGRlZmF1bHRBZGRQcmluY2lwYWxUb0Fzc3VtZVJvbGUocHJpbmNpcGFsLCBhZGREb2MpO1xuXG4gIHJldHVybiBhY3R1YWxEb2M7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlUm9sZVBhdGgocGF0aD86IHN0cmluZykge1xuICBpZiAocGF0aCA9PT0gdW5kZWZpbmVkIHx8IFRva2VuLmlzVW5yZXNvbHZlZChwYXRoKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHZhbGlkUm9sZVBhdGggPSAvXihcXC98XFwvW1xcdTAwMjEtXFx1MDA3Rl0rXFwvKSQvO1xuXG4gIGlmIChwYXRoLmxlbmd0aCA9PSAwIHx8IHBhdGgubGVuZ3RoID4gNTEyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYFJvbGUgcGF0aCBtdXN0IGJlIGJldHdlZW4gMSBhbmQgNTEyIGNoYXJhY3RlcnMuIFRoZSBwcm92aWRlZCByb2xlIHBhdGggaXMgJHtwYXRoLmxlbmd0aH0gY2hhcmFjdGVycy5gLFxuICAgICk7XG4gIH0gZWxzZSBpZiAoIXZhbGlkUm9sZVBhdGgudGVzdChwYXRoKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIFwiUm9sZSBwYXRoIG11c3QgYmUgZWl0aGVyIGEgc2xhc2ggb3IgdmFsaWQgY2hhcmFjdGVycyAoYWxwaGFudW1lcmljcyBhbmQgc3ltYm9scykgc3Vycm91bmRlZCBieSBzbGFzaGVzLiBcIiArXG4gICAgICAgIGBWYWxpZCBjaGFyYWN0ZXJzIGFyZSB1bmljb2RlIGNoYXJhY3RlcnMgaW4gW1xcXFx1MDAyMS1cXFxcdTAwN0ZdLiBIb3dldmVyLCAke3BhdGh9IGlzIHByb3ZpZGVkLmAsXG4gICAgKTtcbiAgfVxufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZU1heFNlc3Npb25EdXJhdGlvbihkdXJhdGlvbj86IG51bWJlcikge1xuICBpZiAoZHVyYXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChkdXJhdGlvbiA8IDM2MDAgfHwgZHVyYXRpb24gPiA0MzIwMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBtYXhTZXNzaW9uRHVyYXRpb24gaXMgc2V0IHRvICR7ZHVyYXRpb259LCBidXQgbXVzdCBiZSA+PSAzNjAwc2VjICgxaHIpIGFuZCA8PSA0MzIwMHNlYyAoMTJocnMpYCxcbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgdGhlIGB3aXRob3V0UG9saWN5VXBkYXRlcygpYCBtb2RpZmllciBvZiBhIFJvbGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXaXRob3V0UG9saWN5VXBkYXRlc09wdGlvbnMge1xuICAvKipcbiAgICogQWRkIGdyYW50cyB0byByZXNvdXJjZXMgaW5zdGVhZCBvZiBkcm9wcGluZyB0aGVtXG4gICAqXG4gICAqIElmIHRoaXMgaXMgYGZhbHNlYCBvciBub3Qgc3BlY2lmaWVkLCBncmFudCBwZXJtaXNzaW9ucyBhZGRlZCB0byB0aGlzIHJvbGUgYXJlIGlnbm9yZWQuXG4gICAqIEl0IGlzIHlvdXIgb3duIHJlc3BvbnNpYmlsaXR5IHRvIG1ha2Ugc3VyZSB0aGUgcm9sZSBoYXMgdGhlIHJlcXVpcmVkIHBlcm1pc3Npb25zLlxuICAgKlxuICAgKiBJZiB0aGlzIGlzIGB0cnVlYCwgYW55IGdyYW50IHBlcm1pc3Npb25zIHdpbGwgYmUgYWRkZWQgdG8gdGhlIHJlc291cmNlIGluc3RlYWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBhZGRHcmFudHNUb1Jlc291cmNlcz86IGJvb2xlYW47XG59XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShSb2xlLnByb3RvdHlwZSwgSUFNX1JPTEVfU1lNQk9MLCB7XG4gIHZhbHVlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgd3JpdGFibGU6IGZhbHNlLFxufSk7XG4iXX0=
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { iamSamlProvider } from "@cdktf/provider-aws";
|
|
2
|
+
import { Construct } from "constructs";
|
|
3
|
+
import { IAwsConstruct, AwsConstructBase, AwsConstructProps } from "../";
|
|
4
|
+
export interface SamlProviderOutputs {
|
|
5
|
+
/**
|
|
6
|
+
* The Amazon Resource Name (ARN) of the SAML provider.
|
|
7
|
+
* @stability stable
|
|
8
|
+
*/
|
|
9
|
+
readonly arn: string;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* A SAML provider
|
|
13
|
+
*/
|
|
14
|
+
export interface ISamlProvider extends IAwsConstruct {
|
|
15
|
+
readonly samlProviderOutputs: SamlProviderOutputs;
|
|
16
|
+
/**
|
|
17
|
+
* The Amazon Resource Name (ARN) of the provider
|
|
18
|
+
*
|
|
19
|
+
* @attribute
|
|
20
|
+
*/
|
|
21
|
+
readonly samlProviderArn: string;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Properties for a SAML provider
|
|
25
|
+
*/
|
|
26
|
+
export interface SamlProviderProps extends AwsConstructProps {
|
|
27
|
+
/**
|
|
28
|
+
* The name of the provider to create.
|
|
29
|
+
*
|
|
30
|
+
* This parameter allows a string of characters consisting of upper and
|
|
31
|
+
* lowercase alphanumeric characters with no spaces. You can also include
|
|
32
|
+
* any of the following characters: _+=,.@-
|
|
33
|
+
*
|
|
34
|
+
* Length must be between 1 and 128 characters.
|
|
35
|
+
*
|
|
36
|
+
* @default - a unique name based on path within stack
|
|
37
|
+
*/
|
|
38
|
+
readonly name?: string;
|
|
39
|
+
/**
|
|
40
|
+
* An XML document generated by an identity provider (IdP) that supports
|
|
41
|
+
* SAML 2.0. The document includes the issuer's name, expiration information,
|
|
42
|
+
* and keys that can be used to validate the SAML authentication response
|
|
43
|
+
* (assertions) that are received from the IdP. You must generate the metadata
|
|
44
|
+
* document using the identity management software that is used as your
|
|
45
|
+
* organization's IdP.
|
|
46
|
+
*/
|
|
47
|
+
readonly metadataDocument: SamlMetadataDocument;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* A SAML metadata document
|
|
51
|
+
*/
|
|
52
|
+
export declare abstract class SamlMetadataDocument {
|
|
53
|
+
/**
|
|
54
|
+
* Create a SAML metadata document from a XML string
|
|
55
|
+
*/
|
|
56
|
+
static fromXml(xml: string): SamlMetadataDocument;
|
|
57
|
+
/**
|
|
58
|
+
* Create a SAML metadata document from a XML file
|
|
59
|
+
*/
|
|
60
|
+
static fromFile(path: string): SamlMetadataDocument;
|
|
61
|
+
/**
|
|
62
|
+
* The XML content of the metadata document
|
|
63
|
+
*/
|
|
64
|
+
abstract readonly xml: string;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* A SAML provider
|
|
68
|
+
*/
|
|
69
|
+
export declare class SamlProvider extends AwsConstructBase implements ISamlProvider {
|
|
70
|
+
/**
|
|
71
|
+
* Import an existing provider
|
|
72
|
+
*/
|
|
73
|
+
static fromSamlProviderArn(scope: Construct, id: string, samlProviderArn: string): ISamlProvider;
|
|
74
|
+
readonly samlProviderOutputs: SamlProviderOutputs;
|
|
75
|
+
get outputs(): Record<string, any>;
|
|
76
|
+
readonly resource: iamSamlProvider.IamSamlProvider;
|
|
77
|
+
readonly samlProviderArn: string;
|
|
78
|
+
constructor(scope: Construct, id: string, props: SamlProviderProps);
|
|
79
|
+
}
|