terraconstructs 0.2.4 → 0.2.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.jsii +3099 -2917
- package/CLAUDE.md +6 -6
- package/README.md +1 -1
- package/lib/asset-staging.js +3 -3
- package/lib/aws/arn.js +5 -5
- package/lib/aws/aws-asset-manager.js +9 -9
- package/lib/aws/aws-construct.js +1 -1
- package/lib/aws/aws-stack.d.ts +19 -4
- package/lib/aws/aws-stack.js +43 -18
- package/lib/aws/aws-tags.d.ts +1 -1
- package/lib/aws/aws-tags.js +5 -5
- package/lib/aws/cloudwatch/actions/appscaling.js +1 -1
- package/lib/aws/cloudwatch/actions/ec2.js +1 -1
- package/lib/aws/cloudwatch/actions/lambda.js +2 -2
- package/lib/aws/cloudwatch/actions/sns.js +1 -1
- package/lib/aws/cloudwatch/actions/ssm.js +2 -2
- package/lib/aws/cloudwatch/alarm-base.js +1 -1
- package/lib/aws/cloudwatch/alarm-rule.js +1 -1
- package/lib/aws/cloudwatch/alarm-status-widget.js +1 -1
- package/lib/aws/cloudwatch/alarm.d.ts +1 -1
- package/lib/aws/cloudwatch/alarm.js +10 -10
- package/lib/aws/cloudwatch/composite-alarm.d.ts +1 -1
- package/lib/aws/cloudwatch/composite-alarm.js +7 -7
- package/lib/aws/cloudwatch/dashboard.d.ts +1 -1
- package/lib/aws/cloudwatch/dashboard.js +7 -7
- package/lib/aws/cloudwatch/data-protection-policy.d.ts +1 -1
- package/lib/aws/cloudwatch/data-protection-policy.js +5 -5
- package/lib/aws/cloudwatch/graph.js +8 -8
- package/lib/aws/cloudwatch/layout.js +3 -3
- package/lib/aws/cloudwatch/log-destinations/kinesis.js +1 -1
- package/lib/aws/cloudwatch/log-destinations/lambda.js +1 -1
- package/lib/aws/cloudwatch/log-group.d.ts +1 -1
- package/lib/aws/cloudwatch/log-group.js +7 -7
- package/lib/aws/cloudwatch/log-query.js +1 -1
- package/lib/aws/cloudwatch/log-stream.d.ts +1 -1
- package/lib/aws/cloudwatch/log-stream.js +3 -3
- package/lib/aws/cloudwatch/metric-filter.d.ts +1 -1
- package/lib/aws/cloudwatch/metric-filter.js +3 -3
- package/lib/aws/cloudwatch/metric.js +6 -6
- package/lib/aws/cloudwatch/pattern.js +3 -3
- package/lib/aws/cloudwatch/policy.d.ts +1 -1
- package/lib/aws/cloudwatch/policy.js +3 -3
- package/lib/aws/cloudwatch/private/drop-empty-object-at-the-end-of-an-array-token.d.ts +1 -1
- package/lib/aws/cloudwatch/private/drop-empty-object-at-the-end-of-an-array-token.js +1 -1
- package/lib/aws/cloudwatch/private/env-tokens.js +6 -6
- package/lib/aws/cloudwatch/query-definition.d.ts +1 -1
- package/lib/aws/cloudwatch/query-definition.js +4 -4
- package/lib/aws/cloudwatch/stats.js +1 -1
- package/lib/aws/cloudwatch/subscription-filter.d.ts +1 -1
- package/lib/aws/cloudwatch/subscription-filter.js +6 -6
- package/lib/aws/cloudwatch/text.js +1 -1
- package/lib/aws/cloudwatch/variable.js +3 -3
- package/lib/aws/cloudwatch/widget.js +1 -1
- package/lib/aws/compute/access-log.d.ts +1 -1
- package/lib/aws/compute/access-log.js +5 -5
- package/lib/aws/compute/activity.d.ts +1 -1
- package/lib/aws/compute/activity.js +5 -5
- package/lib/aws/compute/alb/application-listener-action.d.ts +1 -1
- package/lib/aws/compute/alb/application-listener-action.js +5 -5
- package/lib/aws/compute/alb/application-listener-certificate.js +3 -3
- package/lib/aws/compute/alb/application-listener-rule.js +9 -9
- package/lib/aws/compute/alb/application-listener.js +5 -5
- package/lib/aws/compute/alb/application-load-balancer.js +8 -8
- package/lib/aws/compute/alb/application-target-group.js +7 -7
- package/lib/aws/compute/alb/conditions.js +3 -3
- package/lib/aws/compute/alb/trust-store-revocation.js +3 -3
- package/lib/aws/compute/alb/trust-store.js +7 -7
- package/lib/aws/compute/api-definition.js +9 -9
- package/lib/aws/compute/api-key.js +6 -6
- package/lib/aws/compute/architecture.js +1 -1
- package/lib/aws/compute/aspects/require-imdsv2-aspect.d.ts +1 -1
- package/lib/aws/compute/aspects/require-imdsv2-aspect.js +6 -6
- package/lib/aws/compute/authorizer.js +1 -1
- package/lib/aws/compute/authorizers/identity-source.js +1 -1
- package/lib/aws/compute/authorizers/lambda.d.ts +1 -1
- package/lib/aws/compute/authorizers/lambda.js +6 -6
- package/lib/aws/compute/base-path-mapping.js +5 -5
- package/lib/aws/compute/base-scalable-attribute.js +1 -1
- package/lib/aws/compute/bastion-host.js +4 -4
- package/lib/aws/compute/chain.js +1 -1
- package/lib/aws/compute/client-vpn-authorization-rule.js +3 -3
- package/lib/aws/compute/client-vpn-endpoint.d.ts +1 -1
- package/lib/aws/compute/client-vpn-endpoint.js +9 -9
- package/lib/aws/compute/client-vpn-route.d.ts +1 -1
- package/lib/aws/compute/client-vpn-route.js +4 -4
- package/lib/aws/compute/code.d.ts +3 -3
- package/lib/aws/compute/code.js +15 -15
- package/lib/aws/compute/condition.js +1 -1
- package/lib/aws/compute/connections.js +1 -1
- package/lib/aws/compute/cors.js +1 -1
- package/lib/aws/compute/deployment.js +5 -5
- package/lib/aws/compute/domain-name.js +5 -5
- package/lib/aws/compute/event-invoke-config.d.ts +1 -1
- package/lib/aws/compute/event-invoke-config.js +3 -3
- package/lib/aws/compute/event-source-filter.js +2 -2
- package/lib/aws/compute/event-source-mapping.js +7 -7
- package/lib/aws/compute/event-sources/s3-onfailure-destination.js +1 -1
- package/lib/aws/compute/event-sources/s3.js +1 -1
- package/lib/aws/compute/event-sources/sqs-dlq.js +1 -1
- package/lib/aws/compute/event-sources/sqs.js +5 -5
- package/lib/aws/compute/fields.d.ts +1 -1
- package/lib/aws/compute/fields.js +12 -12
- package/lib/aws/compute/function-alias.d.ts +1 -1
- package/lib/aws/compute/function-alias.js +3 -3
- package/lib/aws/compute/function-base.d.ts +1 -1
- package/lib/aws/compute/function-base.js +10 -9
- package/lib/aws/compute/function-destinations/event-bridge.js +1 -1
- package/lib/aws/compute/function-destinations/function.js +1 -1
- package/lib/aws/compute/function-destinations/sqs.js +1 -1
- package/lib/aws/compute/function-nodejs/bundling.js +6 -6
- package/lib/aws/compute/function-nodejs/function.js +4 -4
- package/lib/aws/compute/function-url.d.ts +1 -1
- package/lib/aws/compute/function-url.js +3 -3
- package/lib/aws/compute/function-vpc-config.generated.d.ts +5 -5
- package/lib/aws/compute/function-vpc-config.generated.js +1 -1
- package/lib/aws/compute/function.d.ts +2 -2
- package/lib/aws/compute/function.js +9 -9
- package/lib/aws/compute/gateway-response.d.ts +1 -1
- package/lib/aws/compute/gateway-response.js +4 -4
- package/lib/aws/compute/handler.js +1 -1
- package/lib/aws/compute/instance-types.js +1 -1
- package/lib/aws/compute/instance.d.ts +1 -1
- package/lib/aws/compute/instance.js +9 -9
- package/lib/aws/compute/integration.js +4 -4
- package/lib/aws/compute/integrations/aws.js +3 -3
- package/lib/aws/compute/integrations/http.js +1 -1
- package/lib/aws/compute/integrations/lambda.js +5 -5
- package/lib/aws/compute/integrations/mock.js +1 -1
- package/lib/aws/compute/integrations/stepfunctions.js +4 -4
- package/lib/aws/compute/ip-addresses.d.ts +1 -1
- package/lib/aws/compute/ip-addresses.js +10 -10
- package/lib/aws/compute/ipam.d.ts +1 -1
- package/lib/aws/compute/ipam.js +5 -5
- package/lib/aws/compute/key-pair.d.ts +1 -1
- package/lib/aws/compute/key-pair.js +6 -6
- package/lib/aws/compute/lambda-api.js +1 -1
- package/lib/aws/compute/launch-template.d.ts +1 -1
- package/lib/aws/compute/launch-template.js +12 -12
- package/lib/aws/compute/lb-shared/base-listener.js +9 -9
- package/lib/aws/compute/lb-shared/base-load-balancer.d.ts +2 -2
- package/lib/aws/compute/lb-shared/base-load-balancer.js +12 -12
- package/lib/aws/compute/lb-shared/base-target-group.d.ts +1 -1
- package/lib/aws/compute/lb-shared/base-target-group.js +15 -15
- package/lib/aws/compute/lb-shared/lb-listener-config.generated.d.ts +34 -34
- package/lib/aws/compute/lb-shared/lb-listener-config.generated.js +1 -1
- package/lib/aws/compute/lb-shared/lb-target-group-attachment-config.generated.d.ts +11 -6
- package/lib/aws/compute/lb-shared/lb-target-group-attachment-config.generated.js +1 -1
- package/lib/aws/compute/lb-shared/listener-action.d.ts +1 -1
- package/lib/aws/compute/lb-shared/listener-action.js +1 -1
- package/lib/aws/compute/lb-shared/listener-certificate.js +1 -1
- package/lib/aws/compute/lb-shared/load-balancer-targets.js +2 -2
- package/lib/aws/compute/lb-shared/util.js +5 -5
- package/lib/aws/compute/lb-targets/alb-target.js +3 -3
- package/lib/aws/compute/lb-targets/instance-target.js +2 -2
- package/lib/aws/compute/lb-targets/ip-target.js +1 -1
- package/lib/aws/compute/lb-targets/lambda-target.js +1 -1
- package/lib/aws/compute/load-balancer.d.ts +1 -1
- package/lib/aws/compute/load-balancer.js +8 -8
- package/lib/aws/compute/machine-image/amazon-linux-2022.js +2 -2
- package/lib/aws/compute/machine-image/amazon-linux-2023.js +2 -2
- package/lib/aws/compute/machine-image/amazon-linux2.js +2 -2
- package/lib/aws/compute/machine-image/common.js +1 -1
- package/lib/aws/compute/machine-image/machine-image.js +10 -10
- package/lib/aws/compute/method.js +6 -6
- package/lib/aws/compute/model.js +5 -5
- package/lib/aws/compute/nat.js +10 -10
- package/lib/aws/compute/network-acl-types.js +2 -2
- package/lib/aws/compute/network-acl.d.ts +1 -1
- package/lib/aws/compute/network-acl.js +5 -5
- package/lib/aws/compute/nlb/network-listener-action.d.ts +1 -1
- package/lib/aws/compute/nlb/network-listener-action.js +2 -2
- package/lib/aws/compute/nlb/network-listener-certificate.js +2 -2
- package/lib/aws/compute/nlb/network-listener.js +5 -5
- package/lib/aws/compute/nlb/network-load-balancer.js +6 -6
- package/lib/aws/compute/nlb/network-target-group.js +4 -4
- package/lib/aws/compute/peer.js +7 -7
- package/lib/aws/compute/placement-group.d.ts +1 -1
- package/lib/aws/compute/placement-group.js +3 -3
- package/lib/aws/compute/port.js +5 -5
- package/lib/aws/compute/prefix-list.d.ts +1 -1
- package/lib/aws/compute/prefix-list.js +5 -5
- package/lib/aws/compute/private/context-stub.js +7 -7
- package/lib/aws/compute/private/ebs-util.d.ts +1 -1
- package/lib/aws/compute/private/ebs-util.js +3 -3
- package/lib/aws/compute/private/json-path.d.ts +1 -1
- package/lib/aws/compute/private/json-path.js +8 -8
- package/lib/aws/compute/requestvalidator.js +3 -3
- package/lib/aws/compute/resource.js +5 -5
- package/lib/aws/compute/restapi.d.ts +1 -1
- package/lib/aws/compute/restapi.js +11 -11
- package/lib/aws/compute/route.d.ts +1 -1
- package/lib/aws/compute/route.js +12 -12
- package/lib/aws/compute/runtime.js +3 -3
- package/lib/aws/compute/scalable-target.d.ts +1 -1
- package/lib/aws/compute/scalable-target.js +3 -3
- package/lib/aws/compute/schedule.js +4 -4
- package/lib/aws/compute/security-group.js +12 -12
- package/lib/aws/compute/stage.d.ts +1 -1
- package/lib/aws/compute/stage.js +6 -6
- package/lib/aws/compute/state-graph.js +1 -1
- package/lib/aws/compute/state-machine-fragment.js +1 -1
- package/lib/aws/compute/state-machine.d.ts +2 -2
- package/lib/aws/compute/state-machine.js +8 -8
- package/lib/aws/compute/states/choice.js +1 -1
- package/lib/aws/compute/states/custom-state.js +5 -5
- package/lib/aws/compute/states/distributed-map/item-batcher.js +1 -1
- package/lib/aws/compute/states/distributed-map/item-reader.js +5 -5
- package/lib/aws/compute/states/distributed-map/result-writer.js +1 -1
- package/lib/aws/compute/states/distributed-map.js +4 -4
- package/lib/aws/compute/states/fail.js +4 -4
- package/lib/aws/compute/states/map-base.js +4 -4
- package/lib/aws/compute/states/map.js +1 -1
- package/lib/aws/compute/states/parallel.js +1 -1
- package/lib/aws/compute/states/pass.js +2 -2
- package/lib/aws/compute/states/state.js +4 -4
- package/lib/aws/compute/states/succeed.js +1 -1
- package/lib/aws/compute/states/task-base.js +2 -2
- package/lib/aws/compute/states/task.js +1 -1
- package/lib/aws/compute/states/wait.js +2 -2
- package/lib/aws/compute/step-scaling-action.js +5 -5
- package/lib/aws/compute/step-scaling-policy.js +7 -7
- package/lib/aws/compute/stepfunctions-api.js +2 -2
- package/lib/aws/compute/subnet-v2.d.ts +1 -1
- package/lib/aws/compute/subnet-v2.js +5 -5
- package/lib/aws/compute/subnet.js +4 -4
- package/lib/aws/compute/target-tracking-scaling-policy.js +3 -3
- package/lib/aws/compute/task-credentials.js +1 -1
- package/lib/aws/compute/task-input.js +1 -1
- package/lib/aws/compute/tasks/aws-sdk/call-aws-service.js +5 -5
- package/lib/aws/compute/tasks/eventbridge/put-events.js +1 -1
- package/lib/aws/compute/tasks/http/invoke.js +1 -1
- package/lib/aws/compute/tasks/lambda/invoke.js +1 -1
- package/lib/aws/compute/tasks/sqs/send-message.js +1 -1
- package/lib/aws/compute/tasks/stepfunctions/invoke-activity.js +1 -1
- package/lib/aws/compute/tasks/stepfunctions/start-execution.js +1 -1
- package/lib/aws/compute/types.js +1 -1
- package/lib/aws/compute/usage-plan.js +5 -5
- package/lib/aws/compute/user-data.d.ts +2 -2
- package/lib/aws/compute/user-data.js +10 -10
- package/lib/aws/compute/volume.d.ts +1 -1
- package/lib/aws/compute/volume.js +7 -7
- package/lib/aws/compute/vpc-endpoint-service.js +3 -3
- package/lib/aws/compute/vpc-endpoint.d.ts +1 -1
- package/lib/aws/compute/vpc-endpoint.js +13 -13
- package/lib/aws/compute/vpc-flow-logs.d.ts +1 -1
- package/lib/aws/compute/vpc-flow-logs.js +8 -8
- package/lib/aws/compute/vpc-link.js +5 -5
- package/lib/aws/compute/vpc-v2-base.js +6 -6
- package/lib/aws/compute/vpc-v2.d.ts +2 -2
- package/lib/aws/compute/vpc-v2.js +4 -4
- package/lib/aws/compute/vpc.d.ts +1 -1
- package/lib/aws/compute/vpc.js +24 -22
- package/lib/aws/compute/vpn.js +8 -8
- package/lib/aws/context-provider.js +4 -4
- package/lib/aws/edge/certificate.d.ts +1 -1
- package/lib/aws/edge/certificate.js +6 -6
- package/lib/aws/edge/distribution.d.ts +1 -1
- package/lib/aws/edge/distribution.js +9 -9
- package/lib/aws/edge/dns-alias-record-targets.d.ts +1 -1
- package/lib/aws/edge/dns-alias-record-targets.js +7 -7
- package/lib/aws/edge/dns-record.d.ts +1 -1
- package/lib/aws/edge/dns-record.js +19 -19
- package/lib/aws/edge/dns-zone.d.ts +2 -2
- package/lib/aws/edge/dns-zone.js +5 -5
- package/lib/aws/edge/function.d.ts +1 -1
- package/lib/aws/edge/function.js +4 -4
- package/lib/aws/edge/key-value-store.d.ts +1 -1
- package/lib/aws/edge/key-value-store.js +6 -6
- package/lib/aws/edge/origin.d.ts +1 -1
- package/lib/aws/edge/origin.js +6 -6
- package/lib/aws/edge/response-headers-policy.d.ts +1 -1
- package/lib/aws/edge/response-headers-policy.js +6 -6
- package/lib/aws/encryption/alias.d.ts +1 -1
- package/lib/aws/encryption/alias.js +8 -8
- package/lib/aws/encryption/key.d.ts +1 -1
- package/lib/aws/encryption/key.js +6 -6
- package/lib/aws/encryption/via-service-principal.js +1 -1
- package/lib/aws/iam/grant.js +3 -3
- package/lib/aws/iam/group.js +5 -5
- package/lib/aws/iam/instance-profile.d.ts +1 -1
- package/lib/aws/iam/instance-profile.js +3 -3
- package/lib/aws/iam/managed-policy.d.ts +1 -1
- package/lib/aws/iam/managed-policy.js +3 -3
- package/lib/aws/iam/oidc-provider.d.ts +1 -1
- package/lib/aws/iam/oidc-provider.js +3 -3
- package/lib/aws/iam/policy-document-config.generated.d.ts +9 -9
- package/lib/aws/iam/policy-document-config.generated.js +1 -1
- package/lib/aws/iam/policy-document.d.ts +1 -1
- package/lib/aws/iam/policy-document.js +5 -5
- package/lib/aws/iam/policy-statement-props.generated.d.ts +8 -8
- package/lib/aws/iam/policy-statement-props.generated.js +1 -1
- package/lib/aws/iam/policy-statement.d.ts +1 -1
- package/lib/aws/iam/policy-statement.js +8 -8
- package/lib/aws/iam/policy.js +3 -3
- package/lib/aws/iam/principals.js +25 -25
- package/lib/aws/iam/private/imported-role.js +3 -3
- package/lib/aws/iam/private/postprocess-policy-document.d.ts +1 -1
- package/lib/aws/iam/private/postprocess-policy-document.js +1 -1
- package/lib/aws/iam/private/util.d.ts +1 -1
- package/lib/aws/iam/private/util.js +5 -5
- package/lib/aws/iam/role.d.ts +1 -1
- package/lib/aws/iam/role.js +6 -6
- package/lib/aws/iam/saml-provider.d.ts +1 -1
- package/lib/aws/iam/saml-provider.js +6 -6
- package/lib/aws/iam/unknown-principal.js +4 -4
- package/lib/aws/iam/user.js +3 -3
- package/lib/aws/network/network.d.ts +1 -1
- package/lib/aws/network/network.js +1 -1
- package/lib/aws/network/simple-ipv4-vpc.js +12 -12
- package/lib/aws/network/subnet-group.d.ts +1 -1
- package/lib/aws/network/subnet-group.js +5 -5
- package/lib/aws/network/subnet.d.ts +1 -1
- package/lib/aws/network/subnet.js +6 -6
- package/lib/aws/notify/archive.d.ts +1 -1
- package/lib/aws/notify/archive.js +3 -3
- package/lib/aws/notify/connection.d.ts +1 -1
- package/lib/aws/notify/connection.js +5 -5
- package/lib/aws/notify/event-bus.d.ts +1 -1
- package/lib/aws/notify/event-bus.js +10 -10
- package/lib/aws/notify/event-pattern.d.ts +1 -1
- package/lib/aws/notify/event-pattern.js +5 -5
- package/lib/aws/notify/input.d.ts +1 -1
- package/lib/aws/notify/input.js +12 -12
- package/lib/aws/notify/kinesis-stream.d.ts +1 -1
- package/lib/aws/notify/kinesis-stream.js +7 -7
- package/lib/aws/notify/notification-rule.js +8 -8
- package/lib/aws/notify/policy.js +3 -3
- package/lib/aws/notify/queue-base.js +1 -1
- package/lib/aws/notify/queue-policy.js +3 -3
- package/lib/aws/notify/queue.d.ts +1 -1
- package/lib/aws/notify/queue.js +8 -8
- package/lib/aws/notify/resource-policy.js +3 -3
- package/lib/aws/notify/rule.d.ts +1 -1
- package/lib/aws/notify/rule.js +6 -6
- package/lib/aws/notify/schedule.js +4 -4
- package/lib/aws/notify/sns-grants.generated.js +1 -1
- package/lib/aws/notify/sqs-grants.generated.js +1 -1
- package/lib/aws/notify/subscription-filter.js +1 -1
- package/lib/aws/notify/subscription.js +6 -6
- package/lib/aws/notify/subscriptions/email.js +1 -1
- package/lib/aws/notify/subscriptions/lambda.js +4 -4
- package/lib/aws/notify/subscriptions/sms.js +1 -1
- package/lib/aws/notify/subscriptions/sqs.js +4 -4
- package/lib/aws/notify/subscriptions/url.js +4 -4
- package/lib/aws/notify/target.d.ts +1 -1
- package/lib/aws/notify/target.js +1 -1
- package/lib/aws/notify/targets/event-bus.js +1 -1
- package/lib/aws/notify/targets/function.js +1 -1
- package/lib/aws/notify/targets/log-group.js +2 -2
- package/lib/aws/notify/targets/sqs.js +1 -1
- package/lib/aws/notify/targets/state-machine.js +1 -1
- package/lib/aws/notify/targets/util.js +3 -3
- package/lib/aws/notify/topic-base.js +4 -4
- package/lib/aws/notify/topic.js +7 -7
- package/lib/aws/provider-config.generated.d.ts +42 -36
- package/lib/aws/provider-config.generated.js +1 -1
- package/lib/aws/region-lookup.js +4 -4
- package/lib/aws/storage/assets/image-asset.js +8 -8
- package/lib/aws/storage/assets/s3.js +1 -1
- package/lib/aws/storage/auth-token.js +2 -2
- package/lib/aws/storage/billing.js +1 -1
- package/lib/aws/storage/bucket-notifications.d.ts +1 -1
- package/lib/aws/storage/bucket-notifications.js +8 -8
- package/lib/aws/storage/bucket-policy.d.ts +1 -1
- package/lib/aws/storage/bucket-policy.js +3 -3
- package/lib/aws/storage/bucket-source.d.ts +1 -1
- package/lib/aws/storage/bucket-source.js +7 -7
- package/lib/aws/storage/bucket.d.ts +1 -1
- package/lib/aws/storage/bucket.js +8 -8
- package/lib/aws/storage/capacity.js +1 -1
- package/lib/aws/storage/cors-config.generated.d.ts +5 -5
- package/lib/aws/storage/cors-config.generated.js +1 -1
- package/lib/aws/storage/cors-rule-config.generated.d.ts +5 -5
- package/lib/aws/storage/cors-rule-config.generated.js +1 -1
- package/lib/aws/storage/ecr-repository.js +11 -11
- package/lib/aws/storage/encryption.d.ts +1 -1
- package/lib/aws/storage/encryption.js +5 -5
- package/lib/aws/storage/lifecycle-config.generated.d.ts +9 -9
- package/lib/aws/storage/lifecycle-config.generated.js +1 -1
- package/lib/aws/storage/notification-targets/function.js +2 -2
- package/lib/aws/storage/notification-targets/queue.js +4 -4
- package/lib/aws/storage/origin-access-identity.d.ts +2 -2
- package/lib/aws/storage/origin-access-identity.js +3 -3
- package/lib/aws/storage/parameter-util.js +5 -5
- package/lib/aws/storage/parameter.d.ts +2 -2
- package/lib/aws/storage/parameter.js +16 -16
- package/lib/aws/storage/stream-grants.js +1 -1
- package/lib/aws/storage/table-grants.js +1 -1
- package/lib/aws/storage/table.d.ts +1 -1
- package/lib/aws/storage/table.js +10 -10
- package/lib/aws/storage/website-config.generated.d.ts +8 -8
- package/lib/aws/storage/website-config.generated.js +1 -1
- package/lib/bundling.js +5 -5
- package/lib/construct-base.d.ts +1 -1
- package/lib/construct-base.js +10 -10
- package/lib/duration.js +9 -9
- package/lib/errors.js +1 -1
- package/lib/expiration.js +1 -1
- package/lib/fs/ignore.js +4 -4
- package/lib/fs/index.js +1 -1
- package/lib/private/terraform-dependables-aspect.d.ts +1 -1
- package/lib/private/terraform-dependables-aspect.js +6 -6
- package/lib/private/unique-resource-name.js +3 -3
- package/lib/size.js +6 -6
- package/lib/stack-base.d.ts +2 -2
- package/lib/stack-base.js +16 -16
- package/lib/terra-func.d.ts +1 -1
- package/lib/terra-func.js +18 -18
- package/lib/time-zone.js +1 -1
- package/lib/token.js +5 -5
- package/package.json +17 -17
- package/setup.js +2 -2
|
@@ -5,9 +5,9 @@ exports.EventType = exports.BucketEncryption = exports.StorageClass = exports.Bu
|
|
|
5
5
|
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
6
6
|
const node_os_1 = require("node:os");
|
|
7
7
|
const region_info_1 = require("@aws-cdk/region-info");
|
|
8
|
-
const provider_aws_1 = require("@
|
|
9
|
-
const provider_time_1 = require("@
|
|
10
|
-
const
|
|
8
|
+
const provider_aws_1 = require("@cdktn/provider-aws");
|
|
9
|
+
const provider_time_1 = require("@cdktn/provider-time");
|
|
10
|
+
const cdktn_1 = require("cdktn");
|
|
11
11
|
const bucket_notifications_1 = require("./bucket-notifications");
|
|
12
12
|
const perms = require("./bucket-perms");
|
|
13
13
|
const bucket_policy_1 = require("./bucket-policy");
|
|
@@ -401,7 +401,7 @@ class BucketBase extends aws_construct_1.AwsConstructBase {
|
|
|
401
401
|
}
|
|
402
402
|
exports.BucketBase = BucketBase;
|
|
403
403
|
_a = JSII_RTTI_SYMBOL_1;
|
|
404
|
-
BucketBase[_a] = { fqn: "terraconstructs.aws.storage.BucketBase", version: "0.2.
|
|
404
|
+
BucketBase[_a] = { fqn: "terraconstructs.aws.storage.BucketBase", version: "0.2.6" };
|
|
405
405
|
/**
|
|
406
406
|
* The `Bucket` provides an [AWS S3 Bucket](https://aws.amazon.com/s3/).
|
|
407
407
|
*
|
|
@@ -452,7 +452,7 @@ class Bucket extends BucketBase {
|
|
|
452
452
|
Bucket.validateBucketName(bucketName, true);
|
|
453
453
|
const newEndpoint = `s3-website.${region}.${urlSuffix}`;
|
|
454
454
|
const staticDomainEndpoint = regionInfo.s3StaticWebsiteEndpoint ??
|
|
455
|
-
|
|
455
|
+
cdktn_1.Lazy.stringValue({
|
|
456
456
|
produce: () => stack.regionalFact(region_info_1.FactName.S3_STATIC_WEBSITE_ENDPOINT, newEndpoint),
|
|
457
457
|
});
|
|
458
458
|
const websiteDomain = `${bucketName}.${staticDomainEndpoint}`;
|
|
@@ -510,7 +510,7 @@ class Bucket extends BucketBase {
|
|
|
510
510
|
*/
|
|
511
511
|
static validateBucketName(physicalName, allowLegacyBucketNaming = false) {
|
|
512
512
|
const bucketName = physicalName;
|
|
513
|
-
if (!bucketName ||
|
|
513
|
+
if (!bucketName || cdktn_1.Token.isUnresolved(bucketName)) {
|
|
514
514
|
// the name is a late-bound value, not a defined string,
|
|
515
515
|
// so skip validation
|
|
516
516
|
return;
|
|
@@ -901,7 +901,7 @@ class Bucket extends BucketBase {
|
|
|
901
901
|
}
|
|
902
902
|
exports.Bucket = Bucket;
|
|
903
903
|
_b = JSII_RTTI_SYMBOL_1;
|
|
904
|
-
Bucket[_b] = { fqn: "terraconstructs.aws.storage.Bucket", version: "0.2.
|
|
904
|
+
Bucket[_b] = { fqn: "terraconstructs.aws.storage.Bucket", version: "0.2.6" };
|
|
905
905
|
/**
|
|
906
906
|
* Storage class to move an object to
|
|
907
907
|
*/
|
|
@@ -1200,4 +1200,4 @@ var EventType;
|
|
|
1200
1200
|
*/
|
|
1201
1201
|
EventType["OBJECT_ACL_PUT"] = "s3:ObjectAcl:Put";
|
|
1202
1202
|
})(EventType || (exports.EventType = EventType = {}));
|
|
1203
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVja2V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2F3cy9zdG9yYWdlL2J1Y2tldC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLHFDQUE4QjtBQUM5QixzREFBNEQ7QUFDNUQsc0RBVzZCO0FBQzdCLHdEQUE2QztBQUM3QyxpQ0FBb0M7QUFJcEMsaUVBQTZEO0FBQzdELHdDQUF3QztBQUN4QyxtREFBK0M7QUFDL0MsbURBQWtFO0FBR2xFLHFFQUFnRTtBQUVoRSxvREFJMEI7QUFDMUIsNENBQXdDO0FBQ3hDLGlDQUF5RDtBQUN6RCx5Q0FBd0U7QUFDeEUscUNBQXFDO0FBQ3JDLDhCQUE4QjtBQXdwQjlCLE1BQXNCLFVBQVcsU0FBUSxnQ0FBZ0I7SUFjdkQsSUFBVyxhQUFhO1FBQ3RCLE9BQU87WUFDTCxJQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVU7WUFDckIsR0FBRyxFQUFFLElBQUksQ0FBQyxTQUFTO1lBQ25CLFVBQVUsRUFBRSxJQUFJLENBQUMsZ0JBQWdCO1lBQ2pDLGtCQUFrQixFQUFFLElBQUksQ0FBQyx3QkFBd0I7WUFDakQsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLGlCQUFpQjtZQUN6QyxVQUFVLEVBQUUsSUFBSSxDQUFDLGVBQWU7WUFDaEMsb0JBQW9CLEVBQ2xCLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxrQ0FBa0M7WUFDL0QsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUsVUFBVTtTQUM5QyxDQUFDO0lBQ0osQ0FBQztJQUNELElBQVcsT0FBTztRQUNoQixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUM7SUFDNUIsQ0FBQztJQXNDRCxrRUFBa0U7SUFDbEUsb0dBQW9HO0lBQ3BHLCtDQUErQztJQUUvQyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLFFBQTJCLEVBQUU7UUFDckUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFqQzFCLGdCQUFnQjtR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Q0gsOERBQWlELENBQUE7SUFFakQ7Ozs7O09BS0c7SUFDSCwwRUFBNkQsQ0FBQTtJQUU3RDs7OztPQUlHO0lBQ0gsc0dBQXlGLENBQUE7SUFFekY7OztPQUdHO0lBQ0gsNERBQStDLENBQUE7SUFFL0M7Ozs7T0FJRztJQUNILDBEQUE2QyxDQUFBO0lBRTdDOzs7T0FHRztJQUNILGtEQUFxQyxDQUFBO0lBRXJDOzs7O09BSUc7SUFDSCx3REFBMkMsQ0FBQTtJQUUzQzs7O09BR0c7SUFDSCw4REFBaUQsQ0FBQTtJQUVqRDs7Ozs7T0FLRztJQUNILGdEQUFtQyxDQUFBO0FBQ3JDLENBQUMsRUE3TlcsU0FBUyx5QkFBVCxTQUFTLFFBNk5wQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVPTCB9IGZyb20gXCJub2RlOm9zXCI7XG5pbXBvcnQgeyBGYWN0TmFtZSwgUmVnaW9uSW5mbyB9IGZyb20gXCJAYXdzLWNkay9yZWdpb24taW5mb1wiO1xuaW1wb3J0IHtcbiAgczNCdWNrZXQsXG4gIHMzQnVja2V0QWNsLFxuICBzM0J1Y2tldENvcnNDb25maWd1cmF0aW9uLFxuICBzM0J1Y2tldE93bmVyc2hpcENvbnRyb2xzLFxuICBzM0J1Y2tldFB1YmxpY0FjY2Vzc0Jsb2NrLFxuICBzM0J1Y2tldFdlYnNpdGVDb25maWd1cmF0aW9uLFxuICBzM0J1Y2tldExpZmVjeWNsZUNvbmZpZ3VyYXRpb24sXG4gIHMzQnVja2V0VmVyc2lvbmluZyxcbiAgczNCdWNrZXRTZXJ2ZXJTaWRlRW5jcnlwdGlvbkNvbmZpZ3VyYXRpb24sXG4gIGRhdGFBd3NTM0J1Y2tldCxcbn0gZnJvbSBcIkBjZGt0Zi9wcm92aWRlci1hd3NcIjtcbmltcG9ydCB7IHNsZWVwIH0gZnJvbSBcIkBjZGt0Zi9wcm92aWRlci10aW1lXCI7XG5pbXBvcnQgeyBMYXp5LCBUb2tlbiB9IGZyb20gXCJjZGt0ZlwiO1xuLy8gaW1wb3J0IHsgRm4gfSBmcm9tIFwiLi4vLi4vdGVycmEtZnVuY1wiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IElCdWNrZXROb3RpZmljYXRpb25EZXN0aW5hdGlvbiB9IGZyb20gXCIuL2J1Y2tldC1kZXN0aW5hdGlvblwiO1xuaW1wb3J0IHsgQnVja2V0Tm90aWZpY2F0aW9ucyB9IGZyb20gXCIuL2J1Y2tldC1ub3RpZmljYXRpb25zXCI7XG5pbXBvcnQgKiBhcyBwZXJtcyBmcm9tIFwiLi9idWNrZXQtcGVybXNcIjtcbmltcG9ydCB7IEJ1Y2tldFBvbGljeSB9IGZyb20gXCIuL2J1Y2tldC1wb2xpY3lcIjtcbmltcG9ydCB7IEJ1Y2tldFNvdXJjZSwgQnVja2V0U291cmNlUHJvcHMgfSBmcm9tIFwiLi9idWNrZXQtc291cmNlXCI7XG5pbXBvcnQgeyBDb3JzQ29uZmlnIH0gZnJvbSBcIi4vY29ycy1jb25maWcuZ2VuZXJhdGVkXCI7XG5pbXBvcnQgeyBMaWZlY3ljbGVDb25maWd1cmF0aW9uUnVsZSB9IGZyb20gXCIuL2xpZmVjeWNsZS1jb25maWcuZ2VuZXJhdGVkXCI7XG5pbXBvcnQgeyBPcmlnaW5BY2Nlc3NJZGVudGl0eSB9IGZyb20gXCIuL29yaWdpbi1hY2Nlc3MtaWRlbnRpdHlcIjtcbmltcG9ydCB7IFdlYnNpdGVDb25maWcgfSBmcm9tIFwiLi93ZWJzaXRlLWNvbmZpZy5nZW5lcmF0ZWRcIjtcbmltcG9ydCB7XG4gIEF3c0NvbnN0cnVjdEJhc2UsXG4gIElBd3NDb25zdHJ1Y3QsXG4gIEF3c0NvbnN0cnVjdFByb3BzLFxufSBmcm9tIFwiLi4vYXdzLWNvbnN0cnVjdFwiO1xuaW1wb3J0IHsgQXdzU3RhY2sgfSBmcm9tIFwiLi4vYXdzLXN0YWNrXCI7XG5pbXBvcnQgeyBwYXJzZUJ1Y2tldE5hbWUsIHBhcnNlQnVja2V0QXJuIH0gZnJvbSBcIi4vdXRpbFwiO1xuaW1wb3J0IHsgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IsIFZhbGlkYXRpb25FcnJvciB9IGZyb20gXCIuLi8uLi9lcnJvcnNcIjtcbmltcG9ydCAqIGFzIGttcyBmcm9tIFwiLi4vZW5jcnlwdGlvblwiO1xuaW1wb3J0ICogYXMgaWFtIGZyb20gXCIuLi9pYW1cIjtcblxuZXhwb3J0IGludGVyZmFjZSBDbG91ZGZyb250QWNjZXNzQ29uZmlnIHtcbiAgLyoqXG4gICAqIEVuYWJsZSBDbG91ZGZyb250IGFjY2VzcyB2aWEgT3JpZ2luIEFjY2VzcyBJZGVudGl0eS5cbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZWQ6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBPYmplY3Qga2V5IHBhdHRlcm5zIGZvciBjbG91ZGZyb250IGFjY2Vzcy5cbiAgICpcbiAgICogQGRlZmF1bHQgXCIqXCJcbiAgICovXG4gIHJlYWRvbmx5IGtleVBhdHRlcm5zPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogQSByZWZlcmVuY2UgdG8gYSBidWNrZXQgb3V0c2lkZSB0aGlzIHN0YWNrXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVja2V0QXR0cmlidXRlcyB7XG4gIC8qKlxuICAgKiBUaGUgQVJOIG9mIHRoZSBidWNrZXQuIEF0IGxlYXN0IG9uZSBvZiBidWNrZXRBcm4gb3IgYnVja2V0TmFtZSBtdXN0IGJlXG4gICAqIGRlZmluZWQgaW4gb3JkZXIgdG8gaW5pdGlhbGl6ZSBhIGJ1Y2tldCByZWYuXG4gICAqL1xuICByZWFkb25seSBidWNrZXRBcm4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBidWNrZXQuIElmIHRoZSB1bmRlcmx5aW5nIHZhbHVlIG9mIEFSTiBpcyBhIHN0cmluZywgdGhlXG4gICAqIG5hbWUgd2lsbCBiZSBwYXJzZWQgZnJvbSB0aGUgQVJOLiBPdGhlcndpc2UsIHRoZSBuYW1lIGlzIG9wdGlvbmFsLCBidXRcbiAgICogc29tZSBmZWF0dXJlcyB0aGF0IHJlcXVpcmUgdGhlIGJ1Y2tldCBuYW1lIHN1Y2ggYXMgYXV0by1jcmVhdGluZyBhIGJ1Y2tldFxuICAgKiBwb2xpY3ksIHdvbid0IHdvcmsuXG4gICAqL1xuICByZWFkb25seSBidWNrZXROYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZG9tYWluIG5hbWUgb2YgdGhlIGJ1Y2tldC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBJbmZlcnJlZCBmcm9tIGJ1Y2tldCBuYW1lXG4gICAqL1xuICByZWFkb25seSBidWNrZXREb21haW5OYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgd2Vic2l0ZSBVUkwgb2YgdGhlIGJ1Y2tldCAoaWYgc3RhdGljIHdlYiBob3N0aW5nIGlzIGVuYWJsZWQpLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIEluZmVycmVkIGZyb20gYnVja2V0IG5hbWUgYW5kIHJlZ2lvblxuICAgKi9cbiAgcmVhZG9ubHkgYnVja2V0V2Vic2l0ZVVybD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHJlZ2lvbmFsIGRvbWFpbiBuYW1lIG9mIHRoZSBzcGVjaWZpZWQgYnVja2V0LlxuICAgKi9cbiAgcmVhZG9ubHkgYnVja2V0UmVnaW9uYWxEb21haW5OYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgSVB2NiBETlMgbmFtZSBvZiB0aGUgc3BlY2lmaWVkIGJ1Y2tldC5cbiAgICovXG4gIHJlYWRvbmx5IGJ1Y2tldER1YWxTdGFja0RvbWFpbk5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEtNUyBlbmNyeXB0aW9uIGtleSBhc3NvY2lhdGVkIHdpdGggdGhpcyBidWNrZXQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gZW5jcnlwdGlvbiBrZXlcbiAgICovXG4gIHJlYWRvbmx5IGVuY3J5cHRpb25LZXk/OiBrbXMuSUtleTtcblxuICAvKipcbiAgICogSWYgdGhpcyBidWNrZXQgaGFzIGJlZW4gY29uZmlndXJlZCBmb3Igc3RhdGljIHdlYnNpdGUgaG9zdGluZy5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGlzV2Vic2l0ZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBhY2NvdW50IHRoaXMgZXhpc3RpbmcgYnVja2V0IGJlbG9uZ3MgdG8uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gaXQncyBhc3N1bWVkIHRoZSBidWNrZXQgYmVsb25ncyB0byB0aGUgc2FtZSBhY2NvdW50IGFzIHRoZSBzY29wZSBpdCdzIGJlaW5nIGltcG9ydGVkIGludG9cbiAgICovXG4gIHJlYWRvbmx5IGFjY291bnQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSByZWdpb24gdGhpcyBleGlzdGluZyBidWNrZXQgaXMgaW4uXG4gICAqIEZlYXR1cmVzIHRoYXQgcmVxdWlyZSB0aGUgcmVnaW9uIChlLmcuIGBidWNrZXRXZWJzaXRlVXJsYCkgd29uJ3QgZnVsbHkgd29ya1xuICAgKiBpZiB0aGUgcmVnaW9uIGNhbm5vdCBiZSBjb3JyZWN0bHkgaW5mZXJyZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gaXQncyBhc3N1bWVkIHRoZSBidWNrZXQgaXMgaW4gdGhlIHNhbWUgcmVnaW9uIGFzIHRoZSBzY29wZSBpdCdzIGJlaW5nIGltcG9ydGVkIGludG9cbiAgICovXG4gIHJlYWRvbmx5IHJlZ2lvbj86IHN0cmluZztcblxuICAvLyBUT0RPOiBVc2UgQ3VzdG9tIFJlc291cmNlIGZvciB3aXRoTm90aWZpY2F0aW9ucygpIHN1cHBvcnRcbiAgLy8gLyoqXG4gIC8vICAqIFRoZSByb2xlIHRvIGJlIHVzZWQgYnkgdGhlIG5vdGlmaWNhdGlvbnMgaGFuZGxlclxuICAvLyAgKlxuICAvLyAgKiBAZGVmYXVsdCAtIGEgbmV3IHJvbGUgd2lsbCBiZSBjcmVhdGVkLlxuICAvLyAgKi9cbiAgLy8gcmVhZG9ubHkgbm90aWZpY2F0aW9uc0hhbmRsZXJSb2xlPzogaWFtLklSb2xlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBidWNrZXQgaXMgcHVibGljIG9yIG5vdC5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHB1YmxpYz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGJ1Y2tldCBoYXMgdmVyc2lvbmluZyBlbmFibGVkXG4gICAqXG4gICAqIElmIHlvdSBhcmUgZW5hYmxpbmcgdmVyc2lvbmluZyBvbiB0aGUgYnVja2V0IGZvciB0aGUgZmlyc3QgdGltZSwgQVdTIHJlY29tbWVuZHMgdGhhdFxuICAgKiB5b3Ugd2FpdCBmb3IgMTUgbWludXRlcyBhZnRlciBlbmFibGluZyB2ZXJzaW9uaW5nIGJlZm9yZSBpc3N1aW5nIHdyaXRlIG9wZXJhdGlvbnNcbiAgICogKFBVVCBvciBERUxFVEUpIG9uIG9iamVjdHMgaW4gdGhlIGJ1Y2tldC5cbiAgICpcbiAgICogVGhpcyB3aWxsIGNhdXNlIDE1bSBkZWxheSBpZiBgcGF0aGAgaXMgY29uZmlndXJlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHZlcnNpb25lZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFNwZWNpYWwgQ2xvdWRGcm9udCB1c2VyIHRoYXQgeW91IGNhbiBhc3NvY2lhdGUgd2l0aCBBbWF6b24gUzMgb3JpZ2lucywgc28gdGhhdCB5b3UgY2FuIHNlY3VyZSBhbGwgb3IganVzdCBzb21lIG9mXG4gICAqIHlvdXIgQW1hem9uIFMzIGNvbnRlbnQuXG4gICAqXG4gICAqIFJlcXVpcmVkIHRvIHVzZSB0aGUgaW1wb3J0ZWQgYnVja2V0IGluIGEgQ2xvdWRGcm9udCBkaXN0cmlidXRpb24uXG4gICAqL1xuICByZWFkb25seSBvcmlnaW5BY2Nlc3NJZGVudGl0eT86IE9yaWdpbkFjY2Vzc0lkZW50aXR5O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJ1Y2tldFByb3BzIGV4dGVuZHMgQXdzQ29uc3RydWN0UHJvcHMge1xuICAvKipcbiAgICogVGhlIGtpbmQgb2Ygc2VydmVyLXNpZGUgZW5jcnlwdGlvbiB0byBhcHBseSB0byB0aGlzIGJ1Y2tldC5cbiAgICpcbiAgICogSWYgeW91IGNob29zZSBLTVMsIHlvdSBjYW4gc3BlY2lmeSBhIEtNUyBrZXkgdmlhIGBlbmNyeXB0aW9uS2V5YC4gSWZcbiAgICogZW5jcnlwdGlvbiBrZXkgaXMgbm90IHNwZWNpZmllZCwgYSBrZXkgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGNyZWF0ZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYEtNU2AgaWYgYGVuY3J5cHRpb25LZXlgIGlzIHNwZWNpZmllZCwgb3IgYFVORU5DUllQVEVEYCBvdGhlcndpc2UuXG4gICAqIEJ1dCBpZiBgVU5FTkNSWVBURURgIGlzIHNwZWNpZmllZCwgdGhlIGJ1Y2tldCB3aWxsIGJlIGVuY3J5cHRlZCBhcyBgUzNfTUFOQUdFRGAgYXV0b21hdGljYWxseS5cbiAgICovXG4gIHJlYWRvbmx5IGVuY3J5cHRpb24/OiBCdWNrZXRFbmNyeXB0aW9uO1xuXG4gIC8qKlxuICAgKiBFeHRlcm5hbCBLTVMga2V5IHRvIHVzZSBmb3IgYnVja2V0IGVuY3J5cHRpb24uXG4gICAqXG4gICAqIFRoZSBgZW5jcnlwdGlvbmAgcHJvcGVydHkgbXVzdCBiZSBlaXRoZXIgbm90IHNwZWNpZmllZCBvciBzZXQgdG8gYEtNU2Agb3IgYERTU0VgLlxuICAgKiBBbiBlcnJvciB3aWxsIGJlIGVtaXR0ZWQgaWYgYGVuY3J5cHRpb25gIGlzIHNldCB0byBgVU5FTkNSWVBURURgIG9yIGBTM19NQU5BR0VEYC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBJZiBgZW5jcnlwdGlvbmAgaXMgc2V0IHRvIGBLTVNgIGFuZCB0aGlzIHByb3BlcnR5IGlzIHVuZGVmaW5lZCxcbiAgICogYSBuZXcgS01TIGtleSB3aWxsIGJlIGNyZWF0ZWQgYW5kIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGJ1Y2tldC5cbiAgICovXG4gIHJlYWRvbmx5IGVuY3J5cHRpb25LZXk/OiBrbXMuSUtleTtcblxuICAvKipcbiAgICogV2hldGhlciBBbWF6b24gUzMgc2hvdWxkIHVzZSBpdHMgb3duIGludGVybWVkaWFyeSBrZXkgdG8gZ2VuZXJhdGUgZGF0YSBrZXlzLlxuICAgKlxuICAgKiBPbmx5IHJlbGV2YW50IHdoZW4gdXNpbmcgS01TIGZvciBlbmNyeXB0aW9uLlxuICAgKlxuICAgKiAtIElmIG5vdCBlbmFibGVkLCBldmVyeSBvYmplY3QgR0VUIGFuZCBQVVQgd2lsbCBjYXVzZSBhbiBBUEkgY2FsbCB0byBLTVMgKHdpdGggdGhlXG4gICAqICAgYXR0ZW5kYW50IGNvc3QgaW1wbGljYXRpb25zIG9mIHRoYXQpLlxuICAgKiAtIElmIGVuYWJsZWQsIFMzIHdpbGwgdXNlIGl0cyBvd24gdGltZS1saW1pdGVkIGtleSBpbnN0ZWFkLlxuICAgKlxuICAgKiBPbmx5IHJlbGV2YW50LCB3aGVuIEVuY3J5cHRpb24gaXMgbm90IHNldCB0byBgQnVja2V0RW5jcnlwdGlvbi5VTkVOQ1JZUFRFRGAuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGJ1Y2tldEtleUVuYWJsZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aChzKSB0byBzdGF0aWMgZGlyZWN0b3JpZXMgb3IgZmlsZXMgdG8gdXBsb2FkLCByZWxhdGl2ZSB0byB0aGUgU3RhY2sgZmlsZS5cbiAgICpcbiAgICogQGV4YW1wbGUgXCIuL2Rpc3RcIlxuICAgKiBAZGVmYXVsdCAtIE5vIGZpbGVzIGFyZSB1cGxvYWRlZC5cbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZXM/OiBzdHJpbmcgfCBzdHJpbmdbXSB8IEFkZFNvdXJjZU9wdGlvbnNbXTtcblxuICAvLyBUT0RPOiBBZGQgc3VwcG9ydCB0byBwYXNzIGRvbWFpbiBwcm9wcyAoZm9yIHJvdXRlNTMgYWxpYXM/KVxuXG4gIC8qKlxuICAgKiBFbmFibGUgcHVibGljIHJlYWQgYWNjZXNzIGZvciBhbGwgdGhlIGZpbGVzIGluIHRoZSBidWNrZXQuXG4gICAqXG4gICAqIEVuYWJsZSB0aGlzIG9ubHkgaWYgeW91J3JlIG5vdCB1c2luZyBDRE4gKENsb3VkRnJvbnQpIHRvIHNlcnZlIGZpbGVzIGZyb20gdGhlIGJ1Y2tldC5cbiAgICogU2hvdWxkIG9ubHkgYmUgdHVybmVkIG9uIGlmIHlvdSB3YW50IHRvIGhvc3QgcHVibGljIGZpbGVzIGRpcmVjdGx5IGZyb20gdGhlIGJ1Y2tldC5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgcHVibGljPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQSBuYW1lIGZvciB0aGUgYnVja2V0LlxuICAgKlxuICAgKiBNdXN0IGJlIGxvd2VyY2FzZSBhbmQgYmV0d2VlbiAzIChtaW4pIGFuZCA2MyAobWF4KSBjaGFyYWN0ZXJzIGxvbmcuXG4gICAqXG4gICAqIFRoZSBuYW1lIG11c3Qgbm90IGJlIGluIHRoZSBmb3JtYXQgW2J1Y2tldF9uYW1lXS0tW2F6aWRdLS14LXMzLiBVc2UgdGhlXG4gICAqIGBhd3NfczNfZGlyZWN0b3J5X2J1Y2tldGAgcmVzb3VyY2UgdG8gbWFuYWdlIFMzIEV4cHJlc3MgYnVja2V0cy5cbiAgICpcbiAgICogQSBmdWxsIGxpc3Qgb2YgYnVja2V0IG5hbWluZyBydWxlcyBbbWF5IGJlIGZvdW5kIGhlcmVdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25TMy9sYXRlc3QvdXNlcmd1aWRlL2J1Y2tldG5hbWluZ3J1bGVzLmh0bWwpLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIElmIG9taXR0ZWQsIFJlZmVyIHRvIGBuYW1lUHJlZml4YC5cbiAgICovXG4gIHJlYWRvbmx5IGJ1Y2tldE5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSB1bmlxdWUgbmFtZSBiZWdpbm5pbmcgd2l0aCB0aGUgc3BlY2lmaWVkIHByZWZpeC5cbiAgICogQ29uZmxpY3RzIHdpdGggYGJ1Y2tldE5hbWVgLlxuICAgKlxuICAgKiBUZXJyYWZvcm0gUHJlZml4ZXMgbXVzdCByZXNlcnZlIDI2IGNoYXJhY3RlcnMgZm9yIHRoZSB0ZXJyYWZvcm0gZ2VuZXJhdGVkIHN1ZmZpeC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBJZiBvbWl0dGVkLCBFVCB3aWxsIGFzc2lnbiBhIHJhbmRvbSwgdW5pcXVlIG5hbWUgcHJlZml4ZWQgYnkgR3JpZFVVSUQuXG4gICAqL1xuICByZWFkb25seSBuYW1lUHJlZml4Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBCb29sZWFuIHRoYXQgaW5kaWNhdGVzIGFsbCBvYmplY3RzIChpbmNsdWRpbmcgYW55IGxvY2tlZCBvYmplY3RzKVxuICAgKiBzaG91bGQgYmUgZGVsZXRlZCBmcm9tIHRoZSBidWNrZXQgd2hlbiB0aGUgYnVja2V0IGlzIGRlc3Ryb3llZFxuICAgKiBzbyB0aGF0IHRoZSBidWNrZXQgY2FuIGJlIGRlc3Ryb3llZCB3aXRob3V0IGVycm9yLlxuICAgKlxuICAgKiBUaGVzZSBvYmplY3RzIGFyZSBub3QgcmVjb3ZlcmFibGUuIFRoaXMgb25seSBkZWxldGVzIG9iamVjdHMgd2hlblxuICAgKiB0aGUgYnVja2V0IGlzIGRlc3Ryb3llZCwgbm90IHdoZW4gc2V0dGluZyB0aGlzIHBhcmFtZXRlciB0byB0cnVlLlxuICAgKlxuICAgKiBPbmNlIHRoaXMgcGFyYW1ldGVyIGlzIHNldCB0byB0cnVlLCB0aGVyZSBtdXN0IGJlIGEgc3VjY2Vzc2Z1bFxuICAgKiB0ZXJyYWZvcm0gYXBwbHkgcnVuIGJlZm9yZSBhIGRlc3Ryb3kgaXMgcmVxdWlyZWQgdG8gdXBkYXRlIHRoaXNcbiAgICogdmFsdWUgaW4gdGhlIHJlc291cmNlIHN0YXRlLlxuICAgKlxuICAgKiBXaXRob3V0IGEgc3VjY2Vzc2Z1bCB0ZXJyYWZvcm0gYXBwbHkgYWZ0ZXIgdGhpcyBwYXJhbWV0ZXIgaXMgc2V0LFxuICAgKiB0aGlzIGZsYWcgd2lsbCBoYXZlIG5vIGVmZmVjdC4gSWYgc2V0dGluZyB0aGlzIGZpZWxkIGluIHRoZSBzYW1lXG4gICAqIG9wZXJhdGlvbiB0aGF0IHdvdWxkIHJlcXVpcmUgcmVwbGFjaW5nIHRoZSBidWNrZXQgb3IgZGVzdHJveWluZ1xuICAgKiB0aGUgYnVja2V0LCB0aGlzIGZsYWcgd2lsbCBub3Qgd29yay5cbiAgICpcbiAgICogQWRkaXRpb25hbGx5IHdoZW4gaW1wb3J0aW5nIGEgYnVja2V0LCBhIHN1Y2Nlc3NmdWwgdGVycmFmb3JtIGFwcGx5XG4gICAqIGlzIHJlcXVpcmVkIHRvIHNldCB0aGlzIHZhbHVlIGluIHN0YXRlIGJlZm9yZSBpdCB3aWxsIHRha2UgZWZmZWN0XG4gICAqIG9uIGEgZGVzdHJveSBvcGVyYXRpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBmb3JjZURlc3Ryb3k/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBQcm92aWRlcyBhbiBTMyBidWNrZXQgd2Vic2l0ZSBjb25maWd1cmF0aW9uIHJlc291cmNlLlxuICAgKlxuICAgKiBJbXBvcnRhbnQ6IEFtYXpvbiBTMyB3ZWJzaXRlIGVuZHBvaW50cyBkbyBub3Qgc3VwcG9ydCBIVFRQUyBvciBhY2Nlc3MgcG9pbnRzLlxuICAgKiBJZiB5b3Ugd2FudCB0byB1c2UgSFRUUFMsIHlvdSBjYW4gdXNlIGVkZ2UgRGlzdHJpYnV0aW9uIHRvIHNlcnZlIGEgc3RhdGljXG4gICAqIHdlYnNpdGUgaG9zdGVkIGluIGEgYnVja2V0LlxuICAgKlxuICAgKiBVc2UgT3JpZ2luQWNjZXNzSWRlbnRpdHkgcHJvcGVydHkgdG8gY29udHJvbCBpbmdyZXNzIHRocm91Z2ggZWRnZSBEaXN0cmlidXRpb24uXG4gICAqXG4gICAqIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW0hvc3RpbmcgV2Vic2l0ZXMgb24gUzNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25TMy9sYXRlc3QvZGV2L1dlYnNpdGVIb3N0aW5nLmh0bWwpLlxuICAgKi9cbiAgcmVhZG9ubHkgd2Vic2l0ZUNvbmZpZz86IFdlYnNpdGVDb25maWc7XG5cbiAgLyoqXG4gICAqIFByb3ZpZGVzIGFuIFMzIGJ1Y2tldCBDT1JTIGNvbmZpZ3VyYXRpb24gcmVzb3VyY2UuXG4gICAqXG4gICAqIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IENPUlMsIGdvIHRvXG4gICAqIFtFbmFibGluZyBDcm9zcy1PcmlnaW4gUmVzb3VyY2UgU2hhcmluZ10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC91c2VyZ3VpZGUvY29ycy5odG1sKVxuICAgKiBpbiB0aGUgQW1hem9uIFMzIFVzZXIgR3VpZGUuXG4gICAqL1xuICByZWFkb25seSBjb3JzQ29uZmlnPzogQ29yc0NvbmZpZztcblxuICAvKipcbiAgICogT25lIG9yIG1vcmUgTGlmZWN5Y2xlIHJ1bGVzLiBFYWNoIHJ1bGUgY29uc2lzdHMgb2YgdGhlIGZvbGxvd2luZzpcbiAgICpcbiAgICogIC0gUnVsZSBpZFxuICAgKiAgLSBGaWx0ZXIgaWRlbnRpZnlpbmcgb2JqZWN0cyB0byB3aGljaCB0aGUgcnVsZSBhcHBsaWVzXG4gICAqICAtIE9uZSBvciBtb3JlIHRyYW5zaXRpb24gb3IgZXhwaXJhdGlvbiBhY3Rpb25zXG4gICAqXG4gICAqIEZvciBtb3JlIGluZm9ybWF0aW9uIHNlZSB0aGUgQW1hem9uIFMzIFVzZXIgR3VpZGUgb24gW0xpZmVjeWNsZSBDb25maWd1cmF0aW9uIEVsZW1lbnRzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L3VzZXJndWlkZS9pbnRyby1saWZlY3ljbGUtcnVsZXMuaHRtbCkuXG4gICAqL1xuICByZWFkb25seSBsaWZlY3ljbGVSdWxlcz86IExpZmVjeWNsZUNvbmZpZ3VyYXRpb25SdWxlW107XG5cbiAgLyoqXG4gICAqIENvbnRyb2xzIHZlcnNpb25pbmcgb24gdGhlIFMzIGJ1Y2tldC5cbiAgICpcbiAgICogU2V0dGluZyB0aGlzIHRvIGZhbHNlIHdpbGwgc3VzcGVuZCB2ZXJzaW9uaW5nIGlmIHRoZSBhc3NvY2lhdGVkIFMzIGJ1Y2tldCBpcyB2ZXJzaW9uZWQuXG4gICAqXG4gICAqIElmIHlvdSBhcmUgZW5hYmxpbmcgdmVyc2lvbmluZyBvbiB0aGUgYnVja2V0IGZvciB0aGUgZmlyc3QgdGltZSwgQVdTIHJlY29tbWVuZHMgdGhhdCB5b3Ugd2FpdCBmb3IgMTUgbWludXRlcyBhZnRlciBlbmFibGluZyB2ZXJzaW9uaW5nIGJlZm9yZSBpc3N1aW5nIHdyaXRlIG9wZXJhdGlvbnMgKFBVVCBvciBERUxFVEUpIG9uIG9iamVjdHMgaW4gdGhlIGJ1Y2tldC5cbiAgICogVGhpcyB3aWxsIGNhdXNlIDE1bSBkZWxheSBpZiBgcGF0aGAgaXMgY29uZmlndXJlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHZlcnNpb25lZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyBidWNrZXQgc2hvdWxkIHNlbmQgbm90aWZpY2F0aW9ucyB0byBBbWF6b24gRXZlbnRCcmlkZ2Ugb3Igbm90LlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgZXZlbnRCcmlkZ2VFbmFibGVkPzogYm9vbGVhbjtcblxuICAvLyBUT0RPOiByZS1hZGQgT2JqZWN0T3duZXJzaGlwIGFuZCBCdWNrZXRBY2Nlc3NDb250cm9sXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9ibG9iL3YyLjE2MC4wL3BhY2thZ2VzL2F3cy1jZGstbGliL2F3cy1zMy9saWIvYnVja2V0LnRzI0wxMjg0XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9ibG9iL3YyLjE2MC4wL3BhY2thZ2VzL2F3cy1jZGstbGliL2F3cy1zMy9saWIvYnVja2V0LnRzI0wxNjQzXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9ibG9iL3YyLjE2MC4wL3BhY2thZ2VzL2F3cy1jZGstbGliL2F3cy1zMy9saWIvYnVja2V0LnRzI0wxOTM2XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9ibG9iL3YyLjE2MC4wL3BhY2thZ2VzL2F3cy1jZGstbGliL2F3cy1zMy9saWIvYnVja2V0LnRzI0wyMzYzXG4gIC8vIEJ1Y2tldEFjY2Vzc0NvbnRyb2xcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2Jsb2IvdjIuMTYwLjAvcGFja2FnZXMvYXdzLWNkay1saWIvYXdzLXMzL2xpYi9idWNrZXQudHMjTDI5MDVcblxuICAvKipcbiAgICogRW5mb3JjZXMgU1NMIGZvciByZXF1ZXN0cy4gUzMuNSBvZiB0aGUgQVdTIEZvdW5kYXRpb25hbCBTZWN1cml0eSBCZXN0IFByYWN0aWNlcyBSZWdhcmRpbmcgUzMuXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2NvbmZpZy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvczMtYnVja2V0LXNzbC1yZXF1ZXN0cy1vbmx5Lmh0bWxcbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGVuZm9yY2VTU0w/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBFbmZvcmNlcyBtaW5pbXVtIFRMUyB2ZXJzaW9uIGZvciByZXF1ZXN0cy5cbiAgICpcbiAgICogUmVxdWlyZXMgYGVuZm9yY2VTU0xgIHRvIGJlIGVuYWJsZWQuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC91c2VyZ3VpZGUvYW1hem9uLXMzLXBvbGljeS1rZXlzLmh0bWwjZXhhbXBsZS1vYmplY3QtdGxzLXZlcnNpb25cbiAgICpcbiAgICogQGRlZmF1bHQgTm8gbWluaW11bSBUTFMgdmVyc2lvbiBpcyBlbmZvcmNlZC5cbiAgICovXG4gIHJlYWRvbmx5IG1pbmltdW1UTFNWZXJzaW9uPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBFbmFibGUgQ2xvdWRmcm9udCBhY2Nlc3MgdmlhIE9yaWdpbiBBY2Nlc3MgSWRlbnRpdHkuXG4gICAqXG4gICAqIE5vdGU6IHJlY29tbWVuZGVkIHRvIG1pZ3JhdGUgdG8gT0FDIGluIGZ1dHVyZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBjbG91ZGZyb250IGFjY2Vzc1xuICAgKi9cbiAgcmVhZG9ubHkgY2xvdWRmcm9udEFjY2Vzcz86IENsb3VkZnJvbnRBY2Nlc3NDb25maWc7XG5cbiAgLy8gVE9ETzogQWRkIGZsYWcgdG8gcmVnaXN0ZXIgQnVja2V0IFNvdXJjZSBvdXRwdXRzP1xufVxuXG4vKipcbiAqIE91dHB1dHMgd2hpY2ggbWF5IGJlIHJlZ2lzdGVyZWQgZm9yIG91dHB1dCB2aWEgdGhlIEdyaWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVja2V0T3V0cHV0cyB7XG4gIC8qKlxuICAgKiBBV1MgQnVja2V0IG5hbWVcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBV1MgQnVja2V0IGFyblxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBhcm46IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIFVSTCBvZiB0aGUgc3RhdGljIHdlYnNpdGUuXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IHdlYnNpdGVVcmw/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBEb21haW4gbmFtZSBvZiB0aGUgc3RhdGljIHdlYnNpdGUuXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IHdlYnNpdGVEb21haW5OYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgSVB2NCBETlMgbmFtZSBvZiB0aGUgc3BlY2lmaWVkIGJ1Y2tldC5cbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgZG9tYWluTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVnaW9uYWwgZG9tYWluIG5hbWUgb2YgdGhlIHNwZWNpZmllZCBidWNrZXQuXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IHJlZ2lvbmFsRG9tYWluTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBPcmlnaW4gQWNjZXNzIElkZW50aXR5LCBpZiBjbG91ZGZyb250QWNjZXNzIGlzIGVuYWJsZWQuXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IG9yaWdpbkFjY2Vzc0lkZW50aXR5Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBLbXMgS2V5IG91dHB1dHMsIGlmIGJ1Y2tldCBoYXMgZW5jcnlwdGlvbi5cbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgZW5jcnlwdGlvbktleT86IGttcy5LZXlPdXRwdXRzO1xufVxuXG4vKipcbiAqIEltcG9ydGVkIG9yIGNyZWF0ZWQgQnVja2V0IGF0dHJpYnV0ZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJQnVja2V0IGV4dGVuZHMgSUF3c0NvbnN0cnVjdCB7XG4gIC8qKiBTdHJvbmdseSB0eXBlZCBvdXRwdXRzICovXG4gIHJlYWRvbmx5IGJ1Y2tldE91dHB1dHM6IEJ1Y2tldE91dHB1dHM7XG5cbiAgLyoqXG4gICAqIEFXUyBCdWNrZXQgYXJuXG4gICAqL1xuICByZWFkb25seSBidWNrZXRBcm46IHN0cmluZztcblxuICAvKipcbiAgICogQVdTIEJ1Y2tldCBuYW1lXG4gICAqL1xuICByZWFkb25seSBidWNrZXROYW1lOiBzdHJpbmc7XG5cbiAgLyoqIFdoZXRoZXIgdGhlIGJ1Y2tldCBoYXMgdmVyc2lvbmluZyBlbmFibGVkICovXG4gIHJlYWRvbmx5IHZlcnNpb25lZDogYm9vbGVhbjtcblxuICAvKiogVGhlIGhvc3RlZCBab25lIElkIGZvciB0aGUgYnVja2V0ICovXG4gIHJlYWRvbmx5IGhvc3RlZFpvbmVJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgRG9tYWluIG5hbWUgb2YgdGhlIHN0YXRpYyB3ZWJzaXRlLlxuICAgKlxuICAgKiBUaGlzIGlzIHVzZWQgdG8gY3JlYXRlIFJvdXRlIDUzIGFsaWFzIHJlY29yZHMuXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IHdlYnNpdGVEb21haW5OYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBidWNrZXQgaXMgcHVibGljIG9yIG5vdC5cbiAgICovXG4gIHJlYWRvbmx5IHB1YmxpYz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsIEtNUyBlbmNyeXB0aW9uIGtleSBhc3NvY2lhdGVkIHdpdGggdGhpcyBidWNrZXQuXG4gICAqL1xuICByZWFkb25seSBlbmNyeXB0aW9uS2V5Pzoga21zLklLZXk7XG5cbiAgLyoqXG4gICAqIFRoZSByZXNvdXJjZSBwb2xpY3kgYXNzb2NpYXRlZCB3aXRoIHRoaXMgYnVja2V0LlxuICAgKlxuICAgKiBJZiBgYXV0b0NyZWF0ZVBvbGljeWAgaXMgdHJ1ZSwgYSBgQnVja2V0UG9saWN5YCB3aWxsIGJlIGNyZWF0ZWQgdXBvbiB0aGVcbiAgICogZmlyc3QgY2FsbCB0byBhZGRUb1Jlc291cmNlUG9saWN5KHMpLlxuICAgKi9cbiAgcG9saWN5PzogQnVja2V0UG9saWN5O1xuXG4gIC8qKlxuICAgKiBBZGQgYSBzb3VyY2Ugb2YgZmlsZXMgZm9yIHVwbG9hZCB0byB0aGUgYnVja2V0LlxuICAgKi9cbiAgYWRkU291cmNlKHByb3BzOiBBZGRTb3VyY2VPcHRpb25zLCBzb3VyY2VJZD86IHN0cmluZyk6IHN0cmluZztcblxuICAvKipcbiAgICogSWYgdGhpcyBidWNrZXQgaGFzIGJlZW4gY29uZmlndXJlZCBmb3Igc3RhdGljIHdlYnNpdGUgaG9zdGluZy5cbiAgICovXG4gIGlzV2Vic2l0ZSgpOiB0aGlzIGlzIHtcbiAgICB3ZWJzaXRlRG9tYWluTmFtZTogc3RyaW5nO1xuICAgIGJ1Y2tldE91dHB1dHM6IHsgd2Vic2l0ZVVybDogc3RyaW5nOyB3ZWJzaXRlRG9tYWluTmFtZTogc3RyaW5nIH07XG4gIH07XG5cbiAgLyoqXG4gICAqIFRoZSBodHRwcyBVUkwgb2YgYW4gUzMgb2JqZWN0LiBGb3IgZXhhbXBsZTpcbiAgICpcbiAgICogLSBgaHR0cHM6Ly9zMy51cy13ZXN0LTEuYW1hem9uYXdzLmNvbS9vbmx5YnVja2V0YFxuICAgKiAtIGBodHRwczovL3MzLnVzLXdlc3QtMS5hbWF6b25hd3MuY29tL2J1Y2tldC9rZXlgXG4gICAqIC0gYGh0dHBzOi8vczMuY24tbm9ydGgtMS5hbWF6b25hd3MuY29tLmNuL2NoaW5hLWJ1Y2tldC9teWtleWBcbiAgICogQHBhcmFtIGtleSBUaGUgUzMga2V5IG9mIHRoZSBvYmplY3QuIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBVUkwgb2YgdGhlXG4gICAqICAgICAgYnVja2V0IGlzIHJldHVybmVkLlxuICAgKiBAcmV0dXJucyBhbiBPYmplY3RTM1VybCB0b2tlblxuICAgKi9cbiAgdXJsRm9yT2JqZWN0KGtleT86IHN0cmluZyk6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIFMzIFVSTCBvZiBhbiBTMyBvYmplY3QuIEZvciBleGFtcGxlOlxuICAgKiAtIGBzMzovL29ubHlidWNrZXRgXG4gICAqIC0gYHMzOi8vYnVja2V0L2tleWBcbiAgICogQHBhcmFtIGtleSBUaGUgUzMga2V5IG9mIHRoZSBvYmplY3QuIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBTMyBVUkwgb2YgdGhlXG4gICAqICAgICAgYnVja2V0IGlzIHJldHVybmVkLlxuICAgKiBAcmV0dXJucyBhbiBPYmplY3RTM1VybCB0b2tlblxuICAgKi9cbiAgczNVcmxGb3JPYmplY3Qoa2V5Pzogc3RyaW5nKTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIEFSTiB0aGF0IHJlcHJlc2VudHMgYWxsIG9iamVjdHMgd2l0aGluIHRoZSBidWNrZXQgdGhhdCBtYXRjaFxuICAgKiB0aGUga2V5IHBhdHRlcm4gc3BlY2lmaWVkLiBUbyByZXByZXNlbnQgYWxsIGtleXMsIHNwZWNpZnkgYGBcIipcImBgLlxuICAgKi9cbiAgYXJuRm9yT2JqZWN0cyhrZXlQYXR0ZXJuOiBzdHJpbmcpOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBzdGF0ZW1lbnQgdG8gdGhlIHJlc291cmNlIHBvbGljeSBmb3IgYSBwcmluY2lwYWwgKGkuZS5cbiAgICogYWNjb3VudC9yb2xlL3NlcnZpY2UpIHRvIHBlcmZvcm0gYWN0aW9ucyBvbiB0aGlzIGJ1Y2tldCBhbmQvb3IgaXRzXG4gICAqIGNvbnRlbnRzLiBVc2UgYGJ1Y2tldEFybmAgYW5kIGBhcm5Gb3JPYmplY3RzKGtleXMpYCB0byBvYnRhaW4gQVJOcyBmb3JcbiAgICogdGhpcyBidWNrZXQgb3Igb2JqZWN0cy5cbiAgICpcbiAgICogTm90ZSB0aGF0IHRoZSBwb2xpY3kgc3RhdGVtZW50IG1heSBvciBtYXkgbm90IGJlIGFkZGVkIHRvIHRoZSBwb2xpY3kuXG4gICAqIEZvciBleGFtcGxlLCB3aGVuIGFuIGBJQnVja2V0YCBpcyBjcmVhdGVkIGZyb20gYW4gZXhpc3RpbmcgYnVja2V0LFxuICAgKiBpdCdzIG5vdCBwb3NzaWJsZSB0byB0ZWxsIHdoZXRoZXIgdGhlIGJ1Y2tldCBhbHJlYWR5IGhhcyBhIHBvbGljeVxuICAgKiBhdHRhY2hlZCwgbGV0IGFsb25lIHRvIHJlLXVzZSB0aGF0IHBvbGljeSB0byBhZGQgbW9yZSBzdGF0ZW1lbnRzIHRvIGl0LlxuICAgKiBTbyBpdCdzIHNhZmVzdCB0byBkbyBub3RoaW5nIGluIHRoZXNlIGNhc2VzLlxuICAgKlxuICAgKiBAcGFyYW0gcGVybWlzc2lvbiB0aGUgcG9saWN5IHN0YXRlbWVudCB0byBiZSBhZGRlZCB0byB0aGUgYnVja2V0J3NcbiAgICogcG9saWN5LlxuICAgKiBAcmV0dXJucyBtZXRhZGF0YSBhYm91dCB0aGUgZXhlY3V0aW9uIG9mIHRoaXMgbWV0aG9kLiBJZiB0aGUgcG9saWN5XG4gICAqIHdhcyBub3QgYWRkZWQsIHRoZSB2YWx1ZSBvZiBgc3RhdGVtZW50QWRkZWRgIHdpbGwgYmUgYGZhbHNlYC4gWW91XG4gICAqIHNob3VsZCBhbHdheXMgY2hlY2sgdGhpcyB2YWx1ZSB0byBtYWtlIHN1cmUgdGhhdCB0aGUgb3BlcmF0aW9uIHdhc1xuICAgKiBhY3R1YWxseSBjYXJyaWVkIG91dC4gT3RoZXJ3aXNlLCBzeW50aGVzaXMgYW5kIGRlcGxveSB3aWxsIHRlcm1pbmF0ZVxuICAgKiBzaWxlbnRseSwgd2hpY2ggbWF5IGJlIGNvbmZ1c2luZy5cbiAgICovXG4gIGFkZFRvUmVzb3VyY2VQb2xpY3koXG4gICAgcGVybWlzc2lvbjogaWFtLlBvbGljeVN0YXRlbWVudCxcbiAgKTogaWFtLkFkZFRvUmVzb3VyY2VQb2xpY3lSZXN1bHQ7XG5cbiAgLyoqXG4gICAqIEdyYW50IHJlYWQgcGVybWlzc2lvbnMgZm9yIHRoaXMgYnVja2V0IGFuZCBpdCdzIGNvbnRlbnRzIHRvIGFuIElBTVxuICAgKiBwcmluY2lwYWwgKFJvbGUvR3JvdXAvVXNlcikuXG4gICAqXG4gICAqIElmIGVuY3J5cHRpb24gaXMgdXNlZCwgcGVybWlzc2lvbiB0byB1c2UgdGhlIGtleSB0byBkZWNyeXB0IHRoZSBjb250ZW50c1xuICAgKiBvZiB0aGUgYnVja2V0IHdpbGwgYWxzbyBiZSBncmFudGVkIHRvIHRoZSBzYW1lIHByaW5jaXBhbC5cbiAgICpcbiAgICogQHBhcmFtIGlkZW50aXR5IFRoZSBwcmluY2lwYWxcbiAgICogQHBhcmFtIG9iamVjdHNLZXlQYXR0ZXJuIFJlc3RyaWN0IHRoZSBwZXJtaXNzaW9uIHRvIGEgY2VydGFpbiBrZXkgcGF0dGVybiAoZGVmYXVsdCAnKicpLiBQYXJhbWV0ZXIgdHlwZSBpcyBgYW55YCBidXQgYHN0cmluZ2Agc2hvdWxkIGJlIHBhc3NlZCBpbi5cbiAgICovXG4gIGdyYW50UmVhZChpZGVudGl0eTogaWFtLklHcmFudGFibGUsIG9iamVjdHNLZXlQYXR0ZXJuPzogYW55KTogaWFtLkdyYW50O1xuXG4gIC8qKlxuICAgKiBHcmFudCB3cml0ZSBwZXJtaXNzaW9ucyB0byB0aGlzIGJ1Y2tldCB0byBhbiBJQU0gcHJpbmNpcGFsLlxuICAgKlxuICAgKiBJZiBlbmNyeXB0aW9uIGlzIHVzZWQsIHBlcm1pc3Npb24gdG8gdXNlIHRoZSBrZXkgdG8gZW5jcnlwdCB0aGUgY29udGVudHNcbiAgICogb2Ygd3JpdHRlbiBmaWxlcyB3aWxsIGFsc28gYmUgZ3JhbnRlZCB0byB0aGUgc2FtZSBwcmluY2lwYWwuXG4gICAqXG4gICAqIFRoaXMgZG9lcyBub3QgaW5jbHVkZSBgczM6UHV0T2JqZWN0QWNsYCwgd2hpY2ggY291bGQgYmUgdXNlZCB0byBncmFudCByZWFkL3dyaXRlIG9iamVjdCBhY2Nlc3MgdG8gSUFNIHByaW5jaXBhbHMgaW4gb3RoZXIgYWNjb3VudHMuXG4gICAqXG4gICAqIElmIHlvdSBuZWVkIHRoZSBwcmluY2lwYWwgdG8gaGF2ZSBwZXJtaXNzaW9ucyB0byBtb2RpZnkgdGhlIEFDTHMsXG4gICAqIHVzZSB0aGUgYGdyYW50UHV0QWNsYCBtZXRob2QuXG4gICAqXG4gICAqIEBwYXJhbSBpZGVudGl0eSBUaGUgcHJpbmNpcGFsXG4gICAqIEBwYXJhbSBvYmplY3RzS2V5UGF0dGVybiBSZXN0cmljdCB0aGUgcGVybWlzc2lvbiB0byBhIGNlcnRhaW4ga2V5IHBhdHRlcm4gKGRlZmF1bHQgJyonKS4gUGFyYW1ldGVyIHR5cGUgaXMgYGFueWAgYnV0IGBzdHJpbmdgIHNob3VsZCBiZSBwYXNzZWQgaW4uXG4gICAqIEBwYXJhbSBhbGxvd2VkQWN0aW9uUGF0dGVybnMgUmVzdHJpY3QgdGhlIHBlcm1pc3Npb25zIHRvIGNlcnRhaW4gbGlzdCBvZiBhY3Rpb24gcGF0dGVybnNcbiAgICovXG4gIGdyYW50V3JpdGUoXG4gICAgaWRlbnRpdHk6IGlhbS5JR3JhbnRhYmxlLFxuICAgIG9iamVjdHNLZXlQYXR0ZXJuPzogYW55LFxuICAgIGFsbG93ZWRBY3Rpb25QYXR0ZXJucz86IHN0cmluZ1tdLFxuICApOiBpYW0uR3JhbnQ7XG5cbiAgLyoqXG4gICAqIEdyYW50cyBzMzpQdXRPYmplY3QqIGFuZCBzMzpBYm9ydCogcGVybWlzc2lvbnMgZm9yIHRoaXMgYnVja2V0IHRvIGFuIElBTSBwcmluY2lwYWwuXG4gICAqXG4gICAqIElmIGVuY3J5cHRpb24gaXMgdXNlZCwgcGVybWlzc2lvbiB0byB1c2UgdGhlIGtleSB0byBlbmNyeXB0IHRoZSBjb250ZW50c1xuICAgKiBvZiB3cml0dGVuIGZpbGVzIHdpbGwgYWxzbyBiZSBncmFudGVkIHRvIHRoZSBzYW1lIHByaW5jaXBhbC5cbiAgICogQHBhcmFtIGlkZW50aXR5IFRoZSBwcmluY2lwYWxcbiAgICogQHBhcmFtIG9iamVjdHNLZXlQYXR0ZXJuIFJlc3RyaWN0IHRoZSBwZXJtaXNzaW9uIHRvIGEgY2VydGFpbiBrZXkgcGF0dGVybiAoZGVmYXVsdCAnKicpLiBQYXJhbWV0ZXIgdHlwZSBpcyBgYW55YCBidXQgYHN0cmluZ2Agc2hvdWxkIGJlIHBhc3NlZCBpbi5cbiAgICovXG4gIGdyYW50UHV0KGlkZW50aXR5OiBpYW0uSUdyYW50YWJsZSwgb2JqZWN0c0tleVBhdHRlcm4/OiBhbnkpOiBpYW0uR3JhbnQ7XG5cbiAgLyoqXG4gICAqIEdyYW50IHRoZSBnaXZlbiBJQU0gaWRlbnRpdHkgcGVybWlzc2lvbnMgdG8gbW9kaWZ5IHRoZSBBQ0xzIG9mIG9iamVjdHMgaW4gdGhlIGdpdmVuIEJ1Y2tldC5cbiAgICpcbiAgICogY2FsbGluZyBgZ3JhbnRXcml0ZWAgb3IgYGdyYW50UmVhZFdyaXRlYCBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9ucyB0byBtb2RpZnkgdGhlIEFDTHMgb2YgdGhlIG9iamVjdHM7XG4gICAqIGluIHRoaXMgY2FzZSwgaWYgeW91IG5lZWQgdG8gbW9kaWZ5IG9iamVjdCBBQ0xzLCBjYWxsIHRoaXMgbWV0aG9kIGV4cGxpY2l0bHkuXG4gICAqXG4gICAqIEBwYXJhbSBpZGVudGl0eSBUaGUgcHJpbmNpcGFsXG4gICAqIEBwYXJhbSBvYmplY3RzS2V5UGF0dGVybiBSZXN0cmljdCB0aGUgcGVybWlzc2lvbiB0byBhIGNlcnRhaW4ga2V5IHBhdHRlcm4gKGRlZmF1bHQgJyonKVxuICAgKi9cbiAgZ3JhbnRQdXRBY2woaWRlbnRpdHk6IGlhbS5JR3JhbnRhYmxlLCBvYmplY3RzS2V5UGF0dGVybj86IHN0cmluZyk6IGlhbS5HcmFudDtcblxuICAvKipcbiAgICogR3JhbnRzIHMzOkRlbGV0ZU9iamVjdCogcGVybWlzc2lvbiB0byBhbiBJQU0gcHJpbmNpcGFsIGZvciBvYmplY3RzXG4gICAqIGluIHRoaXMgYnVja2V0LlxuICAgKlxuICAgKiBAcGFyYW0gaWRlbnRpdHkgVGhlIHByaW5jaXBhbFxuICAgKiBAcGFyYW0gb2JqZWN0c0tleVBhdHRlcm4gUmVzdHJpY3QgdGhlIHBlcm1pc3Npb24gdG8gYSBjZXJ0YWluIGtleSBwYXR0ZXJuIChkZWZhdWx0ICcqJykuIFBhcmFtZXRlciB0eXBlIGlzIGBhbnlgIGJ1dCBgc3RyaW5nYCBzaG91bGQgYmUgcGFzc2VkIGluLlxuICAgKi9cbiAgZ3JhbnREZWxldGUoaWRlbnRpdHk6IGlhbS5JR3JhbnRhYmxlLCBvYmplY3RzS2V5UGF0dGVybj86IGFueSk6IGlhbS5HcmFudDtcblxuICAvKipcbiAgICogR3JhbnRzIHJlYWQvd3JpdGUgcGVybWlzc2lvbnMgZm9yIHRoaXMgYnVja2V0IGFuZCBpdCdzIGNvbnRlbnRzIHRvIGFuIElBTVxuICAgKiBwcmluY2lwYWwgKFJvbGUvR3JvdXAvVXNlcikuXG4gICAqXG4gICAqIElmIGFuIGVuY3J5cHRpb24ga2V5IGlzIHVzZWQsIHBlcm1pc3Npb24gdG8gdXNlIHRoZSBrZXkgZm9yXG4gICAqIGVuY3J5cHQvZGVjcnlwdCB3aWxsIGFsc28gYmUgZ3JhbnRlZC5cbiAgICpcbiAgICogVGhpcyBkb2VzIG5vdCBpbmNsdWRlIGBzMzpQdXRPYmplY3RBY2xgLCB3aGljaCBjb3VsZCBiZSB1c2VkIHRvIGdyYW50IHJlYWQvd3JpdGUgb2JqZWN0IGFjY2VzcyB0byBJQU0gcHJpbmNpcGFscyBpbiBvdGhlciBhY2NvdW50cy5cbiAgICpcbiAgICogSWYgeW91IG5lZWQgdGhlIHByaW5jaXBhbCB0byBoYXZlIHBlcm1pc3Npb25zIHRvIG1vZGlmeSB0aGUgQUNMcyxcbiAgICogdXNlIHRoZSBgZ3JhbnRQdXRBY2xgIG1ldGhvZC5cbiAgICpcbiAgICogQHBhcmFtIGlkZW50aXR5IFRoZSBwcmluY2lwYWxcbiAgICogQHBhcmFtIG9iamVjdHNLZXlQYXR0ZXJuIFJlc3RyaWN0IHRoZSBwZXJtaXNzaW9uIHRvIGEgY2VydGFpbiBrZXkgcGF0dGVybiAoZGVmYXVsdCAnKicpLiBQYXJhbWV0ZXIgdHlwZSBpcyBgYW55YCBidXQgYHN0cmluZ2Agc2hvdWxkIGJlIHBhc3NlZCBpbi5cbiAgICovXG4gIGdyYW50UmVhZFdyaXRlKGlkZW50aXR5OiBpYW0uSUdyYW50YWJsZSwgb2JqZWN0c0tleVBhdHRlcm4/OiBhbnkpOiBpYW0uR3JhbnQ7XG5cbiAgLy8gLyoqXG4gIC8vICAqIEFsbG93cyB1bnJlc3RyaWN0ZWQgYWNjZXNzIHRvIG9iamVjdHMgZnJvbSB0aGlzIGJ1Y2tldC5cbiAgLy8gICpcbiAgLy8gICogSU1QT1JUQU5UOiBUaGlzIHBlcm1pc3Npb24gYWxsb3dzIGFueW9uZSB0byBwZXJmb3JtIGFjdGlvbnMgb24gUzMgb2JqZWN0c1xuICAvLyAgKiBpbiB0aGlzIGJ1Y2tldCwgd2hpY2ggaXMgdXNlZnVsIGZvciB3aGVuIHlvdSBjb25maWd1cmUgeW91ciBidWNrZXQgYXMgYVxuICAvLyAgKiB3ZWJzaXRlIGFuZCB3YW50IGV2ZXJ5b25lIHRvIGJlIGFibGUgdG8gcmVhZCBvYmplY3RzIGluIHRoZSBidWNrZXQgd2l0aG91dFxuICAvLyAgKiBuZWVkaW5nIHRvIGF1dGhlbnRpY2F0ZS5cbiAgLy8gICpcbiAgLy8gICogV2l0aG91dCBhcmd1bWVudHMsIHRoaXMgbWV0aG9kIHdpbGwgZ3JhbnQgcmVhZCAoXCJzMzpHZXRPYmplY3RcIikgYWNjZXNzIHRvXG4gIC8vICAqIGFsbCBvYmplY3RzIChcIipcIikgaW4gdGhlIGJ1Y2tldC5cbiAgLy8gICpcbiAgLy8gICogVGhlIG1ldGhvZCByZXR1cm5zIHRoZSBgaWFtLkdyYW50YCBvYmplY3QsIHdoaWNoIGNhbiB0aGVuIGJlIG1vZGlmaWVkXG4gIC8vICAqIGFzIG5lZWRlZC4gRm9yIGV4YW1wbGUsIHlvdSBjYW4gYWRkIGEgY29uZGl0aW9uIHRoYXQgd2lsbCByZXN0cmljdCBhY2Nlc3Mgb25seVxuICAvLyAgKiB0byBhbiBJUHY0IHJhbmdlIGxpa2UgdGhpczpcbiAgLy8gICpcbiAgLy8gICogICAgIGNvbnN0IGdyYW50ID0gYnVja2V0LmdyYW50UHVibGljQWNjZXNzKCk7XG4gIC8vICAqICAgICBncmFudC5yZXNvdXJjZVN0YXRlbWVudCEuYWRkQ29uZGl0aW9uKOKAmElwQWRkcmVzc+KAmSwgeyDigJxhd3M6U291cmNlSXDigJ06IOKAnDU0LjI0MC4xNDMuMC8yNOKAnSB9KTtcbiAgLy8gICpcbiAgLy8gICpcbiAgLy8gICogQHBhcmFtIGtleVByZWZpeCB0aGUgcHJlZml4IG9mIFMzIG9iamVjdCBrZXlzIChlLmcuIGBob21lLypgKS4gRGVmYXVsdCBpcyBcIipcIi5cbiAgLy8gICogQHBhcmFtIGFsbG93ZWRBY3Rpb25zIHRoZSBzZXQgb2YgUzMgYWN0aW9ucyB0byBhbGxvdy4gRGVmYXVsdCBpcyBcInMzOkdldE9iamVjdFwiLlxuICAvLyAgKiBAcmV0dXJucyBUaGUgYGlhbS5Qb2xpY3lTdGF0ZW1lbnRgIG9iamVjdCwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gYXBwbHkgZS5nLiBjb25kaXRpb25zLlxuICAvLyAgKi9cbiAgLy8gZ3JhbnRQdWJsaWNBY2Nlc3Moa2V5UHJlZml4Pzogc3RyaW5nLCAuLi5hbGxvd2VkQWN0aW9uczogc3RyaW5nW10pOiBpYW0uR3JhbnQ7XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBidWNrZXQgbm90aWZpY2F0aW9uIGV2ZW50IGRlc3RpbmF0aW9uLlxuICAgKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50IHRvIHRyaWdnZXIgdGhlIG5vdGlmaWNhdGlvblxuICAgKiBAcGFyYW0gZGVzdCBUaGUgbm90aWZpY2F0aW9uIGRlc3RpbmF0aW9uIChMYW1iZGEsIFNOUyBUb3BpYyBvciBTUVMgUXVldWUpXG4gICAqXG4gICAqIEBwYXJhbSBmaWx0ZXJzIFMzIG9iamVjdCBrZXkgZmlsdGVyIHJ1bGVzIHRvIGRldGVybWluZSB3aGljaCBvYmplY3RzXG4gICAqIHRyaWdnZXIgdGhpcyBldmVudC4gRWFjaCBmaWx0ZXIgbXVzdCBpbmNsdWRlIGEgYHByZWZpeGAgYW5kL29yIGBzdWZmaXhgXG4gICAqIHRoYXQgd2lsbCBiZSBtYXRjaGVkIGFnYWluc3QgdGhlIHMzIG9iamVjdCBrZXkuIFJlZmVyIHRvIHRoZSBTMyBEZXZlbG9wZXIgR3VpZGVcbiAgICogZm9yIGRldGFpbHMgYWJvdXQgYWxsb3dlZCBmaWx0ZXIgcnVsZXMuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC9kZXYvTm90aWZpY2F0aW9uSG93VG8uaHRtbCNub3RpZmljYXRpb24taG93LXRvLWZpbHRlcmluZ1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiAgICBkZWNsYXJlIGNvbnN0IG15TGFtYmRhOiBsYW1iZGEuRnVuY3Rpb247XG4gICAqICAgIGNvbnN0IGJ1Y2tldCA9IG5ldyBzMy5CdWNrZXQodGhpcywgJ015QnVja2V0Jyk7XG4gICAqICAgIGJ1Y2tldC5hZGRFdmVudE5vdGlmaWNhdGlvbihzMy5FdmVudFR5cGUuT0JKRUNUX0NSRUFURUQsIG5ldyBzM24uTGFtYmRhRGVzdGluYXRpb24obXlMYW1iZGEpLCB7cHJlZml4OiAnaG9tZS9teXVzZXJuYW1lLyonfSlcbiAgICpcbiAgICogQHNlZVxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L2Rldi9Ob3RpZmljYXRpb25Ib3dUby5odG1sXG4gICAqL1xuICBhZGRFdmVudE5vdGlmaWNhdGlvbihcbiAgICBldmVudDogRXZlbnRUeXBlLFxuICAgIGRlc3Q6IElCdWNrZXROb3RpZmljYXRpb25EZXN0aW5hdGlvbixcbiAgICAuLi5maWx0ZXJzOiBOb3RpZmljYXRpb25LZXlGaWx0ZXJbXVxuICApOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBTdWJzY3JpYmVzIGEgZGVzdGluYXRpb24gdG8gcmVjZWl2ZSBub3RpZmljYXRpb25zIHdoZW4gYW4gb2JqZWN0IGlzXG4gICAqIGNyZWF0ZWQgaW4gdGhlIGJ1Y2tldC4gVGhpcyBpcyBpZGVudGljYWwgdG8gY2FsbGluZ1xuICAgKiBgb25FdmVudChzMy5FdmVudFR5cGUuT0JKRUNUX0NSRUFURUQpYC5cbiAgICpcbiAgICogQHBhcmFtIGRlc3QgVGhlIG5vdGlmaWNhdGlvbiBkZXN0aW5hdGlvbiAoc2VlIG9uRXZlbnQpXG4gICAqIEBwYXJhbSBmaWx0ZXJzIEZpbHRlcnMgKHNlZSBvbkV2ZW50KVxuICAgKi9cbiAgYWRkT2JqZWN0Q3JlYXRlZE5vdGlmaWNhdGlvbihcbiAgICBkZXN0OiBJQnVja2V0Tm90aWZpY2F0aW9uRGVzdGluYXRpb24sXG4gICAgLi4uZmlsdGVyczogTm90aWZpY2F0aW9uS2V5RmlsdGVyW11cbiAgKTogdm9pZDtcblxuICAvKipcbiAgICogU3Vic2NyaWJlcyBhIGRlc3RpbmF0aW9uIHRvIHJlY2VpdmUgbm90aWZpY2F0aW9ucyB3aGVuIGFuIG9iamVjdCBpc1xuICAgKiByZW1vdmVkIGZyb20gdGhlIGJ1Y2tldC4gVGhpcyBpcyBpZGVudGljYWwgdG8gY2FsbGluZ1xuICAgKiBgb25FdmVudChFdmVudFR5cGUuT0JKRUNUX1JFTU9WRUQpYC5cbiAgICpcbiAgICogQHBhcmFtIGRlc3QgVGhlIG5vdGlmaWNhdGlvbiBkZXN0aW5hdGlvbiAoc2VlIG9uRXZlbnQpXG4gICAqIEBwYXJhbSBmaWx0ZXJzIEZpbHRlcnMgKHNlZSBvbkV2ZW50KVxuICAgKi9cbiAgYWRkT2JqZWN0UmVtb3ZlZE5vdGlmaWNhdGlvbihcbiAgICBkZXN0OiBJQnVja2V0Tm90aWZpY2F0aW9uRGVzdGluYXRpb24sXG4gICAgLi4uZmlsdGVyczogTm90aWZpY2F0aW9uS2V5RmlsdGVyW11cbiAgKTogdm9pZDtcblxuICAvKipcbiAgICogRW5hYmxlcyBldmVudCBicmlkZ2Ugbm90aWZpY2F0aW9uLCBjYXVzaW5nIGFsbCBldmVudHMgYmVsb3cgdG8gYmUgc2VudCB0byBFdmVudEJyaWRnZTpcbiAgICpcbiAgICogLSBPYmplY3QgRGVsZXRlZCAoRGVsZXRlT2JqZWN0KVxuICAgKiAtIE9iamVjdCBEZWxldGVkIChMaWZlY3ljbGUgZXhwaXJhdGlvbilcbiAgICogLSBPYmplY3QgUmVzdG9yZSBJbml0aWF0ZWRcbiAgICogLSBPYmplY3QgUmVzdG9yZSBDb21wbGV0ZWRcbiAgICogLSBPYmplY3QgUmVzdG9yZSBFeHBpcmVkXG4gICAqIC0gT2JqZWN0IFN0b3JhZ2UgQ2xhc3MgQ2hhbmdlZFxuICAgKiAtIE9iamVjdCBBY2Nlc3MgVGllciBDaGFuZ2VkXG4gICAqIC0gT2JqZWN0IEFDTCBVcGRhdGVkXG4gICAqIC0gT2JqZWN0IFRhZ3MgQWRkZWRcbiAgICogLSBPYmplY3QgVGFncyBEZWxldGVkXG4gICAqL1xuICBlbmFibGVFdmVudEJyaWRnZU5vdGlmaWNhdGlvbigpOiB2b2lkO1xufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQnVja2V0QmFzZSBleHRlbmRzIEF3c0NvbnN0cnVjdEJhc2UgaW1wbGVtZW50cyBJQnVja2V0IHtcbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IGJ1Y2tldEFybjogc3RyaW5nO1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgYnVja2V0TmFtZTogc3RyaW5nO1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgd2Vic2l0ZURvbWFpbk5hbWU/OiBzdHJpbmc7XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBidWNrZXREb21haW5OYW1lOiBzdHJpbmc7XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBidWNrZXRSZWdpb25hbERvbWFpbk5hbWU6IHN0cmluZztcbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IHdlYnNpdGVFbmRwb2ludD86IHN0cmluZztcbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IHB1YmxpYz86IGJvb2xlYW47XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSB2ZXJzaW9uZWQ6IGJvb2xlYW47XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBob3N0ZWRab25lSWQ6IHN0cmluZztcbiAgLyoqXG4gICAqIE9wdGlvbmFsIEtNUyBlbmNyeXB0aW9uIGtleSBhc3NvY2lhdGVkIHdpdGggdGhpcyBidWNrZXQuXG4gICAqL1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgZW5jcnlwdGlvbktleT86IGttcy5JS2V5O1xuICBwdWJsaWMgZ2V0IGJ1Y2tldE91dHB1dHMoKTogQnVja2V0T3V0cHV0cyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IHRoaXMuYnVja2V0TmFtZSxcbiAgICAgIGFybjogdGhpcy5idWNrZXRBcm4sXG4gICAgICBkb21haW5OYW1lOiB0aGlzLmJ1Y2tldERvbWFpbk5hbWUsXG4gICAgICByZWdpb25hbERvbWFpbk5hbWU6IHRoaXMuYnVja2V0UmVnaW9uYWxEb21haW5OYW1lLFxuICAgICAgd2Vic2l0ZURvbWFpbk5hbWU6IHRoaXMud2Vic2l0ZURvbWFpbk5hbWUsXG4gICAgICB3ZWJzaXRlVXJsOiB0aGlzLndlYnNpdGVFbmRwb2ludCxcbiAgICAgIG9yaWdpbkFjY2Vzc0lkZW50aXR5OlxuICAgICAgICB0aGlzLm9yaWdpbkFjY2Vzc0lkZW50aXR5Py5jbG91ZEZyb250T3JpZ2luQWNjZXNzSWRlbnRpdHlQYXRoLFxuICAgICAgZW5jcnlwdGlvbktleTogdGhpcy5lbmNyeXB0aW9uS2V5Py5rZXlPdXRwdXRzLFxuICAgIH07XG4gIH1cbiAgcHVibGljIGdldCBvdXRwdXRzKCk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgIHJldHVybiB0aGlzLmJ1Y2tldE91dHB1dHM7XG4gIH1cbiAgLy8gcHJvdGVjdGVkIGFic3RyYWN0IHJlYWRvbmx5IHJlc291cmNlOlxuICAvLyAgIHwgczNCdWNrZXQuUzNCdWNrZXRcbiAgLy8gICB8IGRhdGFBd3NTM0J1Y2tldC5EYXRhQXdzUzNCdWNrZXQ7XG4gIHByb3RlY3RlZCBhYnN0cmFjdCByZWFkb25seSBvcmlnaW5BY2Nlc3NJZGVudGl0eT86IE9yaWdpbkFjY2Vzc0lkZW50aXR5O1xuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHJvdGVjdGVkIGFic3RyYWN0IHJlYWRvbmx5IF9pc1dlYnNpdGU6IGJvb2xlYW47XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHJpdmF0ZSBzb3VyY2VTbGVlcD86IHNsZWVwLlNsZWVwO1xuICAvKiogQGludGVybmFsICovXG4gIHByaXZhdGUgcmVhZG9ubHkgc291cmNlczogU291cmNlSW5kZXhbXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVzb3VyY2UgcG9saWN5IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGJ1Y2tldC5cbiAgICpcbiAgICogSWYgYGF1dG9DcmVhdGVQb2xpY3lgIGlzIHRydWUsIGEgYEJ1Y2tldFBvbGljeWAgd2lsbCBiZSBjcmVhdGVkIHVwb24gdGhlXG4gICAqIGZpcnN0IGNhbGwgdG8gYWRkVG9SZXNvdXJjZVBvbGljeShzKS5cbiAgICovXG4gIHB1YmxpYyBhYnN0cmFjdCBwb2xpY3k/OiBCdWNrZXRQb2xpY3k7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiBhIGJ1Y2tldCByZXNvdXJjZSBwb2xpY3kgc2hvdWxkIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCB1cG9uXG4gICAqIHRoZSBmaXJzdCBjYWxsIHRvIGBhZGRUb1Jlc291cmNlUG9saWN5YC5cbiAgICovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBhdXRvQ3JlYXRlUG9saWN5OiBib29sZWFuO1xuXG4gIC8vIC8qKlxuICAvLyAgKiBXaGV0aGVyIHRvIGRpc2FsbG93IHB1YmxpYyBhY2Nlc3NcbiAgLy8gICovXG4gIC8vIHByb3RlY3RlZCBhYnN0cmFjdCBkaXNhbGxvd1B1YmxpY0FjY2Vzcz86IGJvb2xlYW47XG5cbiAgcHJpdmF0ZSBub3RpZmljYXRpb25zPzogQnVja2V0Tm90aWZpY2F0aW9ucztcblxuICBwcm90ZWN0ZWQgbm90aWZpY2F0aW9uc0hhbmRsZXJSb2xlPzogaWFtLklSb2xlO1xuXG4gIHByb3RlY3RlZCBub3RpZmljYXRpb25zU2tpcERlc3RpbmF0aW9uVmFsaWRhdGlvbj86IGJvb2xlYW47XG5cbiAgLy8gVE9ETzogcmUtYWRkIG93bmVyc2hpcCBjb250cm9sIHBhcnNpbmcgYmFzZWQgb24gYWNjZXNzIGNvbnRyb2xzXG4gIC8vIHJlZjogaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2Jsb2IvdjIuMTYwLjAvcGFja2FnZXMvYXdzLWNkay1saWIvYXdzLXMzL2xpYi9idWNrZXQudHMjTDIzNjNcbiAgLy8gcHJvdGVjdGVkIG9iamVjdE93bmVyc2hpcD86IE9iamVjdE93bmVyc2hpcDtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogQXdzQ29uc3RydWN0UHJvcHMgPSB7fSkge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwgcHJvcHMpO1xuXG4gICAgdGhpcy5ub2RlLmFkZFZhbGlkYXRpb24oe1xuICAgICAgdmFsaWRhdGU6ICgpID0+IHRoaXMucG9saWN5Py5kb2N1bWVudC52YWxpZGF0ZUZvclJlc291cmNlUG9saWN5KCkgPz8gW10sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHN0YXRlbWVudCB0byB0aGUgcmVzb3VyY2UgcG9saWN5IGZvciBhIHByaW5jaXBhbCAoaS5lLlxuICAgKiBhY2NvdW50L3JvbGUvc2VydmljZSkgdG8gcGVyZm9ybSBhY3Rpb25zIG9uIHRoaXMgYnVja2V0IGFuZC9vciBpdHNcbiAgICogY29udGVudHMuIFVzZSBgYnVja2V0QXJuYCBhbmQgYGFybkZvck9iamVjdHMoa2V5cylgIHRvIG9idGFpbiBBUk5zIGZvclxuICAgKiB0aGlzIGJ1Y2tldCBvciBvYmplY3RzLlxuICAgKlxuICAgKiBOb3RlIHRoYXQgdGhlIHBvbGljeSBzdGF0ZW1lbnQgbWF5IG9yIG1heSBub3QgYmUgYWRkZWQgdG8gdGhlIHBvbGljeS5cbiAgICogRm9yIGV4YW1wbGUsIHdoZW4gYW4gYElCdWNrZXRgIGlzIGNyZWF0ZWQgZnJvbSBhbiBleGlzdGluZyBidWNrZXQsXG4gICAqIGl0J3Mgbm90IHBvc3NpYmxlIHRvIHRlbGwgd2hldGhlciB0aGUgYnVja2V0IGFscmVhZHkgaGFzIGEgcG9saWN5XG4gICAqIGF0dGFjaGVkLCBsZXQgYWxvbmUgdG8gcmUtdXNlIHRoYXQgcG9saWN5IHRvIGFkZCBtb3JlIHN0YXRlbWVudHMgdG8gaXQuXG4gICAqIFNvIGl0J3Mgc2FmZXN0IHRvIGRvIG5vdGhpbmcgaW4gdGhlc2UgY2FzZXMuXG4gICAqXG4gICAqIEBwYXJhbSBwZXJtaXNzaW9uIHRoZSBwb2xpY3kgc3RhdGVtZW50IHRvIGJlIGFkZGVkIHRvIHRoZSBidWNrZXQnc1xuICAgKiBwb2xpY3kuXG4gICAqIEByZXR1cm5zIG1ldGFkYXRhIGFib3V0IHRoZSBleGVjdXRpb24gb2YgdGhpcyBtZXRob2QuIElmIHRoZSBwb2xpY3lcbiAgICogd2FzIG5vdCBhZGRlZCwgdGhlIHZhbHVlIG9mIGBzdGF0ZW1lbnRBZGRlZGAgd2lsbCBiZSBgZmFsc2VgLiBZb3VcbiAgICogc2hvdWxkIGFsd2F5cyBjaGVjayB0aGlzIHZhbHVlIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBvcGVyYXRpb24gd2FzXG4gICAqIGFjdHVhbGx5IGNhcnJpZWQgb3V0LiBPdGhlcndpc2UsIHN5bnRoZXNpcyBhbmQgZGVwbG95IHdpbGwgdGVybWluYXRlXG4gICAqIHNpbGVudGx5LCB3aGljaCBtYXkgYmUgY29uZnVzaW5nLlxuICAgKi9cbiAgcHVibGljIGFkZFRvUmVzb3VyY2VQb2xpY3koXG4gICAgcGVybWlzc2lvbjogaWFtLlBvbGljeVN0YXRlbWVudCxcbiAgKTogaWFtLkFkZFRvUmVzb3VyY2VQb2xpY3lSZXN1bHQge1xuICAgIGlmICghdGhpcy5wb2xpY3kgJiYgdGhpcy5hdXRvQ3JlYXRlUG9saWN5KSB7XG4gICAgICB0aGlzLnBvbGljeSA9IG5ldyBCdWNrZXRQb2xpY3kodGhpcywgXCJQb2xpY3lcIiwgeyBidWNrZXQ6IHRoaXMgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucG9saWN5KSB7XG4gICAgICB0aGlzLnBvbGljeS5kb2N1bWVudC5hZGRTdGF0ZW1lbnRzKHBlcm1pc3Npb24pO1xuICAgICAgcmV0dXJuIHsgc3RhdGVtZW50QWRkZWQ6IHRydWUsIHBvbGljeURlcGVuZGFibGU6IHRoaXMucG9saWN5IH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgc3RhdGVtZW50QWRkZWQ6IGZhbHNlIH07XG4gIH1cblxuICAvKipcbiAgICogR3JhbnQgcmVhZCBwZXJtaXNzaW9ucyBmb3IgdGhpcyBidWNrZXQgYW5kIGl0J3MgY29udGVudHMgdG8gYW4gSUFNXG4gICAqIHByaW5jaXBhbCAoUm9sZS9Hcm91cC9Vc2VyKS5cbiAgICpcbiAgICogSWYgZW5jcnlwdGlvbiBpcyB1c2VkLCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUga2V5IHRvIGRlY3J5cHQgdGhlIGNvbnRlbnRzXG4gICAqIG9mIHRoZSBidWNrZXQgd2lsbCBhbHNvIGJlIGdyYW50ZWQgdG8gdGhlIHNhbWUgcHJpbmNpcGFsLlxuICAgKlxuICAgKiBAcGFyYW0gaWRlbnRpdHkgVGhlIHByaW5jaXBhbFxuICAgKiBAcGFyYW0gb2JqZWN0c0tleVBhdHRlcm4gUmVzdHJpY3QgdGhlIHBlcm1pc3Npb24gdG8gYSBjZXJ0YWluIGtleSBwYXR0ZXJuIChkZWZhdWx0ICcqJykuIFBhcmFtZXRlciB0eXBlIGlzIGBhbnlgIGJ1dCBgc3RyaW5nYCBzaG91bGQgYmUgcGFzc2VkIGluLlxuICAgKi9cbiAgcHVibGljIGdyYW50UmVhZChpZGVudGl0eTogaWFtLklHcmFudGFibGUsIG9iamVjdHNLZXlQYXR0ZXJuOiBhbnkgPSBcIipcIikge1xuICAgIHJldHVybiB0aGlzLmdyYW50KFxuICAgICAgaWRlbnRpdHksXG4gICAgICBwZXJtcy5CVUNLRVRfUkVBRF9BQ1RJT05TLFxuICAgICAgcGVybXMuS0VZX1JFQURfQUNUSU9OUyxcbiAgICAgIHRoaXMuYnVja2V0QXJuLFxuICAgICAgdGhpcy5hcm5Gb3JPYmplY3RzKG9iamVjdHNLZXlQYXR0ZXJuKSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGdyYW50V3JpdGUoXG4gICAgaWRlbnRpdHk6IGlhbS5JR3JhbnRhYmxlLFxuICAgIG9iamVjdHNLZXlQYXR0ZXJuOiBhbnkgPSBcIipcIixcbiAgICBhbGxvd2VkQWN0aW9uUGF0dGVybnM6IHN0cmluZ1tdID0gW10sXG4gICkge1xuICAgIGNvbnN0IGdyYW50ZWRXcml0ZUFjdGlvbnMgPVxuICAgICAgYWxsb3dlZEFjdGlvblBhdHRlcm5zLmxlbmd0aCA+IDBcbiAgICAgICAgPyBhbGxvd2VkQWN0aW9uUGF0dGVybnNcbiAgICAgICAgOiB0aGlzLndyaXRlQWN0aW9ucztcbiAgICByZXR1cm4gdGhpcy5ncmFudChcbiAgICAgIGlkZW50aXR5LFxuICAgICAgZ3JhbnRlZFdyaXRlQWN0aW9ucyxcbiAgICAgIHBlcm1zLktFWV9XUklURV9BQ1RJT05TLFxuICAgICAgdGhpcy5idWNrZXRBcm4sXG4gICAgICB0aGlzLmFybkZvck9iamVjdHMob2JqZWN0c0tleVBhdHRlcm4pLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHMzOlB1dE9iamVjdCogYW5kIHMzOkFib3J0KiBwZXJtaXNzaW9ucyBmb3IgdGhpcyBidWNrZXQgdG8gYW4gSUFNIHByaW5jaXBhbC5cbiAgICpcbiAgICogSWYgZW5jcnlwdGlvbiBpcyB1c2VkLCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUga2V5IHRvIGVuY3J5cHQgdGhlIGNvbnRlbnRzXG4gICAqIG9mIHdyaXR0ZW4gZmlsZXMgd2lsbCBhbHNvIGJlIGdyYW50ZWQgdG8gdGhlIHNhbWUgcHJpbmNpcGFsLlxuICAgKiBAcGFyYW0gaWRlbnRpdHkgVGhlIHByaW5jaXBhbFxuICAgKiBAcGFyYW0gb2JqZWN0c0tleVBhdHRlcm4gUmVzdHJpY3QgdGhlIHBlcm1pc3Npb24gdG8gYSBjZXJ0YWluIGtleSBwYXR0ZXJuIChkZWZhdWx0ICcqJykuIFBhcmFtZXRlciB0eXBlIGlzIGBhbnlgIGJ1dCBgc3RyaW5nYCBzaG91bGQgYmUgcGFzc2VkIGluLlxuICAgKi9cbiAgcHVibGljIGdyYW50UHV0KGlkZW50aXR5OiBpYW0uSUdyYW50YWJsZSwgb2JqZWN0c0tleVBhdHRlcm46IGFueSA9IFwiKlwiKSB7XG4gICAgcmV0dXJuIHRoaXMuZ3JhbnQoXG4gICAgICBpZGVudGl0eSxcbiAgICAgIHBlcm1zLkJVQ0tFVF9QVVRfQUNUSU9OUyxcbiAgICAgIHBlcm1zLktFWV9XUklURV9BQ1RJT05TLFxuICAgICAgdGhpcy5hcm5Gb3JPYmplY3RzKG9iamVjdHNLZXlQYXR0ZXJuKSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGdyYW50UHV0QWNsKFxuICAgIGlkZW50aXR5OiBpYW0uSUdyYW50YWJsZSxcbiAgICBvYmplY3RzS2V5UGF0dGVybjogc3RyaW5nID0gXCIqXCIsXG4gICkge1xuICAgIHJldHVybiB0aGlzLmdyYW50KFxuICAgICAgaWRlbnRpdHksXG4gICAgICBwZXJtcy5CVUNLRVRfUFVUX0FDTF9BQ1RJT05TLFxuICAgICAgW10sXG4gICAgICB0aGlzLmFybkZvck9iamVjdHMob2JqZWN0c0tleVBhdHRlcm4pLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHMzOkRlbGV0ZU9iamVjdCogcGVybWlzc2lvbiB0byBhbiBJQU0gcHJpbmNpcGFsIGZvciBvYmplY3RzXG4gICAqIGluIHRoaXMgYnVja2V0LlxuICAgKlxuICAgKiBAcGFyYW0gaWRlbnRpdHkgVGhlIHByaW5jaXBhbFxuICAgKiBAcGFyYW0gb2JqZWN0c0tleVBhdHRlcm4gUmVzdHJpY3QgdGhlIHBlcm1pc3Npb24gdG8gYSBjZXJ0YWluIGtleSBwYXR0ZXJuIChkZWZhdWx0ICcqJykuIFBhcmFtZXRlciB0eXBlIGlzIGBhbnlgIGJ1dCBgc3RyaW5nYCBzaG91bGQgYmUgcGFzc2VkIGluLlxuICAgKi9cbiAgcHVibGljIGdyYW50RGVsZXRlKGlkZW50aXR5OiBpYW0uSUdyYW50YWJsZSwgb2JqZWN0c0tleVBhdHRlcm46IGFueSA9IFwiKlwiKSB7XG4gICAgcmV0dXJuIHRoaXMuZ3JhbnQoXG4gICAgICBpZGVudGl0eSxcbiAgICAgIHBlcm1zLkJVQ0tFVF9ERUxFVEVfQUNUSU9OUyxcbiAgICAgIFtdLFxuICAgICAgdGhpcy5hcm5Gb3JPYmplY3RzKG9iamVjdHNLZXlQYXR0ZXJuKSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGdyYW50UmVhZFdyaXRlKFxuICAgIGlkZW50aXR5OiBpYW0uSUdyYW50YWJsZSxcbiAgICBvYmplY3RzS2V5UGF0dGVybjogYW55ID0gXCIqXCIsXG4gICkge1xuICAgIGNvbnN0IGJ1Y2tldEFjdGlvbnMgPSBwZXJtcy5CVUNLRVRfUkVBRF9BQ1RJT05TLmNvbmNhdCh0aGlzLndyaXRlQWN0aW9ucyk7XG4gICAgLy8gd2UgbmVlZCB1bmlxdWUgcGVybWlzc2lvbnMgYmVjYXVzZSBzb21lIHBlcm1pc3Npb25zIGFyZSBjb21tb24gYmV0d2VlbiByZWFkIGFuZCB3cml0ZSBrZXkgYWN0aW9uc1xuICAgIGNvbnN0IGtleUFjdGlvbnMgPSBbXG4gICAgICAuLi5uZXcgU2V0KFsuLi5wZXJtcy5LRVlfUkVBRF9BQ1RJT05TLCAuLi5wZXJtcy5LRVlfV1JJVEVfQUNUSU9OU10pLFxuICAgIF07XG5cbiAgICByZXR1cm4gdGhpcy5ncmFudChcbiAgICAgIGlkZW50aXR5LFxuICAgICAgYnVja2V0QWN0aW9ucyxcbiAgICAgIGtleUFjdGlvbnMsXG4gICAgICB0aGlzLmJ1Y2tldEFybixcbiAgICAgIHRoaXMuYXJuRm9yT2JqZWN0cyhvYmplY3RzS2V5UGF0dGVybiksXG4gICAgKTtcbiAgfVxuXG4gIC8vIFRPRE86IGN1cnJlbnRseSBvbmx5IHN1cHBvcnRlZCB0aHJvdWdoIGBwcm9wcy5wdWJsaWNgIGluIGNvbnN0cnVjdG9yLFxuICAvLyBUT0RPOiByZS1hZGQgT2JqZWN0T3duZXJzaGlwIGFuZCBCdWNrZXRBY2Nlc3NDb250cm9sXG4gIC8vIC8qKlxuICAvLyAgKiBBbGxvd3MgdW5yZXN0cmljdGVkIGFjY2VzcyB0byBvYmplY3RzIGZyb20gdGhpcyBidWNrZXQuXG4gIC8vICAqXG4gIC8vICAqIElNUE9SVEFOVDogVGhpcyBwZXJtaXNzaW9uIGFsbG93cyBhbnlvbmUgdG8gcGVyZm9ybSBhY3Rpb25zIG9uIFMzIG9iamVjdHNcbiAgLy8gICogaW4gdGhpcyBidWNrZXQsIHdoaWNoIGlzIHVzZWZ1bCBmb3Igd2hlbiB5b3UgY29uZmlndXJlIHlvdXIgYnVja2V0IGFzIGFcbiAgLy8gICogd2Vic2l0ZSBhbmQgd2FudCBldmVyeW9uZSB0byBiZSBhYmxlIHRvIHJlYWQgb2JqZWN0cyBpbiB0aGUgYnVja2V0IHdpdGhvdXRcbiAgLy8gICogbmVlZGluZyB0byBhdXRoZW50aWNhdGUuXG4gIC8vICAqXG4gIC8vICAqIFdpdGhvdXQgYXJndW1lbnRzLCB0aGlzIG1ldGhvZCB3aWxsIGdyYW50IHJlYWQgKFwiczM6R2V0T2JqZWN0XCIpIGFjY2VzcyB0b1xuICAvLyAgKiBhbGwgb2JqZWN0cyAoXCIqXCIpIGluIHRoZSBidWNrZXQuXG4gIC8vICAqXG4gIC8vICAqIFRoZSBtZXRob2QgcmV0dXJucyB0aGUgYGlhbS5HcmFudGAgb2JqZWN0LCB3aGljaCBjYW4gdGhlbiBiZSBtb2RpZmllZFxuICAvLyAgKiBhcyBuZWVkZWQuIEZvciBleGFtcGxlLCB5b3UgY2FuIGFkZCBhIGNvbmRpdGlvbiB0aGF0IHdpbGwgcmVzdHJpY3QgYWNjZXNzIG9ubHlcbiAgLy8gICogdG8gYW4gSVB2NCByYW5nZSBsaWtlIHRoaXM6XG4gIC8vICAqXG4gIC8vICAqICAgICBjb25zdCBncmFudCA9IGJ1Y2tldC5ncmFudFB1YmxpY0FjY2VzcygpO1xuICAvLyAgKiAgICAgZ3JhbnQucmVzb3VyY2VTdGF0ZW1lbnQhLmFkZENvbmRpdGlvbijigJhJcEFkZHJlc3PigJksIHsg4oCcYXdzOlNvdXJjZUlw4oCdOiDigJw1NC4yNDAuMTQzLjAvMjTigJ0gfSk7XG4gIC8vICAqXG4gIC8vICAqIE5vdGUgdGhhdCBpZiB0aGlzIGBJQnVja2V0YCByZWZlcnMgdG8gYW4gZXhpc3RpbmcgYnVja2V0LCBwb3NzaWJseSBub3RcbiAgLy8gICogbWFuYWdlZCBieSBDbG91ZEZvcm1hdGlvbiwgdGhpcyBtZXRob2Qgd2lsbCBoYXZlIG5vIGVmZmVjdCwgc2luY2UgaXQnc1xuICAvLyAgKiBpbXBvc3NpYmxlIHRvIG1vZGlmeSB0aGUgcG9saWN5IG9mIGFuIGV4aXN0aW5nIGJ1Y2tldC5cbiAgLy8gICpcbiAgLy8gICogQHBhcmFtIGtleVByZWZpeCB0aGUgcHJlZml4IG9mIFMzIG9iamVjdCBrZXlzIChlLmcuIGBob21lLypgKS4gRGVmYXVsdCBpcyBcIipcIi5cbiAgLy8gICogQHBhcmFtIGFsbG93ZWRBY3Rpb25zIHRoZSBzZXQgb2YgUzMgYWN0aW9ucyB0byBhbGxvdy4gRGVmYXVsdCBpcyBcInMzOkdldE9iamVjdFwiLlxuICAvLyAgKi9cbiAgLy8gcHVibGljIGdyYW50UHVibGljQWNjZXNzKGtleVByZWZpeCA9IFwiKlwiLCAuLi5hbGxvd2VkQWN0aW9uczogc3RyaW5nW10pIHtcbiAgLy8gICBpZiAoIXRoaXMucHVibGljKSB7XG4gIC8vICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFwiQ2Fubm90IGdyYW50IHB1YmxpYyBhY2Nlc3Mgd2hlbiAncHVibGljJyBpcyBlbmFibGVkXCIsIHRoaXMpO1xuICAvLyAgIH1cbiAgLy8gICAvLyBURE9POiBUaGlzIHNob3VsZCBjcmVhdGUgcHVibGljQWNjZXNzIHJlc291cmNlXG4gIC8vICAgYWxsb3dlZEFjdGlvbnMgPVxuICAvLyAgICAgYWxsb3dlZEFjdGlvbnMubGVuZ3RoID4gMCA/IGFsbG93ZWRBY3Rpb25zIDogW1wiczM6R2V0T2JqZWN0XCJdO1xuXG4gIC8vICAgcmV0dXJuIGlhbS5HcmFudC5hZGRUb1ByaW5jaXBhbE9yUmVzb3VyY2Uoe1xuICAvLyAgICAgYWN0aW9uczogYWxsb3dlZEFjdGlvbnMsXG4gIC8vICAgICByZXNvdXJjZUFybnM6IFt0aGlzLmFybkZvck9iamVjdHMoa2V5UHJlZml4KV0sXG4gIC8vICAgICBncmFudGVlOiBuZXcgaWFtLkFueVByaW5jaXBhbCgpLFxuICAvLyAgICAgcmVzb3VyY2U6IHRoaXMsXG4gIC8vICAgfSk7XG4gIC8vIH1cblxuICAvKipcbiAgICogQWRkcyBhIGJ1Y2tldCBub3RpZmljYXRpb24gZXZlbnQgZGVzdGluYXRpb24uXG4gICAqXG4gICAqIFMzIEJ1Y2tldHMgb25seSBzdXBwb3J0IGEgc2luZ2xlIG5vdGlmaWNhdGlvbiBjb25maWd1cmF0aW9uIHJlc291cmNlLlxuICAgKiBEZWNsYXJpbmcgbXVsdGlwbGUgYGF3c19zM19idWNrZXRfbm90aWZpY2F0aW9uYCByZXNvdXJjZXMgdG8gdGhlIHNhbWVcbiAgICogUzMgQnVja2V0IHdpbGwgY2F1c2UgYSBwZXJwZXR1YWwgZGlmZmVyZW5jZSBpbiBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBDYWxsaW5nIHRoaXMgZnVuY3Rpb24gd2lsbCBvdmVyd3JpdGUgYW55IGV4aXN0aW5nIGV2ZW50IG5vdGlmaWNhdGlvbnMgY29uZmlndXJlZFxuICAgKiBmb3IgdGhlIFMzIGJ1Y2tldCBvdXRzaWRlIG9mIHRoaXMgYmVhY29uLlxuICAgKlxuICAgKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50IHRvIHRyaWdnZXIgdGhlIG5vdGlmaWNhdGlvblxuICAgKiBAcGFyYW0gZGVzdCBUaGUgbm90aWZpY2F0aW9uIGRlc3RpbmF0aW9uIChMYW1iZGEsIFNOUyBUb3BpYyBvciBTUVMgUXVldWUpXG4gICAqXG4gICAqIEBwYXJhbSBmaWx0ZXJzIFMzIG9iamVjdCBrZXkgZmlsdGVyIHJ1bGVzIHRvIGRldGVybWluZSB3aGljaCBvYmplY3RzXG4gICAqIHRyaWdnZXIgdGhpcyBldmVudC4gRWFjaCBmaWx0ZXIgbXVzdCBpbmNsdWRlIGEgYHByZWZpeGAgYW5kL29yIGBzdWZmaXhgXG4gICAqIHRoYXQgd2lsbCBiZSBtYXRjaGVkIGFnYWluc3QgdGhlIHMzIG9iamVjdCBrZXkuIFJlZmVyIHRvIHRoZSBTMyBEZXZlbG9wZXIgR3VpZGVcbiAgICogZm9yIGRldGFpbHMgYWJvdXQgYWxsb3dlZCBmaWx0ZXIgcnVsZXMuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC9kZXYvTm90aWZpY2F0aW9uSG93VG8uaHRtbCNub3RpZmljYXRpb24taG93LXRvLWZpbHRlcmluZ1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiAgICBkZWNsYXJlIGNvbnN0IG15RnVuY3Rpb246IGNvbXB1dGUuRnVuY3Rpb247XG4gICAqICAgIGNvbnN0IGJ1Y2tldCA9IG5ldyBzdG9yYWdlLkJ1Y2tldCh0aGlzLCAnTXlCdWNrZXQnKTtcbiAgICogICAgYnVja2V0LmFkZEV2ZW50Tm90aWZpY2F0aW9uKHMzLkV2ZW50VHlwZS5PQkpFQ1RfQ1JFQVRFRCwgbmV3IHMzbi5MYW1iZGFEZXN0aW5hdGlvbihteUZ1bmN0aW9uKSwge3ByZWZpeDogJ2hvbWUvbXl1c2VybmFtZS8qJ30pO1xuICAgKlxuICAgKiBAc2VlXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25TMy9sYXRlc3QvZGV2L05vdGlmaWNhdGlvbkhvd1RvLmh0bWxcbiAgICovXG4gIHB1YmxpYyBhZGRFdmVudE5vdGlmaWNhdGlvbihcbiAgICBldmVudDogRXZlbnRUeXBlLFxuICAgIGRlc3Q6IElCdWNrZXROb3RpZmljYXRpb25EZXN0aW5hdGlvbixcbiAgICAuLi5maWx0ZXJzOiBOb3RpZmljYXRpb25LZXlGaWx0ZXJbXVxuICApIHtcbiAgICAvLyBUT0RPOiBUaGlzIGJsb2NrcyBhZGRpbmcgbm90aWZpY2F0aW9ucyBvdXRzaWRlIG9mIHRoZSBTdGFjayBvd25pbmcgdGhlIGJ1Y2tldC4uLlxuICAgIC8vIEFXUy1DREsgd29ya3MgYXJvdW5kIHRoaXMgYnkgdXNpbmcgYSBDdXN0b21SZXNvdXJjZSBoYW5kbGVyIChMYW1iZGEgZnVuY3Rpb24pIHdoaWNoIG1vZGlmaWVzXG4gICAgLy8gdGhlIGJ1Y2tldCBwb2xpY3kgaW4gcGxhY2UgKGFuZCBDRk4gZG9lcyBub3QgbWFuYWdlIHRoZSBhY3R1YWwgYnVja2V0IHBvbGljeSwgc28gbm8gdGYgc3RhdGUhKVxuICAgIHRoaXMud2l0aE5vdGlmaWNhdGlvbnMoKG5vdGlmaWNhdGlvbnMpID0+XG4gICAgICBub3RpZmljYXRpb25zLmFkZE5vdGlmaWNhdGlvbihldmVudCwgZGVzdCwgLi4uZmlsdGVycyksXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgd2l0aE5vdGlmaWNhdGlvbnMoY2I6IChub3RpZmljYXRpb25zOiBCdWNrZXROb3RpZmljYXRpb25zKSA9PiB2b2lkKSB7XG4gICAgLy8gVE9ETzogVXNlIEN1c3RvbSBSZXNvdXJjZXMgdG8gbWFuYWdlIGJ1Y2tldCBub3RpZmljYXRpb25zIG91dHNpZGUgb2YgdGhlIHN0YWNrXG4gICAgLy8gaGFuZGxlclJvbGU6IHRoaXMubm90aWZpY2F0aW9uc0hhbmRsZXJSb2xlLFxuICAgIGlmICghdGhpcy5ub3RpZmljYXRpb25zKSB7XG4gICAgICB0aGlzLm5vdGlmaWNhdGlvbnMgPSBuZXcgQnVja2V0Tm90aWZpY2F0aW9ucyh0aGlzLCBcIk5vdGlmaWNhdGlvbnNcIiwge1xuICAgICAgICBidWNrZXQ6IHRoaXMsXG4gICAgICB9KTtcbiAgICB9XG4gICAgY2IodGhpcy5ub3RpZmljYXRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJzY3JpYmVzIGEgZGVzdGluYXRpb24gdG8gcmVjZWl2ZSBub3RpZmljYXRpb25zIHdoZW4gYW4gb2JqZWN0IGlzXG4gICAqIGNyZWF0ZWQgaW4gdGhlIGJ1Y2tldC4gVGhpcyBpcyBpZGVudGljYWwgdG8gY2FsbGluZ1xuICAgKiBgb25FdmVudChFdmVudFR5cGUuT0JKRUNUX0NSRUFURUQpYC5cbiAgICpcbiAgICogQHBhcmFtIGRlc3QgVGhlIG5vdGlmaWNhdGlvbiBkZXN0aW5hdGlvbiAoc2VlIG9uRXZlbnQpXG4gICAqIEBwYXJhbSBmaWx0ZXJzIEZpbHRlcnMgKHNlZSBvbkV2ZW50KVxuICAgKi9cbiAgcHVibGljIGFkZE9iamVjdENyZWF0ZWROb3RpZmljYXRpb24oXG4gICAgZGVzdDogSUJ1Y2tldE5vdGlmaWNhdGlvbkRlc3RpbmF0aW9uLFxuICAgIC4uLmZpbHRlcnM6IE5vdGlmaWNhdGlvbktleUZpbHRlcltdXG4gICkge1xuICAgIHJldHVybiB0aGlzLmFkZEV2ZW50Tm90aWZpY2F0aW9uKFxuICAgICAgRXZlbnRUeXBlLk9CSkVDVF9DUkVBVEVELFxuICAgICAgZGVzdCxcbiAgICAgIC4uLmZpbHRlcnMsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJzY3JpYmVzIGEgZGVzdGluYXRpb24gdG8gcmVjZWl2ZSBub3RpZmljYXRpb25zIHdoZW4gYW4gb2JqZWN0IGlzXG4gICAqIHJlbW92ZWQgZnJvbSB0aGUgYnVja2V0LiBUaGlzIGlzIGlkZW50aWNhbCB0byBjYWxsaW5nXG4gICAqIGBvbkV2ZW50KEV2ZW50VHlwZS5PQkpFQ1RfUkVNT1ZFRClgLlxuICAgKlxuICAgKiBAcGFyYW0gZGVzdCBUaGUgbm90aWZpY2F0aW9uIGRlc3RpbmF0aW9uIChzZWUgb25FdmVudClcbiAgICogQHBhcmFtIGZpbHRlcnMgRmlsdGVycyAoc2VlIG9uRXZlbnQpXG4gICAqL1xuICBwdWJsaWMgYWRkT2JqZWN0UmVtb3ZlZE5vdGlmaWNhdGlvbihcbiAgICBkZXN0OiBJQnVja2V0Tm90aWZpY2F0aW9uRGVzdGluYXRpb24sXG4gICAgLi4uZmlsdGVyczogTm90aWZpY2F0aW9uS2V5RmlsdGVyW11cbiAgKSB7XG4gICAgcmV0dXJuIHRoaXMuYWRkRXZlbnROb3RpZmljYXRpb24oXG4gICAgICBFdmVudFR5cGUuT0JKRUNUX1JFTU9WRUQsXG4gICAgICBkZXN0LFxuICAgICAgLi4uZmlsdGVycyxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuYWJsZXMgZXZlbnQgYnJpZGdlIG5vdGlmaWNhdGlvbiwgY2F1c2luZyBhbGwgZXZlbnRzIGJlbG93IHRvIGJlIHNlbnQgdG8gRXZlbnRCcmlkZ2U6XG4gICAqXG4gICAqIC0gT2JqZWN0IERlbGV0ZWQgKERlbGV0ZU9iamVjdClcbiAgICogLSBPYmplY3QgRGVsZXRlZCAoTGlmZWN5Y2xlIGV4cGlyYXRpb24pXG4gICAqIC0gT2JqZWN0IFJlc3RvcmUgSW5pdGlhdGVkXG4gICAqIC0gT2JqZWN0IFJlc3RvcmUgQ29tcGxldGVkXG4gICAqIC0gT2JqZWN0IFJlc3RvcmUgRXhwaXJlZFxuICAgKiAtIE9iamVjdCBTdG9yYWdlIENsYXNzIENoYW5nZWRcbiAgICogLSBPYmplY3QgQWNjZXNzIFRpZXIgQ2hhbmdlZFxuICAgKiAtIE9iamVjdCBBQ0wgVXBkYXRlZFxuICAgKiAtIE9iamVjdCBUYWdzIEFkZGVkXG4gICAqIC0gT2JqZWN0IFRhZ3MgRGVsZXRlZFxuICAgKi9cbiAgcHVibGljIGVuYWJsZUV2ZW50QnJpZGdlTm90aWZpY2F0aW9uKCkge1xuICAgIHRoaXMud2l0aE5vdGlmaWNhdGlvbnMoKG5vdGlmaWNhdGlvbnMpID0+XG4gICAgICBub3RpZmljYXRpb25zLmVuYWJsZUV2ZW50QnJpZGdlTm90aWZpY2F0aW9uKCksXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZ3JhbnQoXG4gICAgZ3JhbnRlZTogaWFtLklHcmFudGFibGUsXG4gICAgYnVja2V0QWN0aW9uczogc3RyaW5nW10sXG4gICAga2V5QWN0aW9uczogc3RyaW5nW10sXG4gICAgcmVzb3VyY2VBcm46IHN0cmluZyxcbiAgICAuLi5vdGhlclJlc291cmNlQXJuczogc3RyaW5nW11cbiAgKSB7XG4gICAgY29uc3QgcmVzb3VyY2VzID0gW3Jlc291cmNlQXJuLCAuLi5vdGhlclJlc291cmNlQXJuc107XG5cbiAgICBjb25zdCByZXQgPSBpYW0uR3JhbnQuYWRkVG9QcmluY2lwYWxPclJlc291cmNlKHtcbiAgICAgIGdyYW50ZWUsXG4gICAgICBhY3Rpb25zOiBidWNrZXRBY3Rpb25zLFxuICAgICAgcmVzb3VyY2VBcm5zOiByZXNvdXJjZXMsXG4gICAgICByZXNvdXJjZTogdGhpcyxcbiAgICB9KTtcblxuICAgIGlmICh0aGlzLmVuY3J5cHRpb25LZXkgJiYga2V5QWN0aW9ucyAmJiBrZXlBY3Rpb25zLmxlbmd0aCAhPT0gMCkge1xuICAgICAgdGhpcy5lbmNyeXB0aW9uS2V5LmdyYW50KGdyYW50ZWUsIC4uLmtleUFjdGlvbnMpO1xuICAgIH1cblxuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICBwcml2YXRlIGdldCB3cml0ZUFjdGlvbnMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbLi4ucGVybXMuQlVDS0VUX0RFTEVURV9BQ1RJT05TLCAuLi5wZXJtcy5CVUNLRVRfUFVUX0FDVElPTlNdO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIHNvdXJjZSB0byB0aGUgYnVja2V0LlxuICAgKlxuICAgKiBAcGFyYW0gcHJvcHMgVGhlIHByb3BlcnRpZXMgb2YgdGhlIHNvdXJjZSB0byBhZGRcbiAgICovXG4gIHB1YmxpYyBhZGRTb3VyY2UocHJvcHM6IEFkZFNvdXJjZU9wdGlvbnMsIHNvdXJjZUlkPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy52ZXJzaW9uZWQpIHtcbiAgICAgIC8qKlxuICAgICAgICogSWYgeW91IGVuYWJsZSB2ZXJzaW9uaW5nIG9uIGEgYnVja2V0IGZvciB0aGUgZmlyc3QgdGltZSwgaXQgbWlnaHQgdGFrZSB1cCB0byAxNSBtaW51dGVzXG4gICAgICAgKiBmb3IgdGhlIGNoYW5nZSB0byBiZSBmdWxseSBwcm9wYWdhdGVkLiBXZSByZWNvbW1lbmQgdGhhdCB5b3Ugd2FpdCBmb3IgMTUgbWludXRlcyBhZnRlclxuICAgICAgICogZW5hYmxpbmcgdmVyc2lvbmluZyBiZWZvcmUgaXNzdWluZyB3cml0ZSBvcGVyYXRpb25zIChQVVQgb3IgREVMRVRFKSBvbiBvYmplY3RzIGluIHRoZSBidWNrZXQuXG4gICAgICAgKlxuICAgICAgICogV3JpdGUgb3BlcmF0aW9ucyBpc3N1ZWQgYmVmb3JlIHRoaXMgY29udmVyc2lvbiBpcyBjb21wbGV0ZSBtYXkgYXBwbHkgdG8gdW52ZXJzaW9uZWQgb2JqZWN0cy5cbiAgICAgICAqL1xuICAgICAgaWYgKCF0aGlzLnNvdXJjZVNsZWVwKSB7XG4gICAgICAgIHRoaXMuc291cmNlU2xlZXAgPSBuZXcgc2xlZXAuU2xlZXAodGhpcywgXCJWZXJzaW9uaW5nU2xlZXBcIiwge1xuICAgICAgICAgIGNyZWF0ZUR1cmF0aW9uOiBcIjE1bVwiLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgaW5kZXhlZFNvdXJjZSA9IHRoaXMuc291cmNlcy5maW5kKFxuICAgICAgKHNvdXJjZUluZGV4KSA9PiBzb3VyY2VJbmRleC5wcm9wcyA9PT0gcHJvcHMsXG4gICAgKTtcbiAgICBpZiAoaW5kZXhlZFNvdXJjZSkge1xuICAgICAgaWYgKHNvdXJjZUlkICYmIHNvdXJjZUlkICE9PSBpbmRleGVkU291cmNlLmlkKSB7XG4gICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICAgYER1cGxpY2F0ZSBidWNrZXQgc291cmNlIGZvciAke2luZGV4ZWRTb3VyY2UuaWR9IGFuZCAke3NvdXJjZUlkfS5gLFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gaW5kZXhlZFNvdXJjZS5pZDtcbiAgICB9XG4gICAgY29uc3QgbmV4dEluZGV4ID0gdGhpcy5zb3VyY2VzLmxlbmd0aDtcbiAgICBjb25zdCBpZCA9IHNvdXJjZUlkID8/IGBzb3VyY2UtJHtuZXh0SW5kZXh9YDtcbiAgICAvLyBlbnN1cmUgaWQgKGlmIHByb3ZpZGVkKSBpcyB1bmlxdWUgd2l0aGluIEJ1Y2tldFxuICAgIGlmICh0aGlzLnNvdXJjZXMuc29tZSgoc291cmNlSW5kZXgpID0+IHNvdXJjZUluZGV4LmlkID09PSBpZCkpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIGBEdXBsaWNhdGUgc291cmNlIGlkICR7aWR9LiBTb3VyY2VJZHMgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGEgQnVja2V0LmAsXG4gICAgICAgIHRoaXMsXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLnNvdXJjZXMucHVzaCh7XG4gICAgICBwcm9wczoge1xuICAgICAgICAuLi5wcm9wcyxcbiAgICAgICAgYnVja2V0OiB0aGlzLFxuICAgICAgICBkZXBlbmRzT246IHRoaXMuc291cmNlU2xlZXAgPyBbdGhpcy5zb3VyY2VTbGVlcF0gOiB1bmRlZmluZWQsXG4gICAgICB9LFxuICAgICAgaWQsXG4gICAgfSk7XG4gICAgcmV0dXJuIGlkO1xuICB9XG5cbiAgcHVibGljIGlzV2Vic2l0ZSgpOiB0aGlzIGlzIHtcbiAgICB3ZWJzaXRlRG9tYWluTmFtZTogc3RyaW5nO1xuICAgIGJ1Y2tldE91dHB1dHM6IHsgd2Vic2l0ZVVybDogc3RyaW5nOyB3ZWJzaXRlRG9tYWluTmFtZTogc3RyaW5nIH07XG4gIH0ge1xuICAgIHJldHVybiB0aGlzLl9pc1dlYnNpdGU7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGh0dHBzIFVSTCBvZiBhbiBTMyBvYmplY3QuIFNwZWNpZnkgYHJlZ2lvbmFsOiBmYWxzZWAgYXQgdGhlIG9wdGlvbnNcbiAgICogZm9yIG5vbi1yZWdpb25hbCBVUkxzLiBGb3IgZXhhbXBsZTpcbiAgICpcbiAgICogLSBgaHR0cHM6Ly9zMy51cy13ZXN0LTEuYW1hem9uYXdzLmNvbS9vbmx5YnVja2V0YFxuICAgKiAtIGBodHRwczovL3MzLnVzLXdlc3QtMS5hbWF6b25hd3MuY29tL2J1Y2tldC9rZXlgXG4gICAqIC0gYGh0dHBzOi8vczMuY24tbm9ydGgtMS5hbWF6b25hd3MuY29tLmNuL2NoaW5hLWJ1Y2tldC9teWtleWBcbiAgICpcbiAgICogQHBhcmFtIGtleSBUaGUgUzMga2V5IG9mIHRoZSBvYmplY3QuIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBVUkwgb2YgdGhlXG4gICAqICAgICAgYnVja2V0IGlzIHJldHVybmVkLlxuICAgKiBAcmV0dXJucyBhbiBPYmplY3RTM1VybCB0b2tlblxuICAgKi9cbiAgcHVibGljIHVybEZvck9iamVjdChrZXk/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHN0YWNrID0gQXdzU3RhY2sub2ZBd3NDb25zdHJ1Y3QodGhpcyk7XG4gICAgY29uc3QgcHJlZml4ID0gYGh0dHBzOi8vczMuJHt0aGlzLmVudi5yZWdpb259LiR7c3RhY2sudXJsU3VmZml4fS9gO1xuICAgIGlmICh0eXBlb2Yga2V5ICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4gdGhpcy51cmxKb2luKHByZWZpeCwgdGhpcy5idWNrZXROYW1lKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudXJsSm9pbihwcmVmaXgsIHRoaXMuYnVja2V0TmFtZSwga2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgUzMgVVJMIG9mIGFuIFMzIG9iamVjdC4gRm9yIGV4YW1wbGU6XG4gICAqXG4gICAqIC0gYHMzOi8vb25seWJ1Y2tldGBcbiAgICogLSBgczM6Ly9idWNrZXQva2V5YFxuICAgKlxuICAgKiBAcGFyYW0ga2V5IFRoZSBTMyBrZXkgb2YgdGhlIG9iamVjdC4gSWYgbm90IHNwZWNpZmllZCwgdGhlIFMzIFVSTCBvZiB0aGVcbiAgICogICAgICBidWNrZXQgaXMgcmV0dXJuZWQuXG4gICAqIEByZXR1cm5zIGFuIE9iamVjdFMzVXJsIHRva2VuXG4gICAqL1xuICBwdWJsaWMgczNVcmxGb3JPYmplY3Qoa2V5Pzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBwcmVmaXggPSBcInMzOi8vXCI7XG4gICAgaWYgKHR5cGVvZiBrZXkgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiB0aGlzLnVybEpvaW4ocHJlZml4LCB0aGlzLmJ1Y2tldE5hbWUpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy51cmxKb2luKHByZWZpeCwgdGhpcy5idWNrZXROYW1lLCBrZXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gQVJOIHRoYXQgcmVwcmVzZW50cyBhbGwgb2JqZWN0cyB3aXRoaW4gdGhlIGJ1Y2tldCB0aGF0IG1hdGNoXG4gICAqIHRoZSBrZXkgcGF0dGVybiBzcGVjaWZpZWQuIFRvIHJlcHJlc2VudCBhbGwga2V5cywgc3BlY2lmeSBgYFwiKlwiYGAuXG4gICAqXG4gICAqIElmIHlvdSBuZWVkIHRvIHNwZWNpZnkgYSBrZXlQYXR0ZXJuIHdpdGggbXVsdGlwbGUgY29tcG9uZW50cywgY29uY2F0ZW5hdGUgdGhlbSBpbnRvIGEgc2luZ2xlIHN0cmluZywgZS5nLjpcbiAgICpcbiAgICogICBhcm5Gb3JPYmplY3RzKGBob21lLyR7dGVhbX0vJHt1c2VyfS8qYClcbiAgICpcbiAgICovXG4gIHB1YmxpYyBhcm5Gb3JPYmplY3RzKGtleVBhdHRlcm46IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMuYnVja2V0QXJufS8ke2tleVBhdHRlcm59YDtcbiAgfVxuXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9ibG9iL3YyLjE0MC4wL3BhY2thZ2VzL2F3cy1jZGstbGliL2F3cy1zMy9saWIvYnVja2V0LnRzI0w5NTNcbiAgcHJpdmF0ZSB1cmxKb2luKC4uLmNvbXBvbmVudHM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICByZXR1cm4gY29tcG9uZW50cy5yZWR1Y2UoKHJlc3VsdCwgY29tcG9uZW50KSA9PiB7XG4gICAgICBpZiAocmVzdWx0LmVuZHNXaXRoKFwiL1wiKSkge1xuICAgICAgICByZXN1bHQgPSByZXN1bHQuc2xpY2UoMCwgLTEpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbXBvbmVudC5zdGFydHNXaXRoKFwiL1wiKSkge1xuICAgICAgICBjb21wb25lbnQgPSBjb21wb25lbnQuc2xpY2UoMSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYCR7cmVzdWx0fS8ke2NvbXBvbmVudH1gO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgcmVzb3VyY2UgdG8gdGhlIFRlcnJhZm9ybSBKU09OIG91dHB1dCBhdCBTeW50aCB0aW1lLlxuICAgKlxuICAgKiBjYWxsZWQgYnkgVGVycmFmb3JtU3RhY2sucHJlcGFyZVN0YWNrKClcbiAgICovXG4gIHB1YmxpYyB0b1RlcnJhZm9ybSgpOiBhbnkge1xuICAgIC8qKlxuICAgICAqIEEgcHJlcGFyaW5nIHJlc29sdmUgbWlnaHQgYWRkIG5ldyByZXNvdXJjZXMgdG8gdGhlIHN0YWNrXG4gICAgICpcbiAgICAgKiBzaG91bGQgbm90IGFkZCByZXNvdXJjZXMgaWYgbm8gYnVja2V0IHNvdXJjZXMgYXJlIGRlZmluZWRcbiAgICAgKi9cbiAgICBpZiAoT2JqZWN0LmtleXModGhpcy5zb3VyY2VzKS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHNvdXJjZSBvZiB0aGlzLnNvdXJjZXMpIHtcbiAgICAgIC8vIFRPRE86IElkZWFsbHkgd2Ugc2hvdWxkIGhhdmUgdXNlZCBJUmVzb2x2YWJsZS5yZXNvbHZlIGFuZCB1c2UgdGhlIElSZXNvbHZlQ29udGV4dC5wcmVwYXJpbmcgZmxhZ1xuICAgICAgLy8gcmVmOiBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvYmxvYi92Mi4xNzAuMC9wYWNrYWdlcy9hd3MtY2RrLWxpYi9hd3MtaWFtL2xpYi9wb2xpY3ktZG9jdW1lbnQudHMjTDQ4XG4gICAgICBpZiAodGhpcy5ub2RlLnRyeUZpbmRDaGlsZChzb3VyY2UuaWQpKSBjb250aW51ZTsgLy8gaWdub3JlIGlmIGFscmVhZHkgZ2VuZXJhdGVkXG4gICAgICBuZXcgQnVja2V0U291cmNlKHRoaXMsIHNvdXJjZS5pZCwgc291cmNlLnByb3BzKTtcbiAgICB9XG4gICAgcmV0dXJuIHt9O1xuICB9XG59XG5cbi8qKlxuICogVGhlIGBCdWNrZXRgIHByb3ZpZGVzIGFuIFtBV1MgUzMgQnVja2V0XShodHRwczovL2F3cy5hbWF6b24uY29tL3MzLykuXG4gKlxuICogYGBgdHNcbiAqIG5ldyBzdG9yYWdlLkJ1Y2tldChzdGFjaywgXCJNeVdlYnNpdGVcIiwge1xuICogICBwYXRoOiBwYXRoLmpvaW4oX19kaXJuYW1lLCBcImRpc3RcIiksXG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqICMjIyMgUHVibGljIHJlYWQgYWNjZXNzXG4gKlxuICogRW5hYmxlcyBgcHVibGljYCByZWFkIGFjY2VzcyBmb3IgYWxsIHRoZSBmaWxlcyBpbiB0aGUgYnVja2V0LiBEYW5nZXJvdXMgYW5kXG4gKiByZWNvbW1lbmRlZCB0byB1c2UgZWRnZS5EaXN0cmlidXRpb24gaW5zdGVhZC5cbiAqXG4gKiBVc2VmdWwgZm9yIGhvc3RpbmcgcHVibGljIGZpbGVzIGRpcmVjdGx5IGZyb20gUzMuXG4gKlxuICogYGBgdHNcbiAqIG5ldyBzdG9yYWdlLkJ1Y2tldChcIk15QnVja2V0XCIsIHtcbiAqICAgcHVibGljOiB0cnVlXG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqIEByZXNvdXJjZSBhd3NfczNfYnVja2V0XG4gKiBAdGVycmFjb25zdHJ1Y3Qgc3RvcmFnZS5JQnVja2V0XG4gKi9cblxuZXhwb3J0IGNsYXNzIEJ1Y2tldCBleHRlbmRzIEJ1Y2tldEJhc2UgaW1wbGVtZW50cyBJQnVja2V0IHtcbiAgLy8gVE9ETzogQWRkIHN0YXRpYyBmcm9tTG9va3VwP1xuICBwdWJsaWMgc3RhdGljIGZyb21CdWNrZXROYW1lKFxuICAgIHNjb3BlOiBDb25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBidWNrZXROYW1lOiBzdHJpbmcsXG4gICk6IElCdWNrZXQge1xuICAgIHJldHVybiBCdWNrZXQuZnJvbUJ1Y2tldEF0dHJpYnV0ZXMoc2NvcGUsIGlkLCB7IGJ1Y2tldE5hbWUgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIEJ1Y2tldCBjb25zdHJ1Y3QgdGhhdCByZXByZXNlbnRzIGFuIGV4dGVybmFsIGJ1Y2tldC5cbiAgICpcbiAgICogQHBhcmFtIHNjb3BlIFRoZSBwYXJlbnQgY3JlYXRpbmcgY29uc3RydWN0ICh1c3VhbGx5IGB0aGlzYCkuXG4gICAqIEBwYXJhbSBpZCBUaGUgY29uc3RydWN0J3MgbmFtZS5cbiAgICogQHBhcmFtIGF0dHJzIEEgYEJ1Y2tldEF0dHJpYnV0ZXNgIG9iamVjdC4gQ2FuIGJlIG9idGFpbmVkIGZyb20gYSBjYWxsIHRvXG4gICAqIGBidWNrZXQuZXhwb3J0KClgIG9yIG1hbnVhbGx5IGNyZWF0ZWQuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21CdWNrZXRBdHRyaWJ1dGVzKFxuICAgIHNjb3BlOiBDb25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBhdHRyczogQnVja2V0QXR0cmlidXRlcyxcbiAgKTogSUJ1Y2tldCB7XG4gICAgY29uc3Qgc3RhY2sgPSBBd3NTdGFjay5vZkF3c0NvbnN0cnVjdChzY29wZSk7XG4gICAgY29uc3QgcmVnaW9uID0gYXR0cnMucmVnaW9uID8/IHN0YWNrLnJlZ2lvbjtcbiAgICBjb25zdCByZWdpb25JbmZvID0gUmVnaW9uSW5mby5nZXQocmVnaW9uKTtcbiAgICBjb25zdCB1cmxTdWZmaXggPSByZWdpb25JbmZvLmRvbWFpblN1ZmZpeCA/PyBzdGFjay51cmxTdWZmaXg7XG5cbiAgICBjb25zdCBidWNrZXROYW1lID0gcGFyc2VCdWNrZXROYW1lKHNjb3BlLCBhdHRycyk7XG4gICAgaWYgKCFidWNrZXROYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFwiQnVja2V0IG5hbWUgaXMgcmVxdWlyZWRcIiwgc2NvcGUpO1xuICAgIH1cbiAgICBCdWNrZXQudmFsaWRhdGVCdWNrZXROYW1lKGJ1Y2tldE5hbWUsIHRydWUpO1xuXG4gICAgY29uc3QgbmV3RW5kcG9pbnQgPSBgczMtd2Vic2l0ZS4ke3JlZ2lvbn0uJHt1cmxTdWZmaXh9YDtcblxuICAgIGNvbnN0IHN0YXRpY0RvbWFpbkVuZHBvaW50ID1cbiAgICAgIHJlZ2lvbkluZm8uczNTdGF0aWNXZWJzaXRlRW5kcG9pbnQgPz9cbiAgICAgIExhenkuc3RyaW5nVmFsdWUoe1xuICAgICAgICBwcm9kdWNlOiAoKSA9PlxuICAgICAgICAgIHN0YWNrLnJlZ2lvbmFsRmFjdChGYWN0TmFtZS5TM19TVEFUSUNfV0VCU0lURV9FTkRQT0lOVCwgbmV3RW5kcG9pbnQpLFxuICAgICAgfSk7XG4gICAgY29uc3Qgd2Vic2l0ZURvbWFpbiA9IGAke2J1Y2tldE5hbWV9LiR7c3RhdGljRG9tYWluRW5kcG9pbnR9YDtcblxuICAgIGNsYXNzIEltcG9ydCBleHRlbmRzIEJ1Y2tldEJhc2Uge1xuICAgICAgcHVibGljIHJlYWRvbmx5IGJ1Y2tldE5hbWUgPSBidWNrZXROYW1lITtcbiAgICAgIHB1YmxpYyByZWFkb25seSBidWNrZXRBcm4gPSBwYXJzZUJ1Y2tldEFybihzY29wZSwgYXR0cnMpO1xuICAgICAgcHVibGljIHJlYWRvbmx5IGJ1Y2tldERvbWFpbk5hbWUgPVxuICAgICAgICBhdHRycy5idWNrZXREb21haW5OYW1lIHx8IGAke2J1Y2tldE5hbWV9LnMzLiR7dXJsU3VmZml4fWA7XG4gICAgICAvLyBOT1RFIHByZXZpb3VzIHZlcnNpb25zIGVycm9yOiByZXNvdXJjZS53ZWJzaXRlRG9tYWluIHNob3VsZCBiZSB3ZWJzaXRlRW5kcG9pbnQgKHdpdGhvdXQgaHR0cDovLylcbiAgICAgIC8vIFJlZjogaHR0cHM6Ly9naXRodWIuY29tL2hhc2hpY29ycC90ZXJyYWZvcm0tcHJvdmlkZXItYXdzL2Jsb2IvdjYuMC4wL2ludGVybmFsL3NlcnZpY2UvczMvYnVja2V0LmdvI0wxNzA4LUwxNzEyXG4gICAgICBwdWJsaWMgcmVhZG9ubHkgd2Vic2l0ZURvbWFpbk5hbWUgPSBzdGF0aWNEb21haW5FbmRwb2ludDtcbiAgICAgIC8vIFRPRE86IHJlLWFsaWduIHRvIEFXU0NESyBidWNrZXRXZWJzaXRlRG9tYWluTmFtZSAuLi5cbiAgICAgIC8vIGF0dHJzLmJ1Y2tldFdlYnNpdGVVcmxcbiAgICAgIC8vICAgPyBGbi5zZWxlY3QoMiwgRm4uc3BsaXQoXCIvXCIsIGF0dHJzLmJ1Y2tldFdlYnNpdGVVcmwpKSAvLyBkcm9wIGh0dHA6Ly9cbiAgICAgIC8vICAgOiB3ZWJzaXRlRG9tYWluO1xuICAgICAgLy8gVE9ETzogRG9lcyBub3QgZXhpc3QgZm9yIEFXU0NES1xuICAgICAgcHVibGljIHJlYWRvbmx5IHdlYnNpdGVFbmRwb2ludCA9IHdlYnNpdGVEb21haW47XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgYnVja2V0V2Vic2l0ZVVybCA9XG4gICAgICAgIGF0dHJzLmJ1Y2tldFdlYnNpdGVVcmwgfHwgYGh0dHA6Ly8ke3dlYnNpdGVEb21haW59YDtcbiAgICAgIHB1YmxpYyByZWFkb25seSBidWNrZXRSZWdpb25hbERvbWFpbk5hbWUgPVxuICAgICAgICBhdHRycy5idWNrZXRSZWdpb25hbERvbWFpbk5hbWUgfHxcbiAgICAgICAgYCR7YnVja2V0TmFtZX0uczMuJHtyZWdpb259LiR7dXJsU3VmZml4fWA7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgYnVja2V0RHVhbFN0YWNrRG9tYWluTmFtZSA9XG4gICAgICAgIGF0dHJzLmJ1Y2tldER1YWxTdGFja0RvbWFpbk5hbWUgfHxcbiAgICAgICAgYCR7YnVja2V0TmFtZX0uczMuZHVhbHN0YWNrLiR7cmVnaW9ufS4ke3VybFN1ZmZpeH1gO1xuICAgICAgcHVibGljIHJlYWRvbmx5IGVuY3J5cHRpb25LZXkgPSBhdHRycy5lbmNyeXB0aW9uS2V5O1xuXG4gICAgICBwdWJsaWMgZ2V0IGhvc3RlZFpvbmVJZCgpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCB7IHMzU3RhdGljV2Vic2l0ZUhvc3RlZFpvbmVJZCB9ID0gUmVnaW9uSW5mby5nZXQocmVnaW9uKTtcbiAgICAgICAgaWYgKCFzM1N0YXRpY1dlYnNpdGVIb3N0ZWRab25lSWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICAgICAgYE5vIGhvc3RlZCB6b25lIElEIGZvdW5kIGZvciBTMyBzdGF0aWMgd2Vic2l0ZSBpbiByZWdpb246ICR7cmVnaW9ufWAsXG4gICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHMzU3RhdGljV2Vic2l0ZUhvc3RlZFpvbmVJZDtcbiAgICAgIH1cbiAgICAgIHB1YmxpYyByZWFkb25seSBwdWJsaWMgPSBhdHRycy5wdWJsaWMgPz8gZmFsc2U7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgdmVyc2lvbmVkID0gYXR0cnMudmVyc2lvbmVkID8/IGZhbHNlO1xuICAgICAgcHVibGljIHBvbGljeT86IEJ1Y2tldFBvbGljeSA9IHVuZGVmaW5lZDtcbiAgICAgIHB1YmxpYyByZWFkb25seSBvcmlnaW5BY2Nlc3NJZGVudGl0eSA9IGF0dHJzLm9yaWdpbkFjY2Vzc0lkZW50aXR5O1xuICAgICAgcHVibGljIHJlYWRvbmx5IF9pc1dlYnNpdGUgPSAhIWF0dHJzLmlzV2Vic2l0ZTtcbiAgICAgIHByb3RlY3RlZCBhdXRvQ3JlYXRlUG9saWN5ID0gZmFsc2U7XG4gICAgICBwdWJsaWMgaXNXZWJzaXRlKCk6IHRoaXMgaXMge1xuICAgICAgICB3ZWJzaXRlRG9tYWluTmFtZTogc3RyaW5nO1xuICAgICAgICBidWNrZXRPdXRwdXRzOiB7IHdlYnNpdGVVcmw6IHN0cmluZzsgd2Vic2l0ZURvbWFpbk5hbWU6IHN0cmluZyB9O1xuICAgICAgfSB7XG4gICAgICAgIHJldHVybiBhdHRycy5pc1dlYnNpdGUgPz8gZmFsc2U7XG4gICAgICB9XG4gICAgICAvLyBwcm90ZWN0ZWQgZGlzYWxsb3dQdWJsaWNBY2Nlc3MgPSBmYWxzZTtcbiAgICAgIC8vIHByb3RlY3RlZCBub3RpZmljYXRpb25zSGFuZGxlclJvbGUgPSBhdHRycy5ub3RpZmljYXRpb25zSGFuZGxlclJvbGU7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBJbXBvcnQoc2NvcGUsIGlkLCB7XG4gICAgICBhY2NvdW50OiBhdHRycy5hY2NvdW50LFxuICAgICAgcmVnaW9uOiBhdHRycy5yZWdpb24sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVGhyb3duIGFuIGV4Y2VwdGlvbiBpZiB0aGUgZ2l2ZW4gYnVja2V0IG5hbWUgaXMgbm90IHZhbGlkLlxuICAgKlxuICAgKiBAcGFyYW0gcGh5c2ljYWxOYW1lIG5hbWUgb2YgdGhlIGJ1Y2tldC5cbiAgICogQHBhcmFtIGFsbG93TGVnYWN5QnVja2V0TmFtaW5nIGFsbG93IGxlZ2FjeSBidWNrZXQgbmFtaW5nIHN0eWxlLCBkZWZhdWx0IGlzIGZhbHNlLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB2YWxpZGF0ZUJ1Y2tldE5hbWUoXG4gICAgcGh5c2ljYWxOYW1lOiBzdHJpbmcsXG4gICAgYWxsb3dMZWdhY3lCdWNrZXROYW1pbmc6IGJvb2xlYW4gPSBmYWxzZSxcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgYnVja2V0TmFtZSA9IHBoeXNpY2FsTmFtZTtcbiAgICBpZiAoIWJ1Y2tldE5hbWUgfHwgVG9rZW4uaXNVbnJlc29sdmVkKGJ1Y2tldE5hbWUpKSB7XG4gICAgICAvLyB0aGUgbmFtZSBpcyBhIGxhdGUtYm91bmQgdmFsdWUsIG5vdCBhIGRlZmluZWQgc3RyaW5nLFxuICAgICAgLy8gc28gc2tpcCB2YWxpZGF0aW9uXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgLy8gUnVsZXMgY29kaWZpZWQgZnJvbSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L2Rldi9CdWNrZXRSZXN0cmljdGlvbnMuaHRtbFxuICAgIGlmIChidWNrZXROYW1lLmxlbmd0aCA8IDMgfHwgYnVja2V0TmFtZS5sZW5ndGggPiA2Mykge1xuICAgICAgZXJyb3JzLnB1c2goXG4gICAgICAgIFwiQnVja2V0IG5hbWUgbXVzdCBiZSBhdCBsZWFzdCAzIGFuZCBubyBtb3JlIHRoYW4gNjMgY2hhcmFjdGVyc1wiLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBpbGxlZ2FsQ2hhcnNldFJlZ0V4ID0gYWxsb3dMZWdhY3lCdWNrZXROYW1pbmdcbiAgICAgID8gL1teQS1aYS16MC05Ll8tXS9cbiAgICAgIDogL1teYS16MC05Li1dLztcbiAgICBjb25zdCBhbGxvd2VkRWRnZUNoYXJzZXRSZWdFeCA9IGFsbG93TGVnYWN5QnVja2V0TmFtaW5nXG4gICAgICA/IC9bQS1aYS16MC05XS9cbiAgICAgIDogL1thLXowLTldLztcblxuICAgIGNvbnN0IGlsbGVnYWxDaGFyTWF0Y2ggPSBidWNrZXROYW1lLm1hdGNoKGlsbGVnYWxDaGFyc2V0UmVnRXgpO1xuICAgIGlmIChpbGxlZ2FsQ2hhck1hdGNoKSB7XG4gICAgICBlcnJvcnMucHVzaChcbiAgICAgICAgYWxsb3dMZWdhY3lCdWNrZXROYW1pbmdcbiAgICAgICAgICA/IFwiQnVja2V0IG5hbWUgbXVzdCBvbmx5IGNvbnRhaW4gdXBwZXJjYXNlIG9yIGxvd2VyY2FzZSBjaGFyYWN0ZXJzIGFuZCB0aGUgc3ltYm9scywgcGVyaW9kICguKSwgdW5kZXJzY29yZSAoXyksIGFuZCBkYXNoICgtKVwiXG4gICAgICAgICAgOiBcIkJ1Y2tldCBuYW1lIG11c3Qgb25seSBjb250YWluIGxvd2VyY2FzZSBjaGFyYWN0ZXJzIGFuZCB0aGUgc3ltYm9scywgcGVyaW9kICguKSBhbmQgZGFzaCAoLSlcIiArXG4gICAgICAgICAgICAgIGAgKG9mZnNldDogJHtpbGxlZ2FsQ2hhck1hdGNoLmluZGV4fSlgLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKCFhbGxvd2VkRWRnZUNoYXJzZXRSZWdFeC50ZXN0KGJ1Y2tldE5hbWUuY2hhckF0KDApKSkge1xuICAgICAgZXJyb3JzLnB1c2goXG4gICAgICAgIGFsbG93TGVnYWN5QnVja2V0TmFtaW5nXG4gICAgICAgICAgPyBcIkJ1Y2tldCBuYW1lIG11c3Qgc3RhcnQgd2l0aCBhbiB1cHBlcmNhc2UsIGxvd2VyY2FzZSBjaGFyYWN0ZXIgb3IgbnVtYmVyXCJcbiAgICAgICAgICA6IFwiQnVja2V0IG5hbWUgbXVzdCBzdGFydCB3aXRoIGEgbG93ZXJjYXNlIGNoYXJhY3RlciBvciBudW1iZXJcIiArXG4gICAgICAgICAgICAgIFwiIChvZmZzZXQ6IDApXCIsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICAhYWxsb3dlZEVkZ2VDaGFyc2V0UmVnRXgudGVzdChidWNrZXROYW1lLmNoYXJBdChidWNrZXROYW1lLmxlbmd0aCAtIDEpKVxuICAgICkge1xuICAgICAgZXJyb3JzLnB1c2goXG4gICAgICAgIGFsbG93TGVnYWN5QnVja2V0TmFtaW5nXG4gICAgICAgICAgPyBcIkJ1Y2tldCBuYW1lIG11c3QgZW5kIHdpdGggYW4gdXBwZXJjYXNlLCBsb3dlcmNhc2UgY2hhcmFjdGVyIG9yIG51bWJlclwiXG4gICAgICAgICAgOiBcIkJ1Y2tldCBuYW1lIG11c3QgZW5kIHdpdGggYSBsb3dlcmNhc2UgY2hhcmFjdGVyIG9yIG51bWJlclwiICtcbiAgICAgICAgICAgICAgYCAob2Zmc2V0OiAke2J1Y2tldE5hbWUubGVuZ3RoIC0gMX0pYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgY29uc2VjU3ltYm9sTWF0Y2ggPSBidWNrZXROYW1lLm1hdGNoKC9cXC4tfC1cXC58XFwuXFwuLyk7XG4gICAgaWYgKGNvbnNlY1N5bWJvbE1hdGNoKSB7XG4gICAgICBlcnJvcnMucHVzaChcbiAgICAgICAgXCJCdWNrZXQgbmFtZSBtdXN0IG5vdCBoYXZlIGRhc2ggbmV4dCB0byBwZXJpb2QsIG9yIHBlcmlvZCBuZXh0IHRvIGRhc2gsIG9yIGNvbnNlY3V0aXZlIHBlcmlvZHNcIiArXG4gICAgICAgICAgYCAob2Zmc2V0OiAke2NvbnNlY1N5bWJvbE1hdGNoLmluZGV4fSlgLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKC9eXFxkezEsM31cXC5cXGR7MSwzfVxcLlxcZHsxLDN9XFwuXFxkezEsM30kLy50ZXN0KGJ1Y2tldE5hbWUpKSB7XG4gICAgICBlcnJvcnMucHVzaChcIkJ1Y2tldCBuYW1lIG11c3Qgbm90IHJlc2VtYmxlIGFuIElQIGFkZHJlc3NcIik7XG4gICAgfVxuXG4gICAgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIGBJbnZhbGlkIFMzIGJ1Y2tldCBuYW1lICh2YWx1ZTogJHtidWNrZXROYW1lfSkke0VPTH0ke2Vycm9ycy5qb2luKEVPTCl9YCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlYWRvbmx5IGVuY3J5cHRpb25LZXk/OiBrbXMuSUtleTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHJlc291cmNlOlxuICAgIHwgczNCdWNrZXQuUzNCdWNrZXRcbiAgICB8IGRhdGFBd3NTM0J1Y2tldC5EYXRhQXdzUzNCdWNrZXQ7XG4gIHByb3RlY3RlZCByZWFkb25seSB3ZWJzaXRlQ29uZmlnPzogczNCdWNrZXRXZWJzaXRlQ29uZmlndXJhdGlvbi5TM0J1Y2tldFdlYnNpdGVDb25maWd1cmF0aW9uO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgY29yc0NvbmZpZz86IHMzQnVja2V0Q29yc0NvbmZpZ3VyYXRpb24uUzNCdWNrZXRDb3JzQ29uZmlndXJhdGlvbjtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IG9yaWdpbkFjY2Vzc0lkZW50aXR5PzogT3JpZ2luQWNjZXNzSWRlbnRpdHk7XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgX2lzV2Vic2l0ZTogYm9vbGVhbjtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF92ZXJzaW9uZWQ6IGJvb2xlYW47XG5cbiAgcHVibGljIGdldCBidWNrZXRBcm4oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5yZXNvdXJjZS5hcm47XG4gIH1cbiAgcHVibGljIGdldCBidWNrZXROYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucmVzb3VyY2UuYnVja2V0O1xuICB9XG4gIHB1YmxpYyBnZXQgYnVja2V0RG9tYWluTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnJlc291cmNlLmJ1Y2tldERvbWFpbk5hbWU7XG4gIH1cbiAgcHVibGljIGdldCBidWNrZXRSZWdpb25hbERvbWFpbk5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5yZXNvdXJjZS5idWNrZXRSZWdpb25hbERvbWFpbk5hbWU7XG4gIH1cbiAgcHVibGljIGdldCB3ZWJzaXRlRG9tYWluTmFtZSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLndlYnNpdGVDb25maWc/LndlYnNpdGVEb21haW47XG4gIH1cbiAgcHVibGljIGdldCB3ZWJzaXRlRW5kcG9pbnQoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy53ZWJzaXRlQ29uZmlnPy53ZWJzaXRlRW5kcG9pbnQ7XG4gIH1cbiAgcHVibGljIGdldCB2ZXJzaW9uZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3ZlcnNpb25lZDtcbiAgfVxuICBwdWJsaWMgZ2V0IGhvc3RlZFpvbmVJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnJlc291cmNlLmhvc3RlZFpvbmVJZDtcbiAgfVxuXG4gIHB1YmxpYyBwb2xpY3k/OiBCdWNrZXRQb2xpY3k7XG4gIHByb3RlY3RlZCBhdXRvQ3JlYXRlUG9saWN5ID0gdHJ1ZTtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgYnVja2V0IGlzIHB1YmxpYyBvciBub3QuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcHVibGljPzogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBldmVudEJyaWRnZUVuYWJsZWQ/OiBib29sZWFuO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIG5hbWU6IHN0cmluZywgcHJvcHM6IEJ1Y2tldFByb3BzID0ge30pIHtcbiAgICBzdXBlcihzY29wZSwgbmFtZSwgcHJvcHMpO1xuXG4gICAgY29uc3QgeyBidWNrZXRFbmNyeXB0aW9uLCBlbmNyeXB0aW9uS2V5IH0gPSB0aGlzLnBhcnNlRW5jcnlwdGlvbihwcm9wcyk7XG4gICAgY29uc3QgeyB3ZWJzaXRlQ29uZmlnLCBjb3JzQ29uZmlnLCBjbG91ZGZyb250QWNjZXNzIH0gPSBwcm9wcztcbiAgICB0aGlzLl9pc1dlYnNpdGUgPSBmYWxzZTtcblxuICAgIGlmIChwcm9wcy5idWNrZXROYW1lICYmIHByb3BzLm5hbWVQcmVmaXgpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIFwiQ2Fubm90IHNwZWNpZnkgYm90aCAnYnVja2V0TmFtZScgYW5kICduYW1lUHJlZml4Jy4gVXNlIG9ubHkgb25lLlwiLFxuICAgICAgICBzY29wZSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgbGV0IGJ1Y2tldFByZWZpeDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGlmICghcHJvcHMuYnVja2V0TmFtZSkge1xuICAgICAgLy8gQnVja2V0IG5hbWVzIG11c3QgYmUgbG93ZXJjYXNlIGFuZCBiZXR3ZWVuIDMgKG1pbikgYW5kIDYzIChtYXgpIGNoYXJhY3RlcnMgbG9uZy5cbiAgICAgIGJ1Y2tldFByZWZpeCA9IHRoaXMuc3RhY2sudW5pcXVlUmVzb3VyY2VOYW1lUHJlZml4KHRoaXMsIHtcbiAgICAgICAgcHJlZml4OiAocHJvcHMubmFtZVByZWZpeCA/PyB0aGlzLmdyaWRVVUlEKSArIFwiLVwiLFxuICAgICAgICBsb3dlckNhc2U6IHRydWUsXG4gICAgICAgIGFsbG93ZWRTcGVjaWFsQ2hhcmFjdGVyczogXCIuLVwiLFxuICAgICAgICBtYXhMZW5ndGg6IDYzLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5yZXNvdXJjZSA9IG5ldyBzM0J1Y2tldC5TM0J1Y2tldCh0aGlzLCBcIlJlc291cmNlXCIsIHtcbiAgICAgIGJ1Y2tldDogcHJvcHMuYnVja2V0TmFtZSxcbiAgICAgIGZvcmNlRGVzdHJveTogcHJvcHMuZm9yY2VEZXN0cm95LFxuICAgICAgYnVja2V0UHJlZml4LFxuICAgIH0pO1xuXG4gICAgdGhpcy5fdmVyc2lvbmVkID0gcHJvcHMudmVyc2lvbmVkID8/IGZhbHNlO1xuICAgIGlmICh0aGlzLl92ZXJzaW9uZWQpIHtcbiAgICAgIG5ldyBzM0J1Y2tldFZlcnNpb25pbmcuUzNCdWNrZXRWZXJzaW9uaW5nQSh0aGlzLCBcIlZlcnNpb25pbmdcIiwge1xuICAgICAgICBidWNrZXQ6IHRoaXMucmVzb3VyY2UuYnVja2V0LFxuICAgICAgICB2ZXJzaW9uaW5nQ29uZmlndXJhdGlvbjoge1xuICAgICAgICAgIHN0YXR1czogdGhpcy5fdmVyc2lvbmVkID8gXCJFbmFibGVkXCIgOiBcIlN1c3BlbmRlZFwiLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuZXZlbnRCcmlkZ2VFbmFibGVkID0gcHJvcHMuZXZlbnRCcmlkZ2VFbmFibGVkO1xuXG4gICAgaWYgKHByb3BzLnNvdXJjZXMpIHtcbiAgICAgIGlmICh0eXBlb2YgcHJvcHMuc291cmNlcyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICB0aGlzLmFkZFNvdXJjZSh7IHBhdGg6IHByb3BzLnNvdXJjZXMgfSk7XG4gICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkocHJvcHMuc291cmNlcykpIHtcbiAgICAgICAgZm9yIChjb25zdCBzb3VyY2VQcm9wcyBvZiBwcm9wcy5zb3VyY2VzKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBzb3VyY2VQcm9wcyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgdGhpcy5hZGRTb3VyY2UoeyBwYXRoOiBzb3VyY2VQcm9wcyB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5hZGRTb3VyY2Uoc291cmNlUHJvcHMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChwcm9wcy5saWZlY3ljbGVSdWxlcykge1xuICAgICAgbmV3IHMzQnVja2V0TGlmZWN5Y2xlQ29uZmlndXJhdGlvbi5TM0J1Y2tldExpZmVjeWNsZUNvbmZpZ3VyYXRpb24oXG4gICAgICAgIHRoaXMsXG4gICAgICAgIFwiTGlmZUN5Y2xlQ29uZmlnXCIsXG4gICAgICAgIHtcbiAgICAgICAgICBidWNrZXQ6IHRoaXMucmVzb3VyY2UuYnVja2V0LFxuICAgICAgICAgIHJ1bGU6IHByb3BzLmxpZmVjeWNsZVJ1bGVzLm1hcCgocnVsZSkgPT4gKHtcbiAgICAgICAgICAgIC4uLnJ1bGUsXG4gICAgICAgICAgICBzdGF0dXM6IHJ1bGUuZW5hYmxlZCA/IFwiRW5hYmxlZFwiIDogXCJEaXNhYmxlZFwiLFxuICAgICAgICAgIH0pKSxcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gRW5mb3JjZSBBV1MgRm91bmRhdGlvbmFsIFNlY3VyaXR5IEJlc3QgUHJhY3RpY2VcbiAgICBpZiAocHJvcHMuZW5mb3JjZVNTTCkge1xuICAgICAgdGhpcy5lbmZvcmNlU1NMU3RhdGVtZW50KCk7XG4gICAgICB0aGlzLm1pbmltdW1UTFNWZXJzaW9uU3RhdGVtZW50KHByb3BzLm1pbmltdW1UTFNWZXJzaW9uKTtcbiAgICB9IGVsc2UgaWYgKHByb3BzLm1pbmltdW1UTFNWZXJzaW9uKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBcIidlbmZvcmNlU1NMJyBtdXN0IGJlIGVuYWJsZWQgZm9yICdtaW5pbXVtVExTVmVyc2lvbicgdG8gYmUgYXBwbGllZFwiLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAod2Vic2l0ZUNvbmZpZyAmJiB3ZWJzaXRlQ29uZmlnLmVuYWJsZWQpIHtcbiAgICAgIHRoaXMuX2lzV2Vic2l0ZSA9IHRydWU7XG4gICAgICB0aGlzLndlYnNpdGVDb25maWcgPVxuICAgICAgICBuZXcgczNCdWNrZXRXZWJzaXRlQ29uZmlndXJhdGlvbi5TM0J1Y2tldFdlYnNpdGVDb25maWd1cmF0aW9uKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgXCJXZWJzaXRlQ29uZmlnXCIsXG4gICAgICAgICAge1xuICAgICAgICAgICAgYnVja2V0OiB0aGlzLnJlc291cmNlLmJ1Y2tldCxcbiAgICAgICAgICAgIC4uLndlYnNpdGVDb25maWcsXG4gICAgICAgICAgICBpbmRleERvY3VtZW50OiB3ZWJzaXRlQ29uZmlnPy5pbmRleERvY3VtZW50XG4gICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgc3VmZml4OiB3ZWJzaXRlQ29uZmlnLmluZGV4RG9jdW1lbnQsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgICAgIHN1ZmZpeDogXCJpbmRleC5odG1sXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHRoaXMucHVibGljID0gcHJvcHMucHVibGljID8/IGZhbHNlO1xuICAgIGlmICh0aGlzLnB1YmxpYykge1xuICAgICAgLy8gVE9ETzogc3dpdGNoIHRvIExhenkgY29uZmlnIHVzaW5nIFwiZ3JhbnRQdWJsaWNBY2Nlc3NcIiBtZWNoYW5pc20gaW5zdGVhZD9cbiAgICAgIC8vIHJlZjogaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2Jsb2IvdjIuMTYwLjAvcGFja2FnZXMvYXdzLWNkay1saWIvYXdzLXMzL2xpYi9idWNrZXQudHMjTDg1MFxuICAgICAgY29uc3Qgb3duZXJzaGlwQ29udHJvbHMgPVxuICAgICAgICBuZXcgczNCdWNrZXRPd25lcnNoaXBDb250cm9scy5TM0J1Y2tldE93bmVyc2hpcENvbnRyb2xzKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgXCJPd25lcnNoaXBDb250cm9sc1wiLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGJ1Y2tldDogdGhpcy5yZXNvdXJjZS5idWNrZXQsXG4gICAgICAgICAgICBydWxlOiB7XG4gICAgICAgICAgICAgIG9iamVjdE93bmVyc2hpcDogXCJCdWNrZXRPd25lclByZWZlcnJlZFwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgICAgY29uc3QgcHVibGljQWNjZXNzQmxvY2sgPVxuICAgICAgICBuZXcgczNCdWNrZXRQdWJsaWNBY2Nlc3NCbG9jay5TM0J1Y2tldFB1YmxpY0FjY2Vzc0Jsb2NrKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgXCJQdWJsaWNBY2Nlc3NCbG9ja1wiLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGJ1Y2tldDogdGhpcy5yZXNvdXJjZS5idWNrZXQsXG4gICAgICAgICAgICBibG9ja1B1YmxpY0FjbHM6IGZhbHNlLFxuICAgICAgICAgICAgYmxvY2tQdWJsaWNQb2xpY3k6IGZhbHNlLFxuICAgICAgICAgICAgaWdub3JlUHVibGljQWNsczogZmFsc2UsXG4gICAgICAgICAgICByZXN0cmljdFB1YmxpY0J1Y2tldHM6IGZhbHNlLFxuICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgICBuZXcgczNCdWNrZXRBY2wuUzNCdWNrZXRBY2wodGhpcywgXCJQdWJsaWNBY2xcIiwge1xuICAgICAgICBidWNrZXQ6IHRoaXMucmVzb3VyY2UuYnVja2V0LFxuICAgICAgICBhY2w6IFwicHVibGljLXJlYWRcIixcbiAgICAgICAgZGVwZW5kc09uOiBbb3duZXJzaGlwQ29udHJvbHMsIHB1YmxpY0FjY2Vzc0Jsb2NrXSxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5hZGRUb1Jlc291cmNlUG9saWN5KFxuICAgICAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgcmVzb3VyY2VzOiBbdGhpcy5hcm5Gb3JPYmplY3RzKFwiKlwiKV0sXG4gICAgICAgICAgYWN0aW9uczogW1wiczM6R2V0T2JqZWN0XCJdLFxuICAgICAgICAgIHByaW5jaXBhbHM6IFtuZXcgaWFtLkFueVByaW5jaXBhbCgpXSxcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgICAgLy8gLy8gcG9saWN5IGRlcGVuZHMgb24gcHVibGljIGFjY2VzcyBibG9jaz9cbiAgICAgIC8vIC8vIGlzIHRoaXMgbmVlZGVkP1xuICAgICAgLy8gaWYgKHBvbGljeURlcGVuZGFibGUgJiYgcG9saWN5RGVwZW5kYWJsZSBpbnN0YW5jZW9mIENvbnN0cnVjdCkge1xuICAgICAgLy8gICBwb2xpY3lEZXBlbmRhYmxlLm5vZGUuYWRkRGVwZW5kZW5jeShwdWJsaWNBY2Nlc3NCbG9jayk7XG4gICAgICAvLyB9XG4gICAgfVxuXG4gICAgaWYgKGNvcnNDb25maWcpIHtcbiAgICAgIHRoaXMuY29yc0NvbmZpZyA9IG5ldyBzM0J1Y2tldENvcnNDb25maWd1cmF0aW9uLlMzQnVja2V0Q29yc0NvbmZpZ3VyYXRpb24oXG4gICAgICAgIHRoaXMsXG4gICAgICAgIFwiQ29yc0NvbmZpZ1wiLFxuICAgICAgICB7XG4gICAgICAgICAgYnVja2V0OiB0aGlzLnJlc291cmNlLmJ1Y2tldCxcbiAgICAgICAgICAuLi5jb3JzQ29uZmlnLFxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoY2xvdWRmcm9udEFjY2Vzcz8uZW5hYmxlZCkge1xuICAgICAgY29uc3Qgb2FpID0gbmV3IE9yaWdpbkFjY2Vzc0lkZW50aXR5KHRoaXMsIFwiT3JpZ2luQWNjZXNzSWRlbnRpdHlcIiwge1xuICAgICAgICBjb21tZW50OiBgT0FJIGZvciAke3RoaXMucmVzb3VyY2UuYnVja2V0fWAsXG4gICAgICB9KTtcbiAgICAgIHRoaXMub3JpZ2luQWNjZXNzSWRlbnRpdHkgPSBvYWk7XG4gICAgICBjb25zdCByZXNvdXJjZXMgPSAoY2xvdWRmcm9udEFjY2Vzcy5rZXlQYXR0ZXJucyA/PyBbXCIqXCJdKS5tYXAoXG4gICAgICAgIChrZXlQYXR0ZXJuKSA9PiB0aGlzLmFybkZvck9iamVjdHMoa2V5UGF0dGVybiksXG4gICAgICApO1xuICAgICAgdGhpcy5hZGRUb1Jlc291cmNlUG9saWN5KFxuICAgICAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgcmVzb3VyY2VzLFxuICAgICAgICAgIGFjdGlvbnM6IFtcInMzOkdldE9iamVjdFwiXSxcbiAgICAgICAgICBwcmluY2lwYWxzOiBbb2FpLmdyYW50UHJpbmNpcGFsXSxcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmV2ZW50QnJpZGdlRW5hYmxlZCkge1xuICAgICAgdGhpcy5lbmFibGVFdmVudEJyaWRnZU5vdGlmaWNhdGlvbigpO1xuICAgIH1cbiAgICB0aGlzLmVuY3J5cHRpb25LZXkgPSBlbmNyeXB0aW9uS2V5O1xuICAgIGlmIChidWNrZXRFbmNyeXB0aW9uKSB7XG4gICAgICBuZXcgczNCdWNrZXRTZXJ2ZXJTaWRlRW5jcnlwdGlvbkNvbmZpZ3VyYXRpb24uUzNCdWNrZXRTZXJ2ZXJTaWRlRW5jcnlwdGlvbkNvbmZpZ3VyYXRpb25BKFxuICAgICAgICB0aGlzLFxuICAgICAgICBcIkVuY3J5cHRpb25cIixcbiAgICAgICAge1xuICAgICAgICAgIGJ1Y2tldDogdGhpcy5yZXNvdXJjZS5idWNrZXQsXG4gICAgICAgICAgLi4uYnVja2V0RW5jcnlwdGlvbixcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldCB1cCBrZXkgcHJvcGVydGllcyBhbmQgcmV0dXJuIHRoZSBCdWNrZXQgZW5jcnlwdGlvbiBwcm9wZXJ0eSBmcm9tIHRoZVxuICAgKiB1c2VyJ3MgY29uZmlndXJhdGlvbiwgYWNjb3JkaW5nIHRvIHRoZSBmb2xsb3dpbmcgdGFibGU6XG4gICAqXG4gICAqIHwgcHJvcHMuZW5jcnlwdGlvbiB8IHByb3BzLmVuY3J5cHRpb25LZXkgfCBwcm9wcy5idWNrZXRLZXlFbmFibGVkIHwgYnVja2V0RW5jcnlwdGlvbiAocmV0dXJuIHZhbHVlKSB8IGVuY3J5cHRpb25LZXkgKHJldHVybiB2YWx1ZSkgfFxuICAgKiB8LS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXxcbiAgICogfCB1bmRlZmluZWQgICAgICAgIHwgdW5kZWZpbmVkICAgICAgICAgICB8IGUgICAgICAgICAgICAgICAgICAgICAgfCB1bmRlZmluZWQgICAgICAgICAgICAgICAgICAgICAgIHwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICB8XG4gICAqIHwgVU5FTkNSWVBURUQgICAgICB8IHVuZGVmaW5lZCAgICAgICAgICAgfCBmYWxzZSAgICAgICAgICAgICAgICAgIHwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICB8IHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgfFxuICAgKiB8IHVuZGVmaW5lZCAgICAgICAgfCBrICAgICAgICAgICAgICAgICAgIHwgZSAgICAgICAgICAgICAgICAgICAgICB8IFNTRS1LTVMsIGJ1Y2tldEtleUVuYWJsZWQgPSBlICAgfCBrICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICogfCBLTVMgICAgICAgICAgICAgIHwgayAgICAgICAgICAgICAgICAgICB8IGUgICAgICAgICAgICAgICAgICAgICAgfCBTU0UtS01TLCBidWNrZXRLZXlFbmFibGVkID0gZSAgIHwgayAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAqIHwgS01TICAgICAgICAgICAgICB8IHVuZGVmaW5lZCAgICAgICAgICAgfCBlICAgICAgICAgICAgICAgICAgICAgIHwgU1NFLUtNUywgYnVja2V0S2V5RW5hYmxlZCA9IGUgICB8IG5ldyBrZXkgICAgICAgICAgICAgICAgICAgICAgfFxuICAgKiB8IEtNU19NQU5BR0VEICAgICAgfCB1bmRlZmluZWQgICAgICAgICAgIHwgZSAgICAgICAgICAgICAgICAgICAgICB8IFNTRS1LTVMsIGJ1Y2tldEtleUVuYWJsZWQgPSBlICAgfCB1bmRlZmluZWQgICAgICAgICAgICAgICAgICAgIHxcbiAgICogfCBTM19NQU5BR0VEICAgICAgIHwgdW5kZWZpbmVkICAgICAgICAgICB8IGZhbHNlICAgICAgICAgICAgICAgICAgfCBTU0UtUzMgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICB8XG4gICAqIHwgUzNfTUFOQUdFRCAgICAgICB8IHVuZGVmaW5lZCAgICAgICAgICAgfCBlICAgICAgICAgICAgICAgICAgICAgIHwgU1NFLVMzLCBidWNrZXRLZXlFbmFibGVkID0gZSAgICB8IHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgfFxuICAgKiB8IFVORU5DUllQVEVEICAgICAgfCB1bmRlZmluZWQgICAgICAgICAgIHwgdHJ1ZSAgICAgICAgICAgICAgICAgICB8IEVSUk9SISAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFUlJPUiEgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICogfCBVTkVOQ1JZUFRFRCAgICAgIHwgayAgICAgICAgICAgICAgICAgICB8IGUgICAgICAgICAgICAgICAgICAgICAgfCBFUlJPUiEgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRVJST1IhICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAqIHwgS01TX01BTkFHRUQgICAgICB8IGsgICAgICAgICAgICAgICAgICAgfCBlICAgICAgICAgICAgICAgICAgICAgIHwgRVJST1IhICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVSUk9SISAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgKiB8IFMzX01BTkFHRUQgICAgICAgfCB1bmRlZmluZWQgICAgICAgICAgIHwgdHJ1ZSAgICAgICAgICAgICAgICAgICB8IEVSUk9SISAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFUlJPUiEgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICogfCBTM19NQU5BR0VEICAgICAgIHwgayAgICAgICAgICAgICAgICAgICB8IGUgICAgICAgICAgICAgICAgICAgICAgfCBFUlJPUiEgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRVJST1IhICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAqL1xuICBwcml2YXRlIHBhcnNlRW5jcnlwdGlvbihwcm9wczogQnVja2V0UHJvcHMpOiB7XG4gICAgYnVja2V0RW5jcnlwdGlvbj86IE9taXQ8XG4gICAgICBzM0J1Y2tldFNlcnZlclNpZGVFbmNyeXB0aW9uQ29uZmlndXJhdGlvbi5TM0J1Y2tldFNlcnZlclNpZGVFbmNyeXB0aW9uQ29uZmlndXJhdGlvbkFDb25maWcsXG4gICAgICBcImJ1Y2tldFwiXG4gICAgPjtcbiAgICBlbmNyeXB0aW9uS2V5Pzoga21zLklLZXk7XG4gIH0ge1xuICAgIC8vIGRlZmF1bHQgYmFzZWQgb24gd2hldGhlciBlbmNyeXB0aW9uS2V5IGlzIHNwZWNpZmllZFxuICAgIGxldCBlbmNyeXB0aW9uVHlwZSA9IHByb3BzLmVuY3J5cHRpb247XG4gICAgaWYgKGVuY3J5cHRpb25UeXBlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGVuY3J5cHRpb25UeXBlID0gcHJvcHMuZW5jcnlwdGlvbktleVxuICAgICAgICA/IEJ1Y2tldEVuY3J5cHRpb24uS01TXG4gICAgICAgIDogQnVja2V0RW5jcnlwdGlvbi5VTkVOQ1JZUFRFRDtcbiAgICB9XG5cbiAgICAvLyBpZiBlbmNyeXB0aW9uIGtleSBpcyBzZXQsIGVuY3J5cHRpb24gbXVzdCBiZSBzZXQgdG8gS01TIG9yIERTU0UuXG4gICAgaWYgKFxuICAgICAgZW5jcnlwdGlvblR5cGUgIT09IEJ1Y2tldEVuY3J5cHRpb24uRFNTRSAmJlxuICAgICAgZW5jcnlwdGlvblR5cGUgIT09IEJ1Y2tldEVuY3J5cHRpb24uS01TICYmXG4gICAgICBwcm9wcy5lbmNyeXB0aW9uS2V5XG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBgZW5jcnlwdGlvbktleSBpcyBzcGVjaWZpZWQsIHNvICdlbmNyeXB0aW9uJyBtdXN0IGJlIHNldCB0byBLTVMgb3IgRFNTRSAodmFsdWU6ICR7ZW5jcnlwdGlvblR5cGV9KWAsXG4gICAgICAgIHRoaXMsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIGlmIGJ1Y2tldEtleUVuYWJsZWQgaXMgc2V0LCBlbmNyeXB0aW9uIGNhbiBub3QgYmUgQnVja2V0RW5jcnlwdGlvbi5VTkVOQ1JZUFRFRFxuICAgIGlmIChcbiAgICAgIHByb3BzLmJ1Y2tldEtleUVuYWJsZWQgJiZcbiAgICAgIGVuY3J5cHRpb25UeXBlID09PSBCdWNrZXRFbmNyeXB0aW9uLlVORU5DUllQVEVEXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBgYnVja2V0S2V5RW5hYmxlZCBpcyBzcGVjaWZpZWQsIHNvICdlbmNyeXB0aW9uJyBtdXN0IGJlIHNldCB0byBLTVMsIERTU0Ugb3IgUzMgKHZhbHVlOiAke2VuY3J5cHRpb25UeXBlfSlgLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoZW5jcnlwdGlvblR5cGUgPT09IEJ1Y2tldEVuY3J5cHRpb24uVU5FTkNSWVBURUQpIHtcbiAgICAgIHJldHVybiB7IGJ1Y2tldEVuY3J5cHRpb246IHVuZGVmaW5lZCwgZW5jcnlwdGlvbktleTogdW5kZWZpbmVkIH07XG4gICAgfVxuXG4gICAgaWYgKGVuY3J5cHRpb25UeXBlID09PSBCdWNrZXRFbmNyeXB0aW9uLktNUykge1xuICAgICAgY29uc3QgZW5jcnlwdGlvbktleSA9XG4gICAgICAgIHByb3BzLmVuY3J5cHRpb25LZXkgfHxcbiAgICAgICAgbmV3IGttcy5LZXkodGhpcywgXCJLZXlcIiwge1xuICAgICAgICAgIGRlc2NyaXB0aW9uOiBgQ3JlYXRlZCBieSAke3RoaXMubm9kZS5wYXRofWAsXG4gICAgICAgICAgZW5hYmxlS2V5Um90YXRpb246IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZW5jcnlwdGlvbktleSxcbiAgICAgICAgYnVja2V0RW5jcnlwdGlvbjoge1xuICAgICAgICAgIC8vIChPcHRpb25hbCkgQWNjb3VudCBJRCBvZiB0aGUgZXhwZWN0ZWQgYnVja2V0IG93bmVyLlxuICAgICAgICAgIC8vIGV4cGVjdGVkQnVja2V0T3duZXJcbiAgICAgICAgICBydWxlOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGJ1Y2tldEtleUVuYWJsZWQ6IHByb3BzLmJ1Y2tldEtleUVuYWJsZWQsXG4gICAgICAgICAgICAgIGFwcGx5U2VydmVyU2lkZUVuY3J5cHRpb25CeURlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICBzc2VBbGdvcml0aG06IFwiYXdzOmttc1wiLFxuICAgICAgICAgICAgICAgIGttc01hc3RlcktleUlkOiBlbmNyeXB0aW9uS2V5LmtleUFybixcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKGVuY3J5cHRpb25UeXBlID09PSBCdWNrZXRFbmNyeXB0aW9uLlMzX01BTkFHRUQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGJ1Y2tldEVuY3J5cHRpb246IHtcbiAgICAgICAgICAvLyAoT3B0aW9uYWwpIEFjY291bnQgSUQgb2YgdGhlIGV4cGVjdGVkIGJ1Y2tldCBvd25lci5cbiAgICAgICAgICAvLyBleHBlY3RlZEJ1Y2tldE93bmVyXG4gICAgICAgICAgcnVsZTogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBidWNrZXRLZXlFbmFibGVkOiBwcm9wcy5idWNrZXRLZXlFbmFibGVkLFxuICAgICAgICAgICAgICBhcHBseVNlcnZlclNpZGVFbmNyeXB0aW9uQnlEZWZhdWx0OiB7IHNzZUFsZ29yaXRobTogXCJBRVMyNTZcIiB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAoZW5jcnlwdGlvblR5cGUgPT09IEJ1Y2tldEVuY3J5cHRpb24uS01TX01BTkFHRUQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGJ1Y2tldEVuY3J5cHRpb246IHtcbiAgICAgICAgICAvLyAoT3B0aW9uYWwpIEFjY291bnQgSUQgb2YgdGhlIGV4cGVjdGVkIGJ1Y2tldCBvd25lci5cbiAgICAgICAgICAvLyBleHBlY3RlZEJ1Y2tldE93bmVyXG4gICAgICAgICAgcnVsZTogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBidWNrZXRLZXlFbmFibGVkOiBwcm9wcy5idWNrZXRLZXlFbmFibGVkLFxuICAgICAgICAgICAgICBhcHBseVNlcnZlclNpZGVFbmNyeXB0aW9uQnlEZWZhdWx0OiB7IHNzZUFsZ29yaXRobTogXCJhd3M6a21zXCIgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKGVuY3J5cHRpb25UeXBlID09PSBCdWNrZXRFbmNyeXB0aW9uLkRTU0UpIHtcbiAgICAgIGNvbnN0IGVuY3J5cHRpb25LZXkgPVxuICAgICAgICBwcm9wcy5lbmNyeXB0aW9uS2V5IHx8XG4gICAgICAgIG5ldyBrbXMuS2V5KHRoaXMsIFwiS2V5XCIsIHtcbiAgICAgICAgICBkZXNjcmlwdGlvbjogYENyZWF0ZWQgYnkgJHt0aGlzLm5vZGUucGF0aH1gLFxuICAgICAgICB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGVuY3J5cHRpb25LZXksXG4gICAgICAgIGJ1Y2tldEVuY3J5cHRpb246IHtcbiAgICAgICAgICAvLyAoT3B0aW9uYWwpIEFjY291bnQgSUQgb2YgdGhlIGV4cGVjdGVkIGJ1Y2tldCBvd25lci5cbiAgICAgICAgICAvLyBleHBlY3RlZEJ1Y2tldE93bmVyXG4gICAgICAgICAgcnVsZTogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBidWNrZXRLZXlFbmFibGVkOiBwcm9wcy5idWNrZXRLZXlFbmFibGVkLFxuICAgICAgICAgICAgICBhcHBseVNlcnZlclNpZGVFbmNyeXB0aW9uQnlEZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgc3NlQWxnb3JpdGhtOiBcImF3czprbXM6ZHNzZVwiLFxuICAgICAgICAgICAgICAgIGttc01hc3RlcktleUlkOiBlbmNyeXB0aW9uS2V5LmtleUFybixcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKGVuY3J5cHRpb25UeXBlID09PSBCdWNrZXRFbmNyeXB0aW9uLkRTU0VfTUFOQUdFRCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYnVja2V0RW5jcnlwdGlvbjoge1xuICAgICAgICAgIC8vIChPcHRpb25hbCkgQWNjb3VudCBJRCBvZiB0aGUgZXhwZWN0ZWQgYnVja2V0IG93bmVyLlxuICAgICAgICAgIC8vIGV4cGVjdGVkQnVja2V0T3duZXJcbiAgICAgICAgICBydWxlOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGJ1Y2tldEtleUVuYWJsZWQ6IHByb3BzLmJ1Y2tldEtleUVuYWJsZWQsXG4gICAgICAgICAgICAgIGFwcGx5U2VydmVyU2lkZUVuY3J5cHRpb25CeURlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICBzc2VBbGdvcml0aG06IFwiYXdzOmttczpkc3NlXCIsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICBgVW5leHBlY3RlZCAnZW5jcnlwdGlvblR5cGUnOiAke2VuY3J5cHRpb25UeXBlfWAsXG4gICAgICB0aGlzLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhbiBpYW0gc3RhdGVtZW50IHRvIGVuZm9yY2UgU1NMIHJlcXVlc3RzIG9ubHkuXG4gICAqL1xuICBwcml2YXRlIGVuZm9yY2VTU0xTdGF0ZW1lbnQoKSB7XG4gICAgY29uc3Qgc3RhdGVtZW50ID0gbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgYWN0aW9uczogW1wiczM6KlwiXSxcbiAgICAgIGNvbmRpdGlvbjogW1xuICAgICAgICB7XG4gICAgICAgICAgdGVzdDogXCJCb29sXCIsXG4gICAgICAgICAgdmFyaWFibGU6IFwiYXdzOlNlY3VyZVRyYW5zcG9ydFwiLFxuICAgICAgICAgIHZhbHVlczogW1wiZmFsc2VcIl0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkRFTlksXG4gICAgICByZXNvdXJjZXM6IFt0aGlzLnJlc291cmNlLmFybiwgdGhpcy5hcm5Gb3JPYmplY3RzKFwiKlwiKV0sXG4gICAgICBwcmluY2lwYWxzOiBbbmV3IGlhbS5BbnlQcmluY2lwYWwoKV0sXG4gICAgfSk7XG4gICAgdGhpcy5hZGRUb1Jlc291cmNlUG9saWN5KHN0YXRlbWVudCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhbiBpYW0gc3RhdGVtZW50IHRvIGFsbG93IHJlcXVlc3RzIHdpdGggYSBtaW5pbXVtIFRMU1xuICAgKiB2ZXJzaW9uIG9ubHkuXG4gICAqL1xuICBwcml2YXRlIG1pbmltdW1UTFNWZXJzaW9uU3RhdGVtZW50KG1pbmltdW1UTFNWZXJzaW9uPzogbnVtYmVyKSB7XG4gICAgaWYgKCFtaW5pbXVtVExTVmVyc2lvbikgcmV0dXJuO1xuICAgIGNvbnN0IHN0YXRlbWVudCA9IG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgIGFjdGlvbnM6IFtcInMzOipcIl0sXG4gICAgICBjb25kaXRpb246IFtcbiAgICAgICAge1xuICAgICAgICAgIHRlc3Q6IFwiTnVtZXJpY0xlc3NUaGFuXCIsXG4gICAgICAgICAgdmFyaWFibGU6IFwiczM6VGxzVmVyc2lvblwiLFxuICAgICAgICAgIHZhbHVlczogW21pbmltdW1UTFNWZXJzaW9uLnRvU3RyaW5nKCldLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5ERU5ZLFxuICAgICAgcmVzb3VyY2VzOiBbdGhpcy5yZXNvdXJjZS5hcm4sIHRoaXMuYXJuRm9yT2JqZWN0cyhcIipcIildLFxuICAgICAgcHJpbmNpcGFsczogW25ldyBpYW0uQW55UHJpbmNpcGFsKCldLFxuICAgIH0pO1xuICAgIHRoaXMuYWRkVG9SZXNvdXJjZVBvbGljeShzdGF0ZW1lbnQpO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWRkU291cmNlT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBMb2NhbCBwYXRoIHRvIHRoZSBzb3VyY2UgZmlsZXNcbiAgICovXG4gIHJlYWRvbmx5IHBhdGg6IHN0cmluZztcbiAgLyoqXG4gICAqIFByZWZpeCB0byBhZGQgdG8gdGhlIHVwbG9hZGVkIG9iamVjdHNcbiAgICovXG4gIHJlYWRvbmx5IHByZWZpeD86IHN0cmluZztcbn1cblxuLy8gcHJpdmF0ZSBpbnRlcmZhY2UgdG8gaW5kZXggQnVja2V0IHNvdXJjZXMgYnkgaWRcbmludGVyZmFjZSBTb3VyY2VJbmRleCB7XG4gIHByb3BzOiBCdWNrZXRTb3VyY2VQcm9wcztcbiAgaWQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBTdG9yYWdlIGNsYXNzIHRvIG1vdmUgYW4gb2JqZWN0IHRvXG4gKi9cbmV4cG9ydCBlbnVtIFN0b3JhZ2VDbGFzcyB7XG4gIC8qKlxuICAgKiBTdG9yYWdlIGNsYXNzIGZvciBkYXRhIHRoYXQgaXMgYWNjZXNzZWQgbGVzcyBmcmVxdWVudGx5LCBidXQgcmVxdWlyZXMgcmFwaWRcbiAgICogYWNjZXNzIHdoZW4gbmVlZGVkLlxuICAgKlxuICAgKiBIYXMgbG93ZXIgYXZhaWxhYmlsaXR5IHRoYW4gU3RhbmRhcmQgc3RvcmFnZS5cbiAgICovXG4gIElORlJFUVVFTlRfQUNDRVNTID0gXCJTVEFOREFSRF9JQVwiLFxuXG4gIC8qKlxuICAgKiBJbmZyZXF1ZW50IEFjY2VzcyB0aGF0J3Mgb25seSBzdG9yZWQgaW4gb25lIGF2YWlsYWJpbGl0eSB6b25lLlxuICAgKlxuICAgKiBIYXMgbG93ZXIgYXZhaWxhYmlsaXR5IHRoYW4gc3RhbmRhcmQgSW5mcmVxdWVudEFjY2Vzcy5cbiAgICovXG4gIE9ORV9aT05FX0lORlJFUVVFTlRfQUNDRVNTID0gXCJPTkVaT05FX0lBXCIsXG5cbiAgLyoqXG4gICAqIFN0b3JhZ2UgY2xhc3MgZm9yIGxvbmctdGVybSBhcmNoaXZhbCB0aGF0IGNhbiB0YWtlIGJldHdlZW4gbWludXRlcyBhbmRcbiAgICogaG91cnMgdG8gYWNjZXNzLlxuICAgKlxuICAgKiBVc2UgZm9yIGFyY2hpdmVzIHdoZXJlIHBvcnRpb25zIG9mIHRoZSBkYXRhIG1pZ2h0IG5lZWQgdG8gYmUgcmV0cmlldmVkIGluXG4gICAqIG1pbnV0ZXMuIERhdGEgc3RvcmVkIGluIHRoZSBHTEFDSUVSIHN0b3JhZ2UgY2xhc3MgaGFzIGEgbWluaW11bSBzdG9yYWdlXG4gICAqIGR1cmF0aW9uIHBlcmlvZCBvZiA5MCBkYXlzIGFuZCBjYW4gYmUgYWNjZXNzZWQgaW4gYXMgbGl0dGxlIGFzIDEtNSBtaW51dGVzXG4gICAqIHVzaW5nIGV4cGVkaXRlZCByZXRyaWV2YWwuIElmIHlvdSBkZWxldGUgYW4gb2JqZWN0IGJlZm9yZSB0aGUgOTAtZGF5XG4gICAqIG1pbmltdW0sIHlvdSBhcmUgY2hhcmdlZCBmb3IgOTAgZGF5cy5cbiAgICovXG4gIEdMQUNJRVIgPSBcIkdMQUNJRVJcIixcblxuICAvKipcbiAgICogU3RvcmFnZSBjbGFzcyBmb3IgbG9uZy10ZXJtIGFyY2hpdmFsIHRoYXQgY2FuIGJlIGFjY2Vzc2VkIGluIGEgZmV3IG1pbGxpc2Vjb25kcy5cbiAgICpcbiAgICogSXQgaXMgaWRlYWwgZm9yIGRhdGEgdGhhdCBpcyBhY2Nlc3NlZCBvbmNlIG9yIHR3aWNlIHBlciBxdWFydGVyLCBhbmRcbiAgICogdGhhdCByZXF1aXJlcyBpbW1lZGlhdGUgYWNjZXNzLiBEYXRhIHN0b3JlZCBpbiB0aGUgR0xBQ0lFUl9JUiBzdG9yYWdlIGNsYXNzXG4gICAqIGhhcyBhIG1pbmltdW0gc3RvcmFnZSBkdXJhdGlvbiBwZXJpb2Qgb2YgOTAgZGF5cyBhbmQgY2FuIGJlIGFjY2Vzc2VkIGluXG4gICAqIGFzIG1pbGxpc2Vjb25kcy4gSWYgeW91IGRlbGV0ZSBhbiBvYmplY3QgYmVmb3JlIHRoZSA5MC1kYXkgbWluaW11bSxcbiAgICogeW91IGFyZSBjaGFyZ2VkIGZvciA5MCBkYXlzLlxuICAgKi9cbiAgR0xBQ0lFUl9JTlNUQU5UX1JFVFJJRVZBTCA9IFwiR0xBQ0lFUl9JUlwiLFxuXG4gIC8qKlxuICAgKiBVc2UgZm9yIGFyY2hpdmluZyBkYXRhIHRoYXQgcmFyZWx5IG5lZWRzIHRvIGJlIGFjY2Vzc2VkLiBEYXRhIHN0b3JlZCBpbiB0aGVcbiAgICogREVFUF9BUkNISVZFIHN0b3JhZ2UgY2xhc3MgaGFzIGEgbWluaW11bSBzdG9yYWdlIGR1cmF0aW9uIHBlcmlvZCBvZiAxODBcbiAgICogZGF5cyBhbmQgYSBkZWZhdWx0IHJldHJpZXZhbCB0aW1lIG9mIDEyIGhvdXJzLiBJZiB5b3UgZGVsZXRlIGFuIG9iamVjdFxuICAgKiBiZWZvcmUgdGhlIDE4MC1kYXkgbWluaW11bSwgeW91IGFyZSBjaGFyZ2VkIGZvciAxODAgZGF5cy4gRm9yIHByaWNpbmdcbiAgICogaW5mb3JtYXRpb24sIHNlZSBBbWF6b24gUzMgUHJpY2luZy5cbiAgICovXG4gIERFRVBfQVJDSElWRSA9IFwiREVFUF9BUkNISVZFXCIsXG5cbiAgLyoqXG4gICAqIFRoZSBJTlRFTExJR0VOVF9USUVSSU5HIHN0b3JhZ2UgY2xhc3MgaXMgZGVzaWduZWQgdG8gb3B0aW1pemUgc3RvcmFnZSBjb3N0c1xuICAgKiBieSBhdXRvbWF0aWNhbGx5IG1vdmluZyBkYXRhIHRvIHRoZSBtb3N0IGNvc3QtZWZmZWN0aXZlIHN0b3JhZ2UgYWNjZXNzXG4gICAqIHRpZXIsIHdpdGhvdXQgcGVyZm9ybWFuY2UgaW1wYWN0IG9yIG9wZXJhdGlvbmFsIG92ZXJoZWFkLlxuICAgKiBJTlRFTExJR0VOVF9USUVSSU5HIGRlbGl2ZXJzIGF1dG9tYXRpYyBjb3N0IHNhdmluZ3MgYnkgbW92aW5nIGRhdGEgb24gYVxuICAgKiBncmFudWxhciBvYmplY3QgbGV2ZWwgYmV0d2VlbiB0d28gYWNjZXNzIHRpZXJzLCBhIGZyZXF1ZW50IGFjY2VzcyB0aWVyIGFuZFxuICAgKiBhIGxvd2VyLWNvc3QgaW5mcmVxdWVudCBhY2Nlc3MgdGllciwgd2hlbiBhY2Nlc3MgcGF0dGVybnMgY2hhbmdlLiBUaGVcbiAgICogSU5URUxMSUdFTlRfVElFUklORyBzdG9yYWdlIGNsYXNzIGlzIGlkZWFsIGlmIHlvdSB3YW50IHRvIG9wdGltaXplIHN0b3JhZ2VcbiAgICogY29zdHMgYXV0b21hdGljYWxseSBmb3IgbG9uZy1saXZlZCBkYXRhIHdoZW4gYWNjZXNzIHBhdHRlcm5zIGFyZSB1bmtub3duIG9yXG4gICAqIHVucHJlZGljdGFibGUuXG4gICAqL1xuICBJTlRFTExJR0VOVF9USUVSSU5HID0gXCJJTlRFTExJR0VOVF9USUVSSU5HXCIsXG59XG5cbi8qKlxuICogV2hhdCBraW5kIG9mIHNlcnZlci1zaWRlIGVuY3J5cHRpb24gdG8gYXBwbHkgdG8gdGhpcyBidWNrZXRcbiAqL1xuZXhwb3J0IGVudW0gQnVja2V0RW5jcnlwdGlvbiB7XG4gIC8qKlxuICAgKiBQcmV2aW91cyBvcHRpb24uIEJ1Y2tldHMgY2FuIG5vdCBiZSB1bmVuY3J5cHRlZCBub3cuXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC91c2VyZ3VpZGUvc2Vydi1zaWRlLWVuY3J5cHRpb24uaHRtbFxuICAgKiBAZGVwcmVjYXRlZCBTMyBhcHBsaWVzIHNlcnZlci1zaWRlIGVuY3J5cHRpb24gd2l0aCBTU0UtUzMgZm9yIGV2ZXJ5IGJ1Y2tldFxuICAgKiB0aGF0IGRlZmF1bHQgZW5jcnlwdGlvbiBpcyBub3QgY29uZmlndXJlZC5cbiAgICovXG4gIFVORU5DUllQVEVEID0gXCJVTkVOQ1JZUFRFRFwiLFxuXG4gIC8qKlxuICAgKiBTZXJ2ZXItc2lkZSBLTVMgZW5jcnlwdGlvbiB3aXRoIGEgbWFzdGVyIGtleSBtYW5hZ2VkIGJ5IEtNUy5cbiAgICovXG4gIEtNU19NQU5BR0VEID0gXCJLTVNfTUFOQUdFRFwiLFxuXG4gIC8qKlxuICAgKiBTZXJ2ZXItc2lkZSBlbmNyeXB0aW9uIHdpdGggYSBtYXN0ZXIga2V5IG1hbmFnZWQgYnkgUzMuXG4gICAqL1xuICBTM19NQU5BR0VEID0gXCJTM19NQU5BR0VEXCIsXG5cbiAgLyoqXG4gICAqIFNlcnZlci1zaWRlIGVuY3J5cHRpb24gd2l0aCBhIEtNUyBrZXkgbWFuYWdlZCBieSB0aGUgdXNlci5cbiAgICogSWYgYGVuY3J5cHRpb25LZXlgIGlzIHNwZWNpZmllZCwgdGhpcyBrZXkgd2lsbCBiZSB1c2VkLCBvdGhlcndpc2UsIG9uZSB3aWxsIGJlIGRlZmluZWQuXG4gICAqL1xuICBLTVMgPSBcIktNU1wiLFxuXG4gIC8qKlxuICAgKiBEb3VibGUgc2VydmVyLXNpZGUgS01TIGVuY3J5cHRpb24gd2l0aCBhIG1hc3RlciBrZXkgbWFuYWdlZCBieSBLTVMuXG4gICAqL1xuICBEU1NFX01BTkFHRUQgPSBcIkRTU0VfTUFOQUdFRFwiLFxuXG4gIC8qKlxuICAgKiBEb3VibGUgc2VydmVyLXNpZGUgZW5jcnlwdGlvbiB3aXRoIGEgS01TIGtleSBtYW5hZ2VkIGJ5IHRoZSB1c2VyLlxuICAgKiBJZiBgZW5jcnlwdGlvbktleWAgaXMgc3BlY2lmaWVkLCB0aGlzIGtleSB3aWxsIGJlIHVzZWQsIG90aGVyd2lzZSwgb25lIHdpbGwgYmUgZGVmaW5lZC5cbiAgICovXG4gIERTU0UgPSBcIkRTU0VcIixcbn1cblxuLyoqXG4gKiBOb3RpZmljYXRpb24gZXZlbnQgdHlwZXMuXG4gKiBAbGluayBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L3VzZXJndWlkZS9ub3RpZmljYXRpb24taG93LXRvLWV2ZW50LXR5cGVzLWFuZC1kZXN0aW5hdGlvbnMuaHRtbCNzdXBwb3J0ZWQtbm90aWZpY2F0aW9uLWV2ZW50LXR5cGVzXG4gKi9cbmV4cG9ydCBlbnVtIEV2ZW50VHlwZSB7XG4gIC8qKlxuICAgKiBBbWF6b24gUzMgQVBJcyBzdWNoIGFzIFBVVCwgUE9TVCwgYW5kIENPUFkgY2FuIGNyZWF0ZSBhbiBvYmplY3QuIFVzaW5nXG4gICAqIHRoZXNlIGV2ZW50IHR5cGVzLCB5b3UgY2FuIGVuYWJsZSBub3RpZmljYXRpb24gd2hlbiBhbiBvYmplY3QgaXMgY3JlYXRlZFxuICAgKiB1c2luZyBhIHNwZWNpZmljIEFQSSwgb3IgeW91IGNhbiB1c2UgdGhlIHMzOk9iamVjdENyZWF0ZWQ6KiBldmVudCB0eXBlIHRvXG4gICAqIHJlcXVlc3Qgbm90aWZpY2F0aW9uIHJlZ2FyZGxlc3Mgb2YgdGhlIEFQSSB0aGF0IHdhcyB1c2VkIHRvIGNyZWF0ZSBhblxuICAgKiBvYmplY3QuXG4gICAqL1xuICBPQkpFQ1RfQ1JFQVRFRCA9IFwiczM6T2JqZWN0Q3JlYXRlZDoqXCIsXG5cbiAgLyoqXG4gICAqIEFtYXpvbiBTMyBBUElzIHN1Y2ggYXMgUFVULCBQT1NULCBhbmQgQ09QWSBjYW4gY3JlYXRlIGFuIG9iamVjdC4gVXNpbmdcbiAgICogdGhlc2UgZXZlbnQgdHlwZXMsIHlvdSBjYW4gZW5hYmxlIG5vdGlmaWNhdGlvbiB3aGVuIGFuIG9iamVjdCBpcyBjcmVhdGVkXG4gICAqIHVzaW5nIGEgc3BlY2lmaWMgQVBJLCBvciB5b3UgY2FuIHVzZSB0aGUgczM6T2JqZWN0Q3JlYXRlZDoqIGV2ZW50IHR5cGUgdG9cbiAgICogcmVxdWVzdCBub3RpZmljYXRpb24gcmVnYXJkbGVzcyBvZiB0aGUgQVBJIHRoYXQgd2FzIHVzZWQgdG8gY3JlYXRlIGFuXG4gICAqIG9iamVjdC5cbiAgICovXG4gIE9CSkVDVF9DUkVBVEVEX1BVVCA9IFwiczM6T2JqZWN0Q3JlYXRlZDpQdXRcIixcblxuICAvKipcbiAgICogQW1hem9uIFMzIEFQSXMgc3VjaCBhcyBQVVQsIFBPU1QsIGFuZCBDT1BZIGNhbiBjcmVhdGUgYW4gb2JqZWN0LiBVc2luZ1xuICAgKiB0aGVzZSBldmVudCB0eXBlcywgeW91IGNhbiBlbmFibGUgbm90aWZpY2F0aW9uIHdoZW4gYW4gb2JqZWN0IGlzIGNyZWF0ZWRcbiAgICogdXNpbmcgYSBzcGVjaWZpYyBBUEksIG9yIHlvdSBjYW4gdXNlIHRoZSBzMzpPYmplY3RDcmVhdGVkOiogZXZlbnQgdHlwZSB0b1xuICAgKiByZXF1ZXN0IG5vdGlmaWNhdGlvbiByZWdhcmRsZXNzIG9mIHRoZSBBUEkgdGhhdCB3YXMgdXNlZCB0byBjcmVhdGUgYW5cbiAgICogb2JqZWN0LlxuICAgKi9cbiAgT0JKRUNUX0NSRUFURURfUE9TVCA9IFwiczM6T2JqZWN0Q3JlYXRlZDpQb3N0XCIsXG5cbiAgLyoqXG4gICAqIEFtYXpvbiBTMyBBUElzIHN1Y2ggYXMgUFVULCBQT1NULCBhbmQgQ09QWSBjYW4gY3JlYXRlIGFuIG9iamVjdC4gVXNpbmdcbiAgICogdGhlc2UgZXZlbnQgdHlwZXMsIHlvdSBjYW4gZW5hYmxlIG5vdGlmaWNhdGlvbiB3aGVuIGFuIG9iamVjdCBpcyBjcmVhdGVkXG4gICAqIHVzaW5nIGEgc3BlY2lmaWMgQVBJLCBvciB5b3UgY2FuIHVzZSB0aGUgczM6T2JqZWN0Q3JlYXRlZDoqIGV2ZW50IHR5cGUgdG9cbiAgICogcmVxdWVzdCBub3RpZmljYXRpb24gcmVnYXJkbGVzcyBvZiB0aGUgQVBJIHRoYXQgd2FzIHVzZWQgdG8gY3JlYXRlIGFuXG4gICAqIG9iamVjdC5cbiAgICovXG4gIE9CSkVDVF9DUkVBVEVEX0NPUFkgPSBcInMzOk9iamVjdENyZWF0ZWQ6Q29weVwiLFxuXG4gIC8qKlxuICAgKiBBbWF6b24gUzMgQVBJcyBzdWNoIGFzIFBVVCwgUE9TVCwgYW5kIENPUFkgY2FuIGNyZWF0ZSBhbiBvYmplY3QuIFVzaW5nXG4gICAqIHRoZXNlIGV2ZW50IHR5cGVzLCB5b3UgY2FuIGVuYWJsZSBub3RpZmljYXRpb24gd2hlbiBhbiBvYmplY3QgaXMgY3JlYXRlZFxuICAgKiB1c2luZyBhIHNwZWNpZmljIEFQSSwgb3IgeW91IGNhbiB1c2UgdGhlIHMzOk9iamVjdENyZWF0ZWQ6KiBldmVudCB0eXBlIHRvXG4gICAqIHJlcXVlc3Qgbm90aWZpY2F0aW9uIHJlZ2FyZGxlc3Mgb2YgdGhlIEFQSSB0aGF0IHdhcyB1c2VkIHRvIGNyZWF0ZSBhblxuICAgKiBvYmplY3QuXG4gICAqL1xuICBPQkpFQ1RfQ1JFQVRFRF9DT01QTEVURV9NVUxUSVBBUlRfVVBMT0FEID0gXCJzMzpPYmplY3RDcmVhdGVkOkNvbXBsZXRlTXVsdGlwYXJ0VXBsb2FkXCIsXG5cbiAgLyoqXG4gICAqIEJ5IHVzaW5nIHRoZSBPYmplY3RSZW1vdmVkIGV2ZW50IHR5cGVzLCB5b3UgY2FuIGVuYWJsZSBub3RpZmljYXRpb24gd2hlblxuICAgKiBhbiBvYmplY3Qgb3IgYSBiYXRjaCBvZiBvYmplY3RzIGlzIHJlbW92ZWQgZnJvbSBhIGJ1Y2tldC5cbiAgICpcbiAgICogWW91IGNhbiByZXF1ZXN0IG5vdGlmaWNhdGlvbiB3aGVuIGFuIG9iamVjdCBpcyBkZWxldGVkIG9yIGEgdmVyc2lvbmVkXG4gICAqIG9iamVjdCBpcyBwZXJtYW5lbnRseSBkZWxldGVkIGJ5IHVzaW5nIHRoZSBzMzpPYmplY3RSZW1vdmVkOkRlbGV0ZSBldmVudFxuICAgKiB0eXBlLiBPciB5b3UgY2FuIHJlcXVlc3Qgbm90aWZpY2F0aW9uIHdoZW4gYSBkZWxldGUgbWFya2VyIGlzIGNyZWF0ZWQgZm9yXG4gICAqIGEgdmVyc2lvbmVkIG9iamVjdCBieSB1c2luZyBzMzpPYmplY3RSZW1vdmVkOkRlbGV0ZU1hcmtlckNyZWF0ZWQuIEZvclxuICAgKiBpbmZvcm1hdGlvbiBhYm91dCBkZWxldGluZyB2ZXJzaW9uZWQgb2JqZWN0cywgc2VlIERlbGV0aW5nIE9iamVjdFxuICAgKiBWZXJzaW9ucy4gWW91IGNhbiBhbHNvIHVzZSBhIHdpbGRjYXJkIHMzOk9iamVjdFJlbW92ZWQ6KiB0byByZXF1ZXN0XG4gICAqIG5vdGlmaWNhdGlvbiBhbnl0aW1lIGFuIG9iamVjdCBpcyBkZWxldGVkLlxuICAgKlxuICAgKiBZb3Ugd2lsbCBub3QgcmVjZWl2ZSBldmVudCBub3RpZmljYXRpb25zIGZyb20gYXV0b21hdGljIGRlbGV0ZXMgZnJvbVxuICAgKiBsaWZlY3ljbGUgcG9saWNpZXMgb3IgZnJvbSBmYWlsZWQgb3BlcmF0aW9ucy5cbiAgICovXG4gIE9CSkVDVF9SRU1PVkVEID0gXCJzMzpPYmplY3RSZW1vdmVkOipcIixcblxuICAvKipcbiAgICogQnkgdXNpbmcgdGhlIE9iamVjdFJlbW92ZWQgZXZlbnQgdHlwZXMsIHlvdSBjYW4gZW5hYmxlIG5vdGlmaWNhdGlvbiB3aGVuXG4gICAqIGFuIG9iamVjdCBvciBhIGJhdGNoIG9mIG9iamVjdHMgaXMgcmVtb3ZlZCBmcm9tIGEgYnVja2V0LlxuICAgKlxuICAgKiBZb3UgY2FuIHJlcXVlc3Qgbm90aWZpY2F0aW9uIHdoZW4gYW4gb2JqZWN0IGlzIGRlbGV0ZWQgb3IgYSB2ZXJzaW9uZWRcbiAgICogb2JqZWN0IGlzIHBlcm1hbmVudGx5IGRlbGV0ZWQgYnkgdXNpbmcgdGhlIHMzOk9iamVjdFJlbW92ZWQ6RGVsZXRlIGV2ZW50XG4gICAqIHR5cGUuIE9yIHlvdSBjYW4gcmVxdWVzdCBub3RpZmljYXRpb24gd2hlbiBhIGRlbGV0ZSBtYXJrZXIgaXMgY3JlYXRlZCBmb3JcbiAgICogYSB2ZXJzaW9uZWQgb2JqZWN0IGJ5IHVzaW5nIHMzOk9iamVjdFJlbW92ZWQ6RGVsZXRlTWFya2VyQ3JlYXRlZC4gRm9yXG4gICAqIGluZm9ybWF0aW9uIGFib3V0IGRlbGV0aW5nIHZlcnNpb25lZCBvYmplY3RzLCBzZWUgRGVsZXRpbmcgT2JqZWN0XG4gICAqIFZlcnNpb25zLiBZb3UgY2FuIGFsc28gdXNlIGEgd2lsZGNhcmQgczM6T2JqZWN0UmVtb3ZlZDoqIHRvIHJlcXVlc3RcbiAgICogbm90aWZpY2F0aW9uIGFueXRpbWUgYW4gb2JqZWN0IGlzIGRlbGV0ZWQuXG4gICAqXG4gICAqIFlvdSB3aWxsIG5vdCByZWNlaXZlIGV2ZW50IG5vdGlmaWNhdGlvbnMgZnJvbSBhdXRvbWF0aWMgZGVsZXRlcyBmcm9tXG4gICAqIGxpZmVjeWNsZSBwb2xpY2llcyBvciBmcm9tIGZhaWxlZCBvcGVyYXRpb25zLlxuICAgKi9cbiAgT0JKRUNUX1JFTU9WRURfREVMRVRFID0gXCJzMzpPYmplY3RSZW1vdmVkOkRlbGV0ZVwiLFxuXG4gIC8qKlxuICAgKiBCeSB1c2luZyB0aGUgT2JqZWN0UmVtb3ZlZCBldmVudCB0eXBlcywgeW91IGNhbiBlbmFibGUgbm90aWZpY2F0aW9uIHdoZW5cbiAgICogYW4gb2JqZWN0IG9yIGEgYmF0Y2ggb2Ygb2JqZWN0cyBpcyByZW1vdmVkIGZyb20gYSBidWNrZXQuXG4gICAqXG4gICAqIFlvdSBjYW4gcmVxdWVzdCBub3RpZmljYXRpb24gd2hlbiBhbiBvYmplY3QgaXMgZGVsZXRlZCBvciBhIHZlcnNpb25lZFxuICAgKiBvYmplY3QgaXMgcGVybWFuZW50bHkgZGVsZXRlZCBieSB1c2luZyB0aGUgczM6T2JqZWN0UmVtb3ZlZDpEZWxldGUgZXZlbnRcbiAgICogdHlwZS4gT3IgeW91IGNhbiByZXF1ZXN0IG5vdGlmaWNhdGlvbiB3aGVuIGEgZGVsZXRlIG1hcmtlciBpcyBjcmVhdGVkIGZvclxuICAgKiBhIHZlcnNpb25lZCBvYmplY3QgYnkgdXNpbmcgczM6T2JqZWN0UmVtb3ZlZDpEZWxldGVNYXJrZXJDcmVhdGVkLiBGb3JcbiAgICogaW5mb3JtYXRpb24gYWJvdXQgZGVsZXRpbmcgdmVyc2lvbmVkIG9iamVjdHMsIHNlZSBEZWxldGluZyBPYmplY3RcbiAgICogVmVyc2lvbnMuIFlvdSBjYW4gYWxzbyB1c2UgYSB3aWxkY2FyZCBzMzpPYmplY3RSZW1vdmVkOiogdG8gcmVxdWVzdFxuICAgKiBub3RpZmljYXRpb24gYW55dGltZSBhbiBvYmplY3QgaXMgZGVsZXRlZC5cbiAgICpcbiAgICogWW91IHdpbGwgbm90IHJlY2VpdmUgZXZlbnQgbm90aWZpY2F0aW9ucyBmcm9tIGF1dG9tYXRpYyBkZWxldGVzIGZyb21cbiAgICogbGlmZWN5Y2xlIHBvbGljaWVzIG9yIGZyb20gZmFpbGVkIG9wZXJhdGlvbnMuXG4gICAqL1xuICBPQkpFQ1RfUkVNT1ZFRF9ERUxFVEVfTUFSS0VSX0NSRUFURUQgPSBcInMzOk9iamVjdFJlbW92ZWQ6RGVsZXRlTWFya2VyQ3JlYXRlZFwiLFxuXG4gIC8qKlxuICAgKiBVc2luZyByZXN0b3JlIG9iamVjdCBldmVudCB0eXBlcyB5b3UgY2FuIHJlY2VpdmUgbm90aWZpY2F0aW9ucyBmb3JcbiAgICogaW5pdGlhdGlvbiBhbmQgY29tcGxldGlvbiB3aGVuIHJlc3RvcmluZyBvYmplY3RzIGZyb20gdGhlIFMzIEdsYWNpZXJcbiAgICogc3RvcmFnZSBjbGFzcy5cbiAgICpcbiAgICogWW91IHVzZSBzMzpPYmplY3RSZXN0b3JlOlBvc3QgdG8gcmVxdWVzdCBub3RpZmljYXRpb24gb2Ygb2JqZWN0IHJlc3RvcmF0aW9uXG4gICAqIGluaXRpYXRpb24uXG4gICAqL1xuICBPQkpFQ1RfUkVTVE9SRV9QT1NUID0gXCJzMzpPYmplY3RSZXN0b3JlOlBvc3RcIixcblxuICAvKipcbiAgICogVXNpbmcgcmVzdG9yZSBvYmplY3QgZXZlbnQgdHlwZXMgeW91IGNhbiByZWNlaXZlIG5vdGlmaWNhdGlvbnMgZm9yXG4gICAqIGluaXRpYXRpb24gYW5kIGNvbXBsZXRpb24gd2hlbiByZXN0b3Jpbmcgb2JqZWN0cyBmcm9tIHRoZSBTMyBHbGFjaWVyXG4gICAqIHN0b3JhZ2UgY2xhc3MuXG4gICAqXG4gICAqIFlvdSB1c2UgczM6T2JqZWN0UmVzdG9yZTpDb21wbGV0ZWQgdG8gcmVxdWVzdCBub3RpZmljYXRpb24gb2ZcbiAgICogcmVzdG9yYXRpb24gY29tcGxldGlvbi5cbiAgICovXG4gIE9CSkVDVF9SRVNUT1JFX0NPTVBMRVRFRCA9IFwiczM6T2JqZWN0UmVzdG9yZTpDb21wbGV0ZWRcIixcblxuICAvKipcbiAgICogVXNpbmcgcmVzdG9yZSBvYmplY3QgZXZlbnQgdHlwZXMgeW91IGNhbiByZWNlaXZlIG5vdGlmaWNhdGlvbnMgZm9yXG4gICAqIGluaXRpYXRpb24gYW5kIGNvbXBsZXRpb24gd2hlbiByZXN0b3Jpbmcgb2JqZWN0cyBmcm9tIHRoZSBTMyBHbGFjaWVyXG4gICAqIHN0b3JhZ2UgY2xhc3MuXG4gICAqXG4gICAqIFlvdSB1c2UgczM6T2JqZWN0UmVzdG9yZTpEZWxldGUgdG8gcmVxdWVzdCBub3RpZmljYXRpb24gb2ZcbiAgICogcmVzdG9yYXRpb24gY29tcGxldGlvbi5cbiAgICovXG4gIE9CSkVDVF9SRVNUT1JFX0RFTEVURSA9IFwiczM6T2JqZWN0UmVzdG9yZTpEZWxldGVcIixcblxuICAvKipcbiAgICogWW91IGNhbiB1c2UgdGhpcyBldmVudCB0eXBlIHRvIHJlcXVlc3QgQW1hem9uIFMzIHRvIHNlbmQgYSBub3RpZmljYXRpb25cbiAgICogbWVzc2FnZSB3aGVuIEFtYXpvbiBTMyBkZXRlY3RzIHRoYXQgYW4gb2JqZWN0IG9mIHRoZSBSUlMgc3RvcmFnZSBjbGFzcyBpc1xuICAgKiBsb3N0LlxuICAgKi9cbiAgUkVEVUNFRF9SRURVTkRBTkNZX0xPU1RfT0JKRUNUID0gXCJzMzpSZWR1Y2VkUmVkdW5kYW5jeUxvc3RPYmplY3RcIixcblxuICAvKipcbiAgICogWW91IHJlY2VpdmUgdGhpcyBub3RpZmljYXRpb24gZXZlbnQgd2hlbiBhbiBvYmplY3QgdGhhdCB3YXMgZWxpZ2libGUgZm9yXG4gICAqIHJlcGxpY2F0aW9uIHVzaW5nIEFtYXpvbiBTMyBSZXBsaWNhdGlvbiBUaW1lIENvbnRyb2wgZmFpbGVkIHRvIHJlcGxpY2F0ZS5cbiAgICovXG4gIFJFUExJQ0FUSU9OX09QRVJBVElPTl9GQUlMRURfUkVQTElDQVRJT04gPSBcInMzOlJlcGxpY2F0aW9uOk9wZXJhdGlvbkZhaWxlZFJlcGxpY2F0aW9uXCIsXG5cbiAgLyoqXG4gICAqIFlvdSByZWNlaXZlIHRoaXMgbm90aWZpY2F0aW9uIGV2ZW50IHdoZW4gYW4gb2JqZWN0IHRoYXQgd2FzIGVsaWdpYmxlIGZvclxuICAgKiByZXBsaWNhdGlvbiB1c2luZyBBbWF6b24gUzMgUmVwbGljYXRpb24gVGltZSBDb250cm9sIGV4Y2VlZGVkIHRoZSAxNS1taW51dGVcbiAgICogdGhyZXNob2xkIGZvciByZXBsaWNhdGlvbi5cbiAgICovXG4gIFJFUExJQ0FUSU9OX09QRVJBVElPTl9NSVNTRURfVEhSRVNIT0xEID0gXCJzMzpSZXBsaWNhdGlvbjpPcGVyYXRpb25NaXNzZWRUaHJlc2hvbGRcIixcblxuICAvKipcbiAgICogWW91IHJlY2VpdmUgdGhpcyBub3RpZmljYXRpb24gZXZlbnQgZm9yIGFuIG9iamVjdCB0aGF0IHdhcyBlbGlnaWJsZSBmb3JcbiAgICogcmVwbGljYXRpb24gdXNpbmcgdGhlIEFtYXpvbiBTMyBSZXBsaWNhdGlvbiBUaW1lIENvbnRyb2wgZmVhdHVyZSByZXBsaWNhdGVkXG4gICAqIGFmdGVyIHRoZSAxNS1taW51dGUgdGhyZXNob2xkLlxuICAgKi9cbiAgUkVQTElDQVRJT05fT1BFUkFUSU9OX1JFUExJQ0FURURfQUZURVJfVEhSRVNIT0xEID0gXCJzMzpSZXBsaWNhdGlvbjpPcGVyYXRpb25SZXBsaWNhdGVkQWZ0ZXJUaHJlc2hvbGRcIixcblxuICAvKipcbiAgICogWW91IHJlY2VpdmUgdGhpcyBub3RpZmljYXRpb24gZXZlbnQgZm9yIGFuIG9iamVjdCB0aGF0IHdhcyBlbGlnaWJsZSBmb3JcbiAgICogcmVwbGljYXRpb24gdXNpbmcgQW1hem9uIFMzIFJlcGxpY2F0aW9uIFRpbWUgQ29udHJvbCBidXQgaXMgbm8gbG9uZ2VyIHRyYWNrZWRcbiAgICogYnkgcmVwbGljYXRpb24gbWV0cmljcy5cbiAgICovXG4gIFJFUExJQ0FUSU9OX09QRVJBVElPTl9OT1RfVFJBQ0tFRCA9IFwiczM6UmVwbGljYXRpb246T3BlcmF0aW9uTm90VHJhY2tlZFwiLFxuXG4gIC8qKlxuICAgKiBCeSB1c2luZyB0aGUgTGlmZWN5Y2xlRXhwaXJhdGlvbiBldmVudCB0eXBlcywgeW91IGNhbiByZWNlaXZlIGEgbm90aWZpY2F0aW9uXG4gICAqIHdoZW4gQW1hem9uIFMzIGRlbGV0ZXMgYW4gb2JqZWN0IGJhc2VkIG9uIHlvdXIgUzMgTGlmZWN5Y2xlIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBMSUZFQ1lDTEVfRVhQSVJBVElPTiA9IFwiczM6TGlmZWN5Y2xlRXhwaXJhdGlvbjoqXCIsXG5cbiAgLyoqXG4gICAqIFRoZSBzMzpMaWZlY3ljbGVFeHBpcmF0aW9uOkRlbGV0ZSBldmVudCB0eXBlIG5vdGlmaWVzIHlvdSB3aGVuIGFuIG9iamVjdFxuICAgKiBpbiBhbiB1bnZlcnNpb25lZCBidWNrZXQgaXMgZGVsZXRlZC5cbiAgICogSXQgYWxzbyBub3RpZmllcyB5b3Ugd2hlbiBhbiBvYmplY3QgdmVyc2lvbiBpcyBwZXJtYW5lbnRseSBkZWxldGVkIGJ5IGFuXG4gICAqIFMzIExpZmVjeWNsZSBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgTElGRUNZQ0xFX0VYUElSQVRJT05fREVMRVRFID0gXCJzMzpMaWZlY3ljbGVFeHBpcmF0aW9uOkRlbGV0ZVwiLFxuXG4gIC8qKlxuICAgKiBUaGUgczM6TGlmZWN5Y2xlRXhwaXJhdGlvbjpEZWxldGVNYXJrZXJDcmVhdGVkIGV2ZW50IHR5cGUgbm90aWZpZXMgeW91XG4gICAqIHdoZW4gUzMgTGlmZWN5Y2xlIGNyZWF0ZXMgYSBkZWxldGUgbWFya2VyIHdoZW4gYSBjdXJyZW50IHZlcnNpb24gb2YgYW5cbiAgICogb2JqZWN0IGluIHZlcnNpb25lZCBidWNrZXQgaXMgZGVsZXRlZC5cbiAgICovXG4gIExJRkVDWUNMRV9FWFBJUkFUSU9OX0RFTEVURV9NQVJLRVJfQ1JFQVRFRCA9IFwiczM6TGlmZWN5Y2xlRXhwaXJhdGlvbjpEZWxldGVNYXJrZXJDcmVhdGVkXCIsXG5cbiAgLyoqXG4gICAqIFlvdSByZWNlaXZlIHRoaXMgbm90aWZpY2F0aW9uIGV2ZW50IHdoZW4gYW4gb2JqZWN0IGlzIHRyYW5zaXRpb25lZCB0b1xuICAgKiBhbm90aGVyIEFtYXpvbiBTMyBzdG9yYWdlIGNsYXNzIGJ5IGFuIFMzIExpZmVjeWNsZSBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgTElGRUNZQ0xFX1RSQU5TSVRJT04gPSBcInMzOkxpZmVjeWNsZVRyYW5zaXRpb25cIixcblxuICAvKipcbiAgICogWW91IHJlY2VpdmUgdGhpcyBub3RpZmljYXRpb24gZXZlbnQgd2hlbiBhbiBvYmplY3Qgd2l0aGluIHRoZVxuICAgKiBTMyBJbnRlbGxpZ2VudC1UaWVyaW5nIHN0b3JhZ2UgY2xhc3MgbW92ZWQgdG8gdGhlIEFyY2hpdmUgQWNjZXNzIHRpZXIgb3JcbiAgICogRGVlcCBBcmNoaXZlIEFjY2VzcyB0aWVyLlxuICAgKi9cbiAgSU5URUxMSUdFTlRfVElFUklORyA9IFwiczM6SW50ZWxsaWdlbnRUaWVyaW5nXCIsXG5cbiAgLyoqXG4gICAqIEJ5IHVzaW5nIHRoZSBPYmplY3RUYWdnaW5nIGV2ZW50IHR5cGVzLCB5b3UgY2FuIGVuYWJsZSBub3RpZmljYXRpb24gd2hlblxuICAgKiBhbiBvYmplY3QgdGFnIGlzIGFkZGVkIG9yIGRlbGV0ZWQgZnJvbSBhbiBvYmplY3QuXG4gICAqL1xuICBPQkpFQ1RfVEFHR0lORyA9IFwiczM6T2JqZWN0VGFnZ2luZzoqXCIsXG5cbiAgLyoqXG4gICAqIFRoZSBzMzpPYmplY3RUYWdnaW5nOlB1dCBldmVudCB0eXBlIG5vdGlmaWVzIHlvdSB3aGVuIGEgdGFnIGlzIFBVVCBvbiBhblxuICAgKiBvYmplY3Qgb3IgYW4gZXhpc3RpbmcgdGFnIGlzIHVwZGF0ZWQuXG5cbiAgICovXG4gIE9CSkVDVF9UQUdHSU5HX1BVVCA9IFwiczM6T2JqZWN0VGFnZ2luZzpQdXRcIixcblxuICAvKipcbiAgICogVGhlIHMzOk9iamVjdFRhZ2dpbmc6RGVsZXRlIGV2ZW50IHR5cGUgbm90aWZpZXMgeW91IHdoZW4gYSB0YWcgaXMgcmVtb3ZlZFxuICAgKiBmcm9tIGFuIG9iamVjdC5cbiAgICovXG4gIE9CSkVDVF9UQUdHSU5HX0RFTEVURSA9IFwiczM6T2JqZWN0VGFnZ2luZzpEZWxldGVcIixcblxuICAvKipcbiAgICogWW91IHJlY2VpdmUgdGhpcyBub3RpZmljYXRpb24gZXZlbnQgd2hlbiBhbiBBQ0wgaXMgUFVUIG9uIGFuIG9iamVjdCBvciB3aGVuXG4gICAqIGFuIGV4aXN0aW5nIEFDTCBpcyBjaGFuZ2VkLlxuICAgKiBBbiBldmVudCBpcyBub3QgZ2VuZXJhdGVkIHdoZW4gYSByZXF1ZXN0IHJlc3VsdHMgaW4gbm8gY2hhbmdlIHRvIGFuXG4gICAqIG9iamVjdOKAmXMgQUNMLlxuICAgKi9cbiAgT0JKRUNUX0FDTF9QVVQgPSBcInMzOk9iamVjdEFjbDpQdXRcIixcbn1cblxuZXhwb3J0IGludGVyZmFjZSBOb3RpZmljYXRpb25LZXlGaWx0ZXIge1xuICAvKipcbiAgICogVW5pcXVlIGlkZW50aWZpZXIgZm9yIGVhY2ggb2YgdGhlIG5vdGlmaWNhdGlvbiBjb25maWd1cmF0aW9ucy5cbiAgICovXG4gIHJlYWRvbmx5IGlkPzogc3RyaW5nO1xuICAvKipcbiAgICogUzMga2V5cyBtdXN0IGhhdmUgdGhlIHNwZWNpZmllZCBwcmVmaXguXG4gICAqL1xuICByZWFkb25seSBwcmVmaXg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFMzIGtleXMgbXVzdCBoYXZlIHRoZSBzcGVjaWZpZWQgc3VmZml4LlxuICAgKi9cbiAgcmVhZG9ubHkgc3VmZml4Pzogc3RyaW5nO1xufVxuIl19
|
|
1203
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVja2V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2F3cy9zdG9yYWdlL2J1Y2tldC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLHFDQUE4QjtBQUM5QixzREFBNEQ7QUFDNUQsc0RBVzZCO0FBQzdCLHdEQUE2QztBQUM3QyxpQ0FBb0M7QUFJcEMsaUVBQTZEO0FBQzdELHdDQUF3QztBQUN4QyxtREFBK0M7QUFDL0MsbURBQWtFO0FBR2xFLHFFQUFnRTtBQUVoRSxvREFJMEI7QUFDMUIsNENBQXdDO0FBQ3hDLGlDQUF5RDtBQUN6RCx5Q0FBd0U7QUFDeEUscUNBQXFDO0FBQ3JDLDhCQUE4QjtBQXdwQjlCLE1BQXNCLFVBQVcsU0FBUSxnQ0FBZ0I7SUFjdkQsSUFBVyxhQUFhO1FBQ3RCLE9BQU87WUFDTCxJQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVU7WUFDckIsR0FBRyxFQUFFLElBQUksQ0FBQyxTQUFTO1lBQ25CLFVBQVUsRUFBRSxJQUFJLENBQUMsZ0JBQWdCO1lBQ2pDLGtCQUFrQixFQUFFLElBQUksQ0FBQyx3QkFBd0I7WUFDakQsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLGlCQUFpQjtZQUN6QyxVQUFVLEVBQUUsSUFBSSxDQUFDLGVBQWU7WUFDaEMsb0JBQW9CLEVBQ2xCLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxrQ0FBa0M7WUFDL0QsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUsVUFBVTtTQUM5QyxDQUFDO0lBQ0osQ0FBQztJQUNELElBQVcsT0FBTztRQUNoQixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUM7SUFDNUIsQ0FBQztJQXNDRCxrRUFBa0U7SUFDbEUsb0dBQW9HO0lBQ3BHLCtDQUErQztJQUUvQyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLFFBQTJCLEVBQUU7UUFDckUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFqQzFCLGdCQUFnQjtR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Q0gsOERBQWlELENBQUE7SUFFakQ7Ozs7O09BS0c7SUFDSCwwRUFBNkQsQ0FBQTtJQUU3RDs7OztPQUlHO0lBQ0gsc0dBQXlGLENBQUE7SUFFekY7OztPQUdHO0lBQ0gsNERBQStDLENBQUE7SUFFL0M7Ozs7T0FJRztJQUNILDBEQUE2QyxDQUFBO0lBRTdDOzs7T0FHRztJQUNILGtEQUFxQyxDQUFBO0lBRXJDOzs7O09BSUc7SUFDSCx3REFBMkMsQ0FBQTtJQUUzQzs7O09BR0c7SUFDSCw4REFBaUQsQ0FBQTtJQUVqRDs7Ozs7T0FLRztJQUNILGdEQUFtQyxDQUFBO0FBQ3JDLENBQUMsRUE3TlcsU0FBUyx5QkFBVCxTQUFTLFFBNk5wQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVPTCB9IGZyb20gXCJub2RlOm9zXCI7XG5pbXBvcnQgeyBGYWN0TmFtZSwgUmVnaW9uSW5mbyB9IGZyb20gXCJAYXdzLWNkay9yZWdpb24taW5mb1wiO1xuaW1wb3J0IHtcbiAgczNCdWNrZXQsXG4gIHMzQnVja2V0QWNsLFxuICBzM0J1Y2tldENvcnNDb25maWd1cmF0aW9uLFxuICBzM0J1Y2tldE93bmVyc2hpcENvbnRyb2xzLFxuICBzM0J1Y2tldFB1YmxpY0FjY2Vzc0Jsb2NrLFxuICBzM0J1Y2tldFdlYnNpdGVDb25maWd1cmF0aW9uLFxuICBzM0J1Y2tldExpZmVjeWNsZUNvbmZpZ3VyYXRpb24sXG4gIHMzQnVja2V0VmVyc2lvbmluZyxcbiAgczNCdWNrZXRTZXJ2ZXJTaWRlRW5jcnlwdGlvbkNvbmZpZ3VyYXRpb24sXG4gIGRhdGFBd3NTM0J1Y2tldCxcbn0gZnJvbSBcIkBjZGt0bi9wcm92aWRlci1hd3NcIjtcbmltcG9ydCB7IHNsZWVwIH0gZnJvbSBcIkBjZGt0bi9wcm92aWRlci10aW1lXCI7XG5pbXBvcnQgeyBMYXp5LCBUb2tlbiB9IGZyb20gXCJjZGt0blwiO1xuLy8gaW1wb3J0IHsgRm4gfSBmcm9tIFwiLi4vLi4vdGVycmEtZnVuY1wiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IElCdWNrZXROb3RpZmljYXRpb25EZXN0aW5hdGlvbiB9IGZyb20gXCIuL2J1Y2tldC1kZXN0aW5hdGlvblwiO1xuaW1wb3J0IHsgQnVja2V0Tm90aWZpY2F0aW9ucyB9IGZyb20gXCIuL2J1Y2tldC1ub3RpZmljYXRpb25zXCI7XG5pbXBvcnQgKiBhcyBwZXJtcyBmcm9tIFwiLi9idWNrZXQtcGVybXNcIjtcbmltcG9ydCB7IEJ1Y2tldFBvbGljeSB9IGZyb20gXCIuL2J1Y2tldC1wb2xpY3lcIjtcbmltcG9ydCB7IEJ1Y2tldFNvdXJjZSwgQnVja2V0U291cmNlUHJvcHMgfSBmcm9tIFwiLi9idWNrZXQtc291cmNlXCI7XG5pbXBvcnQgeyBDb3JzQ29uZmlnIH0gZnJvbSBcIi4vY29ycy1jb25maWcuZ2VuZXJhdGVkXCI7XG5pbXBvcnQgeyBMaWZlY3ljbGVDb25maWd1cmF0aW9uUnVsZSB9IGZyb20gXCIuL2xpZmVjeWNsZS1jb25maWcuZ2VuZXJhdGVkXCI7XG5pbXBvcnQgeyBPcmlnaW5BY2Nlc3NJZGVudGl0eSB9IGZyb20gXCIuL29yaWdpbi1hY2Nlc3MtaWRlbnRpdHlcIjtcbmltcG9ydCB7IFdlYnNpdGVDb25maWcgfSBmcm9tIFwiLi93ZWJzaXRlLWNvbmZpZy5nZW5lcmF0ZWRcIjtcbmltcG9ydCB7XG4gIEF3c0NvbnN0cnVjdEJhc2UsXG4gIElBd3NDb25zdHJ1Y3QsXG4gIEF3c0NvbnN0cnVjdFByb3BzLFxufSBmcm9tIFwiLi4vYXdzLWNvbnN0cnVjdFwiO1xuaW1wb3J0IHsgQXdzU3RhY2sgfSBmcm9tIFwiLi4vYXdzLXN0YWNrXCI7XG5pbXBvcnQgeyBwYXJzZUJ1Y2tldE5hbWUsIHBhcnNlQnVja2V0QXJuIH0gZnJvbSBcIi4vdXRpbFwiO1xuaW1wb3J0IHsgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IsIFZhbGlkYXRpb25FcnJvciB9IGZyb20gXCIuLi8uLi9lcnJvcnNcIjtcbmltcG9ydCAqIGFzIGttcyBmcm9tIFwiLi4vZW5jcnlwdGlvblwiO1xuaW1wb3J0ICogYXMgaWFtIGZyb20gXCIuLi9pYW1cIjtcblxuZXhwb3J0IGludGVyZmFjZSBDbG91ZGZyb250QWNjZXNzQ29uZmlnIHtcbiAgLyoqXG4gICAqIEVuYWJsZSBDbG91ZGZyb250IGFjY2VzcyB2aWEgT3JpZ2luIEFjY2VzcyBJZGVudGl0eS5cbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZWQ6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBPYmplY3Qga2V5IHBhdHRlcm5zIGZvciBjbG91ZGZyb250IGFjY2Vzcy5cbiAgICpcbiAgICogQGRlZmF1bHQgXCIqXCJcbiAgICovXG4gIHJlYWRvbmx5IGtleVBhdHRlcm5zPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogQSByZWZlcmVuY2UgdG8gYSBidWNrZXQgb3V0c2lkZSB0aGlzIHN0YWNrXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVja2V0QXR0cmlidXRlcyB7XG4gIC8qKlxuICAgKiBUaGUgQVJOIG9mIHRoZSBidWNrZXQuIEF0IGxlYXN0IG9uZSBvZiBidWNrZXRBcm4gb3IgYnVja2V0TmFtZSBtdXN0IGJlXG4gICAqIGRlZmluZWQgaW4gb3JkZXIgdG8gaW5pdGlhbGl6ZSBhIGJ1Y2tldCByZWYuXG4gICAqL1xuICByZWFkb25seSBidWNrZXRBcm4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBidWNrZXQuIElmIHRoZSB1bmRlcmx5aW5nIHZhbHVlIG9mIEFSTiBpcyBhIHN0cmluZywgdGhlXG4gICAqIG5hbWUgd2lsbCBiZSBwYXJzZWQgZnJvbSB0aGUgQVJOLiBPdGhlcndpc2UsIHRoZSBuYW1lIGlzIG9wdGlvbmFsLCBidXRcbiAgICogc29tZSBmZWF0dXJlcyB0aGF0IHJlcXVpcmUgdGhlIGJ1Y2tldCBuYW1lIHN1Y2ggYXMgYXV0by1jcmVhdGluZyBhIGJ1Y2tldFxuICAgKiBwb2xpY3ksIHdvbid0IHdvcmsuXG4gICAqL1xuICByZWFkb25seSBidWNrZXROYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZG9tYWluIG5hbWUgb2YgdGhlIGJ1Y2tldC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBJbmZlcnJlZCBmcm9tIGJ1Y2tldCBuYW1lXG4gICAqL1xuICByZWFkb25seSBidWNrZXREb21haW5OYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgd2Vic2l0ZSBVUkwgb2YgdGhlIGJ1Y2tldCAoaWYgc3RhdGljIHdlYiBob3N0aW5nIGlzIGVuYWJsZWQpLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIEluZmVycmVkIGZyb20gYnVja2V0IG5hbWUgYW5kIHJlZ2lvblxuICAgKi9cbiAgcmVhZG9ubHkgYnVja2V0V2Vic2l0ZVVybD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHJlZ2lvbmFsIGRvbWFpbiBuYW1lIG9mIHRoZSBzcGVjaWZpZWQgYnVja2V0LlxuICAgKi9cbiAgcmVhZG9ubHkgYnVja2V0UmVnaW9uYWxEb21haW5OYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgSVB2NiBETlMgbmFtZSBvZiB0aGUgc3BlY2lmaWVkIGJ1Y2tldC5cbiAgICovXG4gIHJlYWRvbmx5IGJ1Y2tldER1YWxTdGFja0RvbWFpbk5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEtNUyBlbmNyeXB0aW9uIGtleSBhc3NvY2lhdGVkIHdpdGggdGhpcyBidWNrZXQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gZW5jcnlwdGlvbiBrZXlcbiAgICovXG4gIHJlYWRvbmx5IGVuY3J5cHRpb25LZXk/OiBrbXMuSUtleTtcblxuICAvKipcbiAgICogSWYgdGhpcyBidWNrZXQgaGFzIGJlZW4gY29uZmlndXJlZCBmb3Igc3RhdGljIHdlYnNpdGUgaG9zdGluZy5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGlzV2Vic2l0ZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBhY2NvdW50IHRoaXMgZXhpc3RpbmcgYnVja2V0IGJlbG9uZ3MgdG8uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gaXQncyBhc3N1bWVkIHRoZSBidWNrZXQgYmVsb25ncyB0byB0aGUgc2FtZSBhY2NvdW50IGFzIHRoZSBzY29wZSBpdCdzIGJlaW5nIGltcG9ydGVkIGludG9cbiAgICovXG4gIHJlYWRvbmx5IGFjY291bnQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSByZWdpb24gdGhpcyBleGlzdGluZyBidWNrZXQgaXMgaW4uXG4gICAqIEZlYXR1cmVzIHRoYXQgcmVxdWlyZSB0aGUgcmVnaW9uIChlLmcuIGBidWNrZXRXZWJzaXRlVXJsYCkgd29uJ3QgZnVsbHkgd29ya1xuICAgKiBpZiB0aGUgcmVnaW9uIGNhbm5vdCBiZSBjb3JyZWN0bHkgaW5mZXJyZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gaXQncyBhc3N1bWVkIHRoZSBidWNrZXQgaXMgaW4gdGhlIHNhbWUgcmVnaW9uIGFzIHRoZSBzY29wZSBpdCdzIGJlaW5nIGltcG9ydGVkIGludG9cbiAgICovXG4gIHJlYWRvbmx5IHJlZ2lvbj86IHN0cmluZztcblxuICAvLyBUT0RPOiBVc2UgQ3VzdG9tIFJlc291cmNlIGZvciB3aXRoTm90aWZpY2F0aW9ucygpIHN1cHBvcnRcbiAgLy8gLyoqXG4gIC8vICAqIFRoZSByb2xlIHRvIGJlIHVzZWQgYnkgdGhlIG5vdGlmaWNhdGlvbnMgaGFuZGxlclxuICAvLyAgKlxuICAvLyAgKiBAZGVmYXVsdCAtIGEgbmV3IHJvbGUgd2lsbCBiZSBjcmVhdGVkLlxuICAvLyAgKi9cbiAgLy8gcmVhZG9ubHkgbm90aWZpY2F0aW9uc0hhbmRsZXJSb2xlPzogaWFtLklSb2xlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBidWNrZXQgaXMgcHVibGljIG9yIG5vdC5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHB1YmxpYz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGJ1Y2tldCBoYXMgdmVyc2lvbmluZyBlbmFibGVkXG4gICAqXG4gICAqIElmIHlvdSBhcmUgZW5hYmxpbmcgdmVyc2lvbmluZyBvbiB0aGUgYnVja2V0IGZvciB0aGUgZmlyc3QgdGltZSwgQVdTIHJlY29tbWVuZHMgdGhhdFxuICAgKiB5b3Ugd2FpdCBmb3IgMTUgbWludXRlcyBhZnRlciBlbmFibGluZyB2ZXJzaW9uaW5nIGJlZm9yZSBpc3N1aW5nIHdyaXRlIG9wZXJhdGlvbnNcbiAgICogKFBVVCBvciBERUxFVEUpIG9uIG9iamVjdHMgaW4gdGhlIGJ1Y2tldC5cbiAgICpcbiAgICogVGhpcyB3aWxsIGNhdXNlIDE1bSBkZWxheSBpZiBgcGF0aGAgaXMgY29uZmlndXJlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHZlcnNpb25lZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFNwZWNpYWwgQ2xvdWRGcm9udCB1c2VyIHRoYXQgeW91IGNhbiBhc3NvY2lhdGUgd2l0aCBBbWF6b24gUzMgb3JpZ2lucywgc28gdGhhdCB5b3UgY2FuIHNlY3VyZSBhbGwgb3IganVzdCBzb21lIG9mXG4gICAqIHlvdXIgQW1hem9uIFMzIGNvbnRlbnQuXG4gICAqXG4gICAqIFJlcXVpcmVkIHRvIHVzZSB0aGUgaW1wb3J0ZWQgYnVja2V0IGluIGEgQ2xvdWRGcm9udCBkaXN0cmlidXRpb24uXG4gICAqL1xuICByZWFkb25seSBvcmlnaW5BY2Nlc3NJZGVudGl0eT86IE9yaWdpbkFjY2Vzc0lkZW50aXR5O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJ1Y2tldFByb3BzIGV4dGVuZHMgQXdzQ29uc3RydWN0UHJvcHMge1xuICAvKipcbiAgICogVGhlIGtpbmQgb2Ygc2VydmVyLXNpZGUgZW5jcnlwdGlvbiB0byBhcHBseSB0byB0aGlzIGJ1Y2tldC5cbiAgICpcbiAgICogSWYgeW91IGNob29zZSBLTVMsIHlvdSBjYW4gc3BlY2lmeSBhIEtNUyBrZXkgdmlhIGBlbmNyeXB0aW9uS2V5YC4gSWZcbiAgICogZW5jcnlwdGlvbiBrZXkgaXMgbm90IHNwZWNpZmllZCwgYSBrZXkgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGNyZWF0ZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYEtNU2AgaWYgYGVuY3J5cHRpb25LZXlgIGlzIHNwZWNpZmllZCwgb3IgYFVORU5DUllQVEVEYCBvdGhlcndpc2UuXG4gICAqIEJ1dCBpZiBgVU5FTkNSWVBURURgIGlzIHNwZWNpZmllZCwgdGhlIGJ1Y2tldCB3aWxsIGJlIGVuY3J5cHRlZCBhcyBgUzNfTUFOQUdFRGAgYXV0b21hdGljYWxseS5cbiAgICovXG4gIHJlYWRvbmx5IGVuY3J5cHRpb24/OiBCdWNrZXRFbmNyeXB0aW9uO1xuXG4gIC8qKlxuICAgKiBFeHRlcm5hbCBLTVMga2V5IHRvIHVzZSBmb3IgYnVja2V0IGVuY3J5cHRpb24uXG4gICAqXG4gICAqIFRoZSBgZW5jcnlwdGlvbmAgcHJvcGVydHkgbXVzdCBiZSBlaXRoZXIgbm90IHNwZWNpZmllZCBvciBzZXQgdG8gYEtNU2Agb3IgYERTU0VgLlxuICAgKiBBbiBlcnJvciB3aWxsIGJlIGVtaXR0ZWQgaWYgYGVuY3J5cHRpb25gIGlzIHNldCB0byBgVU5FTkNSWVBURURgIG9yIGBTM19NQU5BR0VEYC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBJZiBgZW5jcnlwdGlvbmAgaXMgc2V0IHRvIGBLTVNgIGFuZCB0aGlzIHByb3BlcnR5IGlzIHVuZGVmaW5lZCxcbiAgICogYSBuZXcgS01TIGtleSB3aWxsIGJlIGNyZWF0ZWQgYW5kIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGJ1Y2tldC5cbiAgICovXG4gIHJlYWRvbmx5IGVuY3J5cHRpb25LZXk/OiBrbXMuSUtleTtcblxuICAvKipcbiAgICogV2hldGhlciBBbWF6b24gUzMgc2hvdWxkIHVzZSBpdHMgb3duIGludGVybWVkaWFyeSBrZXkgdG8gZ2VuZXJhdGUgZGF0YSBrZXlzLlxuICAgKlxuICAgKiBPbmx5IHJlbGV2YW50IHdoZW4gdXNpbmcgS01TIGZvciBlbmNyeXB0aW9uLlxuICAgKlxuICAgKiAtIElmIG5vdCBlbmFibGVkLCBldmVyeSBvYmplY3QgR0VUIGFuZCBQVVQgd2lsbCBjYXVzZSBhbiBBUEkgY2FsbCB0byBLTVMgKHdpdGggdGhlXG4gICAqICAgYXR0ZW5kYW50IGNvc3QgaW1wbGljYXRpb25zIG9mIHRoYXQpLlxuICAgKiAtIElmIGVuYWJsZWQsIFMzIHdpbGwgdXNlIGl0cyBvd24gdGltZS1saW1pdGVkIGtleSBpbnN0ZWFkLlxuICAgKlxuICAgKiBPbmx5IHJlbGV2YW50LCB3aGVuIEVuY3J5cHRpb24gaXMgbm90IHNldCB0byBgQnVja2V0RW5jcnlwdGlvbi5VTkVOQ1JZUFRFRGAuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGJ1Y2tldEtleUVuYWJsZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aChzKSB0byBzdGF0aWMgZGlyZWN0b3JpZXMgb3IgZmlsZXMgdG8gdXBsb2FkLCByZWxhdGl2ZSB0byB0aGUgU3RhY2sgZmlsZS5cbiAgICpcbiAgICogQGV4YW1wbGUgXCIuL2Rpc3RcIlxuICAgKiBAZGVmYXVsdCAtIE5vIGZpbGVzIGFyZSB1cGxvYWRlZC5cbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZXM/OiBzdHJpbmcgfCBzdHJpbmdbXSB8IEFkZFNvdXJjZU9wdGlvbnNbXTtcblxuICAvLyBUT0RPOiBBZGQgc3VwcG9ydCB0byBwYXNzIGRvbWFpbiBwcm9wcyAoZm9yIHJvdXRlNTMgYWxpYXM/KVxuXG4gIC8qKlxuICAgKiBFbmFibGUgcHVibGljIHJlYWQgYWNjZXNzIGZvciBhbGwgdGhlIGZpbGVzIGluIHRoZSBidWNrZXQuXG4gICAqXG4gICAqIEVuYWJsZSB0aGlzIG9ubHkgaWYgeW91J3JlIG5vdCB1c2luZyBDRE4gKENsb3VkRnJvbnQpIHRvIHNlcnZlIGZpbGVzIGZyb20gdGhlIGJ1Y2tldC5cbiAgICogU2hvdWxkIG9ubHkgYmUgdHVybmVkIG9uIGlmIHlvdSB3YW50IHRvIGhvc3QgcHVibGljIGZpbGVzIGRpcmVjdGx5IGZyb20gdGhlIGJ1Y2tldC5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgcHVibGljPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQSBuYW1lIGZvciB0aGUgYnVja2V0LlxuICAgKlxuICAgKiBNdXN0IGJlIGxvd2VyY2FzZSBhbmQgYmV0d2VlbiAzIChtaW4pIGFuZCA2MyAobWF4KSBjaGFyYWN0ZXJzIGxvbmcuXG4gICAqXG4gICAqIFRoZSBuYW1lIG11c3Qgbm90IGJlIGluIHRoZSBmb3JtYXQgW2J1Y2tldF9uYW1lXS0tW2F6aWRdLS14LXMzLiBVc2UgdGhlXG4gICAqIGBhd3NfczNfZGlyZWN0b3J5X2J1Y2tldGAgcmVzb3VyY2UgdG8gbWFuYWdlIFMzIEV4cHJlc3MgYnVja2V0cy5cbiAgICpcbiAgICogQSBmdWxsIGxpc3Qgb2YgYnVja2V0IG5hbWluZyBydWxlcyBbbWF5IGJlIGZvdW5kIGhlcmVdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25TMy9sYXRlc3QvdXNlcmd1aWRlL2J1Y2tldG5hbWluZ3J1bGVzLmh0bWwpLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIElmIG9taXR0ZWQsIFJlZmVyIHRvIGBuYW1lUHJlZml4YC5cbiAgICovXG4gIHJlYWRvbmx5IGJ1Y2tldE5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSB1bmlxdWUgbmFtZSBiZWdpbm5pbmcgd2l0aCB0aGUgc3BlY2lmaWVkIHByZWZpeC5cbiAgICogQ29uZmxpY3RzIHdpdGggYGJ1Y2tldE5hbWVgLlxuICAgKlxuICAgKiBUZXJyYWZvcm0gUHJlZml4ZXMgbXVzdCByZXNlcnZlIDI2IGNoYXJhY3RlcnMgZm9yIHRoZSB0ZXJyYWZvcm0gZ2VuZXJhdGVkIHN1ZmZpeC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBJZiBvbWl0dGVkLCBFVCB3aWxsIGFzc2lnbiBhIHJhbmRvbSwgdW5pcXVlIG5hbWUgcHJlZml4ZWQgYnkgR3JpZFVVSUQuXG4gICAqL1xuICByZWFkb25seSBuYW1lUHJlZml4Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBCb29sZWFuIHRoYXQgaW5kaWNhdGVzIGFsbCBvYmplY3RzIChpbmNsdWRpbmcgYW55IGxvY2tlZCBvYmplY3RzKVxuICAgKiBzaG91bGQgYmUgZGVsZXRlZCBmcm9tIHRoZSBidWNrZXQgd2hlbiB0aGUgYnVja2V0IGlzIGRlc3Ryb3llZFxuICAgKiBzbyB0aGF0IHRoZSBidWNrZXQgY2FuIGJlIGRlc3Ryb3llZCB3aXRob3V0IGVycm9yLlxuICAgKlxuICAgKiBUaGVzZSBvYmplY3RzIGFyZSBub3QgcmVjb3ZlcmFibGUuIFRoaXMgb25seSBkZWxldGVzIG9iamVjdHMgd2hlblxuICAgKiB0aGUgYnVja2V0IGlzIGRlc3Ryb3llZCwgbm90IHdoZW4gc2V0dGluZyB0aGlzIHBhcmFtZXRlciB0byB0cnVlLlxuICAgKlxuICAgKiBPbmNlIHRoaXMgcGFyYW1ldGVyIGlzIHNldCB0byB0cnVlLCB0aGVyZSBtdXN0IGJlIGEgc3VjY2Vzc2Z1bFxuICAgKiB0ZXJyYWZvcm0gYXBwbHkgcnVuIGJlZm9yZSBhIGRlc3Ryb3kgaXMgcmVxdWlyZWQgdG8gdXBkYXRlIHRoaXNcbiAgICogdmFsdWUgaW4gdGhlIHJlc291cmNlIHN0YXRlLlxuICAgKlxuICAgKiBXaXRob3V0IGEgc3VjY2Vzc2Z1bCB0ZXJyYWZvcm0gYXBwbHkgYWZ0ZXIgdGhpcyBwYXJhbWV0ZXIgaXMgc2V0LFxuICAgKiB0aGlzIGZsYWcgd2lsbCBoYXZlIG5vIGVmZmVjdC4gSWYgc2V0dGluZyB0aGlzIGZpZWxkIGluIHRoZSBzYW1lXG4gICAqIG9wZXJhdGlvbiB0aGF0IHdvdWxkIHJlcXVpcmUgcmVwbGFjaW5nIHRoZSBidWNrZXQgb3IgZGVzdHJveWluZ1xuICAgKiB0aGUgYnVja2V0LCB0aGlzIGZsYWcgd2lsbCBub3Qgd29yay5cbiAgICpcbiAgICogQWRkaXRpb25hbGx5IHdoZW4gaW1wb3J0aW5nIGEgYnVja2V0LCBhIHN1Y2Nlc3NmdWwgdGVycmFmb3JtIGFwcGx5XG4gICAqIGlzIHJlcXVpcmVkIHRvIHNldCB0aGlzIHZhbHVlIGluIHN0YXRlIGJlZm9yZSBpdCB3aWxsIHRha2UgZWZmZWN0XG4gICAqIG9uIGEgZGVzdHJveSBvcGVyYXRpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBmb3JjZURlc3Ryb3k/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBQcm92aWRlcyBhbiBTMyBidWNrZXQgd2Vic2l0ZSBjb25maWd1cmF0aW9uIHJlc291cmNlLlxuICAgKlxuICAgKiBJbXBvcnRhbnQ6IEFtYXpvbiBTMyB3ZWJzaXRlIGVuZHBvaW50cyBkbyBub3Qgc3VwcG9ydCBIVFRQUyBvciBhY2Nlc3MgcG9pbnRzLlxuICAgKiBJZiB5b3Ugd2FudCB0byB1c2UgSFRUUFMsIHlvdSBjYW4gdXNlIGVkZ2UgRGlzdHJpYnV0aW9uIHRvIHNlcnZlIGEgc3RhdGljXG4gICAqIHdlYnNpdGUgaG9zdGVkIGluIGEgYnVja2V0LlxuICAgKlxuICAgKiBVc2UgT3JpZ2luQWNjZXNzSWRlbnRpdHkgcHJvcGVydHkgdG8gY29udHJvbCBpbmdyZXNzIHRocm91Z2ggZWRnZSBEaXN0cmlidXRpb24uXG4gICAqXG4gICAqIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW0hvc3RpbmcgV2Vic2l0ZXMgb24gUzNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25TMy9sYXRlc3QvZGV2L1dlYnNpdGVIb3N0aW5nLmh0bWwpLlxuICAgKi9cbiAgcmVhZG9ubHkgd2Vic2l0ZUNvbmZpZz86IFdlYnNpdGVDb25maWc7XG5cbiAgLyoqXG4gICAqIFByb3ZpZGVzIGFuIFMzIGJ1Y2tldCBDT1JTIGNvbmZpZ3VyYXRpb24gcmVzb3VyY2UuXG4gICAqXG4gICAqIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IENPUlMsIGdvIHRvXG4gICAqIFtFbmFibGluZyBDcm9zcy1PcmlnaW4gUmVzb3VyY2UgU2hhcmluZ10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC91c2VyZ3VpZGUvY29ycy5odG1sKVxuICAgKiBpbiB0aGUgQW1hem9uIFMzIFVzZXIgR3VpZGUuXG4gICAqL1xuICByZWFkb25seSBjb3JzQ29uZmlnPzogQ29yc0NvbmZpZztcblxuICAvKipcbiAgICogT25lIG9yIG1vcmUgTGlmZWN5Y2xlIHJ1bGVzLiBFYWNoIHJ1bGUgY29uc2lzdHMgb2YgdGhlIGZvbGxvd2luZzpcbiAgICpcbiAgICogIC0gUnVsZSBpZFxuICAgKiAgLSBGaWx0ZXIgaWRlbnRpZnlpbmcgb2JqZWN0cyB0byB3aGljaCB0aGUgcnVsZSBhcHBsaWVzXG4gICAqICAtIE9uZSBvciBtb3JlIHRyYW5zaXRpb24gb3IgZXhwaXJhdGlvbiBhY3Rpb25zXG4gICAqXG4gICAqIEZvciBtb3JlIGluZm9ybWF0aW9uIHNlZSB0aGUgQW1hem9uIFMzIFVzZXIgR3VpZGUgb24gW0xpZmVjeWNsZSBDb25maWd1cmF0aW9uIEVsZW1lbnRzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L3VzZXJndWlkZS9pbnRyby1saWZlY3ljbGUtcnVsZXMuaHRtbCkuXG4gICAqL1xuICByZWFkb25seSBsaWZlY3ljbGVSdWxlcz86IExpZmVjeWNsZUNvbmZpZ3VyYXRpb25SdWxlW107XG5cbiAgLyoqXG4gICAqIENvbnRyb2xzIHZlcnNpb25pbmcgb24gdGhlIFMzIGJ1Y2tldC5cbiAgICpcbiAgICogU2V0dGluZyB0aGlzIHRvIGZhbHNlIHdpbGwgc3VzcGVuZCB2ZXJzaW9uaW5nIGlmIHRoZSBhc3NvY2lhdGVkIFMzIGJ1Y2tldCBpcyB2ZXJzaW9uZWQuXG4gICAqXG4gICAqIElmIHlvdSBhcmUgZW5hYmxpbmcgdmVyc2lvbmluZyBvbiB0aGUgYnVja2V0IGZvciB0aGUgZmlyc3QgdGltZSwgQVdTIHJlY29tbWVuZHMgdGhhdCB5b3Ugd2FpdCBmb3IgMTUgbWludXRlcyBhZnRlciBlbmFibGluZyB2ZXJzaW9uaW5nIGJlZm9yZSBpc3N1aW5nIHdyaXRlIG9wZXJhdGlvbnMgKFBVVCBvciBERUxFVEUpIG9uIG9iamVjdHMgaW4gdGhlIGJ1Y2tldC5cbiAgICogVGhpcyB3aWxsIGNhdXNlIDE1bSBkZWxheSBpZiBgcGF0aGAgaXMgY29uZmlndXJlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHZlcnNpb25lZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyBidWNrZXQgc2hvdWxkIHNlbmQgbm90aWZpY2F0aW9ucyB0byBBbWF6b24gRXZlbnRCcmlkZ2Ugb3Igbm90LlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgZXZlbnRCcmlkZ2VFbmFibGVkPzogYm9vbGVhbjtcblxuICAvLyBUT0RPOiByZS1hZGQgT2JqZWN0T3duZXJzaGlwIGFuZCBCdWNrZXRBY2Nlc3NDb250cm9sXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9ibG9iL3YyLjE2MC4wL3BhY2thZ2VzL2F3cy1jZGstbGliL2F3cy1zMy9saWIvYnVja2V0LnRzI0wxMjg0XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9ibG9iL3YyLjE2MC4wL3BhY2thZ2VzL2F3cy1jZGstbGliL2F3cy1zMy9saWIvYnVja2V0LnRzI0wxNjQzXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9ibG9iL3YyLjE2MC4wL3BhY2thZ2VzL2F3cy1jZGstbGliL2F3cy1zMy9saWIvYnVja2V0LnRzI0wxOTM2XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9ibG9iL3YyLjE2MC4wL3BhY2thZ2VzL2F3cy1jZGstbGliL2F3cy1zMy9saWIvYnVja2V0LnRzI0wyMzYzXG4gIC8vIEJ1Y2tldEFjY2Vzc0NvbnRyb2xcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2Jsb2IvdjIuMTYwLjAvcGFja2FnZXMvYXdzLWNkay1saWIvYXdzLXMzL2xpYi9idWNrZXQudHMjTDI5MDVcblxuICAvKipcbiAgICogRW5mb3JjZXMgU1NMIGZvciByZXF1ZXN0cy4gUzMuNSBvZiB0aGUgQVdTIEZvdW5kYXRpb25hbCBTZWN1cml0eSBCZXN0IFByYWN0aWNlcyBSZWdhcmRpbmcgUzMuXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2NvbmZpZy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvczMtYnVja2V0LXNzbC1yZXF1ZXN0cy1vbmx5Lmh0bWxcbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGVuZm9yY2VTU0w/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBFbmZvcmNlcyBtaW5pbXVtIFRMUyB2ZXJzaW9uIGZvciByZXF1ZXN0cy5cbiAgICpcbiAgICogUmVxdWlyZXMgYGVuZm9yY2VTU0xgIHRvIGJlIGVuYWJsZWQuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC91c2VyZ3VpZGUvYW1hem9uLXMzLXBvbGljeS1rZXlzLmh0bWwjZXhhbXBsZS1vYmplY3QtdGxzLXZlcnNpb25cbiAgICpcbiAgICogQGRlZmF1bHQgTm8gbWluaW11bSBUTFMgdmVyc2lvbiBpcyBlbmZvcmNlZC5cbiAgICovXG4gIHJlYWRvbmx5IG1pbmltdW1UTFNWZXJzaW9uPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBFbmFibGUgQ2xvdWRmcm9udCBhY2Nlc3MgdmlhIE9yaWdpbiBBY2Nlc3MgSWRlbnRpdHkuXG4gICAqXG4gICAqIE5vdGU6IHJlY29tbWVuZGVkIHRvIG1pZ3JhdGUgdG8gT0FDIGluIGZ1dHVyZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBjbG91ZGZyb250IGFjY2Vzc1xuICAgKi9cbiAgcmVhZG9ubHkgY2xvdWRmcm9udEFjY2Vzcz86IENsb3VkZnJvbnRBY2Nlc3NDb25maWc7XG5cbiAgLy8gVE9ETzogQWRkIGZsYWcgdG8gcmVnaXN0ZXIgQnVja2V0IFNvdXJjZSBvdXRwdXRzP1xufVxuXG4vKipcbiAqIE91dHB1dHMgd2hpY2ggbWF5IGJlIHJlZ2lzdGVyZWQgZm9yIG91dHB1dCB2aWEgdGhlIEdyaWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVja2V0T3V0cHV0cyB7XG4gIC8qKlxuICAgKiBBV1MgQnVja2V0IG5hbWVcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBV1MgQnVja2V0IGFyblxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBhcm46IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIFVSTCBvZiB0aGUgc3RhdGljIHdlYnNpdGUuXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IHdlYnNpdGVVcmw/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBEb21haW4gbmFtZSBvZiB0aGUgc3RhdGljIHdlYnNpdGUuXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IHdlYnNpdGVEb21haW5OYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgSVB2NCBETlMgbmFtZSBvZiB0aGUgc3BlY2lmaWVkIGJ1Y2tldC5cbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgZG9tYWluTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVnaW9uYWwgZG9tYWluIG5hbWUgb2YgdGhlIHNwZWNpZmllZCBidWNrZXQuXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IHJlZ2lvbmFsRG9tYWluTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBPcmlnaW4gQWNjZXNzIElkZW50aXR5LCBpZiBjbG91ZGZyb250QWNjZXNzIGlzIGVuYWJsZWQuXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IG9yaWdpbkFjY2Vzc0lkZW50aXR5Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBLbXMgS2V5IG91dHB1dHMsIGlmIGJ1Y2tldCBoYXMgZW5jcnlwdGlvbi5cbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgZW5jcnlwdGlvbktleT86IGttcy5LZXlPdXRwdXRzO1xufVxuXG4vKipcbiAqIEltcG9ydGVkIG9yIGNyZWF0ZWQgQnVja2V0IGF0dHJpYnV0ZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJQnVja2V0IGV4dGVuZHMgSUF3c0NvbnN0cnVjdCB7XG4gIC8qKiBTdHJvbmdseSB0eXBlZCBvdXRwdXRzICovXG4gIHJlYWRvbmx5IGJ1Y2tldE91dHB1dHM6IEJ1Y2tldE91dHB1dHM7XG5cbiAgLyoqXG4gICAqIEFXUyBCdWNrZXQgYXJuXG4gICAqL1xuICByZWFkb25seSBidWNrZXRBcm46IHN0cmluZztcblxuICAvKipcbiAgICogQVdTIEJ1Y2tldCBuYW1lXG4gICAqL1xuICByZWFkb25seSBidWNrZXROYW1lOiBzdHJpbmc7XG5cbiAgLyoqIFdoZXRoZXIgdGhlIGJ1Y2tldCBoYXMgdmVyc2lvbmluZyBlbmFibGVkICovXG4gIHJlYWRvbmx5IHZlcnNpb25lZDogYm9vbGVhbjtcblxuICAvKiogVGhlIGhvc3RlZCBab25lIElkIGZvciB0aGUgYnVja2V0ICovXG4gIHJlYWRvbmx5IGhvc3RlZFpvbmVJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgRG9tYWluIG5hbWUgb2YgdGhlIHN0YXRpYyB3ZWJzaXRlLlxuICAgKlxuICAgKiBUaGlzIGlzIHVzZWQgdG8gY3JlYXRlIFJvdXRlIDUzIGFsaWFzIHJlY29yZHMuXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IHdlYnNpdGVEb21haW5OYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBidWNrZXQgaXMgcHVibGljIG9yIG5vdC5cbiAgICovXG4gIHJlYWRvbmx5IHB1YmxpYz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsIEtNUyBlbmNyeXB0aW9uIGtleSBhc3NvY2lhdGVkIHdpdGggdGhpcyBidWNrZXQuXG4gICAqL1xuICByZWFkb25seSBlbmNyeXB0aW9uS2V5Pzoga21zLklLZXk7XG5cbiAgLyoqXG4gICAqIFRoZSByZXNvdXJjZSBwb2xpY3kgYXNzb2NpYXRlZCB3aXRoIHRoaXMgYnVja2V0LlxuICAgKlxuICAgKiBJZiBgYXV0b0NyZWF0ZVBvbGljeWAgaXMgdHJ1ZSwgYSBgQnVja2V0UG9saWN5YCB3aWxsIGJlIGNyZWF0ZWQgdXBvbiB0aGVcbiAgICogZmlyc3QgY2FsbCB0byBhZGRUb1Jlc291cmNlUG9saWN5KHMpLlxuICAgKi9cbiAgcG9saWN5PzogQnVja2V0UG9saWN5O1xuXG4gIC8qKlxuICAgKiBBZGQgYSBzb3VyY2Ugb2YgZmlsZXMgZm9yIHVwbG9hZCB0byB0aGUgYnVja2V0LlxuICAgKi9cbiAgYWRkU291cmNlKHByb3BzOiBBZGRTb3VyY2VPcHRpb25zLCBzb3VyY2VJZD86IHN0cmluZyk6IHN0cmluZztcblxuICAvKipcbiAgICogSWYgdGhpcyBidWNrZXQgaGFzIGJlZW4gY29uZmlndXJlZCBmb3Igc3RhdGljIHdlYnNpdGUgaG9zdGluZy5cbiAgICovXG4gIGlzV2Vic2l0ZSgpOiB0aGlzIGlzIHtcbiAgICB3ZWJzaXRlRG9tYWluTmFtZTogc3RyaW5nO1xuICAgIGJ1Y2tldE91dHB1dHM6IHsgd2Vic2l0ZVVybDogc3RyaW5nOyB3ZWJzaXRlRG9tYWluTmFtZTogc3RyaW5nIH07XG4gIH07XG5cbiAgLyoqXG4gICAqIFRoZSBodHRwcyBVUkwgb2YgYW4gUzMgb2JqZWN0LiBGb3IgZXhhbXBsZTpcbiAgICpcbiAgICogLSBgaHR0cHM6Ly9zMy51cy13ZXN0LTEuYW1hem9uYXdzLmNvbS9vbmx5YnVja2V0YFxuICAgKiAtIGBodHRwczovL3MzLnVzLXdlc3QtMS5hbWF6b25hd3MuY29tL2J1Y2tldC9rZXlgXG4gICAqIC0gYGh0dHBzOi8vczMuY24tbm9ydGgtMS5hbWF6b25hd3MuY29tLmNuL2NoaW5hLWJ1Y2tldC9teWtleWBcbiAgICogQHBhcmFtIGtleSBUaGUgUzMga2V5IG9mIHRoZSBvYmplY3QuIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBVUkwgb2YgdGhlXG4gICAqICAgICAgYnVja2V0IGlzIHJldHVybmVkLlxuICAgKiBAcmV0dXJucyBhbiBPYmplY3RTM1VybCB0b2tlblxuICAgKi9cbiAgdXJsRm9yT2JqZWN0KGtleT86IHN0cmluZyk6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIFMzIFVSTCBvZiBhbiBTMyBvYmplY3QuIEZvciBleGFtcGxlOlxuICAgKiAtIGBzMzovL29ubHlidWNrZXRgXG4gICAqIC0gYHMzOi8vYnVja2V0L2tleWBcbiAgICogQHBhcmFtIGtleSBUaGUgUzMga2V5IG9mIHRoZSBvYmplY3QuIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBTMyBVUkwgb2YgdGhlXG4gICAqICAgICAgYnVja2V0IGlzIHJldHVybmVkLlxuICAgKiBAcmV0dXJucyBhbiBPYmplY3RTM1VybCB0b2tlblxuICAgKi9cbiAgczNVcmxGb3JPYmplY3Qoa2V5Pzogc3RyaW5nKTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIEFSTiB0aGF0IHJlcHJlc2VudHMgYWxsIG9iamVjdHMgd2l0aGluIHRoZSBidWNrZXQgdGhhdCBtYXRjaFxuICAgKiB0aGUga2V5IHBhdHRlcm4gc3BlY2lmaWVkLiBUbyByZXByZXNlbnQgYWxsIGtleXMsIHNwZWNpZnkgYGBcIipcImBgLlxuICAgKi9cbiAgYXJuRm9yT2JqZWN0cyhrZXlQYXR0ZXJuOiBzdHJpbmcpOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBzdGF0ZW1lbnQgdG8gdGhlIHJlc291cmNlIHBvbGljeSBmb3IgYSBwcmluY2lwYWwgKGkuZS5cbiAgICogYWNjb3VudC9yb2xlL3NlcnZpY2UpIHRvIHBlcmZvcm0gYWN0aW9ucyBvbiB0aGlzIGJ1Y2tldCBhbmQvb3IgaXRzXG4gICAqIGNvbnRlbnRzLiBVc2UgYGJ1Y2tldEFybmAgYW5kIGBhcm5Gb3JPYmplY3RzKGtleXMpYCB0byBvYnRhaW4gQVJOcyBmb3JcbiAgICogdGhpcyBidWNrZXQgb3Igb2JqZWN0cy5cbiAgICpcbiAgICogTm90ZSB0aGF0IHRoZSBwb2xpY3kgc3RhdGVtZW50IG1heSBvciBtYXkgbm90IGJlIGFkZGVkIHRvIHRoZSBwb2xpY3kuXG4gICAqIEZvciBleGFtcGxlLCB3aGVuIGFuIGBJQnVja2V0YCBpcyBjcmVhdGVkIGZyb20gYW4gZXhpc3RpbmcgYnVja2V0LFxuICAgKiBpdCdzIG5vdCBwb3NzaWJsZSB0byB0ZWxsIHdoZXRoZXIgdGhlIGJ1Y2tldCBhbHJlYWR5IGhhcyBhIHBvbGljeVxuICAgKiBhdHRhY2hlZCwgbGV0IGFsb25lIHRvIHJlLXVzZSB0aGF0IHBvbGljeSB0byBhZGQgbW9yZSBzdGF0ZW1lbnRzIHRvIGl0LlxuICAgKiBTbyBpdCdzIHNhZmVzdCB0byBkbyBub3RoaW5nIGluIHRoZXNlIGNhc2VzLlxuICAgKlxuICAgKiBAcGFyYW0gcGVybWlzc2lvbiB0aGUgcG9saWN5IHN0YXRlbWVudCB0byBiZSBhZGRlZCB0byB0aGUgYnVja2V0J3NcbiAgICogcG9saWN5LlxuICAgKiBAcmV0dXJucyBtZXRhZGF0YSBhYm91dCB0aGUgZXhlY3V0aW9uIG9mIHRoaXMgbWV0aG9kLiBJZiB0aGUgcG9saWN5XG4gICAqIHdhcyBub3QgYWRkZWQsIHRoZSB2YWx1ZSBvZiBgc3RhdGVtZW50QWRkZWRgIHdpbGwgYmUgYGZhbHNlYC4gWW91XG4gICAqIHNob3VsZCBhbHdheXMgY2hlY2sgdGhpcyB2YWx1ZSB0byBtYWtlIHN1cmUgdGhhdCB0aGUgb3BlcmF0aW9uIHdhc1xuICAgKiBhY3R1YWxseSBjYXJyaWVkIG91dC4gT3RoZXJ3aXNlLCBzeW50aGVzaXMgYW5kIGRlcGxveSB3aWxsIHRlcm1pbmF0ZVxuICAgKiBzaWxlbnRseSwgd2hpY2ggbWF5IGJlIGNvbmZ1c2luZy5cbiAgICovXG4gIGFkZFRvUmVzb3VyY2VQb2xpY3koXG4gICAgcGVybWlzc2lvbjogaWFtLlBvbGljeVN0YXRlbWVudCxcbiAgKTogaWFtLkFkZFRvUmVzb3VyY2VQb2xpY3lSZXN1bHQ7XG5cbiAgLyoqXG4gICAqIEdyYW50IHJlYWQgcGVybWlzc2lvbnMgZm9yIHRoaXMgYnVja2V0IGFuZCBpdCdzIGNvbnRlbnRzIHRvIGFuIElBTVxuICAgKiBwcmluY2lwYWwgKFJvbGUvR3JvdXAvVXNlcikuXG4gICAqXG4gICAqIElmIGVuY3J5cHRpb24gaXMgdXNlZCwgcGVybWlzc2lvbiB0byB1c2UgdGhlIGtleSB0byBkZWNyeXB0IHRoZSBjb250ZW50c1xuICAgKiBvZiB0aGUgYnVja2V0IHdpbGwgYWxzbyBiZSBncmFudGVkIHRvIHRoZSBzYW1lIHByaW5jaXBhbC5cbiAgICpcbiAgICogQHBhcmFtIGlkZW50aXR5IFRoZSBwcmluY2lwYWxcbiAgICogQHBhcmFtIG9iamVjdHNLZXlQYXR0ZXJuIFJlc3RyaWN0IHRoZSBwZXJtaXNzaW9uIHRvIGEgY2VydGFpbiBrZXkgcGF0dGVybiAoZGVmYXVsdCAnKicpLiBQYXJhbWV0ZXIgdHlwZSBpcyBgYW55YCBidXQgYHN0cmluZ2Agc2hvdWxkIGJlIHBhc3NlZCBpbi5cbiAgICovXG4gIGdyYW50UmVhZChpZGVudGl0eTogaWFtLklHcmFudGFibGUsIG9iamVjdHNLZXlQYXR0ZXJuPzogYW55KTogaWFtLkdyYW50O1xuXG4gIC8qKlxuICAgKiBHcmFudCB3cml0ZSBwZXJtaXNzaW9ucyB0byB0aGlzIGJ1Y2tldCB0byBhbiBJQU0gcHJpbmNpcGFsLlxuICAgKlxuICAgKiBJZiBlbmNyeXB0aW9uIGlzIHVzZWQsIHBlcm1pc3Npb24gdG8gdXNlIHRoZSBrZXkgdG8gZW5jcnlwdCB0aGUgY29udGVudHNcbiAgICogb2Ygd3JpdHRlbiBmaWxlcyB3aWxsIGFsc28gYmUgZ3JhbnRlZCB0byB0aGUgc2FtZSBwcmluY2lwYWwuXG4gICAqXG4gICAqIFRoaXMgZG9lcyBub3QgaW5jbHVkZSBgczM6UHV0T2JqZWN0QWNsYCwgd2hpY2ggY291bGQgYmUgdXNlZCB0byBncmFudCByZWFkL3dyaXRlIG9iamVjdCBhY2Nlc3MgdG8gSUFNIHByaW5jaXBhbHMgaW4gb3RoZXIgYWNjb3VudHMuXG4gICAqXG4gICAqIElmIHlvdSBuZWVkIHRoZSBwcmluY2lwYWwgdG8gaGF2ZSBwZXJtaXNzaW9ucyB0byBtb2RpZnkgdGhlIEFDTHMsXG4gICAqIHVzZSB0aGUgYGdyYW50UHV0QWNsYCBtZXRob2QuXG4gICAqXG4gICAqIEBwYXJhbSBpZGVudGl0eSBUaGUgcHJpbmNpcGFsXG4gICAqIEBwYXJhbSBvYmplY3RzS2V5UGF0dGVybiBSZXN0cmljdCB0aGUgcGVybWlzc2lvbiB0byBhIGNlcnRhaW4ga2V5IHBhdHRlcm4gKGRlZmF1bHQgJyonKS4gUGFyYW1ldGVyIHR5cGUgaXMgYGFueWAgYnV0IGBzdHJpbmdgIHNob3VsZCBiZSBwYXNzZWQgaW4uXG4gICAqIEBwYXJhbSBhbGxvd2VkQWN0aW9uUGF0dGVybnMgUmVzdHJpY3QgdGhlIHBlcm1pc3Npb25zIHRvIGNlcnRhaW4gbGlzdCBvZiBhY3Rpb24gcGF0dGVybnNcbiAgICovXG4gIGdyYW50V3JpdGUoXG4gICAgaWRlbnRpdHk6IGlhbS5JR3JhbnRhYmxlLFxuICAgIG9iamVjdHNLZXlQYXR0ZXJuPzogYW55LFxuICAgIGFsbG93ZWRBY3Rpb25QYXR0ZXJucz86IHN0cmluZ1tdLFxuICApOiBpYW0uR3JhbnQ7XG5cbiAgLyoqXG4gICAqIEdyYW50cyBzMzpQdXRPYmplY3QqIGFuZCBzMzpBYm9ydCogcGVybWlzc2lvbnMgZm9yIHRoaXMgYnVja2V0IHRvIGFuIElBTSBwcmluY2lwYWwuXG4gICAqXG4gICAqIElmIGVuY3J5cHRpb24gaXMgdXNlZCwgcGVybWlzc2lvbiB0byB1c2UgdGhlIGtleSB0byBlbmNyeXB0IHRoZSBjb250ZW50c1xuICAgKiBvZiB3cml0dGVuIGZpbGVzIHdpbGwgYWxzbyBiZSBncmFudGVkIHRvIHRoZSBzYW1lIHByaW5jaXBhbC5cbiAgICogQHBhcmFtIGlkZW50aXR5IFRoZSBwcmluY2lwYWxcbiAgICogQHBhcmFtIG9iamVjdHNLZXlQYXR0ZXJuIFJlc3RyaWN0IHRoZSBwZXJtaXNzaW9uIHRvIGEgY2VydGFpbiBrZXkgcGF0dGVybiAoZGVmYXVsdCAnKicpLiBQYXJhbWV0ZXIgdHlwZSBpcyBgYW55YCBidXQgYHN0cmluZ2Agc2hvdWxkIGJlIHBhc3NlZCBpbi5cbiAgICovXG4gIGdyYW50UHV0KGlkZW50aXR5OiBpYW0uSUdyYW50YWJsZSwgb2JqZWN0c0tleVBhdHRlcm4/OiBhbnkpOiBpYW0uR3JhbnQ7XG5cbiAgLyoqXG4gICAqIEdyYW50IHRoZSBnaXZlbiBJQU0gaWRlbnRpdHkgcGVybWlzc2lvbnMgdG8gbW9kaWZ5IHRoZSBBQ0xzIG9mIG9iamVjdHMgaW4gdGhlIGdpdmVuIEJ1Y2tldC5cbiAgICpcbiAgICogY2FsbGluZyBgZ3JhbnRXcml0ZWAgb3IgYGdyYW50UmVhZFdyaXRlYCBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9ucyB0byBtb2RpZnkgdGhlIEFDTHMgb2YgdGhlIG9iamVjdHM7XG4gICAqIGluIHRoaXMgY2FzZSwgaWYgeW91IG5lZWQgdG8gbW9kaWZ5IG9iamVjdCBBQ0xzLCBjYWxsIHRoaXMgbWV0aG9kIGV4cGxpY2l0bHkuXG4gICAqXG4gICAqIEBwYXJhbSBpZGVudGl0eSBUaGUgcHJpbmNpcGFsXG4gICAqIEBwYXJhbSBvYmplY3RzS2V5UGF0dGVybiBSZXN0cmljdCB0aGUgcGVybWlzc2lvbiB0byBhIGNlcnRhaW4ga2V5IHBhdHRlcm4gKGRlZmF1bHQgJyonKVxuICAgKi9cbiAgZ3JhbnRQdXRBY2woaWRlbnRpdHk6IGlhbS5JR3JhbnRhYmxlLCBvYmplY3RzS2V5UGF0dGVybj86IHN0cmluZyk6IGlhbS5HcmFudDtcblxuICAvKipcbiAgICogR3JhbnRzIHMzOkRlbGV0ZU9iamVjdCogcGVybWlzc2lvbiB0byBhbiBJQU0gcHJpbmNpcGFsIGZvciBvYmplY3RzXG4gICAqIGluIHRoaXMgYnVja2V0LlxuICAgKlxuICAgKiBAcGFyYW0gaWRlbnRpdHkgVGhlIHByaW5jaXBhbFxuICAgKiBAcGFyYW0gb2JqZWN0c0tleVBhdHRlcm4gUmVzdHJpY3QgdGhlIHBlcm1pc3Npb24gdG8gYSBjZXJ0YWluIGtleSBwYXR0ZXJuIChkZWZhdWx0ICcqJykuIFBhcmFtZXRlciB0eXBlIGlzIGBhbnlgIGJ1dCBgc3RyaW5nYCBzaG91bGQgYmUgcGFzc2VkIGluLlxuICAgKi9cbiAgZ3JhbnREZWxldGUoaWRlbnRpdHk6IGlhbS5JR3JhbnRhYmxlLCBvYmplY3RzS2V5UGF0dGVybj86IGFueSk6IGlhbS5HcmFudDtcblxuICAvKipcbiAgICogR3JhbnRzIHJlYWQvd3JpdGUgcGVybWlzc2lvbnMgZm9yIHRoaXMgYnVja2V0IGFuZCBpdCdzIGNvbnRlbnRzIHRvIGFuIElBTVxuICAgKiBwcmluY2lwYWwgKFJvbGUvR3JvdXAvVXNlcikuXG4gICAqXG4gICAqIElmIGFuIGVuY3J5cHRpb24ga2V5IGlzIHVzZWQsIHBlcm1pc3Npb24gdG8gdXNlIHRoZSBrZXkgZm9yXG4gICAqIGVuY3J5cHQvZGVjcnlwdCB3aWxsIGFsc28gYmUgZ3JhbnRlZC5cbiAgICpcbiAgICogVGhpcyBkb2VzIG5vdCBpbmNsdWRlIGBzMzpQdXRPYmplY3RBY2xgLCB3aGljaCBjb3VsZCBiZSB1c2VkIHRvIGdyYW50IHJlYWQvd3JpdGUgb2JqZWN0IGFjY2VzcyB0byBJQU0gcHJpbmNpcGFscyBpbiBvdGhlciBhY2NvdW50cy5cbiAgICpcbiAgICogSWYgeW91IG5lZWQgdGhlIHByaW5jaXBhbCB0byBoYXZlIHBlcm1pc3Npb25zIHRvIG1vZGlmeSB0aGUgQUNMcyxcbiAgICogdXNlIHRoZSBgZ3JhbnRQdXRBY2xgIG1ldGhvZC5cbiAgICpcbiAgICogQHBhcmFtIGlkZW50aXR5IFRoZSBwcmluY2lwYWxcbiAgICogQHBhcmFtIG9iamVjdHNLZXlQYXR0ZXJuIFJlc3RyaWN0IHRoZSBwZXJtaXNzaW9uIHRvIGEgY2VydGFpbiBrZXkgcGF0dGVybiAoZGVmYXVsdCAnKicpLiBQYXJhbWV0ZXIgdHlwZSBpcyBgYW55YCBidXQgYHN0cmluZ2Agc2hvdWxkIGJlIHBhc3NlZCBpbi5cbiAgICovXG4gIGdyYW50UmVhZFdyaXRlKGlkZW50aXR5OiBpYW0uSUdyYW50YWJsZSwgb2JqZWN0c0tleVBhdHRlcm4/OiBhbnkpOiBpYW0uR3JhbnQ7XG5cbiAgLy8gLyoqXG4gIC8vICAqIEFsbG93cyB1bnJlc3RyaWN0ZWQgYWNjZXNzIHRvIG9iamVjdHMgZnJvbSB0aGlzIGJ1Y2tldC5cbiAgLy8gICpcbiAgLy8gICogSU1QT1JUQU5UOiBUaGlzIHBlcm1pc3Npb24gYWxsb3dzIGFueW9uZSB0byBwZXJmb3JtIGFjdGlvbnMgb24gUzMgb2JqZWN0c1xuICAvLyAgKiBpbiB0aGlzIGJ1Y2tldCwgd2hpY2ggaXMgdXNlZnVsIGZvciB3aGVuIHlvdSBjb25maWd1cmUgeW91ciBidWNrZXQgYXMgYVxuICAvLyAgKiB3ZWJzaXRlIGFuZCB3YW50IGV2ZXJ5b25lIHRvIGJlIGFibGUgdG8gcmVhZCBvYmplY3RzIGluIHRoZSBidWNrZXQgd2l0aG91dFxuICAvLyAgKiBuZWVkaW5nIHRvIGF1dGhlbnRpY2F0ZS5cbiAgLy8gICpcbiAgLy8gICogV2l0aG91dCBhcmd1bWVudHMsIHRoaXMgbWV0aG9kIHdpbGwgZ3JhbnQgcmVhZCAoXCJzMzpHZXRPYmplY3RcIikgYWNjZXNzIHRvXG4gIC8vICAqIGFsbCBvYmplY3RzIChcIipcIikgaW4gdGhlIGJ1Y2tldC5cbiAgLy8gICpcbiAgLy8gICogVGhlIG1ldGhvZCByZXR1cm5zIHRoZSBgaWFtLkdyYW50YCBvYmplY3QsIHdoaWNoIGNhbiB0aGVuIGJlIG1vZGlmaWVkXG4gIC8vICAqIGFzIG5lZWRlZC4gRm9yIGV4YW1wbGUsIHlvdSBjYW4gYWRkIGEgY29uZGl0aW9uIHRoYXQgd2lsbCByZXN0cmljdCBhY2Nlc3Mgb25seVxuICAvLyAgKiB0byBhbiBJUHY0IHJhbmdlIGxpa2UgdGhpczpcbiAgLy8gICpcbiAgLy8gICogICAgIGNvbnN0IGdyYW50ID0gYnVja2V0LmdyYW50UHVibGljQWNjZXNzKCk7XG4gIC8vICAqICAgICBncmFudC5yZXNvdXJjZVN0YXRlbWVudCEuYWRkQ29uZGl0aW9uKOKAmElwQWRkcmVzc+KAmSwgeyDigJxhd3M6U291cmNlSXDigJ06IOKAnDU0LjI0MC4xNDMuMC8yNOKAnSB9KTtcbiAgLy8gICpcbiAgLy8gICpcbiAgLy8gICogQHBhcmFtIGtleVByZWZpeCB0aGUgcHJlZml4IG9mIFMzIG9iamVjdCBrZXlzIChlLmcuIGBob21lLypgKS4gRGVmYXVsdCBpcyBcIipcIi5cbiAgLy8gICogQHBhcmFtIGFsbG93ZWRBY3Rpb25zIHRoZSBzZXQgb2YgUzMgYWN0aW9ucyB0byBhbGxvdy4gRGVmYXVsdCBpcyBcInMzOkdldE9iamVjdFwiLlxuICAvLyAgKiBAcmV0dXJucyBUaGUgYGlhbS5Qb2xpY3lTdGF0ZW1lbnRgIG9iamVjdCwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gYXBwbHkgZS5nLiBjb25kaXRpb25zLlxuICAvLyAgKi9cbiAgLy8gZ3JhbnRQdWJsaWNBY2Nlc3Moa2V5UHJlZml4Pzogc3RyaW5nLCAuLi5hbGxvd2VkQWN0aW9uczogc3RyaW5nW10pOiBpYW0uR3JhbnQ7XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBidWNrZXQgbm90aWZpY2F0aW9uIGV2ZW50IGRlc3RpbmF0aW9uLlxuICAgKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50IHRvIHRyaWdnZXIgdGhlIG5vdGlmaWNhdGlvblxuICAgKiBAcGFyYW0gZGVzdCBUaGUgbm90aWZpY2F0aW9uIGRlc3RpbmF0aW9uIChMYW1iZGEsIFNOUyBUb3BpYyBvciBTUVMgUXVldWUpXG4gICAqXG4gICAqIEBwYXJhbSBmaWx0ZXJzIFMzIG9iamVjdCBrZXkgZmlsdGVyIHJ1bGVzIHRvIGRldGVybWluZSB3aGljaCBvYmplY3RzXG4gICAqIHRyaWdnZXIgdGhpcyBldmVudC4gRWFjaCBmaWx0ZXIgbXVzdCBpbmNsdWRlIGEgYHByZWZpeGAgYW5kL29yIGBzdWZmaXhgXG4gICAqIHRoYXQgd2lsbCBiZSBtYXRjaGVkIGFnYWluc3QgdGhlIHMzIG9iamVjdCBrZXkuIFJlZmVyIHRvIHRoZSBTMyBEZXZlbG9wZXIgR3VpZGVcbiAgICogZm9yIGRldGFpbHMgYWJvdXQgYWxsb3dlZCBmaWx0ZXIgcnVsZXMuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC9kZXYvTm90aWZpY2F0aW9uSG93VG8uaHRtbCNub3RpZmljYXRpb24taG93LXRvLWZpbHRlcmluZ1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiAgICBkZWNsYXJlIGNvbnN0IG15TGFtYmRhOiBsYW1iZGEuRnVuY3Rpb247XG4gICAqICAgIGNvbnN0IGJ1Y2tldCA9IG5ldyBzMy5CdWNrZXQodGhpcywgJ015QnVja2V0Jyk7XG4gICAqICAgIGJ1Y2tldC5hZGRFdmVudE5vdGlmaWNhdGlvbihzMy5FdmVudFR5cGUuT0JKRUNUX0NSRUFURUQsIG5ldyBzM24uTGFtYmRhRGVzdGluYXRpb24obXlMYW1iZGEpLCB7cHJlZml4OiAnaG9tZS9teXVzZXJuYW1lLyonfSlcbiAgICpcbiAgICogQHNlZVxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L2Rldi9Ob3RpZmljYXRpb25Ib3dUby5odG1sXG4gICAqL1xuICBhZGRFdmVudE5vdGlmaWNhdGlvbihcbiAgICBldmVudDogRXZlbnRUeXBlLFxuICAgIGRlc3Q6IElCdWNrZXROb3RpZmljYXRpb25EZXN0aW5hdGlvbixcbiAgICAuLi5maWx0ZXJzOiBOb3RpZmljYXRpb25LZXlGaWx0ZXJbXVxuICApOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBTdWJzY3JpYmVzIGEgZGVzdGluYXRpb24gdG8gcmVjZWl2ZSBub3RpZmljYXRpb25zIHdoZW4gYW4gb2JqZWN0IGlzXG4gICAqIGNyZWF0ZWQgaW4gdGhlIGJ1Y2tldC4gVGhpcyBpcyBpZGVudGljYWwgdG8gY2FsbGluZ1xuICAgKiBgb25FdmVudChzMy5FdmVudFR5cGUuT0JKRUNUX0NSRUFURUQpYC5cbiAgICpcbiAgICogQHBhcmFtIGRlc3QgVGhlIG5vdGlmaWNhdGlvbiBkZXN0aW5hdGlvbiAoc2VlIG9uRXZlbnQpXG4gICAqIEBwYXJhbSBmaWx0ZXJzIEZpbHRlcnMgKHNlZSBvbkV2ZW50KVxuICAgKi9cbiAgYWRkT2JqZWN0Q3JlYXRlZE5vdGlmaWNhdGlvbihcbiAgICBkZXN0OiBJQnVja2V0Tm90aWZpY2F0aW9uRGVzdGluYXRpb24sXG4gICAgLi4uZmlsdGVyczogTm90aWZpY2F0aW9uS2V5RmlsdGVyW11cbiAgKTogdm9pZDtcblxuICAvKipcbiAgICogU3Vic2NyaWJlcyBhIGRlc3RpbmF0aW9uIHRvIHJlY2VpdmUgbm90aWZpY2F0aW9ucyB3aGVuIGFuIG9iamVjdCBpc1xuICAgKiByZW1vdmVkIGZyb20gdGhlIGJ1Y2tldC4gVGhpcyBpcyBpZGVudGljYWwgdG8gY2FsbGluZ1xuICAgKiBgb25FdmVudChFdmVudFR5cGUuT0JKRUNUX1JFTU9WRUQpYC5cbiAgICpcbiAgICogQHBhcmFtIGRlc3QgVGhlIG5vdGlmaWNhdGlvbiBkZXN0aW5hdGlvbiAoc2VlIG9uRXZlbnQpXG4gICAqIEBwYXJhbSBmaWx0ZXJzIEZpbHRlcnMgKHNlZSBvbkV2ZW50KVxuICAgKi9cbiAgYWRkT2JqZWN0UmVtb3ZlZE5vdGlmaWNhdGlvbihcbiAgICBkZXN0OiBJQnVja2V0Tm90aWZpY2F0aW9uRGVzdGluYXRpb24sXG4gICAgLi4uZmlsdGVyczogTm90aWZpY2F0aW9uS2V5RmlsdGVyW11cbiAgKTogdm9pZDtcblxuICAvKipcbiAgICogRW5hYmxlcyBldmVudCBicmlkZ2Ugbm90aWZpY2F0aW9uLCBjYXVzaW5nIGFsbCBldmVudHMgYmVsb3cgdG8gYmUgc2VudCB0byBFdmVudEJyaWRnZTpcbiAgICpcbiAgICogLSBPYmplY3QgRGVsZXRlZCAoRGVsZXRlT2JqZWN0KVxuICAgKiAtIE9iamVjdCBEZWxldGVkIChMaWZlY3ljbGUgZXhwaXJhdGlvbilcbiAgICogLSBPYmplY3QgUmVzdG9yZSBJbml0aWF0ZWRcbiAgICogLSBPYmplY3QgUmVzdG9yZSBDb21wbGV0ZWRcbiAgICogLSBPYmplY3QgUmVzdG9yZSBFeHBpcmVkXG4gICAqIC0gT2JqZWN0IFN0b3JhZ2UgQ2xhc3MgQ2hhbmdlZFxuICAgKiAtIE9iamVjdCBBY2Nlc3MgVGllciBDaGFuZ2VkXG4gICAqIC0gT2JqZWN0IEFDTCBVcGRhdGVkXG4gICAqIC0gT2JqZWN0IFRhZ3MgQWRkZWRcbiAgICogLSBPYmplY3QgVGFncyBEZWxldGVkXG4gICAqL1xuICBlbmFibGVFdmVudEJyaWRnZU5vdGlmaWNhdGlvbigpOiB2b2lkO1xufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQnVja2V0QmFzZSBleHRlbmRzIEF3c0NvbnN0cnVjdEJhc2UgaW1wbGVtZW50cyBJQnVja2V0IHtcbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IGJ1Y2tldEFybjogc3RyaW5nO1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgYnVja2V0TmFtZTogc3RyaW5nO1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgd2Vic2l0ZURvbWFpbk5hbWU/OiBzdHJpbmc7XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBidWNrZXREb21haW5OYW1lOiBzdHJpbmc7XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBidWNrZXRSZWdpb25hbERvbWFpbk5hbWU6IHN0cmluZztcbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IHdlYnNpdGVFbmRwb2ludD86IHN0cmluZztcbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IHB1YmxpYz86IGJvb2xlYW47XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSB2ZXJzaW9uZWQ6IGJvb2xlYW47XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBob3N0ZWRab25lSWQ6IHN0cmluZztcbiAgLyoqXG4gICAqIE9wdGlvbmFsIEtNUyBlbmNyeXB0aW9uIGtleSBhc3NvY2lhdGVkIHdpdGggdGhpcyBidWNrZXQuXG4gICAqL1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgZW5jcnlwdGlvbktleT86IGttcy5JS2V5O1xuICBwdWJsaWMgZ2V0IGJ1Y2tldE91dHB1dHMoKTogQnVja2V0T3V0cHV0cyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IHRoaXMuYnVja2V0TmFtZSxcbiAgICAgIGFybjogdGhpcy5idWNrZXRBcm4sXG4gICAgICBkb21haW5OYW1lOiB0aGlzLmJ1Y2tldERvbWFpbk5hbWUsXG4gICAgICByZWdpb25hbERvbWFpbk5hbWU6IHRoaXMuYnVja2V0UmVnaW9uYWxEb21haW5OYW1lLFxuICAgICAgd2Vic2l0ZURvbWFpbk5hbWU6IHRoaXMud2Vic2l0ZURvbWFpbk5hbWUsXG4gICAgICB3ZWJzaXRlVXJsOiB0aGlzLndlYnNpdGVFbmRwb2ludCxcbiAgICAgIG9yaWdpbkFjY2Vzc0lkZW50aXR5OlxuICAgICAgICB0aGlzLm9yaWdpbkFjY2Vzc0lkZW50aXR5Py5jbG91ZEZyb250T3JpZ2luQWNjZXNzSWRlbnRpdHlQYXRoLFxuICAgICAgZW5jcnlwdGlvbktleTogdGhpcy5lbmNyeXB0aW9uS2V5Py5rZXlPdXRwdXRzLFxuICAgIH07XG4gIH1cbiAgcHVibGljIGdldCBvdXRwdXRzKCk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgIHJldHVybiB0aGlzLmJ1Y2tldE91dHB1dHM7XG4gIH1cbiAgLy8gcHJvdGVjdGVkIGFic3RyYWN0IHJlYWRvbmx5IHJlc291cmNlOlxuICAvLyAgIHwgczNCdWNrZXQuUzNCdWNrZXRcbiAgLy8gICB8IGRhdGFBd3NTM0J1Y2tldC5EYXRhQXdzUzNCdWNrZXQ7XG4gIHByb3RlY3RlZCBhYnN0cmFjdCByZWFkb25seSBvcmlnaW5BY2Nlc3NJZGVudGl0eT86IE9yaWdpbkFjY2Vzc0lkZW50aXR5O1xuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHJvdGVjdGVkIGFic3RyYWN0IHJlYWRvbmx5IF9pc1dlYnNpdGU6IGJvb2xlYW47XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHJpdmF0ZSBzb3VyY2VTbGVlcD86IHNsZWVwLlNsZWVwO1xuICAvKiogQGludGVybmFsICovXG4gIHByaXZhdGUgcmVhZG9ubHkgc291cmNlczogU291cmNlSW5kZXhbXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVzb3VyY2UgcG9saWN5IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGJ1Y2tldC5cbiAgICpcbiAgICogSWYgYGF1dG9DcmVhdGVQb2xpY3lgIGlzIHRydWUsIGEgYEJ1Y2tldFBvbGljeWAgd2lsbCBiZSBjcmVhdGVkIHVwb24gdGhlXG4gICAqIGZpcnN0IGNhbGwgdG8gYWRkVG9SZXNvdXJjZVBvbGljeShzKS5cbiAgICovXG4gIHB1YmxpYyBhYnN0cmFjdCBwb2xpY3k/OiBCdWNrZXRQb2xpY3k7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiBhIGJ1Y2tldCByZXNvdXJjZSBwb2xpY3kgc2hvdWxkIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCB1cG9uXG4gICAqIHRoZSBmaXJzdCBjYWxsIHRvIGBhZGRUb1Jlc291cmNlUG9saWN5YC5cbiAgICovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBhdXRvQ3JlYXRlUG9saWN5OiBib29sZWFuO1xuXG4gIC8vIC8qKlxuICAvLyAgKiBXaGV0aGVyIHRvIGRpc2FsbG93IHB1YmxpYyBhY2Nlc3NcbiAgLy8gICovXG4gIC8vIHByb3RlY3RlZCBhYnN0cmFjdCBkaXNhbGxvd1B1YmxpY0FjY2Vzcz86IGJvb2xlYW47XG5cbiAgcHJpdmF0ZSBub3RpZmljYXRpb25zPzogQnVja2V0Tm90aWZpY2F0aW9ucztcblxuICBwcm90ZWN0ZWQgbm90aWZpY2F0aW9uc0hhbmRsZXJSb2xlPzogaWFtLklSb2xlO1xuXG4gIHByb3RlY3RlZCBub3RpZmljYXRpb25zU2tpcERlc3RpbmF0aW9uVmFsaWRhdGlvbj86IGJvb2xlYW47XG5cbiAgLy8gVE9ETzogcmUtYWRkIG93bmVyc2hpcCBjb250cm9sIHBhcnNpbmcgYmFzZWQgb24gYWNjZXNzIGNvbnRyb2xzXG4gIC8vIHJlZjogaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2Jsb2IvdjIuMTYwLjAvcGFja2FnZXMvYXdzLWNkay1saWIvYXdzLXMzL2xpYi9idWNrZXQudHMjTDIzNjNcbiAgLy8gcHJvdGVjdGVkIG9iamVjdE93bmVyc2hpcD86IE9iamVjdE93bmVyc2hpcDtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogQXdzQ29uc3RydWN0UHJvcHMgPSB7fSkge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwgcHJvcHMpO1xuXG4gICAgdGhpcy5ub2RlLmFkZFZhbGlkYXRpb24oe1xuICAgICAgdmFsaWRhdGU6ICgpID0+IHRoaXMucG9saWN5Py5kb2N1bWVudC52YWxpZGF0ZUZvclJlc291cmNlUG9saWN5KCkgPz8gW10sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHN0YXRlbWVudCB0byB0aGUgcmVzb3VyY2UgcG9saWN5IGZvciBhIHByaW5jaXBhbCAoaS5lLlxuICAgKiBhY2NvdW50L3JvbGUvc2VydmljZSkgdG8gcGVyZm9ybSBhY3Rpb25zIG9uIHRoaXMgYnVja2V0IGFuZC9vciBpdHNcbiAgICogY29udGVudHMuIFVzZSBgYnVja2V0QXJuYCBhbmQgYGFybkZvck9iamVjdHMoa2V5cylgIHRvIG9idGFpbiBBUk5zIGZvclxuICAgKiB0aGlzIGJ1Y2tldCBvciBvYmplY3RzLlxuICAgKlxuICAgKiBOb3RlIHRoYXQgdGhlIHBvbGljeSBzdGF0ZW1lbnQgbWF5IG9yIG1heSBub3QgYmUgYWRkZWQgdG8gdGhlIHBvbGljeS5cbiAgICogRm9yIGV4YW1wbGUsIHdoZW4gYW4gYElCdWNrZXRgIGlzIGNyZWF0ZWQgZnJvbSBhbiBleGlzdGluZyBidWNrZXQsXG4gICAqIGl0J3Mgbm90IHBvc3NpYmxlIHRvIHRlbGwgd2hldGhlciB0aGUgYnVja2V0IGFscmVhZHkgaGFzIGEgcG9saWN5XG4gICAqIGF0dGFjaGVkLCBsZXQgYWxvbmUgdG8gcmUtdXNlIHRoYXQgcG9saWN5IHRvIGFkZCBtb3JlIHN0YXRlbWVudHMgdG8gaXQuXG4gICAqIFNvIGl0J3Mgc2FmZXN0IHRvIGRvIG5vdGhpbmcgaW4gdGhlc2UgY2FzZXMuXG4gICAqXG4gICAqIEBwYXJhbSBwZXJtaXNzaW9uIHRoZSBwb2xpY3kgc3RhdGVtZW50IHRvIGJlIGFkZGVkIHRvIHRoZSBidWNrZXQnc1xuICAgKiBwb2xpY3kuXG4gICAqIEByZXR1cm5zIG1ldGFkYXRhIGFib3V0IHRoZSBleGVjdXRpb24gb2YgdGhpcyBtZXRob2QuIElmIHRoZSBwb2xpY3lcbiAgICogd2FzIG5vdCBhZGRlZCwgdGhlIHZhbHVlIG9mIGBzdGF0ZW1lbnRBZGRlZGAgd2lsbCBiZSBgZmFsc2VgLiBZb3VcbiAgICogc2hvdWxkIGFsd2F5cyBjaGVjayB0aGlzIHZhbHVlIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBvcGVyYXRpb24gd2FzXG4gICAqIGFjdHVhbGx5IGNhcnJpZWQgb3V0LiBPdGhlcndpc2UsIHN5bnRoZXNpcyBhbmQgZGVwbG95IHdpbGwgdGVybWluYXRlXG4gICAqIHNpbGVudGx5LCB3aGljaCBtYXkgYmUgY29uZnVzaW5nLlxuICAgKi9cbiAgcHVibGljIGFkZFRvUmVzb3VyY2VQb2xpY3koXG4gICAgcGVybWlzc2lvbjogaWFtLlBvbGljeVN0YXRlbWVudCxcbiAgKTogaWFtLkFkZFRvUmVzb3VyY2VQb2xpY3lSZXN1bHQge1xuICAgIGlmICghdGhpcy5wb2xpY3kgJiYgdGhpcy5hdXRvQ3JlYXRlUG9saWN5KSB7XG4gICAgICB0aGlzLnBvbGljeSA9IG5ldyBCdWNrZXRQb2xpY3kodGhpcywgXCJQb2xpY3lcIiwgeyBidWNrZXQ6IHRoaXMgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucG9saWN5KSB7XG4gICAgICB0aGlzLnBvbGljeS5kb2N1bWVudC5hZGRTdGF0ZW1lbnRzKHBlcm1pc3Npb24pO1xuICAgICAgcmV0dXJuIHsgc3RhdGVtZW50QWRkZWQ6IHRydWUsIHBvbGljeURlcGVuZGFibGU6IHRoaXMucG9saWN5IH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgc3RhdGVtZW50QWRkZWQ6IGZhbHNlIH07XG4gIH1cblxuICAvKipcbiAgICogR3JhbnQgcmVhZCBwZXJtaXNzaW9ucyBmb3IgdGhpcyBidWNrZXQgYW5kIGl0J3MgY29udGVudHMgdG8gYW4gSUFNXG4gICAqIHByaW5jaXBhbCAoUm9sZS9Hcm91cC9Vc2VyKS5cbiAgICpcbiAgICogSWYgZW5jcnlwdGlvbiBpcyB1c2VkLCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUga2V5IHRvIGRlY3J5cHQgdGhlIGNvbnRlbnRzXG4gICAqIG9mIHRoZSBidWNrZXQgd2lsbCBhbHNvIGJlIGdyYW50ZWQgdG8gdGhlIHNhbWUgcHJpbmNpcGFsLlxuICAgKlxuICAgKiBAcGFyYW0gaWRlbnRpdHkgVGhlIHByaW5jaXBhbFxuICAgKiBAcGFyYW0gb2JqZWN0c0tleVBhdHRlcm4gUmVzdHJpY3QgdGhlIHBlcm1pc3Npb24gdG8gYSBjZXJ0YWluIGtleSBwYXR0ZXJuIChkZWZhdWx0ICcqJykuIFBhcmFtZXRlciB0eXBlIGlzIGBhbnlgIGJ1dCBgc3RyaW5nYCBzaG91bGQgYmUgcGFzc2VkIGluLlxuICAgKi9cbiAgcHVibGljIGdyYW50UmVhZChpZGVudGl0eTogaWFtLklHcmFudGFibGUsIG9iamVjdHNLZXlQYXR0ZXJuOiBhbnkgPSBcIipcIikge1xuICAgIHJldHVybiB0aGlzLmdyYW50KFxuICAgICAgaWRlbnRpdHksXG4gICAgICBwZXJtcy5CVUNLRVRfUkVBRF9BQ1RJT05TLFxuICAgICAgcGVybXMuS0VZX1JFQURfQUNUSU9OUyxcbiAgICAgIHRoaXMuYnVja2V0QXJuLFxuICAgICAgdGhpcy5hcm5Gb3JPYmplY3RzKG9iamVjdHNLZXlQYXR0ZXJuKSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGdyYW50V3JpdGUoXG4gICAgaWRlbnRpdHk6IGlhbS5JR3JhbnRhYmxlLFxuICAgIG9iamVjdHNLZXlQYXR0ZXJuOiBhbnkgPSBcIipcIixcbiAgICBhbGxvd2VkQWN0aW9uUGF0dGVybnM6IHN0cmluZ1tdID0gW10sXG4gICkge1xuICAgIGNvbnN0IGdyYW50ZWRXcml0ZUFjdGlvbnMgPVxuICAgICAgYWxsb3dlZEFjdGlvblBhdHRlcm5zLmxlbmd0aCA+IDBcbiAgICAgICAgPyBhbGxvd2VkQWN0aW9uUGF0dGVybnNcbiAgICAgICAgOiB0aGlzLndyaXRlQWN0aW9ucztcbiAgICByZXR1cm4gdGhpcy5ncmFudChcbiAgICAgIGlkZW50aXR5LFxuICAgICAgZ3JhbnRlZFdyaXRlQWN0aW9ucyxcbiAgICAgIHBlcm1zLktFWV9XUklURV9BQ1RJT05TLFxuICAgICAgdGhpcy5idWNrZXRBcm4sXG4gICAgICB0aGlzLmFybkZvck9iamVjdHMob2JqZWN0c0tleVBhdHRlcm4pLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHMzOlB1dE9iamVjdCogYW5kIHMzOkFib3J0KiBwZXJtaXNzaW9ucyBmb3IgdGhpcyBidWNrZXQgdG8gYW4gSUFNIHByaW5jaXBhbC5cbiAgICpcbiAgICogSWYgZW5jcnlwdGlvbiBpcyB1c2VkLCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUga2V5IHRvIGVuY3J5cHQgdGhlIGNvbnRlbnRzXG4gICAqIG9mIHdyaXR0ZW4gZmlsZXMgd2lsbCBhbHNvIGJlIGdyYW50ZWQgdG8gdGhlIHNhbWUgcHJpbmNpcGFsLlxuICAgKiBAcGFyYW0gaWRlbnRpdHkgVGhlIHByaW5jaXBhbFxuICAgKiBAcGFyYW0gb2JqZWN0c0tleVBhdHRlcm4gUmVzdHJpY3QgdGhlIHBlcm1pc3Npb24gdG8gYSBjZXJ0YWluIGtleSBwYXR0ZXJuIChkZWZhdWx0ICcqJykuIFBhcmFtZXRlciB0eXBlIGlzIGBhbnlgIGJ1dCBgc3RyaW5nYCBzaG91bGQgYmUgcGFzc2VkIGluLlxuICAgKi9cbiAgcHVibGljIGdyYW50UHV0KGlkZW50aXR5OiBpYW0uSUdyYW50YWJsZSwgb2JqZWN0c0tleVBhdHRlcm46IGFueSA9IFwiKlwiKSB7XG4gICAgcmV0dXJuIHRoaXMuZ3JhbnQoXG4gICAgICBpZGVudGl0eSxcbiAgICAgIHBlcm1zLkJVQ0tFVF9QVVRfQUNUSU9OUyxcbiAgICAgIHBlcm1zLktFWV9XUklURV9BQ1RJT05TLFxuICAgICAgdGhpcy5hcm5Gb3JPYmplY3RzKG9iamVjdHNLZXlQYXR0ZXJuKSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGdyYW50UHV0QWNsKFxuICAgIGlkZW50aXR5OiBpYW0uSUdyYW50YWJsZSxcbiAgICBvYmplY3RzS2V5UGF0dGVybjogc3RyaW5nID0gXCIqXCIsXG4gICkge1xuICAgIHJldHVybiB0aGlzLmdyYW50KFxuICAgICAgaWRlbnRpdHksXG4gICAgICBwZXJtcy5CVUNLRVRfUFVUX0FDTF9BQ1RJT05TLFxuICAgICAgW10sXG4gICAgICB0aGlzLmFybkZvck9iamVjdHMob2JqZWN0c0tleVBhdHRlcm4pLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHMzOkRlbGV0ZU9iamVjdCogcGVybWlzc2lvbiB0byBhbiBJQU0gcHJpbmNpcGFsIGZvciBvYmplY3RzXG4gICAqIGluIHRoaXMgYnVja2V0LlxuICAgKlxuICAgKiBAcGFyYW0gaWRlbnRpdHkgVGhlIHByaW5jaXBhbFxuICAgKiBAcGFyYW0gb2JqZWN0c0tleVBhdHRlcm4gUmVzdHJpY3QgdGhlIHBlcm1pc3Npb24gdG8gYSBjZXJ0YWluIGtleSBwYXR0ZXJuIChkZWZhdWx0ICcqJykuIFBhcmFtZXRlciB0eXBlIGlzIGBhbnlgIGJ1dCBgc3RyaW5nYCBzaG91bGQgYmUgcGFzc2VkIGluLlxuICAgKi9cbiAgcHVibGljIGdyYW50RGVsZXRlKGlkZW50aXR5OiBpYW0uSUdyYW50YWJsZSwgb2JqZWN0c0tleVBhdHRlcm46IGFueSA9IFwiKlwiKSB7XG4gICAgcmV0dXJuIHRoaXMuZ3JhbnQoXG4gICAgICBpZGVudGl0eSxcbiAgICAgIHBlcm1zLkJVQ0tFVF9ERUxFVEVfQUNUSU9OUyxcbiAgICAgIFtdLFxuICAgICAgdGhpcy5hcm5Gb3JPYmplY3RzKG9iamVjdHNLZXlQYXR0ZXJuKSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGdyYW50UmVhZFdyaXRlKFxuICAgIGlkZW50aXR5OiBpYW0uSUdyYW50YWJsZSxcbiAgICBvYmplY3RzS2V5UGF0dGVybjogYW55ID0gXCIqXCIsXG4gICkge1xuICAgIGNvbnN0IGJ1Y2tldEFjdGlvbnMgPSBwZXJtcy5CVUNLRVRfUkVBRF9BQ1RJT05TLmNvbmNhdCh0aGlzLndyaXRlQWN0aW9ucyk7XG4gICAgLy8gd2UgbmVlZCB1bmlxdWUgcGVybWlzc2lvbnMgYmVjYXVzZSBzb21lIHBlcm1pc3Npb25zIGFyZSBjb21tb24gYmV0d2VlbiByZWFkIGFuZCB3cml0ZSBrZXkgYWN0aW9uc1xuICAgIGNvbnN0IGtleUFjdGlvbnMgPSBbXG4gICAgICAuLi5uZXcgU2V0KFsuLi5wZXJtcy5LRVlfUkVBRF9BQ1RJT05TLCAuLi5wZXJtcy5LRVlfV1JJVEVfQUNUSU9OU10pLFxuICAgIF07XG5cbiAgICByZXR1cm4gdGhpcy5ncmFudChcbiAgICAgIGlkZW50aXR5LFxuICAgICAgYnVja2V0QWN0aW9ucyxcbiAgICAgIGtleUFjdGlvbnMsXG4gICAgICB0aGlzLmJ1Y2tldEFybixcbiAgICAgIHRoaXMuYXJuRm9yT2JqZWN0cyhvYmplY3RzS2V5UGF0dGVybiksXG4gICAgKTtcbiAgfVxuXG4gIC8vIFRPRE86IGN1cnJlbnRseSBvbmx5IHN1cHBvcnRlZCB0aHJvdWdoIGBwcm9wcy5wdWJsaWNgIGluIGNvbnN0cnVjdG9yLFxuICAvLyBUT0RPOiByZS1hZGQgT2JqZWN0T3duZXJzaGlwIGFuZCBCdWNrZXRBY2Nlc3NDb250cm9sXG4gIC8vIC8qKlxuICAvLyAgKiBBbGxvd3MgdW5yZXN0cmljdGVkIGFjY2VzcyB0byBvYmplY3RzIGZyb20gdGhpcyBidWNrZXQuXG4gIC8vICAqXG4gIC8vICAqIElNUE9SVEFOVDogVGhpcyBwZXJtaXNzaW9uIGFsbG93cyBhbnlvbmUgdG8gcGVyZm9ybSBhY3Rpb25zIG9uIFMzIG9iamVjdHNcbiAgLy8gICogaW4gdGhpcyBidWNrZXQsIHdoaWNoIGlzIHVzZWZ1bCBmb3Igd2hlbiB5b3UgY29uZmlndXJlIHlvdXIgYnVja2V0IGFzIGFcbiAgLy8gICogd2Vic2l0ZSBhbmQgd2FudCBldmVyeW9uZSB0byBiZSBhYmxlIHRvIHJlYWQgb2JqZWN0cyBpbiB0aGUgYnVja2V0IHdpdGhvdXRcbiAgLy8gICogbmVlZGluZyB0byBhdXRoZW50aWNhdGUuXG4gIC8vICAqXG4gIC8vICAqIFdpdGhvdXQgYXJndW1lbnRzLCB0aGlzIG1ldGhvZCB3aWxsIGdyYW50IHJlYWQgKFwiczM6R2V0T2JqZWN0XCIpIGFjY2VzcyB0b1xuICAvLyAgKiBhbGwgb2JqZWN0cyAoXCIqXCIpIGluIHRoZSBidWNrZXQuXG4gIC8vICAqXG4gIC8vICAqIFRoZSBtZXRob2QgcmV0dXJucyB0aGUgYGlhbS5HcmFudGAgb2JqZWN0LCB3aGljaCBjYW4gdGhlbiBiZSBtb2RpZmllZFxuICAvLyAgKiBhcyBuZWVkZWQuIEZvciBleGFtcGxlLCB5b3UgY2FuIGFkZCBhIGNvbmRpdGlvbiB0aGF0IHdpbGwgcmVzdHJpY3QgYWNjZXNzIG9ubHlcbiAgLy8gICogdG8gYW4gSVB2NCByYW5nZSBsaWtlIHRoaXM6XG4gIC8vICAqXG4gIC8vICAqICAgICBjb25zdCBncmFudCA9IGJ1Y2tldC5ncmFudFB1YmxpY0FjY2VzcygpO1xuICAvLyAgKiAgICAgZ3JhbnQucmVzb3VyY2VTdGF0ZW1lbnQhLmFkZENvbmRpdGlvbijigJhJcEFkZHJlc3PigJksIHsg4oCcYXdzOlNvdXJjZUlw4oCdOiDigJw1NC4yNDAuMTQzLjAvMjTigJ0gfSk7XG4gIC8vICAqXG4gIC8vICAqIE5vdGUgdGhhdCBpZiB0aGlzIGBJQnVja2V0YCByZWZlcnMgdG8gYW4gZXhpc3RpbmcgYnVja2V0LCBwb3NzaWJseSBub3RcbiAgLy8gICogbWFuYWdlZCBieSBDbG91ZEZvcm1hdGlvbiwgdGhpcyBtZXRob2Qgd2lsbCBoYXZlIG5vIGVmZmVjdCwgc2luY2UgaXQnc1xuICAvLyAgKiBpbXBvc3NpYmxlIHRvIG1vZGlmeSB0aGUgcG9saWN5IG9mIGFuIGV4aXN0aW5nIGJ1Y2tldC5cbiAgLy8gICpcbiAgLy8gICogQHBhcmFtIGtleVByZWZpeCB0aGUgcHJlZml4IG9mIFMzIG9iamVjdCBrZXlzIChlLmcuIGBob21lLypgKS4gRGVmYXVsdCBpcyBcIipcIi5cbiAgLy8gICogQHBhcmFtIGFsbG93ZWRBY3Rpb25zIHRoZSBzZXQgb2YgUzMgYWN0aW9ucyB0byBhbGxvdy4gRGVmYXVsdCBpcyBcInMzOkdldE9iamVjdFwiLlxuICAvLyAgKi9cbiAgLy8gcHVibGljIGdyYW50UHVibGljQWNjZXNzKGtleVByZWZpeCA9IFwiKlwiLCAuLi5hbGxvd2VkQWN0aW9uczogc3RyaW5nW10pIHtcbiAgLy8gICBpZiAoIXRoaXMucHVibGljKSB7XG4gIC8vICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFwiQ2Fubm90IGdyYW50IHB1YmxpYyBhY2Nlc3Mgd2hlbiAncHVibGljJyBpcyBlbmFibGVkXCIsIHRoaXMpO1xuICAvLyAgIH1cbiAgLy8gICAvLyBURE9POiBUaGlzIHNob3VsZCBjcmVhdGUgcHVibGljQWNjZXNzIHJlc291cmNlXG4gIC8vICAgYWxsb3dlZEFjdGlvbnMgPVxuICAvLyAgICAgYWxsb3dlZEFjdGlvbnMubGVuZ3RoID4gMCA/IGFsbG93ZWRBY3Rpb25zIDogW1wiczM6R2V0T2JqZWN0XCJdO1xuXG4gIC8vICAgcmV0dXJuIGlhbS5HcmFudC5hZGRUb1ByaW5jaXBhbE9yUmVzb3VyY2Uoe1xuICAvLyAgICAgYWN0aW9uczogYWxsb3dlZEFjdGlvbnMsXG4gIC8vICAgICByZXNvdXJjZUFybnM6IFt0aGlzLmFybkZvck9iamVjdHMoa2V5UHJlZml4KV0sXG4gIC8vICAgICBncmFudGVlOiBuZXcgaWFtLkFueVByaW5jaXBhbCgpLFxuICAvLyAgICAgcmVzb3VyY2U6IHRoaXMsXG4gIC8vICAgfSk7XG4gIC8vIH1cblxuICAvKipcbiAgICogQWRkcyBhIGJ1Y2tldCBub3RpZmljYXRpb24gZXZlbnQgZGVzdGluYXRpb24uXG4gICAqXG4gICAqIFMzIEJ1Y2tldHMgb25seSBzdXBwb3J0IGEgc2luZ2xlIG5vdGlmaWNhdGlvbiBjb25maWd1cmF0aW9uIHJlc291cmNlLlxuICAgKiBEZWNsYXJpbmcgbXVsdGlwbGUgYGF3c19zM19idWNrZXRfbm90aWZpY2F0aW9uYCByZXNvdXJjZXMgdG8gdGhlIHNhbWVcbiAgICogUzMgQnVja2V0IHdpbGwgY2F1c2UgYSBwZXJwZXR1YWwgZGlmZmVyZW5jZSBpbiBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBDYWxsaW5nIHRoaXMgZnVuY3Rpb24gd2lsbCBvdmVyd3JpdGUgYW55IGV4aXN0aW5nIGV2ZW50IG5vdGlmaWNhdGlvbnMgY29uZmlndXJlZFxuICAgKiBmb3IgdGhlIFMzIGJ1Y2tldCBvdXRzaWRlIG9mIHRoaXMgYmVhY29uLlxuICAgKlxuICAgKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50IHRvIHRyaWdnZXIgdGhlIG5vdGlmaWNhdGlvblxuICAgKiBAcGFyYW0gZGVzdCBUaGUgbm90aWZpY2F0aW9uIGRlc3RpbmF0aW9uIChMYW1iZGEsIFNOUyBUb3BpYyBvciBTUVMgUXVldWUpXG4gICAqXG4gICAqIEBwYXJhbSBmaWx0ZXJzIFMzIG9iamVjdCBrZXkgZmlsdGVyIHJ1bGVzIHRvIGRldGVybWluZSB3aGljaCBvYmplY3RzXG4gICAqIHRyaWdnZXIgdGhpcyBldmVudC4gRWFjaCBmaWx0ZXIgbXVzdCBpbmNsdWRlIGEgYHByZWZpeGAgYW5kL29yIGBzdWZmaXhgXG4gICAqIHRoYXQgd2lsbCBiZSBtYXRjaGVkIGFnYWluc3QgdGhlIHMzIG9iamVjdCBrZXkuIFJlZmVyIHRvIHRoZSBTMyBEZXZlbG9wZXIgR3VpZGVcbiAgICogZm9yIGRldGFpbHMgYWJvdXQgYWxsb3dlZCBmaWx0ZXIgcnVsZXMuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC9kZXYvTm90aWZpY2F0aW9uSG93VG8uaHRtbCNub3RpZmljYXRpb24taG93LXRvLWZpbHRlcmluZ1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiAgICBkZWNsYXJlIGNvbnN0IG15RnVuY3Rpb246IGNvbXB1dGUuRnVuY3Rpb247XG4gICAqICAgIGNvbnN0IGJ1Y2tldCA9IG5ldyBzdG9yYWdlLkJ1Y2tldCh0aGlzLCAnTXlCdWNrZXQnKTtcbiAgICogICAgYnVja2V0LmFkZEV2ZW50Tm90aWZpY2F0aW9uKHMzLkV2ZW50VHlwZS5PQkpFQ1RfQ1JFQVRFRCwgbmV3IHMzbi5MYW1iZGFEZXN0aW5hdGlvbihteUZ1bmN0aW9uKSwge3ByZWZpeDogJ2hvbWUvbXl1c2VybmFtZS8qJ30pO1xuICAgKlxuICAgKiBAc2VlXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25TMy9sYXRlc3QvZGV2L05vdGlmaWNhdGlvbkhvd1RvLmh0bWxcbiAgICovXG4gIHB1YmxpYyBhZGRFdmVudE5vdGlmaWNhdGlvbihcbiAgICBldmVudDogRXZlbnRUeXBlLFxuICAgIGRlc3Q6IElCdWNrZXROb3RpZmljYXRpb25EZXN0aW5hdGlvbixcbiAgICAuLi5maWx0ZXJzOiBOb3RpZmljYXRpb25LZXlGaWx0ZXJbXVxuICApIHtcbiAgICAvLyBUT0RPOiBUaGlzIGJsb2NrcyBhZGRpbmcgbm90aWZpY2F0aW9ucyBvdXRzaWRlIG9mIHRoZSBTdGFjayBvd25pbmcgdGhlIGJ1Y2tldC4uLlxuICAgIC8vIEFXUy1DREsgd29ya3MgYXJvdW5kIHRoaXMgYnkgdXNpbmcgYSBDdXN0b21SZXNvdXJjZSBoYW5kbGVyIChMYW1iZGEgZnVuY3Rpb24pIHdoaWNoIG1vZGlmaWVzXG4gICAgLy8gdGhlIGJ1Y2tldCBwb2xpY3kgaW4gcGxhY2UgKGFuZCBDRk4gZG9lcyBub3QgbWFuYWdlIHRoZSBhY3R1YWwgYnVja2V0IHBvbGljeSwgc28gbm8gdGYgc3RhdGUhKVxuICAgIHRoaXMud2l0aE5vdGlmaWNhdGlvbnMoKG5vdGlmaWNhdGlvbnMpID0+XG4gICAgICBub3RpZmljYXRpb25zLmFkZE5vdGlmaWNhdGlvbihldmVudCwgZGVzdCwgLi4uZmlsdGVycyksXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgd2l0aE5vdGlmaWNhdGlvbnMoY2I6IChub3RpZmljYXRpb25zOiBCdWNrZXROb3RpZmljYXRpb25zKSA9PiB2b2lkKSB7XG4gICAgLy8gVE9ETzogVXNlIEN1c3RvbSBSZXNvdXJjZXMgdG8gbWFuYWdlIGJ1Y2tldCBub3RpZmljYXRpb25zIG91dHNpZGUgb2YgdGhlIHN0YWNrXG4gICAgLy8gaGFuZGxlclJvbGU6IHRoaXMubm90aWZpY2F0aW9uc0hhbmRsZXJSb2xlLFxuICAgIGlmICghdGhpcy5ub3RpZmljYXRpb25zKSB7XG4gICAgICB0aGlzLm5vdGlmaWNhdGlvbnMgPSBuZXcgQnVja2V0Tm90aWZpY2F0aW9ucyh0aGlzLCBcIk5vdGlmaWNhdGlvbnNcIiwge1xuICAgICAgICBidWNrZXQ6IHRoaXMsXG4gICAgICB9KTtcbiAgICB9XG4gICAgY2IodGhpcy5ub3RpZmljYXRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJzY3JpYmVzIGEgZGVzdGluYXRpb24gdG8gcmVjZWl2ZSBub3RpZmljYXRpb25zIHdoZW4gYW4gb2JqZWN0IGlzXG4gICAqIGNyZWF0ZWQgaW4gdGhlIGJ1Y2tldC4gVGhpcyBpcyBpZGVudGljYWwgdG8gY2FsbGluZ1xuICAgKiBgb25FdmVudChFdmVudFR5cGUuT0JKRUNUX0NSRUFURUQpYC5cbiAgICpcbiAgICogQHBhcmFtIGRlc3QgVGhlIG5vdGlmaWNhdGlvbiBkZXN0aW5hdGlvbiAoc2VlIG9uRXZlbnQpXG4gICAqIEBwYXJhbSBmaWx0ZXJzIEZpbHRlcnMgKHNlZSBvbkV2ZW50KVxuICAgKi9cbiAgcHVibGljIGFkZE9iamVjdENyZWF0ZWROb3RpZmljYXRpb24oXG4gICAgZGVzdDogSUJ1Y2tldE5vdGlmaWNhdGlvbkRlc3RpbmF0aW9uLFxuICAgIC4uLmZpbHRlcnM6IE5vdGlmaWNhdGlvbktleUZpbHRlcltdXG4gICkge1xuICAgIHJldHVybiB0aGlzLmFkZEV2ZW50Tm90aWZpY2F0aW9uKFxuICAgICAgRXZlbnRUeXBlLk9CSkVDVF9DUkVBVEVELFxuICAgICAgZGVzdCxcbiAgICAgIC4uLmZpbHRlcnMsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJzY3JpYmVzIGEgZGVzdGluYXRpb24gdG8gcmVjZWl2ZSBub3RpZmljYXRpb25zIHdoZW4gYW4gb2JqZWN0IGlzXG4gICAqIHJlbW92ZWQgZnJvbSB0aGUgYnVja2V0LiBUaGlzIGlzIGlkZW50aWNhbCB0byBjYWxsaW5nXG4gICAqIGBvbkV2ZW50KEV2ZW50VHlwZS5PQkpFQ1RfUkVNT1ZFRClgLlxuICAgKlxuICAgKiBAcGFyYW0gZGVzdCBUaGUgbm90aWZpY2F0aW9uIGRlc3RpbmF0aW9uIChzZWUgb25FdmVudClcbiAgICogQHBhcmFtIGZpbHRlcnMgRmlsdGVycyAoc2VlIG9uRXZlbnQpXG4gICAqL1xuICBwdWJsaWMgYWRkT2JqZWN0UmVtb3ZlZE5vdGlmaWNhdGlvbihcbiAgICBkZXN0OiBJQnVja2V0Tm90aWZpY2F0aW9uRGVzdGluYXRpb24sXG4gICAgLi4uZmlsdGVyczogTm90aWZpY2F0aW9uS2V5RmlsdGVyW11cbiAgKSB7XG4gICAgcmV0dXJuIHRoaXMuYWRkRXZlbnROb3RpZmljYXRpb24oXG4gICAgICBFdmVudFR5cGUuT0JKRUNUX1JFTU9WRUQsXG4gICAgICBkZXN0LFxuICAgICAgLi4uZmlsdGVycyxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuYWJsZXMgZXZlbnQgYnJpZGdlIG5vdGlmaWNhdGlvbiwgY2F1c2luZyBhbGwgZXZlbnRzIGJlbG93IHRvIGJlIHNlbnQgdG8gRXZlbnRCcmlkZ2U6XG4gICAqXG4gICAqIC0gT2JqZWN0IERlbGV0ZWQgKERlbGV0ZU9iamVjdClcbiAgICogLSBPYmplY3QgRGVsZXRlZCAoTGlmZWN5Y2xlIGV4cGlyYXRpb24pXG4gICAqIC0gT2JqZWN0IFJlc3RvcmUgSW5pdGlhdGVkXG4gICAqIC0gT2JqZWN0IFJlc3RvcmUgQ29tcGxldGVkXG4gICAqIC0gT2JqZWN0IFJlc3RvcmUgRXhwaXJlZFxuICAgKiAtIE9iamVjdCBTdG9yYWdlIENsYXNzIENoYW5nZWRcbiAgICogLSBPYmplY3QgQWNjZXNzIFRpZXIgQ2hhbmdlZFxuICAgKiAtIE9iamVjdCBBQ0wgVXBkYXRlZFxuICAgKiAtIE9iamVjdCBUYWdzIEFkZGVkXG4gICAqIC0gT2JqZWN0IFRhZ3MgRGVsZXRlZFxuICAgKi9cbiAgcHVibGljIGVuYWJsZUV2ZW50QnJpZGdlTm90aWZpY2F0aW9uKCkge1xuICAgIHRoaXMud2l0aE5vdGlmaWNhdGlvbnMoKG5vdGlmaWNhdGlvbnMpID0+XG4gICAgICBub3RpZmljYXRpb25zLmVuYWJsZUV2ZW50QnJpZGdlTm90aWZpY2F0aW9uKCksXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZ3JhbnQoXG4gICAgZ3JhbnRlZTogaWFtLklHcmFudGFibGUsXG4gICAgYnVja2V0QWN0aW9uczogc3RyaW5nW10sXG4gICAga2V5QWN0aW9uczogc3RyaW5nW10sXG4gICAgcmVzb3VyY2VBcm46IHN0cmluZyxcbiAgICAuLi5vdGhlclJlc291cmNlQXJuczogc3RyaW5nW11cbiAgKSB7XG4gICAgY29uc3QgcmVzb3VyY2VzID0gW3Jlc291cmNlQXJuLCAuLi5vdGhlclJlc291cmNlQXJuc107XG5cbiAgICBjb25zdCByZXQgPSBpYW0uR3JhbnQuYWRkVG9QcmluY2lwYWxPclJlc291cmNlKHtcbiAgICAgIGdyYW50ZWUsXG4gICAgICBhY3Rpb25zOiBidWNrZXRBY3Rpb25zLFxuICAgICAgcmVzb3VyY2VBcm5zOiByZXNvdXJjZXMsXG4gICAgICByZXNvdXJjZTogdGhpcyxcbiAgICB9KTtcblxuICAgIGlmICh0aGlzLmVuY3J5cHRpb25LZXkgJiYga2V5QWN0aW9ucyAmJiBrZXlBY3Rpb25zLmxlbmd0aCAhPT0gMCkge1xuICAgICAgdGhpcy5lbmNyeXB0aW9uS2V5LmdyYW50KGdyYW50ZWUsIC4uLmtleUFjdGlvbnMpO1xuICAgIH1cblxuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICBwcml2YXRlIGdldCB3cml0ZUFjdGlvbnMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbLi4ucGVybXMuQlVDS0VUX0RFTEVURV9BQ1RJT05TLCAuLi5wZXJtcy5CVUNLRVRfUFVUX0FDVElPTlNdO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIHNvdXJjZSB0byB0aGUgYnVja2V0LlxuICAgKlxuICAgKiBAcGFyYW0gcHJvcHMgVGhlIHByb3BlcnRpZXMgb2YgdGhlIHNvdXJjZSB0byBhZGRcbiAgICovXG4gIHB1YmxpYyBhZGRTb3VyY2UocHJvcHM6IEFkZFNvdXJjZU9wdGlvbnMsIHNvdXJjZUlkPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy52ZXJzaW9uZWQpIHtcbiAgICAgIC8qKlxuICAgICAgICogSWYgeW91IGVuYWJsZSB2ZXJzaW9uaW5nIG9uIGEgYnVja2V0IGZvciB0aGUgZmlyc3QgdGltZSwgaXQgbWlnaHQgdGFrZSB1cCB0byAxNSBtaW51dGVzXG4gICAgICAgKiBmb3IgdGhlIGNoYW5nZSB0byBiZSBmdWxseSBwcm9wYWdhdGVkLiBXZSByZWNvbW1lbmQgdGhhdCB5b3Ugd2FpdCBmb3IgMTUgbWludXRlcyBhZnRlclxuICAgICAgICogZW5hYmxpbmcgdmVyc2lvbmluZyBiZWZvcmUgaXNzdWluZyB3cml0ZSBvcGVyYXRpb25zIChQVVQgb3IgREVMRVRFKSBvbiBvYmplY3RzIGluIHRoZSBidWNrZXQuXG4gICAgICAgKlxuICAgICAgICogV3JpdGUgb3BlcmF0aW9ucyBpc3N1ZWQgYmVmb3JlIHRoaXMgY29udmVyc2lvbiBpcyBjb21wbGV0ZSBtYXkgYXBwbHkgdG8gdW52ZXJzaW9uZWQgb2JqZWN0cy5cbiAgICAgICAqL1xuICAgICAgaWYgKCF0aGlzLnNvdXJjZVNsZWVwKSB7XG4gICAgICAgIHRoaXMuc291cmNlU2xlZXAgPSBuZXcgc2xlZXAuU2xlZXAodGhpcywgXCJWZXJzaW9uaW5nU2xlZXBcIiwge1xuICAgICAgICAgIGNyZWF0ZUR1cmF0aW9uOiBcIjE1bVwiLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgaW5kZXhlZFNvdXJjZSA9IHRoaXMuc291cmNlcy5maW5kKFxuICAgICAgKHNvdXJjZUluZGV4KSA9PiBzb3VyY2VJbmRleC5wcm9wcyA9PT0gcHJvcHMsXG4gICAgKTtcbiAgICBpZiAoaW5kZXhlZFNvdXJjZSkge1xuICAgICAgaWYgKHNvdXJjZUlkICYmIHNvdXJjZUlkICE9PSBpbmRleGVkU291cmNlLmlkKSB7XG4gICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICAgYER1cGxpY2F0ZSBidWNrZXQgc291cmNlIGZvciAke2luZGV4ZWRTb3VyY2UuaWR9IGFuZCAke3NvdXJjZUlkfS5gLFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gaW5kZXhlZFNvdXJjZS5pZDtcbiAgICB9XG4gICAgY29uc3QgbmV4dEluZGV4ID0gdGhpcy5zb3VyY2VzLmxlbmd0aDtcbiAgICBjb25zdCBpZCA9IHNvdXJjZUlkID8/IGBzb3VyY2UtJHtuZXh0SW5kZXh9YDtcbiAgICAvLyBlbnN1cmUgaWQgKGlmIHByb3ZpZGVkKSBpcyB1bmlxdWUgd2l0aGluIEJ1Y2tldFxuICAgIGlmICh0aGlzLnNvdXJjZXMuc29tZSgoc291cmNlSW5kZXgpID0+IHNvdXJjZUluZGV4LmlkID09PSBpZCkpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIGBEdXBsaWNhdGUgc291cmNlIGlkICR7aWR9LiBTb3VyY2VJZHMgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGEgQnVja2V0LmAsXG4gICAgICAgIHRoaXMsXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLnNvdXJjZXMucHVzaCh7XG4gICAgICBwcm9wczoge1xuICAgICAgICAuLi5wcm9wcyxcbiAgICAgICAgYnVja2V0OiB0aGlzLFxuICAgICAgICBkZXBlbmRzT246IHRoaXMuc291cmNlU2xlZXAgPyBbdGhpcy5zb3VyY2VTbGVlcF0gOiB1bmRlZmluZWQsXG4gICAgICB9LFxuICAgICAgaWQsXG4gICAgfSk7XG4gICAgcmV0dXJuIGlkO1xuICB9XG5cbiAgcHVibGljIGlzV2Vic2l0ZSgpOiB0aGlzIGlzIHtcbiAgICB3ZWJzaXRlRG9tYWluTmFtZTogc3RyaW5nO1xuICAgIGJ1Y2tldE91dHB1dHM6IHsgd2Vic2l0ZVVybDogc3RyaW5nOyB3ZWJzaXRlRG9tYWluTmFtZTogc3RyaW5nIH07XG4gIH0ge1xuICAgIHJldHVybiB0aGlzLl9pc1dlYnNpdGU7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGh0dHBzIFVSTCBvZiBhbiBTMyBvYmplY3QuIFNwZWNpZnkgYHJlZ2lvbmFsOiBmYWxzZWAgYXQgdGhlIG9wdGlvbnNcbiAgICogZm9yIG5vbi1yZWdpb25hbCBVUkxzLiBGb3IgZXhhbXBsZTpcbiAgICpcbiAgICogLSBgaHR0cHM6Ly9zMy51cy13ZXN0LTEuYW1hem9uYXdzLmNvbS9vbmx5YnVja2V0YFxuICAgKiAtIGBodHRwczovL3MzLnVzLXdlc3QtMS5hbWF6b25hd3MuY29tL2J1Y2tldC9rZXlgXG4gICAqIC0gYGh0dHBzOi8vczMuY24tbm9ydGgtMS5hbWF6b25hd3MuY29tLmNuL2NoaW5hLWJ1Y2tldC9teWtleWBcbiAgICpcbiAgICogQHBhcmFtIGtleSBUaGUgUzMga2V5IG9mIHRoZSBvYmplY3QuIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBVUkwgb2YgdGhlXG4gICAqICAgICAgYnVja2V0IGlzIHJldHVybmVkLlxuICAgKiBAcmV0dXJucyBhbiBPYmplY3RTM1VybCB0b2tlblxuICAgKi9cbiAgcHVibGljIHVybEZvck9iamVjdChrZXk/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHN0YWNrID0gQXdzU3RhY2sub2ZBd3NDb25zdHJ1Y3QodGhpcyk7XG4gICAgY29uc3QgcHJlZml4ID0gYGh0dHBzOi8vczMuJHt0aGlzLmVudi5yZWdpb259LiR7c3RhY2sudXJsU3VmZml4fS9gO1xuICAgIGlmICh0eXBlb2Yga2V5ICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4gdGhpcy51cmxKb2luKHByZWZpeCwgdGhpcy5idWNrZXROYW1lKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudXJsSm9pbihwcmVmaXgsIHRoaXMuYnVja2V0TmFtZSwga2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgUzMgVVJMIG9mIGFuIFMzIG9iamVjdC4gRm9yIGV4YW1wbGU6XG4gICAqXG4gICAqIC0gYHMzOi8vb25seWJ1Y2tldGBcbiAgICogLSBgczM6Ly9idWNrZXQva2V5YFxuICAgKlxuICAgKiBAcGFyYW0ga2V5IFRoZSBTMyBrZXkgb2YgdGhlIG9iamVjdC4gSWYgbm90IHNwZWNpZmllZCwgdGhlIFMzIFVSTCBvZiB0aGVcbiAgICogICAgICBidWNrZXQgaXMgcmV0dXJuZWQuXG4gICAqIEByZXR1cm5zIGFuIE9iamVjdFMzVXJsIHRva2VuXG4gICAqL1xuICBwdWJsaWMgczNVcmxGb3JPYmplY3Qoa2V5Pzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBwcmVmaXggPSBcInMzOi8vXCI7XG4gICAgaWYgKHR5cGVvZiBrZXkgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiB0aGlzLnVybEpvaW4ocHJlZml4LCB0aGlzLmJ1Y2tldE5hbWUpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy51cmxKb2luKHByZWZpeCwgdGhpcy5idWNrZXROYW1lLCBrZXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gQVJOIHRoYXQgcmVwcmVzZW50cyBhbGwgb2JqZWN0cyB3aXRoaW4gdGhlIGJ1Y2tldCB0aGF0IG1hdGNoXG4gICAqIHRoZSBrZXkgcGF0dGVybiBzcGVjaWZpZWQuIFRvIHJlcHJlc2VudCBhbGwga2V5cywgc3BlY2lmeSBgYFwiKlwiYGAuXG4gICAqXG4gICAqIElmIHlvdSBuZWVkIHRvIHNwZWNpZnkgYSBrZXlQYXR0ZXJuIHdpdGggbXVsdGlwbGUgY29tcG9uZW50cywgY29uY2F0ZW5hdGUgdGhlbSBpbnRvIGEgc2luZ2xlIHN0cmluZywgZS5nLjpcbiAgICpcbiAgICogICBhcm5Gb3JPYmplY3RzKGBob21lLyR7dGVhbX0vJHt1c2VyfS8qYClcbiAgICpcbiAgICovXG4gIHB1YmxpYyBhcm5Gb3JPYmplY3RzKGtleVBhdHRlcm46IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMuYnVja2V0QXJufS8ke2tleVBhdHRlcm59YDtcbiAgfVxuXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9ibG9iL3YyLjE0MC4wL3BhY2thZ2VzL2F3cy1jZGstbGliL2F3cy1zMy9saWIvYnVja2V0LnRzI0w5NTNcbiAgcHJpdmF0ZSB1cmxKb2luKC4uLmNvbXBvbmVudHM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICByZXR1cm4gY29tcG9uZW50cy5yZWR1Y2UoKHJlc3VsdCwgY29tcG9uZW50KSA9PiB7XG4gICAgICBpZiAocmVzdWx0LmVuZHNXaXRoKFwiL1wiKSkge1xuICAgICAgICByZXN1bHQgPSByZXN1bHQuc2xpY2UoMCwgLTEpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbXBvbmVudC5zdGFydHNXaXRoKFwiL1wiKSkge1xuICAgICAgICBjb21wb25lbnQgPSBjb21wb25lbnQuc2xpY2UoMSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYCR7cmVzdWx0fS8ke2NvbXBvbmVudH1gO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgcmVzb3VyY2UgdG8gdGhlIFRlcnJhZm9ybSBKU09OIG91dHB1dCBhdCBTeW50aCB0aW1lLlxuICAgKlxuICAgKiBjYWxsZWQgYnkgVGVycmFmb3JtU3RhY2sucHJlcGFyZVN0YWNrKClcbiAgICovXG4gIHB1YmxpYyB0b1RlcnJhZm9ybSgpOiBhbnkge1xuICAgIC8qKlxuICAgICAqIEEgcHJlcGFyaW5nIHJlc29sdmUgbWlnaHQgYWRkIG5ldyByZXNvdXJjZXMgdG8gdGhlIHN0YWNrXG4gICAgICpcbiAgICAgKiBzaG91bGQgbm90IGFkZCByZXNvdXJjZXMgaWYgbm8gYnVja2V0IHNvdXJjZXMgYXJlIGRlZmluZWRcbiAgICAgKi9cbiAgICBpZiAoT2JqZWN0LmtleXModGhpcy5zb3VyY2VzKS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHNvdXJjZSBvZiB0aGlzLnNvdXJjZXMpIHtcbiAgICAgIC8vIFRPRE86IElkZWFsbHkgd2Ugc2hvdWxkIGhhdmUgdXNlZCBJUmVzb2x2YWJsZS5yZXNvbHZlIGFuZCB1c2UgdGhlIElSZXNvbHZlQ29udGV4dC5wcmVwYXJpbmcgZmxhZ1xuICAgICAgLy8gcmVmOiBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvYmxvYi92Mi4xNzAuMC9wYWNrYWdlcy9hd3MtY2RrLWxpYi9hd3MtaWFtL2xpYi9wb2xpY3ktZG9jdW1lbnQudHMjTDQ4XG4gICAgICBpZiAodGhpcy5ub2RlLnRyeUZpbmRDaGlsZChzb3VyY2UuaWQpKSBjb250aW51ZTsgLy8gaWdub3JlIGlmIGFscmVhZHkgZ2VuZXJhdGVkXG4gICAgICBuZXcgQnVja2V0U291cmNlKHRoaXMsIHNvdXJjZS5pZCwgc291cmNlLnByb3BzKTtcbiAgICB9XG4gICAgcmV0dXJuIHt9O1xuICB9XG59XG5cbi8qKlxuICogVGhlIGBCdWNrZXRgIHByb3ZpZGVzIGFuIFtBV1MgUzMgQnVja2V0XShodHRwczovL2F3cy5hbWF6b24uY29tL3MzLykuXG4gKlxuICogYGBgdHNcbiAqIG5ldyBzdG9yYWdlLkJ1Y2tldChzdGFjaywgXCJNeVdlYnNpdGVcIiwge1xuICogICBwYXRoOiBwYXRoLmpvaW4oX19kaXJuYW1lLCBcImRpc3RcIiksXG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqICMjIyMgUHVibGljIHJlYWQgYWNjZXNzXG4gKlxuICogRW5hYmxlcyBgcHVibGljYCByZWFkIGFjY2VzcyBmb3IgYWxsIHRoZSBmaWxlcyBpbiB0aGUgYnVja2V0LiBEYW5nZXJvdXMgYW5kXG4gKiByZWNvbW1lbmRlZCB0byB1c2UgZWRnZS5EaXN0cmlidXRpb24gaW5zdGVhZC5cbiAqXG4gKiBVc2VmdWwgZm9yIGhvc3RpbmcgcHVibGljIGZpbGVzIGRpcmVjdGx5IGZyb20gUzMuXG4gKlxuICogYGBgdHNcbiAqIG5ldyBzdG9yYWdlLkJ1Y2tldChcIk15QnVja2V0XCIsIHtcbiAqICAgcHVibGljOiB0cnVlXG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqIEByZXNvdXJjZSBhd3NfczNfYnVja2V0XG4gKiBAdGVycmFjb25zdHJ1Y3Qgc3RvcmFnZS5JQnVja2V0XG4gKi9cblxuZXhwb3J0IGNsYXNzIEJ1Y2tldCBleHRlbmRzIEJ1Y2tldEJhc2UgaW1wbGVtZW50cyBJQnVja2V0IHtcbiAgLy8gVE9ETzogQWRkIHN0YXRpYyBmcm9tTG9va3VwP1xuICBwdWJsaWMgc3RhdGljIGZyb21CdWNrZXROYW1lKFxuICAgIHNjb3BlOiBDb25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBidWNrZXROYW1lOiBzdHJpbmcsXG4gICk6IElCdWNrZXQge1xuICAgIHJldHVybiBCdWNrZXQuZnJvbUJ1Y2tldEF0dHJpYnV0ZXMoc2NvcGUsIGlkLCB7IGJ1Y2tldE5hbWUgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIEJ1Y2tldCBjb25zdHJ1Y3QgdGhhdCByZXByZXNlbnRzIGFuIGV4dGVybmFsIGJ1Y2tldC5cbiAgICpcbiAgICogQHBhcmFtIHNjb3BlIFRoZSBwYXJlbnQgY3JlYXRpbmcgY29uc3RydWN0ICh1c3VhbGx5IGB0aGlzYCkuXG4gICAqIEBwYXJhbSBpZCBUaGUgY29uc3RydWN0J3MgbmFtZS5cbiAgICogQHBhcmFtIGF0dHJzIEEgYEJ1Y2tldEF0dHJpYnV0ZXNgIG9iamVjdC4gQ2FuIGJlIG9idGFpbmVkIGZyb20gYSBjYWxsIHRvXG4gICAqIGBidWNrZXQuZXhwb3J0KClgIG9yIG1hbnVhbGx5IGNyZWF0ZWQuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21CdWNrZXRBdHRyaWJ1dGVzKFxuICAgIHNjb3BlOiBDb25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBhdHRyczogQnVja2V0QXR0cmlidXRlcyxcbiAgKTogSUJ1Y2tldCB7XG4gICAgY29uc3Qgc3RhY2sgPSBBd3NTdGFjay5vZkF3c0NvbnN0cnVjdChzY29wZSk7XG4gICAgY29uc3QgcmVnaW9uID0gYXR0cnMucmVnaW9uID8/IHN0YWNrLnJlZ2lvbjtcbiAgICBjb25zdCByZWdpb25JbmZvID0gUmVnaW9uSW5mby5nZXQocmVnaW9uKTtcbiAgICBjb25zdCB1cmxTdWZmaXggPSByZWdpb25JbmZvLmRvbWFpblN1ZmZpeCA/PyBzdGFjay51cmxTdWZmaXg7XG5cbiAgICBjb25zdCBidWNrZXROYW1lID0gcGFyc2VCdWNrZXROYW1lKHNjb3BlLCBhdHRycyk7XG4gICAgaWYgKCFidWNrZXROYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFwiQnVja2V0IG5hbWUgaXMgcmVxdWlyZWRcIiwgc2NvcGUpO1xuICAgIH1cbiAgICBCdWNrZXQudmFsaWRhdGVCdWNrZXROYW1lKGJ1Y2tldE5hbWUsIHRydWUpO1xuXG4gICAgY29uc3QgbmV3RW5kcG9pbnQgPSBgczMtd2Vic2l0ZS4ke3JlZ2lvbn0uJHt1cmxTdWZmaXh9YDtcblxuICAgIGNvbnN0IHN0YXRpY0RvbWFpbkVuZHBvaW50ID1cbiAgICAgIHJlZ2lvbkluZm8uczNTdGF0aWNXZWJzaXRlRW5kcG9pbnQgPz9cbiAgICAgIExhenkuc3RyaW5nVmFsdWUoe1xuICAgICAgICBwcm9kdWNlOiAoKSA9PlxuICAgICAgICAgIHN0YWNrLnJlZ2lvbmFsRmFjdChGYWN0TmFtZS5TM19TVEFUSUNfV0VCU0lURV9FTkRQT0lOVCwgbmV3RW5kcG9pbnQpLFxuICAgICAgfSk7XG4gICAgY29uc3Qgd2Vic2l0ZURvbWFpbiA9IGAke2J1Y2tldE5hbWV9LiR7c3RhdGljRG9tYWluRW5kcG9pbnR9YDtcblxuICAgIGNsYXNzIEltcG9ydCBleHRlbmRzIEJ1Y2tldEJhc2Uge1xuICAgICAgcHVibGljIHJlYWRvbmx5IGJ1Y2tldE5hbWUgPSBidWNrZXROYW1lITtcbiAgICAgIHB1YmxpYyByZWFkb25seSBidWNrZXRBcm4gPSBwYXJzZUJ1Y2tldEFybihzY29wZSwgYXR0cnMpO1xuICAgICAgcHVibGljIHJlYWRvbmx5IGJ1Y2tldERvbWFpbk5hbWUgPVxuICAgICAgICBhdHRycy5idWNrZXREb21haW5OYW1lIHx8IGAke2J1Y2tldE5hbWV9LnMzLiR7dXJsU3VmZml4fWA7XG4gICAgICAvLyBOT1RFIHByZXZpb3VzIHZlcnNpb25zIGVycm9yOiByZXNvdXJjZS53ZWJzaXRlRG9tYWluIHNob3VsZCBiZSB3ZWJzaXRlRW5kcG9pbnQgKHdpdGhvdXQgaHR0cDovLylcbiAgICAgIC8vIFJlZjogaHR0cHM6Ly9naXRodWIuY29tL2hhc2hpY29ycC90ZXJyYWZvcm0tcHJvdmlkZXItYXdzL2Jsb2IvdjYuMC4wL2ludGVybmFsL3NlcnZpY2UvczMvYnVja2V0LmdvI0wxNzA4LUwxNzEyXG4gICAgICBwdWJsaWMgcmVhZG9ubHkgd2Vic2l0ZURvbWFpbk5hbWUgPSBzdGF0aWNEb21haW5FbmRwb2ludDtcbiAgICAgIC8vIFRPRE86IHJlLWFsaWduIHRvIEFXU0NESyBidWNrZXRXZWJzaXRlRG9tYWluTmFtZSAuLi5cbiAgICAgIC8vIGF0dHJzLmJ1Y2tldFdlYnNpdGVVcmxcbiAgICAgIC8vICAgPyBGbi5zZWxlY3QoMiwgRm4uc3BsaXQoXCIvXCIsIGF0dHJzLmJ1Y2tldFdlYnNpdGVVcmwpKSAvLyBkcm9wIGh0dHA6Ly9cbiAgICAgIC8vICAgOiB3ZWJzaXRlRG9tYWluO1xuICAgICAgLy8gVE9ETzogRG9lcyBub3QgZXhpc3QgZm9yIEFXU0NES1xuICAgICAgcHVibGljIHJlYWRvbmx5IHdlYnNpdGVFbmRwb2ludCA9IHdlYnNpdGVEb21haW47XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgYnVja2V0V2Vic2l0ZVVybCA9XG4gICAgICAgIGF0dHJzLmJ1Y2tldFdlYnNpdGVVcmwgfHwgYGh0dHA6Ly8ke3dlYnNpdGVEb21haW59YDtcbiAgICAgIHB1YmxpYyByZWFkb25seSBidWNrZXRSZWdpb25hbERvbWFpbk5hbWUgPVxuICAgICAgICBhdHRycy5idWNrZXRSZWdpb25hbERvbWFpbk5hbWUgfHxcbiAgICAgICAgYCR7YnVja2V0TmFtZX0uczMuJHtyZWdpb259LiR7dXJsU3VmZml4fWA7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgYnVja2V0RHVhbFN0YWNrRG9tYWluTmFtZSA9XG4gICAgICAgIGF0dHJzLmJ1Y2tldER1YWxTdGFja0RvbWFpbk5hbWUgfHxcbiAgICAgICAgYCR7YnVja2V0TmFtZX0uczMuZHVhbHN0YWNrLiR7cmVnaW9ufS4ke3VybFN1ZmZpeH1gO1xuICAgICAgcHVibGljIHJlYWRvbmx5IGVuY3J5cHRpb25LZXkgPSBhdHRycy5lbmNyeXB0aW9uS2V5O1xuXG4gICAgICBwdWJsaWMgZ2V0IGhvc3RlZFpvbmVJZCgpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCB7IHMzU3RhdGljV2Vic2l0ZUhvc3RlZFpvbmVJZCB9ID0gUmVnaW9uSW5mby5nZXQocmVnaW9uKTtcbiAgICAgICAgaWYgKCFzM1N0YXRpY1dlYnNpdGVIb3N0ZWRab25lSWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICAgICAgYE5vIGhvc3RlZCB6b25lIElEIGZvdW5kIGZvciBTMyBzdGF0aWMgd2Vic2l0ZSBpbiByZWdpb246ICR7cmVnaW9ufWAsXG4gICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHMzU3RhdGljV2Vic2l0ZUhvc3RlZFpvbmVJZDtcbiAgICAgIH1cbiAgICAgIHB1YmxpYyByZWFkb25seSBwdWJsaWMgPSBhdHRycy5wdWJsaWMgPz8gZmFsc2U7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgdmVyc2lvbmVkID0gYXR0cnMudmVyc2lvbmVkID8/IGZhbHNlO1xuICAgICAgcHVibGljIHBvbGljeT86IEJ1Y2tldFBvbGljeSA9IHVuZGVmaW5lZDtcbiAgICAgIHB1YmxpYyByZWFkb25seSBvcmlnaW5BY2Nlc3NJZGVudGl0eSA9IGF0dHJzLm9yaWdpbkFjY2Vzc0lkZW50aXR5O1xuICAgICAgcHVibGljIHJlYWRvbmx5IF9pc1dlYnNpdGUgPSAhIWF0dHJzLmlzV2Vic2l0ZTtcbiAgICAgIHByb3RlY3RlZCBhdXRvQ3JlYXRlUG9saWN5ID0gZmFsc2U7XG4gICAgICBwdWJsaWMgaXNXZWJzaXRlKCk6IHRoaXMgaXMge1xuICAgICAgICB3ZWJzaXRlRG9tYWluTmFtZTogc3RyaW5nO1xuICAgICAgICBidWNrZXRPdXRwdXRzOiB7IHdlYnNpdGVVcmw6IHN0cmluZzsgd2Vic2l0ZURvbWFpbk5hbWU6IHN0cmluZyB9O1xuICAgICAgfSB7XG4gICAgICAgIHJldHVybiBhdHRycy5pc1dlYnNpdGUgPz8gZmFsc2U7XG4gICAgICB9XG4gICAgICAvLyBwcm90ZWN0ZWQgZGlzYWxsb3dQdWJsaWNBY2Nlc3MgPSBmYWxzZTtcbiAgICAgIC8vIHByb3RlY3RlZCBub3RpZmljYXRpb25zSGFuZGxlclJvbGUgPSBhdHRycy5ub3RpZmljYXRpb25zSGFuZGxlclJvbGU7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBJbXBvcnQoc2NvcGUsIGlkLCB7XG4gICAgICBhY2NvdW50OiBhdHRycy5hY2NvdW50LFxuICAgICAgcmVnaW9uOiBhdHRycy5yZWdpb24sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVGhyb3duIGFuIGV4Y2VwdGlvbiBpZiB0aGUgZ2l2ZW4gYnVja2V0IG5hbWUgaXMgbm90IHZhbGlkLlxuICAgKlxuICAgKiBAcGFyYW0gcGh5c2ljYWxOYW1lIG5hbWUgb2YgdGhlIGJ1Y2tldC5cbiAgICogQHBhcmFtIGFsbG93TGVnYWN5QnVja2V0TmFtaW5nIGFsbG93IGxlZ2FjeSBidWNrZXQgbmFtaW5nIHN0eWxlLCBkZWZhdWx0IGlzIGZhbHNlLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB2YWxpZGF0ZUJ1Y2tldE5hbWUoXG4gICAgcGh5c2ljYWxOYW1lOiBzdHJpbmcsXG4gICAgYWxsb3dMZWdhY3lCdWNrZXROYW1pbmc6IGJvb2xlYW4gPSBmYWxzZSxcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgYnVja2V0TmFtZSA9IHBoeXNpY2FsTmFtZTtcbiAgICBpZiAoIWJ1Y2tldE5hbWUgfHwgVG9rZW4uaXNVbnJlc29sdmVkKGJ1Y2tldE5hbWUpKSB7XG4gICAgICAvLyB0aGUgbmFtZSBpcyBhIGxhdGUtYm91bmQgdmFsdWUsIG5vdCBhIGRlZmluZWQgc3RyaW5nLFxuICAgICAgLy8gc28gc2tpcCB2YWxpZGF0aW9uXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgLy8gUnVsZXMgY29kaWZpZWQgZnJvbSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L2Rldi9CdWNrZXRSZXN0cmljdGlvbnMuaHRtbFxuICAgIGlmIChidWNrZXROYW1lLmxlbmd0aCA8IDMgfHwgYnVja2V0TmFtZS5sZW5ndGggPiA2Mykge1xuICAgICAgZXJyb3JzLnB1c2goXG4gICAgICAgIFwiQnVja2V0IG5hbWUgbXVzdCBiZSBhdCBsZWFzdCAzIGFuZCBubyBtb3JlIHRoYW4gNjMgY2hhcmFjdGVyc1wiLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBpbGxlZ2FsQ2hhcnNldFJlZ0V4ID0gYWxsb3dMZWdhY3lCdWNrZXROYW1pbmdcbiAgICAgID8gL1teQS1aYS16MC05Ll8tXS9cbiAgICAgIDogL1teYS16MC05Li1dLztcbiAgICBjb25zdCBhbGxvd2VkRWRnZUNoYXJzZXRSZWdFeCA9IGFsbG93TGVnYWN5QnVja2V0TmFtaW5nXG4gICAgICA/IC9bQS1aYS16MC05XS9cbiAgICAgIDogL1thLXowLTldLztcblxuICAgIGNvbnN0IGlsbGVnYWxDaGFyTWF0Y2ggPSBidWNrZXROYW1lLm1hdGNoKGlsbGVnYWxDaGFyc2V0UmVnRXgpO1xuICAgIGlmIChpbGxlZ2FsQ2hhck1hdGNoKSB7XG4gICAgICBlcnJvcnMucHVzaChcbiAgICAgICAgYWxsb3dMZWdhY3lCdWNrZXROYW1pbmdcbiAgICAgICAgICA/IFwiQnVja2V0IG5hbWUgbXVzdCBvbmx5IGNvbnRhaW4gdXBwZXJjYXNlIG9yIGxvd2VyY2FzZSBjaGFyYWN0ZXJzIGFuZCB0aGUgc3ltYm9scywgcGVyaW9kICguKSwgdW5kZXJzY29yZSAoXyksIGFuZCBkYXNoICgtKVwiXG4gICAgICAgICAgOiBcIkJ1Y2tldCBuYW1lIG11c3Qgb25seSBjb250YWluIGxvd2VyY2FzZSBjaGFyYWN0ZXJzIGFuZCB0aGUgc3ltYm9scywgcGVyaW9kICguKSBhbmQgZGFzaCAoLSlcIiArXG4gICAgICAgICAgICAgIGAgKG9mZnNldDogJHtpbGxlZ2FsQ2hhck1hdGNoLmluZGV4fSlgLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKCFhbGxvd2VkRWRnZUNoYXJzZXRSZWdFeC50ZXN0KGJ1Y2tldE5hbWUuY2hhckF0KDApKSkge1xuICAgICAgZXJyb3JzLnB1c2goXG4gICAgICAgIGFsbG93TGVnYWN5QnVja2V0TmFtaW5nXG4gICAgICAgICAgPyBcIkJ1Y2tldCBuYW1lIG11c3Qgc3RhcnQgd2l0aCBhbiB1cHBlcmNhc2UsIGxvd2VyY2FzZSBjaGFyYWN0ZXIgb3IgbnVtYmVyXCJcbiAgICAgICAgICA6IFwiQnVja2V0IG5hbWUgbXVzdCBzdGFydCB3aXRoIGEgbG93ZXJjYXNlIGNoYXJhY3RlciBvciBudW1iZXJcIiArXG4gICAgICAgICAgICAgIFwiIChvZmZzZXQ6IDApXCIsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICAhYWxsb3dlZEVkZ2VDaGFyc2V0UmVnRXgudGVzdChidWNrZXROYW1lLmNoYXJBdChidWNrZXROYW1lLmxlbmd0aCAtIDEpKVxuICAgICkge1xuICAgICAgZXJyb3JzLnB1c2goXG4gICAgICAgIGFsbG93TGVnYWN5QnVja2V0TmFtaW5nXG4gICAgICAgICAgPyBcIkJ1Y2tldCBuYW1lIG11c3QgZW5kIHdpdGggYW4gdXBwZXJjYXNlLCBsb3dlcmNhc2UgY2hhcmFjdGVyIG9yIG51bWJlclwiXG4gICAgICAgICAgOiBcIkJ1Y2tldCBuYW1lIG11c3QgZW5kIHdpdGggYSBsb3dlcmNhc2UgY2hhcmFjdGVyIG9yIG51bWJlclwiICtcbiAgICAgICAgICAgICAgYCAob2Zmc2V0OiAke2J1Y2tldE5hbWUubGVuZ3RoIC0gMX0pYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgY29uc2VjU3ltYm9sTWF0Y2ggPSBidWNrZXROYW1lLm1hdGNoKC9cXC4tfC1cXC58XFwuXFwuLyk7XG4gICAgaWYgKGNvbnNlY1N5bWJvbE1hdGNoKSB7XG4gICAgICBlcnJvcnMucHVzaChcbiAgICAgICAgXCJCdWNrZXQgbmFtZSBtdXN0IG5vdCBoYXZlIGRhc2ggbmV4dCB0byBwZXJpb2QsIG9yIHBlcmlvZCBuZXh0IHRvIGRhc2gsIG9yIGNvbnNlY3V0aXZlIHBlcmlvZHNcIiArXG4gICAgICAgICAgYCAob2Zmc2V0OiAke2NvbnNlY1N5bWJvbE1hdGNoLmluZGV4fSlgLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKC9eXFxkezEsM31cXC5cXGR7MSwzfVxcLlxcZHsxLDN9XFwuXFxkezEsM30kLy50ZXN0KGJ1Y2tldE5hbWUpKSB7XG4gICAgICBlcnJvcnMucHVzaChcIkJ1Y2tldCBuYW1lIG11c3Qgbm90IHJlc2VtYmxlIGFuIElQIGFkZHJlc3NcIik7XG4gICAgfVxuXG4gICAgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIGBJbnZhbGlkIFMzIGJ1Y2tldCBuYW1lICh2YWx1ZTogJHtidWNrZXROYW1lfSkke0VPTH0ke2Vycm9ycy5qb2luKEVPTCl9YCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlYWRvbmx5IGVuY3J5cHRpb25LZXk/OiBrbXMuSUtleTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHJlc291cmNlOlxuICAgIHwgczNCdWNrZXQuUzNCdWNrZXRcbiAgICB8IGRhdGFBd3NTM0J1Y2tldC5EYXRhQXdzUzNCdWNrZXQ7XG4gIHByb3RlY3RlZCByZWFkb25seSB3ZWJzaXRlQ29uZmlnPzogczNCdWNrZXRXZWJzaXRlQ29uZmlndXJhdGlvbi5TM0J1Y2tldFdlYnNpdGVDb25maWd1cmF0aW9uO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgY29yc0NvbmZpZz86IHMzQnVja2V0Q29yc0NvbmZpZ3VyYXRpb24uUzNCdWNrZXRDb3JzQ29uZmlndXJhdGlvbjtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IG9yaWdpbkFjY2Vzc0lkZW50aXR5PzogT3JpZ2luQWNjZXNzSWRlbnRpdHk7XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgX2lzV2Vic2l0ZTogYm9vbGVhbjtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF92ZXJzaW9uZWQ6IGJvb2xlYW47XG5cbiAgcHVibGljIGdldCBidWNrZXRBcm4oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5yZXNvdXJjZS5hcm47XG4gIH1cbiAgcHVibGljIGdldCBidWNrZXROYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucmVzb3VyY2UuYnVja2V0O1xuICB9XG4gIHB1YmxpYyBnZXQgYnVja2V0RG9tYWluTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnJlc291cmNlLmJ1Y2tldERvbWFpbk5hbWU7XG4gIH1cbiAgcHVibGljIGdldCBidWNrZXRSZWdpb25hbERvbWFpbk5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5yZXNvdXJjZS5idWNrZXRSZWdpb25hbERvbWFpbk5hbWU7XG4gIH1cbiAgcHVibGljIGdldCB3ZWJzaXRlRG9tYWluTmFtZSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLndlYnNpdGVDb25maWc/LndlYnNpdGVEb21haW47XG4gIH1cbiAgcHVibGljIGdldCB3ZWJzaXRlRW5kcG9pbnQoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy53ZWJzaXRlQ29uZmlnPy53ZWJzaXRlRW5kcG9pbnQ7XG4gIH1cbiAgcHVibGljIGdldCB2ZXJzaW9uZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3ZlcnNpb25lZDtcbiAgfVxuICBwdWJsaWMgZ2V0IGhvc3RlZFpvbmVJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnJlc291cmNlLmhvc3RlZFpvbmVJZDtcbiAgfVxuXG4gIHB1YmxpYyBwb2xpY3k/OiBCdWNrZXRQb2xpY3k7XG4gIHByb3RlY3RlZCBhdXRvQ3JlYXRlUG9saWN5ID0gdHJ1ZTtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgYnVja2V0IGlzIHB1YmxpYyBvciBub3QuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcHVibGljPzogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBldmVudEJyaWRnZUVuYWJsZWQ/OiBib29sZWFuO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIG5hbWU6IHN0cmluZywgcHJvcHM6IEJ1Y2tldFByb3BzID0ge30pIHtcbiAgICBzdXBlcihzY29wZSwgbmFtZSwgcHJvcHMpO1xuXG4gICAgY29uc3QgeyBidWNrZXRFbmNyeXB0aW9uLCBlbmNyeXB0aW9uS2V5IH0gPSB0aGlzLnBhcnNlRW5jcnlwdGlvbihwcm9wcyk7XG4gICAgY29uc3QgeyB3ZWJzaXRlQ29uZmlnLCBjb3JzQ29uZmlnLCBjbG91ZGZyb250QWNjZXNzIH0gPSBwcm9wcztcbiAgICB0aGlzLl9pc1dlYnNpdGUgPSBmYWxzZTtcblxuICAgIGlmIChwcm9wcy5idWNrZXROYW1lICYmIHByb3BzLm5hbWVQcmVmaXgpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIFwiQ2Fubm90IHNwZWNpZnkgYm90aCAnYnVja2V0TmFtZScgYW5kICduYW1lUHJlZml4Jy4gVXNlIG9ubHkgb25lLlwiLFxuICAgICAgICBzY29wZSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgbGV0IGJ1Y2tldFByZWZpeDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGlmICghcHJvcHMuYnVja2V0TmFtZSkge1xuICAgICAgLy8gQnVja2V0IG5hbWVzIG11c3QgYmUgbG93ZXJjYXNlIGFuZCBiZXR3ZWVuIDMgKG1pbikgYW5kIDYzIChtYXgpIGNoYXJhY3RlcnMgbG9uZy5cbiAgICAgIGJ1Y2tldFByZWZpeCA9IHRoaXMuc3RhY2sudW5pcXVlUmVzb3VyY2VOYW1lUHJlZml4KHRoaXMsIHtcbiAgICAgICAgcHJlZml4OiAocHJvcHMubmFtZVByZWZpeCA/PyB0aGlzLmdyaWRVVUlEKSArIFwiLVwiLFxuICAgICAgICBsb3dlckNhc2U6IHRydWUsXG4gICAgICAgIGFsbG93ZWRTcGVjaWFsQ2hhcmFjdGVyczogXCIuLVwiLFxuICAgICAgICBtYXhMZW5ndGg6IDYzLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5yZXNvdXJjZSA9IG5ldyBzM0J1Y2tldC5TM0J1Y2tldCh0aGlzLCBcIlJlc291cmNlXCIsIHtcbiAgICAgIGJ1Y2tldDogcHJvcHMuYnVja2V0TmFtZSxcbiAgICAgIGZvcmNlRGVzdHJveTogcHJvcHMuZm9yY2VEZXN0cm95LFxuICAgICAgYnVja2V0UHJlZml4LFxuICAgIH0pO1xuXG4gICAgdGhpcy5fdmVyc2lvbmVkID0gcHJvcHMudmVyc2lvbmVkID8/IGZhbHNlO1xuICAgIGlmICh0aGlzLl92ZXJzaW9uZWQpIHtcbiAgICAgIG5ldyBzM0J1Y2tldFZlcnNpb25pbmcuUzNCdWNrZXRWZXJzaW9uaW5nQSh0aGlzLCBcIlZlcnNpb25pbmdcIiwge1xuICAgICAgICBidWNrZXQ6IHRoaXMucmVzb3VyY2UuYnVja2V0LFxuICAgICAgICB2ZXJzaW9uaW5nQ29uZmlndXJhdGlvbjoge1xuICAgICAgICAgIHN0YXR1czogdGhpcy5fdmVyc2lvbmVkID8gXCJFbmFibGVkXCIgOiBcIlN1c3BlbmRlZFwiLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuZXZlbnRCcmlkZ2VFbmFibGVkID0gcHJvcHMuZXZlbnRCcmlkZ2VFbmFibGVkO1xuXG4gICAgaWYgKHByb3BzLnNvdXJjZXMpIHtcbiAgICAgIGlmICh0eXBlb2YgcHJvcHMuc291cmNlcyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICB0aGlzLmFkZFNvdXJjZSh7IHBhdGg6IHByb3BzLnNvdXJjZXMgfSk7XG4gICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkocHJvcHMuc291cmNlcykpIHtcbiAgICAgICAgZm9yIChjb25zdCBzb3VyY2VQcm9wcyBvZiBwcm9wcy5zb3VyY2VzKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBzb3VyY2VQcm9wcyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgdGhpcy5hZGRTb3VyY2UoeyBwYXRoOiBzb3VyY2VQcm9wcyB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5hZGRTb3VyY2Uoc291cmNlUHJvcHMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChwcm9wcy5saWZlY3ljbGVSdWxlcykge1xuICAgICAgbmV3IHMzQnVja2V0TGlmZWN5Y2xlQ29uZmlndXJhdGlvbi5TM0J1Y2tldExpZmVjeWNsZUNvbmZpZ3VyYXRpb24oXG4gICAgICAgIHRoaXMsXG4gICAgICAgIFwiTGlmZUN5Y2xlQ29uZmlnXCIsXG4gICAgICAgIHtcbiAgICAgICAgICBidWNrZXQ6IHRoaXMucmVzb3VyY2UuYnVja2V0LFxuICAgICAgICAgIHJ1bGU6IHByb3BzLmxpZmVjeWNsZVJ1bGVzLm1hcCgocnVsZSkgPT4gKHtcbiAgICAgICAgICAgIC4uLnJ1bGUsXG4gICAgICAgICAgICBzdGF0dXM6IHJ1bGUuZW5hYmxlZCA/IFwiRW5hYmxlZFwiIDogXCJEaXNhYmxlZFwiLFxuICAgICAgICAgIH0pKSxcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gRW5mb3JjZSBBV1MgRm91bmRhdGlvbmFsIFNlY3VyaXR5IEJlc3QgUHJhY3RpY2VcbiAgICBpZiAocHJvcHMuZW5mb3JjZVNTTCkge1xuICAgICAgdGhpcy5lbmZvcmNlU1NMU3RhdGVtZW50KCk7XG4gICAgICB0aGlzLm1pbmltdW1UTFNWZXJzaW9uU3RhdGVtZW50KHByb3BzLm1pbmltdW1UTFNWZXJzaW9uKTtcbiAgICB9IGVsc2UgaWYgKHByb3BzLm1pbmltdW1UTFNWZXJzaW9uKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBcIidlbmZvcmNlU1NMJyBtdXN0IGJlIGVuYWJsZWQgZm9yICdtaW5pbXVtVExTVmVyc2lvbicgdG8gYmUgYXBwbGllZFwiLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAod2Vic2l0ZUNvbmZpZyAmJiB3ZWJzaXRlQ29uZmlnLmVuYWJsZWQpIHtcbiAgICAgIHRoaXMuX2lzV2Vic2l0ZSA9IHRydWU7XG4gICAgICB0aGlzLndlYnNpdGVDb25maWcgPVxuICAgICAgICBuZXcgczNCdWNrZXRXZWJzaXRlQ29uZmlndXJhdGlvbi5TM0J1Y2tldFdlYnNpdGVDb25maWd1cmF0aW9uKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgXCJXZWJzaXRlQ29uZmlnXCIsXG4gICAgICAgICAge1xuICAgICAgICAgICAgYnVja2V0OiB0aGlzLnJlc291cmNlLmJ1Y2tldCxcbiAgICAgICAgICAgIC4uLndlYnNpdGVDb25maWcsXG4gICAgICAgICAgICBpbmRleERvY3VtZW50OiB3ZWJzaXRlQ29uZmlnPy5pbmRleERvY3VtZW50XG4gICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgc3VmZml4OiB3ZWJzaXRlQ29uZmlnLmluZGV4RG9jdW1lbnQsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgICAgIHN1ZmZpeDogXCJpbmRleC5odG1sXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHRoaXMucHVibGljID0gcHJvcHMucHVibGljID8/IGZhbHNlO1xuICAgIGlmICh0aGlzLnB1YmxpYykge1xuICAgICAgLy8gVE9ETzogc3dpdGNoIHRvIExhenkgY29uZmlnIHVzaW5nIFwiZ3JhbnRQdWJsaWNBY2Nlc3NcIiBtZWNoYW5pc20gaW5zdGVhZD9cbiAgICAgIC8vIHJlZjogaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2Jsb2IvdjIuMTYwLjAvcGFja2FnZXMvYXdzLWNkay1saWIvYXdzLXMzL2xpYi9idWNrZXQudHMjTDg1MFxuICAgICAgY29uc3Qgb3duZXJzaGlwQ29udHJvbHMgPVxuICAgICAgICBuZXcgczNCdWNrZXRPd25lcnNoaXBDb250cm9scy5TM0J1Y2tldE93bmVyc2hpcENvbnRyb2xzKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgXCJPd25lcnNoaXBDb250cm9sc1wiLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGJ1Y2tldDogdGhpcy5yZXNvdXJjZS5idWNrZXQsXG4gICAgICAgICAgICBydWxlOiB7XG4gICAgICAgICAgICAgIG9iamVjdE93bmVyc2hpcDogXCJCdWNrZXRPd25lclByZWZlcnJlZFwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgICAgY29uc3QgcHVibGljQWNjZXNzQmxvY2sgPVxuICAgICAgICBuZXcgczNCdWNrZXRQdWJsaWNBY2Nlc3NCbG9jay5TM0J1Y2tldFB1YmxpY0FjY2Vzc0Jsb2NrKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgXCJQdWJsaWNBY2Nlc3NCbG9ja1wiLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGJ1Y2tldDogdGhpcy5yZXNvdXJjZS5idWNrZXQsXG4gICAgICAgICAgICBibG9ja1B1YmxpY0FjbHM6IGZhbHNlLFxuICAgICAgICAgICAgYmxvY2tQdWJsaWNQb2xpY3k6IGZhbHNlLFxuICAgICAgICAgICAgaWdub3JlUHVibGljQWNsczogZmFsc2UsXG4gICAgICAgICAgICByZXN0cmljdFB1YmxpY0J1Y2tldHM6IGZhbHNlLFxuICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgICBuZXcgczNCdWNrZXRBY2wuUzNCdWNrZXRBY2wodGhpcywgXCJQdWJsaWNBY2xcIiwge1xuICAgICAgICBidWNrZXQ6IHRoaXMucmVzb3VyY2UuYnVja2V0LFxuICAgICAgICBhY2w6IFwicHVibGljLXJlYWRcIixcbiAgICAgICAgZGVwZW5kc09uOiBbb3duZXJzaGlwQ29udHJvbHMsIHB1YmxpY0FjY2Vzc0Jsb2NrXSxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5hZGRUb1Jlc291cmNlUG9saWN5KFxuICAgICAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgcmVzb3VyY2VzOiBbdGhpcy5hcm5Gb3JPYmplY3RzKFwiKlwiKV0sXG4gICAgICAgICAgYWN0aW9uczogW1wiczM6R2V0T2JqZWN0XCJdLFxuICAgICAgICAgIHByaW5jaXBhbHM6IFtuZXcgaWFtLkFueVByaW5jaXBhbCgpXSxcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgICAgLy8gLy8gcG9saWN5IGRlcGVuZHMgb24gcHVibGljIGFjY2VzcyBibG9jaz9cbiAgICAgIC8vIC8vIGlzIHRoaXMgbmVlZGVkP1xuICAgICAgLy8gaWYgKHBvbGljeURlcGVuZGFibGUgJiYgcG9saWN5RGVwZW5kYWJsZSBpbnN0YW5jZW9mIENvbnN0cnVjdCkge1xuICAgICAgLy8gICBwb2xpY3lEZXBlbmRhYmxlLm5vZGUuYWRkRGVwZW5kZW5jeShwdWJsaWNBY2Nlc3NCbG9jayk7XG4gICAgICAvLyB9XG4gICAgfVxuXG4gICAgaWYgKGNvcnNDb25maWcpIHtcbiAgICAgIHRoaXMuY29yc0NvbmZpZyA9IG5ldyBzM0J1Y2tldENvcnNDb25maWd1cmF0aW9uLlMzQnVja2V0Q29yc0NvbmZpZ3VyYXRpb24oXG4gICAgICAgIHRoaXMsXG4gICAgICAgIFwiQ29yc0NvbmZpZ1wiLFxuICAgICAgICB7XG4gICAgICAgICAgYnVja2V0OiB0aGlzLnJlc291cmNlLmJ1Y2tldCxcbiAgICAgICAgICAuLi5jb3JzQ29uZmlnLFxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoY2xvdWRmcm9udEFjY2Vzcz8uZW5hYmxlZCkge1xuICAgICAgY29uc3Qgb2FpID0gbmV3IE9yaWdpbkFjY2Vzc0lkZW50aXR5KHRoaXMsIFwiT3JpZ2luQWNjZXNzSWRlbnRpdHlcIiwge1xuICAgICAgICBjb21tZW50OiBgT0FJIGZvciAke3RoaXMucmVzb3VyY2UuYnVja2V0fWAsXG4gICAgICB9KTtcbiAgICAgIHRoaXMub3JpZ2luQWNjZXNzSWRlbnRpdHkgPSBvYWk7XG4gICAgICBjb25zdCByZXNvdXJjZXMgPSAoY2xvdWRmcm9udEFjY2Vzcy5rZXlQYXR0ZXJucyA/PyBbXCIqXCJdKS5tYXAoXG4gICAgICAgIChrZXlQYXR0ZXJuKSA9PiB0aGlzLmFybkZvck9iamVjdHMoa2V5UGF0dGVybiksXG4gICAgICApO1xuICAgICAgdGhpcy5hZGRUb1Jlc291cmNlUG9saWN5KFxuICAgICAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgcmVzb3VyY2VzLFxuICAgICAgICAgIGFjdGlvbnM6IFtcInMzOkdldE9iamVjdFwiXSxcbiAgICAgICAgICBwcmluY2lwYWxzOiBbb2FpLmdyYW50UHJpbmNpcGFsXSxcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmV2ZW50QnJpZGdlRW5hYmxlZCkge1xuICAgICAgdGhpcy5lbmFibGVFdmVudEJyaWRnZU5vdGlmaWNhdGlvbigpO1xuICAgIH1cbiAgICB0aGlzLmVuY3J5cHRpb25LZXkgPSBlbmNyeXB0aW9uS2V5O1xuICAgIGlmIChidWNrZXRFbmNyeXB0aW9uKSB7XG4gICAgICBuZXcgczNCdWNrZXRTZXJ2ZXJTaWRlRW5jcnlwdGlvbkNvbmZpZ3VyYXRpb24uUzNCdWNrZXRTZXJ2ZXJTaWRlRW5jcnlwdGlvbkNvbmZpZ3VyYXRpb25BKFxuICAgICAgICB0aGlzLFxuICAgICAgICBcIkVuY3J5cHRpb25cIixcbiAgICAgICAge1xuICAgICAgICAgIGJ1Y2tldDogdGhpcy5yZXNvdXJjZS5idWNrZXQsXG4gICAgICAgICAgLi4uYnVja2V0RW5jcnlwdGlvbixcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldCB1cCBrZXkgcHJvcGVydGllcyBhbmQgcmV0dXJuIHRoZSBCdWNrZXQgZW5jcnlwdGlvbiBwcm9wZXJ0eSBmcm9tIHRoZVxuICAgKiB1c2VyJ3MgY29uZmlndXJhdGlvbiwgYWNjb3JkaW5nIHRvIHRoZSBmb2xsb3dpbmcgdGFibGU6XG4gICAqXG4gICAqIHwgcHJvcHMuZW5jcnlwdGlvbiB8IHByb3BzLmVuY3J5cHRpb25LZXkgfCBwcm9wcy5idWNrZXRLZXlFbmFibGVkIHwgYnVja2V0RW5jcnlwdGlvbiAocmV0dXJuIHZhbHVlKSB8IGVuY3J5cHRpb25LZXkgKHJldHVybiB2YWx1ZSkgfFxuICAgKiB8LS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXxcbiAgICogfCB1bmRlZmluZWQgICAgICAgIHwgdW5kZWZpbmVkICAgICAgICAgICB8IGUgICAgICAgICAgICAgICAgICAgICAgfCB1bmRlZmluZWQgICAgICAgICAgICAgICAgICAgICAgIHwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICB8XG4gICAqIHwgVU5FTkNSWVBURUQgICAgICB8IHVuZGVmaW5lZCAgICAgICAgICAgfCBmYWxzZSAgICAgICAgICAgICAgICAgIHwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICB8IHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgfFxuICAgKiB8IHVuZGVmaW5lZCAgICAgICAgfCBrICAgICAgICAgICAgICAgICAgIHwgZSAgICAgICAgICAgICAgICAgICAgICB8IFNTRS1LTVMsIGJ1Y2tldEtleUVuYWJsZWQgPSBlICAgfCBrICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICogfCBLTVMgICAgICAgICAgICAgIHwgayAgICAgICAgICAgICAgICAgICB8IGUgICAgICAgICAgICAgICAgICAgICAgfCBTU0UtS01TLCBidWNrZXRLZXlFbmFibGVkID0gZSAgIHwgayAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAqIHwgS01TICAgICAgICAgICAgICB8IHVuZGVmaW5lZCAgICAgICAgICAgfCBlICAgICAgICAgICAgICAgICAgICAgIHwgU1NFLUtNUywgYnVja2V0S2V5RW5hYmxlZCA9IGUgICB8IG5ldyBrZXkgICAgICAgICAgICAgICAgICAgICAgfFxuICAgKiB8IEtNU19NQU5BR0VEICAgICAgfCB1bmRlZmluZWQgICAgICAgICAgIHwgZSAgICAgICAgICAgICAgICAgICAgICB8IFNTRS1LTVMsIGJ1Y2tldEtleUVuYWJsZWQgPSBlICAgfCB1bmRlZmluZWQgICAgICAgICAgICAgICAgICAgIHxcbiAgICogfCBTM19NQU5BR0VEICAgICAgIHwgdW5kZWZpbmVkICAgICAgICAgICB8IGZhbHNlICAgICAgICAgICAgICAgICAgfCBTU0UtUzMgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICB8XG4gICAqIHwgUzNfTUFOQUdFRCAgICAgICB8IHVuZGVmaW5lZCAgICAgICAgICAgfCBlICAgICAgICAgICAgICAgICAgICAgIHwgU1NFLVMzLCBidWNrZXRLZXlFbmFibGVkID0gZSAgICB8IHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgfFxuICAgKiB8IFVORU5DUllQVEVEICAgICAgfCB1bmRlZmluZWQgICAgICAgICAgIHwgdHJ1ZSAgICAgICAgICAgICAgICAgICB8IEVSUk9SISAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFUlJPUiEgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICogfCBVTkVOQ1JZUFRFRCAgICAgIHwgayAgICAgICAgICAgICAgICAgICB8IGUgICAgICAgICAgICAgICAgICAgICAgfCBFUlJPUiEgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRVJST1IhICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAqIHwgS01TX01BTkFHRUQgICAgICB8IGsgICAgICAgICAgICAgICAgICAgfCBlICAgICAgICAgICAgICAgICAgICAgIHwgRVJST1IhICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVSUk9SISAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgKiB8IFMzX01BTkFHRUQgICAgICAgfCB1bmRlZmluZWQgICAgICAgICAgIHwgdHJ1ZSAgICAgICAgICAgICAgICAgICB8IEVSUk9SISAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFUlJPUiEgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICogfCBTM19NQU5BR0VEICAgICAgIHwgayAgICAgICAgICAgICAgICAgICB8IGUgICAgICAgICAgICAgICAgICAgICAgfCBFUlJPUiEgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRVJST1IhICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAqL1xuICBwcml2YXRlIHBhcnNlRW5jcnlwdGlvbihwcm9wczogQnVja2V0UHJvcHMpOiB7XG4gICAgYnVja2V0RW5jcnlwdGlvbj86IE9taXQ8XG4gICAgICBzM0J1Y2tldFNlcnZlclNpZGVFbmNyeXB0aW9uQ29uZmlndXJhdGlvbi5TM0J1Y2tldFNlcnZlclNpZGVFbmNyeXB0aW9uQ29uZmlndXJhdGlvbkFDb25maWcsXG4gICAgICBcImJ1Y2tldFwiXG4gICAgPjtcbiAgICBlbmNyeXB0aW9uS2V5Pzoga21zLklLZXk7XG4gIH0ge1xuICAgIC8vIGRlZmF1bHQgYmFzZWQgb24gd2hldGhlciBlbmNyeXB0aW9uS2V5IGlzIHNwZWNpZmllZFxuICAgIGxldCBlbmNyeXB0aW9uVHlwZSA9IHByb3BzLmVuY3J5cHRpb247XG4gICAgaWYgKGVuY3J5cHRpb25UeXBlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGVuY3J5cHRpb25UeXBlID0gcHJvcHMuZW5jcnlwdGlvbktleVxuICAgICAgICA/IEJ1Y2tldEVuY3J5cHRpb24uS01TXG4gICAgICAgIDogQnVja2V0RW5jcnlwdGlvbi5VTkVOQ1JZUFRFRDtcbiAgICB9XG5cbiAgICAvLyBpZiBlbmNyeXB0aW9uIGtleSBpcyBzZXQsIGVuY3J5cHRpb24gbXVzdCBiZSBzZXQgdG8gS01TIG9yIERTU0UuXG4gICAgaWYgKFxuICAgICAgZW5jcnlwdGlvblR5cGUgIT09IEJ1Y2tldEVuY3J5cHRpb24uRFNTRSAmJlxuICAgICAgZW5jcnlwdGlvblR5cGUgIT09IEJ1Y2tldEVuY3J5cHRpb24uS01TICYmXG4gICAgICBwcm9wcy5lbmNyeXB0aW9uS2V5XG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBgZW5jcnlwdGlvbktleSBpcyBzcGVjaWZpZWQsIHNvICdlbmNyeXB0aW9uJyBtdXN0IGJlIHNldCB0byBLTVMgb3IgRFNTRSAodmFsdWU6ICR7ZW5jcnlwdGlvblR5cGV9KWAsXG4gICAgICAgIHRoaXMsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIGlmIGJ1Y2tldEtleUVuYWJsZWQgaXMgc2V0LCBlbmNyeXB0aW9uIGNhbiBub3QgYmUgQnVja2V0RW5jcnlwdGlvbi5VTkVOQ1JZUFRFRFxuICAgIGlmIChcbiAgICAgIHByb3BzLmJ1Y2tldEtleUVuYWJsZWQgJiZcbiAgICAgIGVuY3J5cHRpb25UeXBlID09PSBCdWNrZXRFbmNyeXB0aW9uLlVORU5DUllQVEVEXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBgYnVja2V0S2V5RW5hYmxlZCBpcyBzcGVjaWZpZWQsIHNvICdlbmNyeXB0aW9uJyBtdXN0IGJlIHNldCB0byBLTVMsIERTU0Ugb3IgUzMgKHZhbHVlOiAke2VuY3J5cHRpb25UeXBlfSlgLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoZW5jcnlwdGlvblR5cGUgPT09IEJ1Y2tldEVuY3J5cHRpb24uVU5FTkNSWVBURUQpIHtcbiAgICAgIHJldHVybiB7IGJ1Y2tldEVuY3J5cHRpb246IHVuZGVmaW5lZCwgZW5jcnlwdGlvbktleTogdW5kZWZpbmVkIH07XG4gICAgfVxuXG4gICAgaWYgKGVuY3J5cHRpb25UeXBlID09PSBCdWNrZXRFbmNyeXB0aW9uLktNUykge1xuICAgICAgY29uc3QgZW5jcnlwdGlvbktleSA9XG4gICAgICAgIHByb3BzLmVuY3J5cHRpb25LZXkgfHxcbiAgICAgICAgbmV3IGttcy5LZXkodGhpcywgXCJLZXlcIiwge1xuICAgICAgICAgIGRlc2NyaXB0aW9uOiBgQ3JlYXRlZCBieSAke3RoaXMubm9kZS5wYXRofWAsXG4gICAgICAgICAgZW5hYmxlS2V5Um90YXRpb246IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZW5jcnlwdGlvbktleSxcbiAgICAgICAgYnVja2V0RW5jcnlwdGlvbjoge1xuICAgICAgICAgIC8vIChPcHRpb25hbCkgQWNjb3VudCBJRCBvZiB0aGUgZXhwZWN0ZWQgYnVja2V0IG93bmVyLlxuICAgICAgICAgIC8vIGV4cGVjdGVkQnVja2V0T3duZXJcbiAgICAgICAgICBydWxlOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGJ1Y2tldEtleUVuYWJsZWQ6IHByb3BzLmJ1Y2tldEtleUVuYWJsZWQsXG4gICAgICAgICAgICAgIGFwcGx5U2VydmVyU2lkZUVuY3J5cHRpb25CeURlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICBzc2VBbGdvcml0aG06IFwiYXdzOmttc1wiLFxuICAgICAgICAgICAgICAgIGttc01hc3RlcktleUlkOiBlbmNyeXB0aW9uS2V5LmtleUFybixcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKGVuY3J5cHRpb25UeXBlID09PSBCdWNrZXRFbmNyeXB0aW9uLlMzX01BTkFHRUQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGJ1Y2tldEVuY3J5cHRpb246IHtcbiAgICAgICAgICAvLyAoT3B0aW9uYWwpIEFjY291bnQgSUQgb2YgdGhlIGV4cGVjdGVkIGJ1Y2tldCBvd25lci5cbiAgICAgICAgICAvLyBleHBlY3RlZEJ1Y2tldE93bmVyXG4gICAgICAgICAgcnVsZTogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBidWNrZXRLZXlFbmFibGVkOiBwcm9wcy5idWNrZXRLZXlFbmFibGVkLFxuICAgICAgICAgICAgICBhcHBseVNlcnZlclNpZGVFbmNyeXB0aW9uQnlEZWZhdWx0OiB7IHNzZUFsZ29yaXRobTogXCJBRVMyNTZcIiB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAoZW5jcnlwdGlvblR5cGUgPT09IEJ1Y2tldEVuY3J5cHRpb24uS01TX01BTkFHRUQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGJ1Y2tldEVuY3J5cHRpb246IHtcbiAgICAgICAgICAvLyAoT3B0aW9uYWwpIEFjY291bnQgSUQgb2YgdGhlIGV4cGVjdGVkIGJ1Y2tldCBvd25lci5cbiAgICAgICAgICAvLyBleHBlY3RlZEJ1Y2tldE93bmVyXG4gICAgICAgICAgcnVsZTogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBidWNrZXRLZXlFbmFibGVkOiBwcm9wcy5idWNrZXRLZXlFbmFibGVkLFxuICAgICAgICAgICAgICBhcHBseVNlcnZlclNpZGVFbmNyeXB0aW9uQnlEZWZhdWx0OiB7IHNzZUFsZ29yaXRobTogXCJhd3M6a21zXCIgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKGVuY3J5cHRpb25UeXBlID09PSBCdWNrZXRFbmNyeXB0aW9uLkRTU0UpIHtcbiAgICAgIGNvbnN0IGVuY3J5cHRpb25LZXkgPVxuICAgICAgICBwcm9wcy5lbmNyeXB0aW9uS2V5IHx8XG4gICAgICAgIG5ldyBrbXMuS2V5KHRoaXMsIFwiS2V5XCIsIHtcbiAgICAgICAgICBkZXNjcmlwdGlvbjogYENyZWF0ZWQgYnkgJHt0aGlzLm5vZGUucGF0aH1gLFxuICAgICAgICB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGVuY3J5cHRpb25LZXksXG4gICAgICAgIGJ1Y2tldEVuY3J5cHRpb246IHtcbiAgICAgICAgICAvLyAoT3B0aW9uYWwpIEFjY291bnQgSUQgb2YgdGhlIGV4cGVjdGVkIGJ1Y2tldCBvd25lci5cbiAgICAgICAgICAvLyBleHBlY3RlZEJ1Y2tldE93bmVyXG4gICAgICAgICAgcnVsZTogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBidWNrZXRLZXlFbmFibGVkOiBwcm9wcy5idWNrZXRLZXlFbmFibGVkLFxuICAgICAgICAgICAgICBhcHBseVNlcnZlclNpZGVFbmNyeXB0aW9uQnlEZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgc3NlQWxnb3JpdGhtOiBcImF3czprbXM6ZHNzZVwiLFxuICAgICAgICAgICAgICAgIGttc01hc3RlcktleUlkOiBlbmNyeXB0aW9uS2V5LmtleUFybixcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKGVuY3J5cHRpb25UeXBlID09PSBCdWNrZXRFbmNyeXB0aW9uLkRTU0VfTUFOQUdFRCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYnVja2V0RW5jcnlwdGlvbjoge1xuICAgICAgICAgIC8vIChPcHRpb25hbCkgQWNjb3VudCBJRCBvZiB0aGUgZXhwZWN0ZWQgYnVja2V0IG93bmVyLlxuICAgICAgICAgIC8vIGV4cGVjdGVkQnVja2V0T3duZXJcbiAgICAgICAgICBydWxlOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGJ1Y2tldEtleUVuYWJsZWQ6IHByb3BzLmJ1Y2tldEtleUVuYWJsZWQsXG4gICAgICAgICAgICAgIGFwcGx5U2VydmVyU2lkZUVuY3J5cHRpb25CeURlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICBzc2VBbGdvcml0aG06IFwiYXdzOmttczpkc3NlXCIsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICBgVW5leHBlY3RlZCAnZW5jcnlwdGlvblR5cGUnOiAke2VuY3J5cHRpb25UeXBlfWAsXG4gICAgICB0aGlzLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhbiBpYW0gc3RhdGVtZW50IHRvIGVuZm9yY2UgU1NMIHJlcXVlc3RzIG9ubHkuXG4gICAqL1xuICBwcml2YXRlIGVuZm9yY2VTU0xTdGF0ZW1lbnQoKSB7XG4gICAgY29uc3Qgc3RhdGVtZW50ID0gbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgYWN0aW9uczogW1wiczM6KlwiXSxcbiAgICAgIGNvbmRpdGlvbjogW1xuICAgICAgICB7XG4gICAgICAgICAgdGVzdDogXCJCb29sXCIsXG4gICAgICAgICAgdmFyaWFibGU6IFwiYXdzOlNlY3VyZVRyYW5zcG9ydFwiLFxuICAgICAgICAgIHZhbHVlczogW1wiZmFsc2VcIl0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkRFTlksXG4gICAgICByZXNvdXJjZXM6IFt0aGlzLnJlc291cmNlLmFybiwgdGhpcy5hcm5Gb3JPYmplY3RzKFwiKlwiKV0sXG4gICAgICBwcmluY2lwYWxzOiBbbmV3IGlhbS5BbnlQcmluY2lwYWwoKV0sXG4gICAgfSk7XG4gICAgdGhpcy5hZGRUb1Jlc291cmNlUG9saWN5KHN0YXRlbWVudCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhbiBpYW0gc3RhdGVtZW50IHRvIGFsbG93IHJlcXVlc3RzIHdpdGggYSBtaW5pbXVtIFRMU1xuICAgKiB2ZXJzaW9uIG9ubHkuXG4gICAqL1xuICBwcml2YXRlIG1pbmltdW1UTFNWZXJzaW9uU3RhdGVtZW50KG1pbmltdW1UTFNWZXJzaW9uPzogbnVtYmVyKSB7XG4gICAgaWYgKCFtaW5pbXVtVExTVmVyc2lvbikgcmV0dXJuO1xuICAgIGNvbnN0IHN0YXRlbWVudCA9IG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgIGFjdGlvbnM6IFtcInMzOipcIl0sXG4gICAgICBjb25kaXRpb246IFtcbiAgICAgICAge1xuICAgICAgICAgIHRlc3Q6IFwiTnVtZXJpY0xlc3NUaGFuXCIsXG4gICAgICAgICAgdmFyaWFibGU6IFwiczM6VGxzVmVyc2lvblwiLFxuICAgICAgICAgIHZhbHVlczogW21pbmltdW1UTFNWZXJzaW9uLnRvU3RyaW5nKCldLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5ERU5ZLFxuICAgICAgcmVzb3VyY2VzOiBbdGhpcy5yZXNvdXJjZS5hcm4sIHRoaXMuYXJuRm9yT2JqZWN0cyhcIipcIildLFxuICAgICAgcHJpbmNpcGFsczogW25ldyBpYW0uQW55UHJpbmNpcGFsKCldLFxuICAgIH0pO1xuICAgIHRoaXMuYWRkVG9SZXNvdXJjZVBvbGljeShzdGF0ZW1lbnQpO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWRkU291cmNlT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBMb2NhbCBwYXRoIHRvIHRoZSBzb3VyY2UgZmlsZXNcbiAgICovXG4gIHJlYWRvbmx5IHBhdGg6IHN0cmluZztcbiAgLyoqXG4gICAqIFByZWZpeCB0byBhZGQgdG8gdGhlIHVwbG9hZGVkIG9iamVjdHNcbiAgICovXG4gIHJlYWRvbmx5IHByZWZpeD86IHN0cmluZztcbn1cblxuLy8gcHJpdmF0ZSBpbnRlcmZhY2UgdG8gaW5kZXggQnVja2V0IHNvdXJjZXMgYnkgaWRcbmludGVyZmFjZSBTb3VyY2VJbmRleCB7XG4gIHByb3BzOiBCdWNrZXRTb3VyY2VQcm9wcztcbiAgaWQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBTdG9yYWdlIGNsYXNzIHRvIG1vdmUgYW4gb2JqZWN0IHRvXG4gKi9cbmV4cG9ydCBlbnVtIFN0b3JhZ2VDbGFzcyB7XG4gIC8qKlxuICAgKiBTdG9yYWdlIGNsYXNzIGZvciBkYXRhIHRoYXQgaXMgYWNjZXNzZWQgbGVzcyBmcmVxdWVudGx5LCBidXQgcmVxdWlyZXMgcmFwaWRcbiAgICogYWNjZXNzIHdoZW4gbmVlZGVkLlxuICAgKlxuICAgKiBIYXMgbG93ZXIgYXZhaWxhYmlsaXR5IHRoYW4gU3RhbmRhcmQgc3RvcmFnZS5cbiAgICovXG4gIElORlJFUVVFTlRfQUNDRVNTID0gXCJTVEFOREFSRF9JQVwiLFxuXG4gIC8qKlxuICAgKiBJbmZyZXF1ZW50IEFjY2VzcyB0aGF0J3Mgb25seSBzdG9yZWQgaW4gb25lIGF2YWlsYWJpbGl0eSB6b25lLlxuICAgKlxuICAgKiBIYXMgbG93ZXIgYXZhaWxhYmlsaXR5IHRoYW4gc3RhbmRhcmQgSW5mcmVxdWVudEFjY2Vzcy5cbiAgICovXG4gIE9ORV9aT05FX0lORlJFUVVFTlRfQUNDRVNTID0gXCJPTkVaT05FX0lBXCIsXG5cbiAgLyoqXG4gICAqIFN0b3JhZ2UgY2xhc3MgZm9yIGxvbmctdGVybSBhcmNoaXZhbCB0aGF0IGNhbiB0YWtlIGJldHdlZW4gbWludXRlcyBhbmRcbiAgICogaG91cnMgdG8gYWNjZXNzLlxuICAgKlxuICAgKiBVc2UgZm9yIGFyY2hpdmVzIHdoZXJlIHBvcnRpb25zIG9mIHRoZSBkYXRhIG1pZ2h0IG5lZWQgdG8gYmUgcmV0cmlldmVkIGluXG4gICAqIG1pbnV0ZXMuIERhdGEgc3RvcmVkIGluIHRoZSBHTEFDSUVSIHN0b3JhZ2UgY2xhc3MgaGFzIGEgbWluaW11bSBzdG9yYWdlXG4gICAqIGR1cmF0aW9uIHBlcmlvZCBvZiA5MCBkYXlzIGFuZCBjYW4gYmUgYWNjZXNzZWQgaW4gYXMgbGl0dGxlIGFzIDEtNSBtaW51dGVzXG4gICAqIHVzaW5nIGV4cGVkaXRlZCByZXRyaWV2YWwuIElmIHlvdSBkZWxldGUgYW4gb2JqZWN0IGJlZm9yZSB0aGUgOTAtZGF5XG4gICAqIG1pbmltdW0sIHlvdSBhcmUgY2hhcmdlZCBmb3IgOTAgZGF5cy5cbiAgICovXG4gIEdMQUNJRVIgPSBcIkdMQUNJRVJcIixcblxuICAvKipcbiAgICogU3RvcmFnZSBjbGFzcyBmb3IgbG9uZy10ZXJtIGFyY2hpdmFsIHRoYXQgY2FuIGJlIGFjY2Vzc2VkIGluIGEgZmV3IG1pbGxpc2Vjb25kcy5cbiAgICpcbiAgICogSXQgaXMgaWRlYWwgZm9yIGRhdGEgdGhhdCBpcyBhY2Nlc3NlZCBvbmNlIG9yIHR3aWNlIHBlciBxdWFydGVyLCBhbmRcbiAgICogdGhhdCByZXF1aXJlcyBpbW1lZGlhdGUgYWNjZXNzLiBEYXRhIHN0b3JlZCBpbiB0aGUgR0xBQ0lFUl9JUiBzdG9yYWdlIGNsYXNzXG4gICAqIGhhcyBhIG1pbmltdW0gc3RvcmFnZSBkdXJhdGlvbiBwZXJpb2Qgb2YgOTAgZGF5cyBhbmQgY2FuIGJlIGFjY2Vzc2VkIGluXG4gICAqIGFzIG1pbGxpc2Vjb25kcy4gSWYgeW91IGRlbGV0ZSBhbiBvYmplY3QgYmVmb3JlIHRoZSA5MC1kYXkgbWluaW11bSxcbiAgICogeW91IGFyZSBjaGFyZ2VkIGZvciA5MCBkYXlzLlxuICAgKi9cbiAgR0xBQ0lFUl9JTlNUQU5UX1JFVFJJRVZBTCA9IFwiR0xBQ0lFUl9JUlwiLFxuXG4gIC8qKlxuICAgKiBVc2UgZm9yIGFyY2hpdmluZyBkYXRhIHRoYXQgcmFyZWx5IG5lZWRzIHRvIGJlIGFjY2Vzc2VkLiBEYXRhIHN0b3JlZCBpbiB0aGVcbiAgICogREVFUF9BUkNISVZFIHN0b3JhZ2UgY2xhc3MgaGFzIGEgbWluaW11bSBzdG9yYWdlIGR1cmF0aW9uIHBlcmlvZCBvZiAxODBcbiAgICogZGF5cyBhbmQgYSBkZWZhdWx0IHJldHJpZXZhbCB0aW1lIG9mIDEyIGhvdXJzLiBJZiB5b3UgZGVsZXRlIGFuIG9iamVjdFxuICAgKiBiZWZvcmUgdGhlIDE4MC1kYXkgbWluaW11bSwgeW91IGFyZSBjaGFyZ2VkIGZvciAxODAgZGF5cy4gRm9yIHByaWNpbmdcbiAgICogaW5mb3JtYXRpb24sIHNlZSBBbWF6b24gUzMgUHJpY2luZy5cbiAgICovXG4gIERFRVBfQVJDSElWRSA9IFwiREVFUF9BUkNISVZFXCIsXG5cbiAgLyoqXG4gICAqIFRoZSBJTlRFTExJR0VOVF9USUVSSU5HIHN0b3JhZ2UgY2xhc3MgaXMgZGVzaWduZWQgdG8gb3B0aW1pemUgc3RvcmFnZSBjb3N0c1xuICAgKiBieSBhdXRvbWF0aWNhbGx5IG1vdmluZyBkYXRhIHRvIHRoZSBtb3N0IGNvc3QtZWZmZWN0aXZlIHN0b3JhZ2UgYWNjZXNzXG4gICAqIHRpZXIsIHdpdGhvdXQgcGVyZm9ybWFuY2UgaW1wYWN0IG9yIG9wZXJhdGlvbmFsIG92ZXJoZWFkLlxuICAgKiBJTlRFTExJR0VOVF9USUVSSU5HIGRlbGl2ZXJzIGF1dG9tYXRpYyBjb3N0IHNhdmluZ3MgYnkgbW92aW5nIGRhdGEgb24gYVxuICAgKiBncmFudWxhciBvYmplY3QgbGV2ZWwgYmV0d2VlbiB0d28gYWNjZXNzIHRpZXJzLCBhIGZyZXF1ZW50IGFjY2VzcyB0aWVyIGFuZFxuICAgKiBhIGxvd2VyLWNvc3QgaW5mcmVxdWVudCBhY2Nlc3MgdGllciwgd2hlbiBhY2Nlc3MgcGF0dGVybnMgY2hhbmdlLiBUaGVcbiAgICogSU5URUxMSUdFTlRfVElFUklORyBzdG9yYWdlIGNsYXNzIGlzIGlkZWFsIGlmIHlvdSB3YW50IHRvIG9wdGltaXplIHN0b3JhZ2VcbiAgICogY29zdHMgYXV0b21hdGljYWxseSBmb3IgbG9uZy1saXZlZCBkYXRhIHdoZW4gYWNjZXNzIHBhdHRlcm5zIGFyZSB1bmtub3duIG9yXG4gICAqIHVucHJlZGljdGFibGUuXG4gICAqL1xuICBJTlRFTExJR0VOVF9USUVSSU5HID0gXCJJTlRFTExJR0VOVF9USUVSSU5HXCIsXG59XG5cbi8qKlxuICogV2hhdCBraW5kIG9mIHNlcnZlci1zaWRlIGVuY3J5cHRpb24gdG8gYXBwbHkgdG8gdGhpcyBidWNrZXRcbiAqL1xuZXhwb3J0IGVudW0gQnVja2V0RW5jcnlwdGlvbiB7XG4gIC8qKlxuICAgKiBQcmV2aW91cyBvcHRpb24uIEJ1Y2tldHMgY2FuIG5vdCBiZSB1bmVuY3J5cHRlZCBub3cuXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC91c2VyZ3VpZGUvc2Vydi1zaWRlLWVuY3J5cHRpb24uaHRtbFxuICAgKiBAZGVwcmVjYXRlZCBTMyBhcHBsaWVzIHNlcnZlci1zaWRlIGVuY3J5cHRpb24gd2l0aCBTU0UtUzMgZm9yIGV2ZXJ5IGJ1Y2tldFxuICAgKiB0aGF0IGRlZmF1bHQgZW5jcnlwdGlvbiBpcyBub3QgY29uZmlndXJlZC5cbiAgICovXG4gIFVORU5DUllQVEVEID0gXCJVTkVOQ1JZUFRFRFwiLFxuXG4gIC8qKlxuICAgKiBTZXJ2ZXItc2lkZSBLTVMgZW5jcnlwdGlvbiB3aXRoIGEgbWFzdGVyIGtleSBtYW5hZ2VkIGJ5IEtNUy5cbiAgICovXG4gIEtNU19NQU5BR0VEID0gXCJLTVNfTUFOQUdFRFwiLFxuXG4gIC8qKlxuICAgKiBTZXJ2ZXItc2lkZSBlbmNyeXB0aW9uIHdpdGggYSBtYXN0ZXIga2V5IG1hbmFnZWQgYnkgUzMuXG4gICAqL1xuICBTM19NQU5BR0VEID0gXCJTM19NQU5BR0VEXCIsXG5cbiAgLyoqXG4gICAqIFNlcnZlci1zaWRlIGVuY3J5cHRpb24gd2l0aCBhIEtNUyBrZXkgbWFuYWdlZCBieSB0aGUgdXNlci5cbiAgICogSWYgYGVuY3J5cHRpb25LZXlgIGlzIHNwZWNpZmllZCwgdGhpcyBrZXkgd2lsbCBiZSB1c2VkLCBvdGhlcndpc2UsIG9uZSB3aWxsIGJlIGRlZmluZWQuXG4gICAqL1xuICBLTVMgPSBcIktNU1wiLFxuXG4gIC8qKlxuICAgKiBEb3VibGUgc2VydmVyLXNpZGUgS01TIGVuY3J5cHRpb24gd2l0aCBhIG1hc3RlciBrZXkgbWFuYWdlZCBieSBLTVMuXG4gICAqL1xuICBEU1NFX01BTkFHRUQgPSBcIkRTU0VfTUFOQUdFRFwiLFxuXG4gIC8qKlxuICAgKiBEb3VibGUgc2VydmVyLXNpZGUgZW5jcnlwdGlvbiB3aXRoIGEgS01TIGtleSBtYW5hZ2VkIGJ5IHRoZSB1c2VyLlxuICAgKiBJZiBgZW5jcnlwdGlvbktleWAgaXMgc3BlY2lmaWVkLCB0aGlzIGtleSB3aWxsIGJlIHVzZWQsIG90aGVyd2lzZSwgb25lIHdpbGwgYmUgZGVmaW5lZC5cbiAgICovXG4gIERTU0UgPSBcIkRTU0VcIixcbn1cblxuLyoqXG4gKiBOb3RpZmljYXRpb24gZXZlbnQgdHlwZXMuXG4gKiBAbGluayBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L3VzZXJndWlkZS9ub3RpZmljYXRpb24taG93LXRvLWV2ZW50LXR5cGVzLWFuZC1kZXN0aW5hdGlvbnMuaHRtbCNzdXBwb3J0ZWQtbm90aWZpY2F0aW9uLWV2ZW50LXR5cGVzXG4gKi9cbmV4cG9ydCBlbnVtIEV2ZW50VHlwZSB7XG4gIC8qKlxuICAgKiBBbWF6b24gUzMgQVBJcyBzdWNoIGFzIFBVVCwgUE9TVCwgYW5kIENPUFkgY2FuIGNyZWF0ZSBhbiBvYmplY3QuIFVzaW5nXG4gICAqIHRoZXNlIGV2ZW50IHR5cGVzLCB5b3UgY2FuIGVuYWJsZSBub3RpZmljYXRpb24gd2hlbiBhbiBvYmplY3QgaXMgY3JlYXRlZFxuICAgKiB1c2luZyBhIHNwZWNpZmljIEFQSSwgb3IgeW91IGNhbiB1c2UgdGhlIHMzOk9iamVjdENyZWF0ZWQ6KiBldmVudCB0eXBlIHRvXG4gICAqIHJlcXVlc3Qgbm90aWZpY2F0aW9uIHJlZ2FyZGxlc3Mgb2YgdGhlIEFQSSB0aGF0IHdhcyB1c2VkIHRvIGNyZWF0ZSBhblxuICAgKiBvYmplY3QuXG4gICAqL1xuICBPQkpFQ1RfQ1JFQVRFRCA9IFwiczM6T2JqZWN0Q3JlYXRlZDoqXCIsXG5cbiAgLyoqXG4gICAqIEFtYXpvbiBTMyBBUElzIHN1Y2ggYXMgUFVULCBQT1NULCBhbmQgQ09QWSBjYW4gY3JlYXRlIGFuIG9iamVjdC4gVXNpbmdcbiAgICogdGhlc2UgZXZlbnQgdHlwZXMsIHlvdSBjYW4gZW5hYmxlIG5vdGlmaWNhdGlvbiB3aGVuIGFuIG9iamVjdCBpcyBjcmVhdGVkXG4gICAqIHVzaW5nIGEgc3BlY2lmaWMgQVBJLCBvciB5b3UgY2FuIHVzZSB0aGUgczM6T2JqZWN0Q3JlYXRlZDoqIGV2ZW50IHR5cGUgdG9cbiAgICogcmVxdWVzdCBub3RpZmljYXRpb24gcmVnYXJkbGVzcyBvZiB0aGUgQVBJIHRoYXQgd2FzIHVzZWQgdG8gY3JlYXRlIGFuXG4gICAqIG9iamVjdC5cbiAgICovXG4gIE9CSkVDVF9DUkVBVEVEX1BVVCA9IFwiczM6T2JqZWN0Q3JlYXRlZDpQdXRcIixcblxuICAvKipcbiAgICogQW1hem9uIFMzIEFQSXMgc3VjaCBhcyBQVVQsIFBPU1QsIGFuZCBDT1BZIGNhbiBjcmVhdGUgYW4gb2JqZWN0LiBVc2luZ1xuICAgKiB0aGVzZSBldmVudCB0eXBlcywgeW91IGNhbiBlbmFibGUgbm90aWZpY2F0aW9uIHdoZW4gYW4gb2JqZWN0IGlzIGNyZWF0ZWRcbiAgICogdXNpbmcgYSBzcGVjaWZpYyBBUEksIG9yIHlvdSBjYW4gdXNlIHRoZSBzMzpPYmplY3RDcmVhdGVkOiogZXZlbnQgdHlwZSB0b1xuICAgKiByZXF1ZXN0IG5vdGlmaWNhdGlvbiByZWdhcmRsZXNzIG9mIHRoZSBBUEkgdGhhdCB3YXMgdXNlZCB0byBjcmVhdGUgYW5cbiAgICogb2JqZWN0LlxuICAgKi9cbiAgT0JKRUNUX0NSRUFURURfUE9TVCA9IFwiczM6T2JqZWN0Q3JlYXRlZDpQb3N0XCIsXG5cbiAgLyoqXG4gICAqIEFtYXpvbiBTMyBBUElzIHN1Y2ggYXMgUFVULCBQT1NULCBhbmQgQ09QWSBjYW4gY3JlYXRlIGFuIG9iamVjdC4gVXNpbmdcbiAgICogdGhlc2UgZXZlbnQgdHlwZXMsIHlvdSBjYW4gZW5hYmxlIG5vdGlmaWNhdGlvbiB3aGVuIGFuIG9iamVjdCBpcyBjcmVhdGVkXG4gICAqIHVzaW5nIGEgc3BlY2lmaWMgQVBJLCBvciB5b3UgY2FuIHVzZSB0aGUgczM6T2JqZWN0Q3JlYXRlZDoqIGV2ZW50IHR5cGUgdG9cbiAgICogcmVxdWVzdCBub3RpZmljYXRpb24gcmVnYXJkbGVzcyBvZiB0aGUgQVBJIHRoYXQgd2FzIHVzZWQgdG8gY3JlYXRlIGFuXG4gICAqIG9iamVjdC5cbiAgICovXG4gIE9CSkVDVF9DUkVBVEVEX0NPUFkgPSBcInMzOk9iamVjdENyZWF0ZWQ6Q29weVwiLFxuXG4gIC8qKlxuICAgKiBBbWF6b24gUzMgQVBJcyBzdWNoIGFzIFBVVCwgUE9TVCwgYW5kIENPUFkgY2FuIGNyZWF0ZSBhbiBvYmplY3QuIFVzaW5nXG4gICAqIHRoZXNlIGV2ZW50IHR5cGVzLCB5b3UgY2FuIGVuYWJsZSBub3RpZmljYXRpb24gd2hlbiBhbiBvYmplY3QgaXMgY3JlYXRlZFxuICAgKiB1c2luZyBhIHNwZWNpZmljIEFQSSwgb3IgeW91IGNhbiB1c2UgdGhlIHMzOk9iamVjdENyZWF0ZWQ6KiBldmVudCB0eXBlIHRvXG4gICAqIHJlcXVlc3Qgbm90aWZpY2F0aW9uIHJlZ2FyZGxlc3Mgb2YgdGhlIEFQSSB0aGF0IHdhcyB1c2VkIHRvIGNyZWF0ZSBhblxuICAgKiBvYmplY3QuXG4gICAqL1xuICBPQkpFQ1RfQ1JFQVRFRF9DT01QTEVURV9NVUxUSVBBUlRfVVBMT0FEID0gXCJzMzpPYmplY3RDcmVhdGVkOkNvbXBsZXRlTXVsdGlwYXJ0VXBsb2FkXCIsXG5cbiAgLyoqXG4gICAqIEJ5IHVzaW5nIHRoZSBPYmplY3RSZW1vdmVkIGV2ZW50IHR5cGVzLCB5b3UgY2FuIGVuYWJsZSBub3RpZmljYXRpb24gd2hlblxuICAgKiBhbiBvYmplY3Qgb3IgYSBiYXRjaCBvZiBvYmplY3RzIGlzIHJlbW92ZWQgZnJvbSBhIGJ1Y2tldC5cbiAgICpcbiAgICogWW91IGNhbiByZXF1ZXN0IG5vdGlmaWNhdGlvbiB3aGVuIGFuIG9iamVjdCBpcyBkZWxldGVkIG9yIGEgdmVyc2lvbmVkXG4gICAqIG9iamVjdCBpcyBwZXJtYW5lbnRseSBkZWxldGVkIGJ5IHVzaW5nIHRoZSBzMzpPYmplY3RSZW1vdmVkOkRlbGV0ZSBldmVudFxuICAgKiB0eXBlLiBPciB5b3UgY2FuIHJlcXVlc3Qgbm90aWZpY2F0aW9uIHdoZW4gYSBkZWxldGUgbWFya2VyIGlzIGNyZWF0ZWQgZm9yXG4gICAqIGEgdmVyc2lvbmVkIG9iamVjdCBieSB1c2luZyBzMzpPYmplY3RSZW1vdmVkOkRlbGV0ZU1hcmtlckNyZWF0ZWQuIEZvclxuICAgKiBpbmZvcm1hdGlvbiBhYm91dCBkZWxldGluZyB2ZXJzaW9uZWQgb2JqZWN0cywgc2VlIERlbGV0aW5nIE9iamVjdFxuICAgKiBWZXJzaW9ucy4gWW91IGNhbiBhbHNvIHVzZSBhIHdpbGRjYXJkIHMzOk9iamVjdFJlbW92ZWQ6KiB0byByZXF1ZXN0XG4gICAqIG5vdGlmaWNhdGlvbiBhbnl0aW1lIGFuIG9iamVjdCBpcyBkZWxldGVkLlxuICAgKlxuICAgKiBZb3Ugd2lsbCBub3QgcmVjZWl2ZSBldmVudCBub3RpZmljYXRpb25zIGZyb20gYXV0b21hdGljIGRlbGV0ZXMgZnJvbVxuICAgKiBsaWZlY3ljbGUgcG9saWNpZXMgb3IgZnJvbSBmYWlsZWQgb3BlcmF0aW9ucy5cbiAgICovXG4gIE9CSkVDVF9SRU1PVkVEID0gXCJzMzpPYmplY3RSZW1vdmVkOipcIixcblxuICAvKipcbiAgICogQnkgdXNpbmcgdGhlIE9iamVjdFJlbW92ZWQgZXZlbnQgdHlwZXMsIHlvdSBjYW4gZW5hYmxlIG5vdGlmaWNhdGlvbiB3aGVuXG4gICAqIGFuIG9iamVjdCBvciBhIGJhdGNoIG9mIG9iamVjdHMgaXMgcmVtb3ZlZCBmcm9tIGEgYnVja2V0LlxuICAgKlxuICAgKiBZb3UgY2FuIHJlcXVlc3Qgbm90aWZpY2F0aW9uIHdoZW4gYW4gb2JqZWN0IGlzIGRlbGV0ZWQgb3IgYSB2ZXJzaW9uZWRcbiAgICogb2JqZWN0IGlzIHBlcm1hbmVudGx5IGRlbGV0ZWQgYnkgdXNpbmcgdGhlIHMzOk9iamVjdFJlbW92ZWQ6RGVsZXRlIGV2ZW50XG4gICAqIHR5cGUuIE9yIHlvdSBjYW4gcmVxdWVzdCBub3RpZmljYXRpb24gd2hlbiBhIGRlbGV0ZSBtYXJrZXIgaXMgY3JlYXRlZCBmb3JcbiAgICogYSB2ZXJzaW9uZWQgb2JqZWN0IGJ5IHVzaW5nIHMzOk9iamVjdFJlbW92ZWQ6RGVsZXRlTWFya2VyQ3JlYXRlZC4gRm9yXG4gICAqIGluZm9ybWF0aW9uIGFib3V0IGRlbGV0aW5nIHZlcnNpb25lZCBvYmplY3RzLCBzZWUgRGVsZXRpbmcgT2JqZWN0XG4gICAqIFZlcnNpb25zLiBZb3UgY2FuIGFsc28gdXNlIGEgd2lsZGNhcmQgczM6T2JqZWN0UmVtb3ZlZDoqIHRvIHJlcXVlc3RcbiAgICogbm90aWZpY2F0aW9uIGFueXRpbWUgYW4gb2JqZWN0IGlzIGRlbGV0ZWQuXG4gICAqXG4gICAqIFlvdSB3aWxsIG5vdCByZWNlaXZlIGV2ZW50IG5vdGlmaWNhdGlvbnMgZnJvbSBhdXRvbWF0aWMgZGVsZXRlcyBmcm9tXG4gICAqIGxpZmVjeWNsZSBwb2xpY2llcyBvciBmcm9tIGZhaWxlZCBvcGVyYXRpb25zLlxuICAgKi9cbiAgT0JKRUNUX1JFTU9WRURfREVMRVRFID0gXCJzMzpPYmplY3RSZW1vdmVkOkRlbGV0ZVwiLFxuXG4gIC8qKlxuICAgKiBCeSB1c2luZyB0aGUgT2JqZWN0UmVtb3ZlZCBldmVudCB0eXBlcywgeW91IGNhbiBlbmFibGUgbm90aWZpY2F0aW9uIHdoZW5cbiAgICogYW4gb2JqZWN0IG9yIGEgYmF0Y2ggb2Ygb2JqZWN0cyBpcyByZW1vdmVkIGZyb20gYSBidWNrZXQuXG4gICAqXG4gICAqIFlvdSBjYW4gcmVxdWVzdCBub3RpZmljYXRpb24gd2hlbiBhbiBvYmplY3QgaXMgZGVsZXRlZCBvciBhIHZlcnNpb25lZFxuICAgKiBvYmplY3QgaXMgcGVybWFuZW50bHkgZGVsZXRlZCBieSB1c2luZyB0aGUgczM6T2JqZWN0UmVtb3ZlZDpEZWxldGUgZXZlbnRcbiAgICogdHlwZS4gT3IgeW91IGNhbiByZXF1ZXN0IG5vdGlmaWNhdGlvbiB3aGVuIGEgZGVsZXRlIG1hcmtlciBpcyBjcmVhdGVkIGZvclxuICAgKiBhIHZlcnNpb25lZCBvYmplY3QgYnkgdXNpbmcgczM6T2JqZWN0UmVtb3ZlZDpEZWxldGVNYXJrZXJDcmVhdGVkLiBGb3JcbiAgICogaW5mb3JtYXRpb24gYWJvdXQgZGVsZXRpbmcgdmVyc2lvbmVkIG9iamVjdHMsIHNlZSBEZWxldGluZyBPYmplY3RcbiAgICogVmVyc2lvbnMuIFlvdSBjYW4gYWxzbyB1c2UgYSB3aWxkY2FyZCBzMzpPYmplY3RSZW1vdmVkOiogdG8gcmVxdWVzdFxuICAgKiBub3RpZmljYXRpb24gYW55dGltZSBhbiBvYmplY3QgaXMgZGVsZXRlZC5cbiAgICpcbiAgICogWW91IHdpbGwgbm90IHJlY2VpdmUgZXZlbnQgbm90aWZpY2F0aW9ucyBmcm9tIGF1dG9tYXRpYyBkZWxldGVzIGZyb21cbiAgICogbGlmZWN5Y2xlIHBvbGljaWVzIG9yIGZyb20gZmFpbGVkIG9wZXJhdGlvbnMuXG4gICAqL1xuICBPQkpFQ1RfUkVNT1ZFRF9ERUxFVEVfTUFSS0VSX0NSRUFURUQgPSBcInMzOk9iamVjdFJlbW92ZWQ6RGVsZXRlTWFya2VyQ3JlYXRlZFwiLFxuXG4gIC8qKlxuICAgKiBVc2luZyByZXN0b3JlIG9iamVjdCBldmVudCB0eXBlcyB5b3UgY2FuIHJlY2VpdmUgbm90aWZpY2F0aW9ucyBmb3JcbiAgICogaW5pdGlhdGlvbiBhbmQgY29tcGxldGlvbiB3aGVuIHJlc3RvcmluZyBvYmplY3RzIGZyb20gdGhlIFMzIEdsYWNpZXJcbiAgICogc3RvcmFnZSBjbGFzcy5cbiAgICpcbiAgICogWW91IHVzZSBzMzpPYmplY3RSZXN0b3JlOlBvc3QgdG8gcmVxdWVzdCBub3RpZmljYXRpb24gb2Ygb2JqZWN0IHJlc3RvcmF0aW9uXG4gICAqIGluaXRpYXRpb24uXG4gICAqL1xuICBPQkpFQ1RfUkVTVE9SRV9QT1NUID0gXCJzMzpPYmplY3RSZXN0b3JlOlBvc3RcIixcblxuICAvKipcbiAgICogVXNpbmcgcmVzdG9yZSBvYmplY3QgZXZlbnQgdHlwZXMgeW91IGNhbiByZWNlaXZlIG5vdGlmaWNhdGlvbnMgZm9yXG4gICAqIGluaXRpYXRpb24gYW5kIGNvbXBsZXRpb24gd2hlbiByZXN0b3Jpbmcgb2JqZWN0cyBmcm9tIHRoZSBTMyBHbGFjaWVyXG4gICAqIHN0b3JhZ2UgY2xhc3MuXG4gICAqXG4gICAqIFlvdSB1c2UgczM6T2JqZWN0UmVzdG9yZTpDb21wbGV0ZWQgdG8gcmVxdWVzdCBub3RpZmljYXRpb24gb2ZcbiAgICogcmVzdG9yYXRpb24gY29tcGxldGlvbi5cbiAgICovXG4gIE9CSkVDVF9SRVNUT1JFX0NPTVBMRVRFRCA9IFwiczM6T2JqZWN0UmVzdG9yZTpDb21wbGV0ZWRcIixcblxuICAvKipcbiAgICogVXNpbmcgcmVzdG9yZSBvYmplY3QgZXZlbnQgdHlwZXMgeW91IGNhbiByZWNlaXZlIG5vdGlmaWNhdGlvbnMgZm9yXG4gICAqIGluaXRpYXRpb24gYW5kIGNvbXBsZXRpb24gd2hlbiByZXN0b3Jpbmcgb2JqZWN0cyBmcm9tIHRoZSBTMyBHbGFjaWVyXG4gICAqIHN0b3JhZ2UgY2xhc3MuXG4gICAqXG4gICAqIFlvdSB1c2UgczM6T2JqZWN0UmVzdG9yZTpEZWxldGUgdG8gcmVxdWVzdCBub3RpZmljYXRpb24gb2ZcbiAgICogcmVzdG9yYXRpb24gY29tcGxldGlvbi5cbiAgICovXG4gIE9CSkVDVF9SRVNUT1JFX0RFTEVURSA9IFwiczM6T2JqZWN0UmVzdG9yZTpEZWxldGVcIixcblxuICAvKipcbiAgICogWW91IGNhbiB1c2UgdGhpcyBldmVudCB0eXBlIHRvIHJlcXVlc3QgQW1hem9uIFMzIHRvIHNlbmQgYSBub3RpZmljYXRpb25cbiAgICogbWVzc2FnZSB3aGVuIEFtYXpvbiBTMyBkZXRlY3RzIHRoYXQgYW4gb2JqZWN0IG9mIHRoZSBSUlMgc3RvcmFnZSBjbGFzcyBpc1xuICAgKiBsb3N0LlxuICAgKi9cbiAgUkVEVUNFRF9SRURVTkRBTkNZX0xPU1RfT0JKRUNUID0gXCJzMzpSZWR1Y2VkUmVkdW5kYW5jeUxvc3RPYmplY3RcIixcblxuICAvKipcbiAgICogWW91IHJlY2VpdmUgdGhpcyBub3RpZmljYXRpb24gZXZlbnQgd2hlbiBhbiBvYmplY3QgdGhhdCB3YXMgZWxpZ2libGUgZm9yXG4gICAqIHJlcGxpY2F0aW9uIHVzaW5nIEFtYXpvbiBTMyBSZXBsaWNhdGlvbiBUaW1lIENvbnRyb2wgZmFpbGVkIHRvIHJlcGxpY2F0ZS5cbiAgICovXG4gIFJFUExJQ0FUSU9OX09QRVJBVElPTl9GQUlMRURfUkVQTElDQVRJT04gPSBcInMzOlJlcGxpY2F0aW9uOk9wZXJhdGlvbkZhaWxlZFJlcGxpY2F0aW9uXCIsXG5cbiAgLyoqXG4gICAqIFlvdSByZWNlaXZlIHRoaXMgbm90aWZpY2F0aW9uIGV2ZW50IHdoZW4gYW4gb2JqZWN0IHRoYXQgd2FzIGVsaWdpYmxlIGZvclxuICAgKiByZXBsaWNhdGlvbiB1c2luZyBBbWF6b24gUzMgUmVwbGljYXRpb24gVGltZSBDb250cm9sIGV4Y2VlZGVkIHRoZSAxNS1taW51dGVcbiAgICogdGhyZXNob2xkIGZvciByZXBsaWNhdGlvbi5cbiAgICovXG4gIFJFUExJQ0FUSU9OX09QRVJBVElPTl9NSVNTRURfVEhSRVNIT0xEID0gXCJzMzpSZXBsaWNhdGlvbjpPcGVyYXRpb25NaXNzZWRUaHJlc2hvbGRcIixcblxuICAvKipcbiAgICogWW91IHJlY2VpdmUgdGhpcyBub3RpZmljYXRpb24gZXZlbnQgZm9yIGFuIG9iamVjdCB0aGF0IHdhcyBlbGlnaWJsZSBmb3JcbiAgICogcmVwbGljYXRpb24gdXNpbmcgdGhlIEFtYXpvbiBTMyBSZXBsaWNhdGlvbiBUaW1lIENvbnRyb2wgZmVhdHVyZSByZXBsaWNhdGVkXG4gICAqIGFmdGVyIHRoZSAxNS1taW51dGUgdGhyZXNob2xkLlxuICAgKi9cbiAgUkVQTElDQVRJT05fT1BFUkFUSU9OX1JFUExJQ0FURURfQUZURVJfVEhSRVNIT0xEID0gXCJzMzpSZXBsaWNhdGlvbjpPcGVyYXRpb25SZXBsaWNhdGVkQWZ0ZXJUaHJlc2hvbGRcIixcblxuICAvKipcbiAgICogWW91IHJlY2VpdmUgdGhpcyBub3RpZmljYXRpb24gZXZlbnQgZm9yIGFuIG9iamVjdCB0aGF0IHdhcyBlbGlnaWJsZSBmb3JcbiAgICogcmVwbGljYXRpb24gdXNpbmcgQW1hem9uIFMzIFJlcGxpY2F0aW9uIFRpbWUgQ29udHJvbCBidXQgaXMgbm8gbG9uZ2VyIHRyYWNrZWRcbiAgICogYnkgcmVwbGljYXRpb24gbWV0cmljcy5cbiAgICovXG4gIFJFUExJQ0FUSU9OX09QRVJBVElPTl9OT1RfVFJBQ0tFRCA9IFwiczM6UmVwbGljYXRpb246T3BlcmF0aW9uTm90VHJhY2tlZFwiLFxuXG4gIC8qKlxuICAgKiBCeSB1c2luZyB0aGUgTGlmZWN5Y2xlRXhwaXJhdGlvbiBldmVudCB0eXBlcywgeW91IGNhbiByZWNlaXZlIGEgbm90aWZpY2F0aW9uXG4gICAqIHdoZW4gQW1hem9uIFMzIGRlbGV0ZXMgYW4gb2JqZWN0IGJhc2VkIG9uIHlvdXIgUzMgTGlmZWN5Y2xlIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBMSUZFQ1lDTEVfRVhQSVJBVElPTiA9IFwiczM6TGlmZWN5Y2xlRXhwaXJhdGlvbjoqXCIsXG5cbiAgLyoqXG4gICAqIFRoZSBzMzpMaWZlY3ljbGVFeHBpcmF0aW9uOkRlbGV0ZSBldmVudCB0eXBlIG5vdGlmaWVzIHlvdSB3aGVuIGFuIG9iamVjdFxuICAgKiBpbiBhbiB1bnZlcnNpb25lZCBidWNrZXQgaXMgZGVsZXRlZC5cbiAgICogSXQgYWxzbyBub3RpZmllcyB5b3Ugd2hlbiBhbiBvYmplY3QgdmVyc2lvbiBpcyBwZXJtYW5lbnRseSBkZWxldGVkIGJ5IGFuXG4gICAqIFMzIExpZmVjeWNsZSBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgTElGRUNZQ0xFX0VYUElSQVRJT05fREVMRVRFID0gXCJzMzpMaWZlY3ljbGVFeHBpcmF0aW9uOkRlbGV0ZVwiLFxuXG4gIC8qKlxuICAgKiBUaGUgczM6TGlmZWN5Y2xlRXhwaXJhdGlvbjpEZWxldGVNYXJrZXJDcmVhdGVkIGV2ZW50IHR5cGUgbm90aWZpZXMgeW91XG4gICAqIHdoZW4gUzMgTGlmZWN5Y2xlIGNyZWF0ZXMgYSBkZWxldGUgbWFya2VyIHdoZW4gYSBjdXJyZW50IHZlcnNpb24gb2YgYW5cbiAgICogb2JqZWN0IGluIHZlcnNpb25lZCBidWNrZXQgaXMgZGVsZXRlZC5cbiAgICovXG4gIExJRkVDWUNMRV9FWFBJUkFUSU9OX0RFTEVURV9NQVJLRVJfQ1JFQVRFRCA9IFwiczM6TGlmZWN5Y2xlRXhwaXJhdGlvbjpEZWxldGVNYXJrZXJDcmVhdGVkXCIsXG5cbiAgLyoqXG4gICAqIFlvdSByZWNlaXZlIHRoaXMgbm90aWZpY2F0aW9uIGV2ZW50IHdoZW4gYW4gb2JqZWN0IGlzIHRyYW5zaXRpb25lZCB0b1xuICAgKiBhbm90aGVyIEFtYXpvbiBTMyBzdG9yYWdlIGNsYXNzIGJ5IGFuIFMzIExpZmVjeWNsZSBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgTElGRUNZQ0xFX1RSQU5TSVRJT04gPSBcInMzOkxpZmVjeWNsZVRyYW5zaXRpb25cIixcblxuICAvKipcbiAgICogWW91IHJlY2VpdmUgdGhpcyBub3RpZmljYXRpb24gZXZlbnQgd2hlbiBhbiBvYmplY3Qgd2l0aGluIHRoZVxuICAgKiBTMyBJbnRlbGxpZ2VudC1UaWVyaW5nIHN0b3JhZ2UgY2xhc3MgbW92ZWQgdG8gdGhlIEFyY2hpdmUgQWNjZXNzIHRpZXIgb3JcbiAgICogRGVlcCBBcmNoaXZlIEFjY2VzcyB0aWVyLlxuICAgKi9cbiAgSU5URUxMSUdFTlRfVElFUklORyA9IFwiczM6SW50ZWxsaWdlbnRUaWVyaW5nXCIsXG5cbiAgLyoqXG4gICAqIEJ5IHVzaW5nIHRoZSBPYmplY3RUYWdnaW5nIGV2ZW50IHR5cGVzLCB5b3UgY2FuIGVuYWJsZSBub3RpZmljYXRpb24gd2hlblxuICAgKiBhbiBvYmplY3QgdGFnIGlzIGFkZGVkIG9yIGRlbGV0ZWQgZnJvbSBhbiBvYmplY3QuXG4gICAqL1xuICBPQkpFQ1RfVEFHR0lORyA9IFwiczM6T2JqZWN0VGFnZ2luZzoqXCIsXG5cbiAgLyoqXG4gICAqIFRoZSBzMzpPYmplY3RUYWdnaW5nOlB1dCBldmVudCB0eXBlIG5vdGlmaWVzIHlvdSB3aGVuIGEgdGFnIGlzIFBVVCBvbiBhblxuICAgKiBvYmplY3Qgb3IgYW4gZXhpc3RpbmcgdGFnIGlzIHVwZGF0ZWQuXG5cbiAgICovXG4gIE9CSkVDVF9UQUdHSU5HX1BVVCA9IFwiczM6T2JqZWN0VGFnZ2luZzpQdXRcIixcblxuICAvKipcbiAgICogVGhlIHMzOk9iamVjdFRhZ2dpbmc6RGVsZXRlIGV2ZW50IHR5cGUgbm90aWZpZXMgeW91IHdoZW4gYSB0YWcgaXMgcmVtb3ZlZFxuICAgKiBmcm9tIGFuIG9iamVjdC5cbiAgICovXG4gIE9CSkVDVF9UQUdHSU5HX0RFTEVURSA9IFwiczM6T2JqZWN0VGFnZ2luZzpEZWxldGVcIixcblxuICAvKipcbiAgICogWW91IHJlY2VpdmUgdGhpcyBub3RpZmljYXRpb24gZXZlbnQgd2hlbiBhbiBBQ0wgaXMgUFVUIG9uIGFuIG9iamVjdCBvciB3aGVuXG4gICAqIGFuIGV4aXN0aW5nIEFDTCBpcyBjaGFuZ2VkLlxuICAgKiBBbiBldmVudCBpcyBub3QgZ2VuZXJhdGVkIHdoZW4gYSByZXF1ZXN0IHJlc3VsdHMgaW4gbm8gY2hhbmdlIHRvIGFuXG4gICAqIG9iamVjdOKAmXMgQUNMLlxuICAgKi9cbiAgT0JKRUNUX0FDTF9QVVQgPSBcInMzOk9iamVjdEFjbDpQdXRcIixcbn1cblxuZXhwb3J0IGludGVyZmFjZSBOb3RpZmljYXRpb25LZXlGaWx0ZXIge1xuICAvKipcbiAgICogVW5pcXVlIGlkZW50aWZpZXIgZm9yIGVhY2ggb2YgdGhlIG5vdGlmaWNhdGlvbiBjb25maWd1cmF0aW9ucy5cbiAgICovXG4gIHJlYWRvbmx5IGlkPzogc3RyaW5nO1xuICAvKipcbiAgICogUzMga2V5cyBtdXN0IGhhdmUgdGhlIHNwZWNpZmllZCBwcmVmaXguXG4gICAqL1xuICByZWFkb25seSBwcmVmaXg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFMzIGtleXMgbXVzdCBoYXZlIHRoZSBzcGVjaWZpZWQgc3VmZml4LlxuICAgKi9cbiAgcmVhZG9ubHkgc3VmZml4Pzogc3RyaW5nO1xufVxuIl19
|