terraconstructs 0.1.7 → 0.1.9
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 +1602 -1223
- package/go.mod +83 -77
- package/go.sum +175 -159
- package/lib/asset-staging.js +1 -1
- package/lib/aws/arn.js +1 -1
- package/lib/aws/aws-asset-manager.js +1 -1
- package/lib/aws/aws-construct.js +1 -1
- package/lib/aws/aws-stack.js +1 -1
- package/lib/aws/aws-tags.js +2 -2
- 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 +1 -1
- 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.js +9 -8
- package/lib/aws/cloudwatch/composite-alarm.js +1 -1
- package/lib/aws/cloudwatch/dashboard.js +1 -1
- package/lib/aws/cloudwatch/data-protection-policy.js +3 -3
- package/lib/aws/cloudwatch/graph.js +8 -8
- package/lib/aws/cloudwatch/layout.js +3 -3
- package/lib/aws/cloudwatch/log-destinations/kinesis.js +1 -1
- package/lib/aws/cloudwatch/log-destinations/lambda.js +1 -1
- package/lib/aws/cloudwatch/log-group.js +1 -1
- package/lib/aws/cloudwatch/log-query.js +1 -1
- package/lib/aws/cloudwatch/log-stream.js +1 -1
- package/lib/aws/cloudwatch/metric-filter.js +1 -1
- package/lib/aws/cloudwatch/metric.js +2 -2
- package/lib/aws/cloudwatch/pattern.js +3 -3
- package/lib/aws/cloudwatch/policy.js +1 -1
- package/lib/aws/cloudwatch/query-definition.js +2 -2
- package/lib/aws/cloudwatch/stats.js +1 -1
- package/lib/aws/cloudwatch/subscription-filter.js +1 -1
- package/lib/aws/cloudwatch/text.js +1 -1
- package/lib/aws/cloudwatch/variable.js +3 -3
- package/lib/aws/cloudwatch/widget.js +1 -1
- package/lib/aws/compute/access-log.js +9 -7
- package/lib/aws/compute/activity.js +1 -1
- package/lib/aws/compute/alb/application-listener-action.js +1 -1
- package/lib/aws/compute/alb/application-listener-certificate.js +1 -1
- package/lib/aws/compute/alb/application-listener-rule.js +1 -1
- package/lib/aws/compute/alb/application-listener.js +1 -1
- package/lib/aws/compute/alb/application-load-balancer.js +1 -1
- package/lib/aws/compute/alb/application-target-group.js +1 -1
- package/lib/aws/compute/alb/conditions.js +1 -1
- package/lib/aws/compute/alb/trust-store-revocation.js +1 -1
- package/lib/aws/compute/alb/trust-store.js +1 -1
- package/lib/aws/compute/api-definition.d.ts +1 -1
- package/lib/aws/compute/api-definition.js +11 -16
- package/lib/aws/compute/api-key.js +7 -8
- package/lib/aws/compute/apigateway-util.js +10 -21
- package/lib/aws/compute/architecture.js +1 -1
- package/lib/aws/compute/aspects/require-imdsv2-aspect.js +2 -2
- package/lib/aws/compute/authorizer.js +1 -1
- package/lib/aws/compute/authorizers/identity-source.js +4 -5
- package/lib/aws/compute/authorizers/lambda.js +8 -11
- package/lib/aws/compute/autoscaling-common/interval-utils.js +7 -11
- package/lib/aws/compute/base-path-mapping.js +6 -8
- package/lib/aws/compute/base-scalable-attribute.js +1 -1
- package/lib/aws/compute/bastion-host.js +1 -1
- package/lib/aws/compute/chain.js +1 -1
- package/lib/aws/compute/client-vpn-authorization-rule.js +1 -1
- package/lib/aws/compute/client-vpn-endpoint.js +2 -2
- package/lib/aws/compute/client-vpn-route.js +2 -2
- package/lib/aws/compute/code.js +23 -40
- 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 +1 -1
- package/lib/aws/compute/domain-name.js +9 -8
- package/lib/aws/compute/event-invoke-config.js +1 -1
- package/lib/aws/compute/event-source-filter.js +2 -2
- package/lib/aws/compute/event-source-mapping.js +1 -1
- package/lib/aws/compute/event-sources/s3-onfailure-destination.js +1 -1
- package/lib/aws/compute/event-sources/s3.js +1 -1
- package/lib/aws/compute/event-sources/sqs-dlq.js +1 -1
- package/lib/aws/compute/event-sources/sqs.js +1 -1
- package/lib/aws/compute/fields.js +4 -4
- package/lib/aws/compute/function-alias.js +1 -1
- package/lib/aws/compute/function-base.js +12 -12
- 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/function.js +1 -1
- package/lib/aws/compute/function-url.js +1 -1
- package/lib/aws/compute/function-vpc-config.generated.d.ts +3 -3
- package/lib/aws/compute/function-vpc-config.generated.js +1 -1
- package/lib/aws/compute/function.js +4 -3
- package/lib/aws/compute/gateway-response.js +2 -2
- package/lib/aws/compute/handler.js +1 -1
- package/lib/aws/compute/instance-types.js +1 -1
- package/lib/aws/compute/instance.js +1 -1
- package/lib/aws/compute/integration.js +10 -16
- package/lib/aws/compute/integrations/aws.js +4 -4
- package/lib/aws/compute/integrations/http.js +1 -1
- package/lib/aws/compute/integrations/lambda.js +1 -1
- package/lib/aws/compute/integrations/mock.js +1 -1
- package/lib/aws/compute/integrations/stepfunctions.js +4 -5
- package/lib/aws/compute/ip-addresses.js +2 -2
- package/lib/aws/compute/ipam.js +1 -1
- package/lib/aws/compute/key-pair.js +1 -1
- package/lib/aws/compute/lambda-api.js +7 -10
- package/lib/aws/compute/launch-template.js +2 -2
- package/lib/aws/compute/lb-shared/base-listener.js +1 -1
- package/lib/aws/compute/lb-shared/base-load-balancer.js +2 -2
- package/lib/aws/compute/lb-shared/base-target-group.js +1 -1
- package/lib/aws/compute/lb-shared/lb-listener-config.generated.d.ts +37 -31
- 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 +10 -4
- package/lib/aws/compute/lb-shared/lb-target-group-attachment-config.generated.js +1 -1
- package/lib/aws/compute/lb-shared/listener-certificate.js +1 -1
- package/lib/aws/compute/lb-shared/load-balancer-targets.js +2 -2
- package/lib/aws/compute/lb-targets/alb-target.js +3 -3
- package/lib/aws/compute/lb-targets/instance-target.js +2 -2
- package/lib/aws/compute/lb-targets/ip-target.js +1 -1
- package/lib/aws/compute/lb-targets/lambda-target.js +1 -1
- package/lib/aws/compute/load-balancer.js +3 -3
- package/lib/aws/compute/machine-image/amazon-linux-2022.js +2 -2
- package/lib/aws/compute/machine-image/amazon-linux-2023.js +2 -2
- package/lib/aws/compute/machine-image/amazon-linux2.js +2 -2
- package/lib/aws/compute/machine-image/common.js +1 -1
- package/lib/aws/compute/machine-image/machine-image.js +8 -8
- package/lib/aws/compute/method.js +1 -1
- package/lib/aws/compute/model.js +3 -3
- package/lib/aws/compute/nat.js +5 -5
- package/lib/aws/compute/network-acl-types.js +2 -2
- package/lib/aws/compute/network-acl.js +3 -3
- package/lib/aws/compute/nlb/network-listener-action.js +1 -1
- package/lib/aws/compute/nlb/network-listener.js +1 -1
- package/lib/aws/compute/nlb/network-load-balancer.js +1 -1
- package/lib/aws/compute/nlb/network-target-group.js +1 -1
- package/lib/aws/compute/peer.js +1 -1
- package/lib/aws/compute/placement-group.js +1 -1
- package/lib/aws/compute/port.js +1 -1
- package/lib/aws/compute/prefix-list.js +1 -1
- package/lib/aws/compute/requestvalidator.js +1 -1
- package/lib/aws/compute/resource.js +3 -3
- package/lib/aws/compute/restapi.js +9 -10
- package/lib/aws/compute/route.js +10 -10
- package/lib/aws/compute/runtime.d.ts +8 -0
- package/lib/aws/compute/runtime.js +20 -7
- package/lib/aws/compute/scalable-target.js +1 -1
- package/lib/aws/compute/schedule.js +6 -12
- package/lib/aws/compute/security-group.js +1 -1
- package/lib/aws/compute/stage.js +8 -11
- package/lib/aws/compute/state-graph.js +1 -1
- package/lib/aws/compute/state-machine-fragment.js +1 -1
- package/lib/aws/compute/state-machine.js +4 -4
- package/lib/aws/compute/states/choice.js +1 -1
- package/lib/aws/compute/states/custom-state.js +1 -1
- package/lib/aws/compute/states/distributed-map/item-batcher.js +1 -1
- package/lib/aws/compute/states/distributed-map/item-reader.js +5 -5
- package/lib/aws/compute/states/distributed-map/result-writer.js +1 -1
- package/lib/aws/compute/states/distributed-map.js +1 -1
- package/lib/aws/compute/states/fail.js +1 -1
- package/lib/aws/compute/states/map-base.js +1 -1
- package/lib/aws/compute/states/map.js +1 -1
- package/lib/aws/compute/states/parallel.js +1 -1
- package/lib/aws/compute/states/pass.js +2 -2
- package/lib/aws/compute/states/state.js +1 -1
- package/lib/aws/compute/states/succeed.js +1 -1
- package/lib/aws/compute/states/task-base.js +2 -2
- package/lib/aws/compute/states/task.js +1 -1
- package/lib/aws/compute/states/wait.js +2 -2
- package/lib/aws/compute/step-scaling-action.js +1 -1
- package/lib/aws/compute/step-scaling-policy.js +9 -14
- package/lib/aws/compute/stepfunctions-api.js +5 -6
- package/lib/aws/compute/subnet-v2.js +2 -2
- package/lib/aws/compute/subnet.js +1 -1
- package/lib/aws/compute/target-tracking-scaling-policy.js +9 -12
- package/lib/aws/compute/task-credentials.js +1 -1
- package/lib/aws/compute/task-input.js +1 -1
- package/lib/aws/compute/tasks/aws-sdk/call-aws-service.js +1 -1
- package/lib/aws/compute/tasks/eventbridge/put-events.js +1 -1
- package/lib/aws/compute/tasks/http/invoke.js +1 -1
- package/lib/aws/compute/tasks/lambda/invoke.js +1 -1
- package/lib/aws/compute/tasks/sqs/send-message.js +1 -1
- package/lib/aws/compute/tasks/stepfunctions/invoke-activity.js +1 -1
- package/lib/aws/compute/tasks/stepfunctions/start-execution.js +1 -1
- package/lib/aws/compute/types.js +1 -1
- package/lib/aws/compute/usage-plan.js +1 -1
- package/lib/aws/compute/user-data.js +3 -3
- package/lib/aws/compute/volume.js +2 -2
- package/lib/aws/compute/vpc-endpoint-service.js +1 -1
- package/lib/aws/compute/vpc-endpoint.js +6 -6
- package/lib/aws/compute/vpc-flow-logs.js +8 -6
- package/lib/aws/compute/vpc-link.js +1 -1
- package/lib/aws/compute/vpc-v2-base.js +1 -1
- package/lib/aws/compute/vpc-v2.js +2 -2
- package/lib/aws/compute/vpc.js +4 -4
- package/lib/aws/compute/vpn.js +3 -3
- package/lib/aws/edge/certificate.js +1 -1
- package/lib/aws/edge/distribution.js +3 -3
- package/lib/aws/edge/dns-alias-record-targets.js +6 -6
- package/lib/aws/edge/dns-record.js +13 -13
- package/lib/aws/edge/dns-zone.d.ts +1 -1
- package/lib/aws/edge/dns-zone.js +8 -7
- package/lib/aws/edge/function.js +2 -2
- package/lib/aws/edge/key-value-store.js +4 -4
- package/lib/aws/edge/origin.js +3 -3
- package/lib/aws/edge/response-headers-policy.js +1 -1
- package/lib/aws/encryption/alias.js +1 -1
- package/lib/aws/encryption/key.js +1 -1
- package/lib/aws/encryption/via-service-principal.js +1 -1
- package/lib/aws/iam/grant.js +2 -2
- package/lib/aws/iam/group.js +1 -1
- package/lib/aws/iam/instance-profile.js +1 -1
- package/lib/aws/iam/managed-policy.js +1 -1
- package/lib/aws/iam/oidc-provider.js +1 -1
- package/lib/aws/iam/policy-document-config.generated.d.ts +8 -8
- package/lib/aws/iam/policy-document-config.generated.js +1 -1
- package/lib/aws/iam/policy-document.js +1 -1
- package/lib/aws/iam/policy-statement-props.generated.d.ts +8 -8
- package/lib/aws/iam/policy-statement-props.generated.js +1 -1
- package/lib/aws/iam/policy-statement.js +1 -1
- package/lib/aws/iam/policy.js +1 -1
- package/lib/aws/iam/principals.js +20 -20
- package/lib/aws/iam/role.js +1 -1
- package/lib/aws/iam/saml-provider.js +2 -2
- package/lib/aws/iam/unknown-principal.js +1 -1
- package/lib/aws/iam/user.js +1 -1
- package/lib/aws/network/simple-ipv4-vpc.js +1 -1
- package/lib/aws/network/subnet-group.js +3 -3
- package/lib/aws/network/subnet.js +4 -4
- package/lib/aws/notify/archive.js +1 -1
- package/lib/aws/notify/connection.js +3 -3
- package/lib/aws/notify/event-bus.d.ts +19 -0
- package/lib/aws/notify/event-bus.js +22 -26
- package/lib/aws/notify/event-pattern.js +1 -1
- package/lib/aws/notify/input.js +2 -2
- package/lib/aws/notify/kinesis-stream.js +1 -1
- package/lib/aws/notify/notification-rule.js +1 -1
- package/lib/aws/notify/policy.js +1 -1
- package/lib/aws/notify/queue-config.generated.d.ts +18 -12
- package/lib/aws/notify/queue-config.generated.js +1 -1
- package/lib/aws/notify/queue-policy.js +1 -1
- package/lib/aws/notify/queue.js +1 -1
- package/lib/aws/notify/resource-policy.js +1 -1
- package/lib/aws/notify/rule.js +1 -1
- package/lib/aws/notify/schedule.js +1 -1
- package/lib/aws/notify/subscription-filter.js +7 -8
- package/lib/aws/notify/subscription.js +23 -25
- package/lib/aws/notify/subscriptions/email.js +1 -1
- package/lib/aws/notify/subscriptions/lambda.js +1 -1
- package/lib/aws/notify/subscriptions/sms.js +1 -1
- package/lib/aws/notify/subscriptions/sqs.js +1 -1
- package/lib/aws/notify/subscriptions/url.js +1 -1
- package/lib/aws/notify/targets/event-bus.js +1 -1
- package/lib/aws/notify/targets/function.js +1 -1
- package/lib/aws/notify/targets/log-group.js +2 -2
- package/lib/aws/notify/targets/sqs.js +1 -1
- package/lib/aws/notify/targets/state-machine.js +1 -1
- package/lib/aws/notify/topic-base.js +4 -4
- package/lib/aws/notify/topic.js +1 -1
- package/lib/aws/provider-config.generated.d.ts +41 -33
- package/lib/aws/provider-config.generated.js +1 -1
- package/lib/aws/storage/assets/image-asset.js +8 -12
- package/lib/aws/storage/assets/s3.js +4 -4
- package/lib/aws/storage/auth-token.js +2 -2
- package/lib/aws/storage/billing.js +1 -1
- package/lib/aws/storage/bucket-notifications.js +1 -1
- package/lib/aws/storage/bucket-policy.js +1 -1
- package/lib/aws/storage/bucket-source.js +1 -1
- package/lib/aws/storage/bucket.js +2 -2
- package/lib/aws/storage/capacity.js +1 -1
- package/lib/aws/storage/cors-config.generated.d.ts +9 -3
- package/lib/aws/storage/cors-config.generated.js +1 -1
- package/lib/aws/storage/cors-rule-config.generated.d.ts +5 -5
- package/lib/aws/storage/cors-rule-config.generated.js +1 -1
- package/lib/aws/storage/ecr-repository.js +19 -32
- package/lib/aws/storage/encryption.js +1 -1
- package/lib/aws/storage/lifecycle-config.generated.d.ts +7 -7
- package/lib/aws/storage/lifecycle-config.generated.js +1 -1
- package/lib/aws/storage/notification-targets/function.js +1 -1
- package/lib/aws/storage/notification-targets/queue.js +1 -1
- package/lib/aws/storage/origin-access-identity.js +1 -1
- package/lib/aws/storage/parameter.js +2 -2
- package/lib/aws/storage/table.js +50 -101
- package/lib/aws/storage/website-config.generated.d.ts +11 -5
- package/lib/aws/storage/website-config.generated.js +1 -1
- package/lib/bundling.js +7 -6
- package/lib/construct-base.js +2 -2
- package/lib/duration.js +1 -1
- package/lib/errors.js +5 -3
- package/lib/expiration.js +1 -1
- package/lib/fs/ignore.js +4 -4
- package/lib/fs/index.js +1 -1
- package/lib/index.d.ts +1 -0
- package/lib/index.js +2 -1
- package/lib/private/asset-staging.js +3 -2
- package/lib/size.js +1 -1
- package/lib/stack-base.js +1 -1
- package/lib/terra-func.js +1 -1
- package/lib/time-zone.js +1 -1
- package/package.json +3 -3
|
@@ -675,8 +675,9 @@ class LambdaFunction extends function_base_1.LambdaFunctionBase {
|
|
|
675
675
|
// props.deadLetterTopic &&
|
|
676
676
|
// (props.deadLetterQueue || props.deadLetterQueueEnabled !== undefined)
|
|
677
677
|
// ) {
|
|
678
|
-
// throw new
|
|
678
|
+
// throw new ValidationError(
|
|
679
679
|
// "deadLetterQueue and deadLetterTopic cannot be specified together at the same time",
|
|
680
|
+
// this,
|
|
680
681
|
// );
|
|
681
682
|
// }
|
|
682
683
|
let deadLetterQueue; // | ITopic;
|
|
@@ -731,7 +732,7 @@ class LambdaFunction extends function_base_1.LambdaFunctionBase {
|
|
|
731
732
|
}
|
|
732
733
|
exports.LambdaFunction = LambdaFunction;
|
|
733
734
|
_a = JSII_RTTI_SYMBOL_1;
|
|
734
|
-
LambdaFunction[_a] = { fqn: "terraconstructs.aws.compute.LambdaFunction", version: "0.1.
|
|
735
|
+
LambdaFunction[_a] = { fqn: "terraconstructs.aws.compute.LambdaFunction", version: "0.1.9" };
|
|
735
736
|
/**
|
|
736
737
|
* Given an opaque (token) ARN, returns a TF expression that extracts the function
|
|
737
738
|
* name from the ARN.
|
|
@@ -867,4 +868,4 @@ function undefinedIfNoKeys(struct) {
|
|
|
867
868
|
const allUndefined = Object.values(struct).every((val) => val === undefined);
|
|
868
869
|
return allUndefined ? undefined : struct;
|
|
869
870
|
}
|
|
870
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVuY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXdzL2NvbXB1dGUvZnVuY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQXU3Q0EsNENBNEJDOztBQW45Q0QsNkpBQTZKO0FBQzdKLDJIQUEySDtBQUMzSCxzREFNNkI7QUFDN0IsaUNBQWtFO0FBRWxFLHlDQUF3RTtBQUN4RSxnQ0FBd0M7QUFDeEMsNENBQXdDO0FBQ3hDLG9EQUFpRDtBQUNqRCxpREFBOEM7QUFLOUMsbURBS3lCO0FBR3pCLHVDQUFvQztBQUNwQyx1Q0FBb0M7QUFDcEMscURBQWlFO0FBQ2pFLGlDQUFrQztBQUVsQyw2Q0FBMEM7QUFDMUMseUNBQXlDO0FBQ3pDLDhCQUE4QjtBQUM5QixzQ0FBMEM7QUFDMUMsK0NBQTRDO0FBbVY1QywyQkFBMkI7QUFFM0IsTUFBTTtBQUNOLHdCQUF3QjtBQUN4QixNQUFNO0FBQ04scUVBQXFFO0FBRXJFLFFBQVE7QUFDUixxREFBcUQ7QUFDckQsUUFBUTtBQUNSLDJEQUEyRDtBQUMzRCxJQUFJO0FBRUo7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsTUFBYSxjQUFlLFNBQVEsa0NBQWtCO0lBQ3BELDZEQUE2RDtJQUU3RDs7T0FFRztJQUNILElBQVcsT0FBTztRQUNoQiwyQ0FBMkM7UUFDM0MsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQztJQUMvQixDQUFDO0lBRUQ7O09BRUc7SUFDSSxNQUFNLENBQUMsZ0JBQWdCLENBQzVCLEtBQWdCLEVBQ2hCLEVBQVUsRUFDVixZQUFvQjtRQUVwQixPQUFPLGNBQWMsQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFO1lBQ3RELFdBQVcsRUFBRSxvQkFBUSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxTQUFTLENBQUM7Z0JBQ3BELE9BQU8sRUFBRSxRQUFRO2dCQUNqQixRQUFRLEVBQUUsVUFBVTtnQkFDcEIsWUFBWSxF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QUUsQ0FBQztRQUM1RCxNQUFNLElBQUksZ0NBQXVCLENBQy9CLGlGQUFpRixDQUNsRixDQUFDO0lBQ0osQ0FBQztJQUVELDBEQUEwRDtJQUMxRCxJQUFJLElBQUksQ0FBQyxVQUFVLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDekQsTUFBTSxJQUFJLGdDQUF1QixDQUMvQixpQ0FBaUMsS0FBSyxDQUFDLE9BQVEsQ0FBQyxJQUFJLEVBQUUsQ0FDdkQsQ0FBQztJQUNKLENBQUM7QUFDSCxDQUFDO0FBRUQsU0FBUyxpQkFBaUIsQ0FDeEIsTUFBUztJQUVULE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEtBQUssU0FBUyxDQUFDLENBQUM7SUFDN0UsT0FBTyxZQUFZLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO0FBQzNDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBzb3VyY2U6IGh0dHBzOi8vZ2l0aHViLmNvbS9jZGt0Zi1wbHVzL2Nka3RmLXBsdXMvYmxvYi81ODZhYWJhZDNhYjJmYjJhMmU5M2UwNWVkMzNmOTQ0NzRlYmU5Mzk3L3BhY2thZ2VzLyU0MGNka3RmLXBsdXMvYXdzL2xpYi9hd3MtbGFtYmRhLWZ1bmN0aW9uL2luZGV4LnRzXG4vLyB1cGRhdGUgdG8gYWxpZ24gY2xvc2VyIHdpdGggaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2Jsb2IvdjIuMTU2LjAvcGFja2FnZXMvYXdzLWNkay1saWIvYXdzLWxhbWJkYS9saWIvZnVuY3Rpb24udHNcbmltcG9ydCB7XG4gIGxhbWJkYUZ1bmN0aW9uLFxuICBjbG91ZHdhdGNoTG9nR3JvdXAsXG4gIHNlY3VyaXR5R3JvdXAsXG4gIGxhbWJkYUV2ZW50U291cmNlTWFwcGluZyxcbiAgZGF0YUF3c0xhbWJkYUZ1bmN0aW9uLFxufSBmcm9tIFwiQGNka3RmL3Byb3ZpZGVyLWF3c1wiO1xuaW1wb3J0IHsgSVJlc29sdmVDb250ZXh0LCBMYXp5LCBJUmVzb2x2YWJsZSwgVG9rZW4gfSBmcm9tIFwiY2RrdGZcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgeyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvciwgVmFsaWRhdGlvbkVycm9yIH0gZnJvbSBcIi4uLy4uL2Vycm9yc1wiO1xuaW1wb3J0IHsgQXJuRm9ybWF0LCBBcm4gfSBmcm9tIFwiLi4vYXJuXCI7XG5pbXBvcnQgeyBBd3NTdGFjayB9IGZyb20gXCIuLi9hd3Mtc3RhY2tcIjtcbmltcG9ydCB7IFJldGVudGlvbkRheXMgfSBmcm9tIFwiLi4vbG9nLXJldGVudGlvblwiO1xuaW1wb3J0IHsgQXJjaGl0ZWN0dXJlIH0gZnJvbSBcIi4vYXJjaGl0ZWN0dXJlXCI7XG5pbXBvcnQgeyBDb2RlLCBDb2RlQ29uZmlnIH0gZnJvbSBcIi4vY29kZVwiO1xuaW1wb3J0IHsgRXZlbnRJbnZva2VDb25maWdPcHRpb25zIH0gZnJvbSBcIi4vZXZlbnQtaW52b2tlLWNvbmZpZ1wiO1xuaW1wb3J0IHsgSUV2ZW50U291cmNlTWFwcGluZyB9IGZyb20gXCIuL2V2ZW50LXNvdXJjZS1tYXBwaW5nXCI7XG5pbXBvcnQgeyBBbGlhc09wdGlvbnMsIEFsaWFzIH0gZnJvbSBcIi4vZnVuY3Rpb24tYWxpYXNcIjtcbmltcG9ydCB7XG4gIExhbWJkYUZ1bmN0aW9uQmFzZSxcbiAgSUZ1bmN0aW9uLFxuICBGdW5jdGlvbkF0dHJpYnV0ZXMsXG4gIElFdmVudFNvdXJjZSxcbn0gZnJvbSBcIi4vZnVuY3Rpb24tYmFzZVwiO1xuaW1wb3J0IHsgRnVuY3Rpb25VcmwsIEZ1bmN0aW9uVXJsT3B0aW9ucyB9IGZyb20gXCIuL2Z1bmN0aW9uLXVybFwiO1xuaW1wb3J0IHsgVnBjQ29uZmlnIH0gZnJvbSBcIi4vZnVuY3Rpb24tdnBjLWNvbmZpZy5nZW5lcmF0ZWRcIjtcbmltcG9ydCB7IEhhbmRsZXIgfSBmcm9tIFwiLi9oYW5kbGVyXCI7XG5pbXBvcnQgeyBSdW50aW1lIH0gZnJvbSBcIi4vcnVudGltZVwiO1xuaW1wb3J0IHsgSVNlY3VyaXR5R3JvdXAsIFNlY3VyaXR5R3JvdXAgfSBmcm9tIFwiLi9zZWN1cml0eS1ncm91cFwiO1xuaW1wb3J0IHsgYWRkQWxpYXMgfSBmcm9tIFwiLi91dGlsXCI7XG5pbXBvcnQgeyBJVnBjLCBTdWJuZXRTZWxlY3Rpb24gfSBmcm9tIFwiLi92cGNcIjtcbmltcG9ydCB7IER1cmF0aW9uIH0gZnJvbSBcIi4uLy4uL2R1cmF0aW9uXCI7XG4vLyBpbXBvcnQgeyBGbiB9IGZyb20gXCIuLi8uLi90ZXJyYS1mdW5jXCI7XG5pbXBvcnQgKiBhcyBpYW0gZnJvbSBcIi4uL2lhbVwiO1xuaW1wb3J0IHsgSVF1ZXVlLCBRdWV1ZSB9IGZyb20gXCIuLi9ub3RpZnlcIjtcbmltcG9ydCB7IENvbm5lY3Rpb25zIH0gZnJvbSBcIi4vY29ubmVjdGlvbnNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBGdW5jdGlvbk91dHB1dHMge1xuICAvKipcbiAgICogQVdTIExhbWJkYSBmdW5jdGlvbiBuYW1lXG4gICAqL1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFXUyBMYW1iZGEgYXJuIG9mIHRoZSBmdW5jdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgYXJuOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBJQU0gUm9sZSBhc3NvY2lhdGVkIHdpdGggdGhlIExhbWJkYSBmdW5jdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgcm9sZUFybjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBGdW5jdGlvbiBVUkwgaWYgZW5hYmxlZFxuICAgKi9cbiAgcmVhZG9ubHkgdXJsPzogc3RyaW5nIHwgSVJlc29sdmFibGU7XG5cbiAgLyoqXG4gICAqIFNlY3VyaXR5IGdyb3VwIG9mIHRoZSBmdW5jdGlvbiBpZiBjcmVhdGVkXG4gICAqL1xuICByZWFkb25seSBkZWZhdWx0U2VjdXJpdHlHcm91cD86IHN0cmluZyB8IElSZXNvbHZhYmxlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZ1bmN0aW9uT3B0aW9ucyBleHRlbmRzIEV2ZW50SW52b2tlQ29uZmlnT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBGb3JjZSBmdW5jdGlvbiBuYW1lIChmb3IgYWRvcHRpb24gb2YgZXhpc3RpbmcgcmVzb3VyY2VzKS5cbiAgICpcbiAgICogUHJlZmVyIHRvIHVzZSBmdW5jdGlvbk5hbWVQcmVmaXguXG4gICAqXG4gICAqIFVzZSBbVGVycmFmb3JtIFJlc291cmNlIE1ldGEgQXJndW1lbnRzXShodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9yZXNvdXJjZXMvc3ludGF4I21ldGEtYXJndW1lbnRzKVxuICAgKiB0byBjb250cm9sIGxpZmVjeWNsZSB3aGVuIHJlcGxhY2luZyB0aGUgZnVuY3Rpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gSWYgb21pdHRlZCwgUmVmZXIgdG8gYGZ1bmN0aW9uTmFtZVByZWZpeGAuXG4gICAqL1xuICByZWFkb25seSBmdW5jdGlvbk5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgbmFtZSBwcmVmaXggZm9yIHRoZSBmdW5jdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBHcmlkIGdlbmVyYXRlcyBhIHVuaXF1ZSBwaHlzaWNhbCBJRCBhbmQgdXNlcyB0aGF0XG4gICAqIElEIGZvciB0aGUgZnVuY3Rpb24ncyBuYW1lLlxuICAgKi9cbiAgcmVhZG9ubHkgZnVuY3Rpb25OYW1lUHJlZml4Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIGJlIHBhc3NlZCB0byB0aGUgTGFtYmRhIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBLZXktdmFsdWUgcGFpcnMgdGhhdCBMYW1iZGEgY2FjaGVzIGFuZCBtYWtlcyBhdmFpbGFibGUgZm9yIHlvdXIgTGFtYmRhXG4gICAqIGZ1bmN0aW9ucy4gVXNlIGVudmlyb25tZW50IHZhcmlhYmxlcyB0byBhcHBseSBjb25maWd1cmF0aW9uIGNoYW5nZXMsIHN1Y2hcbiAgICogYXMgdGVzdCBhbmQgcHJvZHVjdGlvbiBlbnZpcm9ubWVudCBjb25maWd1cmF0aW9ucywgd2l0aG91dCBjaGFuZ2luZyB5b3VyXG4gICAqIExhbWJkYSBmdW5jdGlvbiBzb3VyY2UgY29kZS5cbiAgICovXG4gIHJlYWRvbmx5IGVudmlyb25tZW50PzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcblxuICAvKipcbiAgICogRGVzY3JpcHRpb24gb2Ygd2hhdCB5b3VyIExhbWJkYSBGdW5jdGlvbiBkb2VzLlxuICAgKi9cbiAgcmVhZG9ubHkgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBzeXN0ZW0gYXJjaGl0ZWN0dXJlcyBjb21wYXRpYmxlIHdpdGggdGhpcyBsYW1iZGEgZnVuY3Rpb24uXG4gICAqIEBkZWZhdWx0IEFyY2hpdGVjdHVyZS5YODZfNjRcbiAgICovXG4gIHJlYWRvbmx5IGFyY2hpdGVjdHVyZT86IEFyY2hpdGVjdHVyZTtcblxuICAvKipcbiAgICogVGhlIHRyYWNpbmcgbW9kZSBmb3IgdGhlIExhbWJkYSBmdW5jdGlvbi5cbiAgICpcbiAgICogVGhlIExhbWJkYSBmdW5jdGlvbiBpYW0gcm9sZSB3aWxsIHJlY2VpdmUgcGVybWlzc2lvbiB0b1xuICAgKiB3cml0ZSB0byBBV1MgWC1SYXkuXG4gICAqXG4gICAqIEBkZWZhdWx0IFRyYWNpbmcuQUNUSVZFXG4gICAqL1xuICByZWFkb25seSB0cmFjaW5nPzogVHJhY2luZztcblxuICAvKipcbiAgICogVGhlIGxvZyByZXRlbnRpb24gcGVyaW9kIGluIGRheXMuIERlZmF1bHRzIHRvIDcuXG4gICAqL1xuICByZWFkb25seSBsb2dSZXRlbnRpb25JbkRheXM/OiBSZXRlbnRpb25EYXlzO1xuXG4gIC8qKlxuICAgKiBUaGUgbWVtb3J5IGxpbWl0IGluIE1CLlxuICAgKlxuICAgKiBAZGVmYXVsdCAxMjguXG4gICAqL1xuICByZWFkb25seSBtZW1vcnlTaXplPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgZnVuY3Rpb24gZXhlY3V0aW9uIHRpbWUgKGluIHNlY29uZHMpIGFmdGVyIHdoaWNoIExhbWJkYSB0ZXJtaW5hdGVzXG4gICAqIHRoZSBmdW5jdGlvbi4gQmVjYXVzZSB0aGUgZXhlY3V0aW9uIHRpbWUgYWZmZWN0cyBjb3N0LCBzZXQgdGhpcyB2YWx1ZVxuICAgKiBiYXNlZCBvbiB0aGUgZnVuY3Rpb24ncyBleHBlY3RlZCBleGVjdXRpb24gdGltZS5cbiAgICpcbiAgICogQGRlZmF1bHQgRHVyYXRpb24uc2Vjb25kcygzKVxuICAgKi9cbiAgcmVhZG9ubHkgdGltZW91dD86IER1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBMYXllcnMgZm9yIHRoZSBMYW1iZGEuXG4gICAqL1xuICByZWFkb25seSBsYXllcnM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogSW5pdGlhbCBwb2xpY3kgc3RhdGVtZW50cyB0byBhZGQgdG8gdGhlIGNyZWF0ZWQgTGFtYmRhIFJvbGUuXG4gICAqXG4gICAqIFlvdSBjYW4gY2FsbCBgYWRkVG9Sb2xlUG9saWN5YCB0byB0aGUgY3JlYXRlZCBsYW1iZGEgdG8gYWRkIHN0YXRlbWVudHMgcG9zdCBjcmVhdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBwb2xpY3kgc3RhdGVtZW50cyBhcmUgYWRkZWQgdG8gdGhlIGNyZWF0ZWQgTGFtYmRhIHJvbGUuXG4gICAqL1xuICByZWFkb25seSBpbml0aWFsUG9saWN5PzogaWFtLlBvbGljeVN0YXRlbWVudFtdO1xuXG4gIC8qKlxuICAgKiBMYW1iZGEgZXhlY3V0aW9uIHJvbGUuXG4gICAqXG4gICAqIFRoaXMgaXMgdGhlIHJvbGUgdGhhdCB3aWxsIGJlIGFzc3VtZWQgYnkgdGhlIGZ1bmN0aW9uIHVwb24gZXhlY3V0aW9uLlxuICAgKiBJdCBjb250cm9scyB0aGUgcGVybWlzc2lvbnMgdGhhdCB0aGUgZnVuY3Rpb24gd2lsbCBoYXZlLiBUaGUgUm9sZSBtdXN0XG4gICAqIGJlIGFzc3VtYWJsZSBieSB0aGUgJ2xhbWJkYS5hbWF6b25hd3MuY29tJyBzZXJ2aWNlIHByaW5jaXBhbC5cbiAgICpcbiAgICogVGhlIGRlZmF1bHQgUm9sZSBhdXRvbWF0aWNhbGx5IGhhcyBwZXJtaXNzaW9ucyBncmFudGVkIGZvciBMYW1iZGEgZXhlY3V0aW9uLiBJZiB5b3VcbiAgICogcHJvdmlkZSBhIFJvbGUsIHlvdSBtdXN0IGFkZCB0aGUgcmVsZXZhbnQgQVdTIG1hbmFnZWQgcG9saWNpZXMgeW91cnNlbGYuXG4gICAqXG4gICAqIFRoZSByZWxldmFudCBtYW5hZ2VkIHBvbGljaWVzIGFyZSBcInNlcnZpY2Utcm9sZS9BV1NMYW1iZGFCYXNpY0V4ZWN1dGlvblJvbGVcIiBhbmRcbiAgICogXCJzZXJ2aWNlLXJvbGUvQVdTTGFtYmRhVlBDQWNjZXNzRXhlY3V0aW9uUm9sZVwiLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIEEgdW5pcXVlIHJvbGUgd2lsbCBiZSBnZW5lcmF0ZWQgZm9yIHRoaXMgbGFtYmRhIGZ1bmN0aW9uLlxuICAgKiBCb3RoIHN1cHBsaWVkIGFuZCBnZW5lcmF0ZWQgcm9sZXMgY2FuIGFsd2F5cyBiZSBjaGFuZ2VkIGJ5IGNhbGxpbmcgYGFkZFRvUm9sZVBvbGljeWAuXG4gICAqL1xuICByZWFkb25seSByb2xlPzogaWFtLklSb2xlO1xuXG4gIC8qKlxuICAgKiBMYW1iZGEgRnVuY3Rpb25zIGluIGEgcHVibGljIHN1Ym5ldCBjYW4gTk9UIGFjY2VzcyB0aGUgaW50ZXJuZXQuXG4gICAqIFVzZSB0aGlzIHByb3BlcnR5IHRvIGFja25vd2xlZGdlIHRoaXMgbGltaXRhdGlvbiBhbmQgc3RpbGwgcGxhY2UgdGhlIGZ1bmN0aW9uIGluIGEgcHVibGljIHN1Ym5ldC5cbiAgICogQHNlZSBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy81Mjk5MjA4NS93aHktY2FudC1hbi1hd3MtbGFtYmRhLWZ1bmN0aW9uLWluc2lkZS1hLXB1YmxpYy1zdWJuZXQtaW4tYS12cGMtY29ubmVjdC10by10aGUvNTI5OTQ4NDEjNTI5OTQ4NDFcbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGFsbG93UHVibGljU3VibmV0PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQ29uZmlnIGZvciBuZXR3b3JrIGNvbm5lY3Rpdml0eSB0byBBV1MgcmVzb3VyY2VzIGluIGEgVlBDLCBzcGVjaWZ5IGEgbGlzdFxuICAgKiBvZiBzdWJuZXQsIGFuZCBvcHRpb25hbGx5IHNlY3VyaXR5IGdyb3VwcywgaW4gdGhlIFZQQy5cbiAgICpcbiAgICogVGhlIExhbWJkYSBmdW5jdGlvbiBpYW0gcm9sZSB3aWxsIHJlY2VpdmUgcGVybWlzc2lvbiB0b1xuICAgKiBtYW5hZ2UgRU5JcyB3aXRoaW4gdGhlIHByb3ZpZGVkIG5ldHdvcmsuXG4gICAqXG4gICAqIFdoZW4geW91IGNvbm5lY3QgYSBmdW5jdGlvbiB0byBhIFZQQywgaXQgY2FuIG9ubHkgYWNjZXNzIHJlc291cmNlcyBhbmQgdGhlIGludGVybmV0IHRocm91Z2ggdGhhdCBWUEMuXG4gICAqXG4gICAqIFNlZSBbVlBDIFNldHRpbmdzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGFtYmRhL2xhdGVzdC9kZy9jb25maWd1cmF0aW9uLXZwYy5odG1sKS5cbiAgICpcbiAgICogQGRlcHJlY2F0ZWQgLSBUaGlzIHByb3BlcnR5IGlzIGRlcHJlY2F0ZWQsIHVzZSB2cGMgYW5kIG90aGVyIHJlbGF0ZWQgcHJvcGVydGllcyBpbnN0ZWFkXG4gICAqL1xuICByZWFkb25seSBuZXR3b3JrQ29uZmlnPzogVnBjQ29uZmlnO1xuXG4gIC8qKlxuICAgKiBWUEMgbmV0d29yayB0byBwbGFjZSBMYW1iZGEgbmV0d29yayBpbnRlcmZhY2VzXG4gICAqXG4gICAqIFNwZWNpZnkgdGhpcyBpZiB0aGUgTGFtYmRhIGZ1bmN0aW9uIG5lZWRzIHRvIGFjY2VzcyByZXNvdXJjZXMgaW4gYSBWUEMuXG4gICAqIFRoaXMgaXMgcmVxdWlyZWQgd2hlbiBgdnBjU3VibmV0c2AgaXMgc3BlY2lmaWVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIEZ1bmN0aW9uIGlzIG5vdCBwbGFjZWQgd2l0aGluIGEgVlBDLlxuICAgKi9cbiAgcmVhZG9ubHkgdnBjPzogSVZwYztcblxuICAvKipcbiAgICogQWxsb3dzIG91dGJvdW5kIElQdjYgdHJhZmZpYyBvbiBWUEMgZnVuY3Rpb25zIHRoYXQgYXJlIGNvbm5lY3RlZCB0byBkdWFsLXN0YWNrIHN1Ym5ldHMuXG4gICAqXG4gICAqIE9ubHkgdXNlZCBpZiAndnBjJyBpcyBzdXBwbGllZC5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGlwdjZBbGxvd2VkRm9yRHVhbFN0YWNrPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hlcmUgdG8gcGxhY2UgdGhlIG5ldHdvcmsgaW50ZXJmYWNlcyB3aXRoaW4gdGhlIFZQQy5cbiAgICpcbiAgICogVGhpcyByZXF1aXJlcyBgdnBjYCB0byBiZSBzcGVjaWZpZWQgaW4gb3JkZXIgZm9yIGludGVyZmFjZXMgdG8gYWN0dWFsbHkgYmVcbiAgICogcGxhY2VkIGluIHRoZSBzdWJuZXRzLiBJZiBgdnBjYCBpcyBub3Qgc3BlY2lmeSwgdGhpcyB3aWxsIHJhaXNlIGFuIGVycm9yLlxuICAgKlxuICAgKiBOb3RlOiBJbnRlcm5ldCBhY2Nlc3MgZm9yIExhbWJkYSBGdW5jdGlvbnMgcmVxdWlyZXMgYSBOQVQgR2F0ZXdheSwgc28gcGlja2luZ1xuICAgKiBwdWJsaWMgc3VibmV0cyBpcyBub3QgYWxsb3dlZCAodW5sZXNzIGBhbGxvd1B1YmxpY1N1Ym5ldGAgaXMgc2V0IHRvIGB0cnVlYCkuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdGhlIFZwYyBkZWZhdWx0IHN0cmF0ZWd5IGlmIG5vdCBzcGVjaWZpZWRcbiAgICovXG4gIHJlYWRvbmx5IHZwY1N1Ym5ldHM/OiBTdWJuZXRTZWxlY3Rpb247XG5cbiAgLyoqXG4gICAqIFRoZSBsaXN0IG9mIHNlY3VyaXR5IGdyb3VwcyB0byBhc3NvY2lhdGUgd2l0aCB0aGUgTGFtYmRhJ3MgbmV0d29yayBpbnRlcmZhY2VzLlxuICAgKlxuICAgKiBPbmx5IHVzZWQgaWYgJ3ZwYycgaXMgc3VwcGxpZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gSWYgdGhlIGZ1bmN0aW9uIGlzIHBsYWNlZCB3aXRoaW4gYSBWUEMgYW5kIGEgc2VjdXJpdHkgZ3JvdXAgaXNcbiAgICogbm90IHNwZWNpZmllZCwgZWl0aGVyIGJ5IHRoaXMgb3Igc2VjdXJpdHlHcm91cCBwcm9wLCBhIGRlZGljYXRlZCBzZWN1cml0eVxuICAgKiBncm91cCB3aWxsIGJlIGNyZWF0ZWQgZm9yIHRoaXMgZnVuY3Rpb24uXG4gICAqL1xuICByZWFkb25seSBzZWN1cml0eUdyb3Vwcz86IElTZWN1cml0eUdyb3VwW107XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYWxsb3cgdGhlIExhbWJkYSB0byBzZW5kIGFsbCBuZXR3b3JrIHRyYWZmaWMgKGV4Y2VwdCBpcHY2KVxuICAgKlxuICAgKiBJZiBzZXQgdG8gZmFsc2UsIHlvdSBtdXN0IGluZGl2aWR1YWxseSBhZGQgdHJhZmZpYyBydWxlcyB0byBhbGxvdyB0aGVcbiAgICogTGFtYmRhIHRvIGNvbm5lY3QgdG8gbmV0d29yayB0YXJnZXRzLlxuICAgKlxuICAgKiBEbyBub3Qgc3BlY2lmeSB0aGlzIHByb3BlcnR5IGlmIHRoZSBgc2VjdXJpdHlHcm91cHNgIG9yIGBzZWN1cml0eUdyb3VwYCBwcm9wZXJ0eSBpcyBzZXQuXG4gICAqIEluc3RlYWQsIGNvbmZpZ3VyZSBgYWxsb3dBbGxPdXRib3VuZGAgZGlyZWN0bHkgb24gdGhlIHNlY3VyaXR5IGdyb3VwLlxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBhbGxvd0FsbE91dGJvdW5kPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBhbGxvdyB0aGUgTGFtYmRhIHRvIHNlbmQgYWxsIGlwdjYgbmV0d29yayB0cmFmZmljXG4gICAqXG4gICAqIElmIHNldCB0byB0cnVlLCB0aGVyZSB3aWxsIG9ubHkgYmUgYSBzaW5nbGUgZWdyZXNzIHJ1bGUgd2hpY2ggYWxsb3dzIGFsbFxuICAgKiBvdXRib3VuZCBpcHY2IHRyYWZmaWMuIElmIHNldCB0byBmYWxzZSwgeW91IG11c3QgaW5kaXZpZHVhbGx5IGFkZCB0cmFmZmljIHJ1bGVzIHRvIGFsbG93IHRoZVxuICAgKiBMYW1iZGEgdG8gY29ubmVjdCB0byBuZXR3b3JrIHRhcmdldHMgdXNpbmcgaXB2Ni5cbiAgICpcbiAgICogRG8gbm90IHNwZWNpZnkgdGhpcyBwcm9wZXJ0eSBpZiB0aGUgYHNlY3VyaXR5R3JvdXBzYCBvciBgc2VjdXJpdHlHcm91cGAgcHJvcGVydHkgaXMgc2V0LlxuICAgKiBJbnN0ZWFkLCBjb25maWd1cmUgYGFsbG93QWxsSXB2Nk91dGJvdW5kYCBkaXJlY3RseSBvbiB0aGUgc2VjdXJpdHkgZ3JvdXAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBhbGxvd0FsbElwdjZPdXRib3VuZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBTUVMgRExRLlxuICAgKlxuICAgKiBUaGUgTGFtYmRhIGZ1bmN0aW9uIGlhbSByb2xlIHdpbGwgcmVjZWl2ZSBwZXJtaXNzaW9uIHRvXG4gICAqIHNlbmQgbWVzc2FnZXMgb24gdGhpcyBxdWV1ZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBkZWFkbGV0dGVyIHF1ZXVlXG4gICAqL1xuICByZWFkb25seSBkZWFkTGV0dGVyUXVldWU/OiBJUXVldWU7XG5cbiAgLyoqXG4gICAqIEVuYWJsZWQgRExRLiBJZiBgZGVhZExldHRlclF1ZXVlYCBpcyB1bmRlZmluZWQsXG4gICAqIGFuIFNRUyBxdWV1ZSB3aXRoIGRlZmF1bHQgb3B0aW9ucyB3aWxsIGJlIGRlZmluZWQgZm9yIHlvdXIgRnVuY3Rpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gZmFsc2UgdW5sZXNzIGBkZWFkTGV0dGVyUXVldWVgIGlzIHNldCwgd2hpY2ggaW1wbGllcyBETFEgaXMgZW5hYmxlZC5cbiAgICovXG4gIHJlYWRvbmx5IGRlYWRMZXR0ZXJRdWV1ZUVuYWJsZWQ/OiBib29sZWFuO1xuXG4gIC8vIFRPRE86IHJlLWFkZCBTTlMgZGVhZExldHRlclRvcGljXG5cbiAgLyoqXG4gICAqIEV2ZW50IHNvdXJjZXMgZm9yIHRoaXMgZnVuY3Rpb24uXG4gICAqXG4gICAqIFlvdSBjYW4gYWxzbyBhZGQgZXZlbnQgc291cmNlcyB1c2luZyBgYWRkRXZlbnRTb3VyY2VgLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIGV2ZW50IHNvdXJjZXMuXG4gICAqL1xuICByZWFkb25seSBldmVudHM/OiBJRXZlbnRTb3VyY2VbXTtcblxuICAvKipcbiAgICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F3cy81LjYwLjAvZG9jcy9yZXNvdXJjZXMvbGFtYmRhX2Z1bmN0aW9uI3Jlc2VydmVkX2NvbmN1cnJlbnRfZXhlY3V0aW9ucyBMYW1iZGFGdW5jdGlvbiNyZXNlcnZlZF9jb25jdXJyZW50X2V4ZWN1dGlvbnN9XG4gICAqL1xuICByZWFkb25seSByZXNlcnZlZENvbmN1cnJlbnRFeGVjdXRpb25zPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUYWdzIHRvIGFwcGx5IHRvIHRoZSBMYW1iZGEgZnVuY3Rpb24uXG4gICAqL1xuICByZWFkb25seSB0YWdzPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcblxuICAvKipcbiAgICogU2V0dGluZyB0aGlzIHByb3BlcnR5IGluZm9ybXMgdGhlIENESyB0aGF0IHRoZSBpbXBvcnRlZCBmdW5jdGlvbiBBTFJFQURZIEhBUyB0aGUgbmVjZXNzYXJ5IHBlcm1pc3Npb25zXG4gICAqIGZvciB3aGF0IHlvdSBhcmUgdHJ5aW5nIHRvIGRvLiBXaGVuIG5vdCBjb25maWd1cmVkLCB0aGUgQ0RLIGF0dGVtcHRzIHRvIGF1dG8tZGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90XG4gICAqIGFkZGl0aW9uYWwgcGVybWlzc2lvbnMgYXJlIG5lY2Vzc2FyeSBvbiB0aGUgZnVuY3Rpb24gd2hlbiBncmFudCBBUElzIGFyZSB1c2VkLiBJZiB0aGUgQ0RLIHRyaWVkIHRvIGFkZFxuICAgKiBwZXJtaXNzaW9ucyBvbiBhbiBpbXBvcnRlZCBsYW1iZGEsIGl0IHdpbGwgZmFpbC5cbiAgICpcbiAgICogU2V0IHRoaXMgcHJvcGVydHkgKk9OTFkgSUYqIHlvdSBhcmUgY29tbWl0dGluZyB0byBtYW5hZ2UgdGhlIGltcG9ydGVkIGZ1bmN0aW9uJ3MgcGVybWlzc2lvbnMgb3V0c2lkZSBvZlxuICAgKiBDREsuIFlvdSBhcmUgYWNrbm93bGVkZ2luZyB0aGF0IHlvdXIgQ0RLIGNvZGUgYWxvbmUgd2lsbCBoYXZlIGluc3VmZmljaWVudCBwZXJtaXNzaW9ucyB0byBhY2Nlc3MgdGhlXG4gICAqIGltcG9ydGVkIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgc2tpcFBlcm1pc3Npb25zPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogU2V0cyB0aGUgbG9nZ2luZ0Zvcm1hdCBmb3IgdGhlIGZ1bmN0aW9uLlxuICAgKiBAZGVmYXVsdCBMb2dnaW5nRm9ybWF0LlRFWFRcbiAgICovXG4gIHJlYWRvbmx5IGxvZ2dpbmdGb3JtYXQ/OiBMb2dnaW5nRm9ybWF0O1xuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBhcHBsaWNhdGlvbiBsb2cgbGV2ZWwgZm9yIHRoZSBmdW5jdGlvbi5cbiAgICogQGRlZmF1bHQgQXBwbGljYXRpb25Mb2dMZXZlbC5JTkZPXG4gICAqL1xuICByZWFkb25seSBhcHBsaWNhdGlvbkxvZ0xldmVsPzogQXBwbGljYXRpb25Mb2dMZXZlbDtcblxuICAvKipcbiAgICogU2V0cyB0aGUgc3lzdGVtIGxvZyBsZXZlbCBmb3IgdGhlIGZ1bmN0aW9uLlxuICAgKiBAZGVmYXVsdCBTeXN0ZW1Mb2dMZXZlbC5JTkZPXG4gICAqL1xuICByZWFkb25seSBzeXN0ZW1Mb2dMZXZlbD86IFN5c3RlbUxvZ0xldmVsO1xuICAvKipcbiAgICogV2hldGhlciB0byBwdWJsaXNoIGNyZWF0aW9uL2NoYW5nZSBhcyBuZXcgTGFtYmRhIEZ1bmN0aW9uIFZlcnNpb24uXG4gICAqXG4gICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9hd3MvbGF0ZXN0L2RvY3MvcmVzb3VyY2VzL2xhbWJkYV9mdW5jdGlvbiNwdWJsaXNoIExhbWJkYUZ1bmN0aW9uI3B1Ymxpc2h9XG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBwdWJsaXNoPzogYm9vbGVhbiB8IElSZXNvbHZhYmxlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZ1bmN0aW9uUHJvcHMgZXh0ZW5kcyBGdW5jdGlvbk9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIHJ1bnRpbWUgZW52aXJvbm1lbnQgZm9yIHRoZSBMYW1iZGEgZnVuY3Rpb24gdGhhdCB5b3UgYXJlIHVwbG9hZGluZy5cbiAgICogRm9yIHZhbGlkIHZhbHVlcywgc2VlIHRoZSBSdW50aW1lIHByb3BlcnR5IGluIHRoZSBBV1MgTGFtYmRhIERldmVsb3BlclxuICAgKiBHdWlkZS5cbiAgICpcbiAgICogVXNlIGBSdW50aW1lLkZST01fSU1BR0VgIHdoZW4gZGVmaW5pbmcgYSBmdW5jdGlvbiBmcm9tIGEgRG9ja2VyIGltYWdlLlxuICAgKi9cbiAgcmVhZG9ubHkgcnVudGltZTogUnVudGltZTtcblxuICAvKipcbiAgICogVGhlIHNvdXJjZSBjb2RlIG9mIHlvdXIgTGFtYmRhIGZ1bmN0aW9uLiBZb3UgY2FuIHBvaW50IHRvIGEgZmlsZSBpbiBhblxuICAgKiBBbWF6b24gU2ltcGxlIFN0b3JhZ2UgU2VydmljZSAoQW1hem9uIFMzKSBidWNrZXQgb3Igc3BlY2lmeSB5b3VyIHNvdXJjZVxuICAgKiBjb2RlIGFzIGlubGluZSB0ZXh0LlxuICAgKi9cbiAgcmVhZG9ubHkgY29kZTogQ29kZTtcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIG1ldGhvZCB3aXRoaW4geW91ciBjb2RlIHRoYXQgTGFtYmRhIGNhbGxzIHRvIGV4ZWN1dGVcbiAgICogeW91ciBmdW5jdGlvbi4gVGhlIGZvcm1hdCBpbmNsdWRlcyB0aGUgZmlsZSBuYW1lLiBJdCBjYW4gYWxzbyBpbmNsdWRlXG4gICAqIG5hbWVzcGFjZXMgYW5kIG90aGVyIHF1YWxpZmllcnMsIGRlcGVuZGluZyBvbiB0aGUgcnVudGltZS5cbiAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGFtYmRhL2xhdGVzdC9kZy9mb3VuZGF0aW9uLXByb2dtb2RlbC5odG1sLlxuICAgKlxuICAgKiBVc2UgYEhhbmRsZXIuRlJPTV9JTUFHRWAgd2hlbiBkZWZpbmluZyBhIGZ1bmN0aW9uIGZyb20gYSBEb2NrZXIgaW1hZ2UuXG4gICAqXG4gICAqIE5PVEU6IElmIHlvdSBzcGVjaWZ5IHlvdXIgc291cmNlIGNvZGUgYXMgaW5saW5lIHRleHQgYnkgc3BlY2lmeWluZyB0aGVcbiAgICogWmlwRmlsZSBwcm9wZXJ0eSB3aXRoaW4gdGhlIENvZGUgcHJvcGVydHksIHNwZWNpZnkgaW5kZXguZnVuY3Rpb25fbmFtZSBhc1xuICAgKiB0aGUgaGFuZGxlci5cbiAgICovXG4gIHJlYWRvbmx5IGhhbmRsZXI6IHN0cmluZztcbn1cblxuLy8gcmUtYWRkIGVjMi5JQ29ubmVjdGFibGU/XG5cbi8vIC8qKlxuLy8gICogQSBMYW1iZGEgZnVuY3Rpb24uXG4vLyAgKi9cbi8vIGV4cG9ydCBpbnRlcmZhY2UgSUZ1bmN0aW9uIGV4dGVuZHMgSUF3c0NvbnN0cnVjdCwgaWFtLklHcmFudGFibGUge1xuXG4vLyAgIC8qKlxuLy8gICAgKiBBZGQgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gdGhpcyBmdW5jdGlvbi5cbi8vICAgICovXG4vLyAgIGFkZEVudmlyb25tZW50KGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogSUZ1bmN0aW9uO1xuLy8gfVxuXG4vKipcbiAqIFByb3ZpZGVzIGEgTGFtYmRhIEZ1bmN0aW9uIHJlc291cmNlLiBMYW1iZGEgYWxsb3dzIHlvdSB0byB0cmlnZ2VyIGV4ZWN1dGlvblxuICogb2YgY29kZSBpbiByZXNwb25zZSB0byBldmVudHMgaW4gQVdTLCBlbmFibGluZyBzZXJ2ZXJsZXNzIGJhY2tlbmQgc29sdXRpb25zLlxuICpcbiAqIFRoZSBMYW1iZGEgRnVuY3Rpb24gaXRzZWxmIGluY2x1ZGVzIHNvdXJjZSBjb2RlIGFuZCBydW50aW1lIGNvbmZpZ3VyYXRpb24uXG4gKlxuICogVGhpcyBDb25zdHJ1Y3QgbWFuYWdlcyBwZXJtaXNzaW9ucyBhcyBwYXJ0IG9mIHRoZSBmdW5jdGlvbiBQcmluY2lwYWwgaWFtIHBvbGljeS5cbiAqIFRoaXMgd29ya3MgZm9yIHNhbWUgYWNjb3VudCByZXNvdXJjZXMsIGJ1dCBmb3IgY3Jvc3MtYWNjb3VudCByZXNvdXJjZXMsXG4gKiB5b3UgbWF5IG5lZWQgdG8gbWFuYWdlIGFjY2VzcyBhcyBwYXJ0IG9mIHRoZSBSZXNvdXJjZSBpYW0gcG9saWN5LlxuICpcbiAqIEByZXNvdXJjZSBhd3NfbGFtYmRhX2Z1bmN0aW9uXG4gKiBAYmVhY29uLWNsYXNzIGNvbXB1dGUuSUZ1bmN0aW9uXG4gKi9cbmV4cG9ydCBjbGFzcyBMYW1iZGFGdW5jdGlvbiBleHRlbmRzIExhbWJkYUZ1bmN0aW9uQmFzZSBpbXBsZW1lbnRzIElGdW5jdGlvbiB7XG4gIC8vIFRPRE86IFRlcnJhZm9ybSBhd3NfbGFtYmRhX2Z1bmN0aW9uID09IENESyBGdW5jdGlvblZlcnNpb25cblxuICAvKipcbiAgICogTGF0ZXN0IHB1Ymxpc2hlZCB2ZXJzaW9uIG9mIHlvdXIgTGFtYmRhIEZ1bmN0aW9uLlxuICAgKi9cbiAgcHVibGljIGdldCB2ZXJzaW9uKCk6IHN0cmluZyB7XG4gICAgLy8gVE9ETzogV2hhdCBpcyB0aGlzIGlmIHB1Ymxpc2ggaXMgZmFsc2U/P1xuICAgIHJldHVybiB0aGlzLnJlc291cmNlLnZlcnNpb247XG4gIH1cblxuICAvKipcbiAgICogSW1wb3J0IGEgbGFtYmRhIGZ1bmN0aW9uIGludG8gdGhlIFRlcnJhQ29uc3RydWN0IHNwZWMgdXNpbmcgaXRzIG5hbWVcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbUZ1bmN0aW9uTmFtZShcbiAgICBzY29wZTogQ29uc3RydWN0LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgZnVuY3Rpb25OYW1lOiBzdHJpbmcsXG4gICk6IElGdW5jdGlvbiB7XG4gICAgcmV0dXJuIExhbWJkYUZ1bmN0aW9uLmZyb21GdW5jdGlvbkF0dHJpYnV0ZXMoc2NvcGUsIGlkLCB7XG4gICAgICBmdW5jdGlvbkFybjogQXdzU3RhY2sub2ZBd3NDb25zdHJ1Y3Qoc2NvcGUpLmZvcm1hdEFybih7XG4gICAgICAgIHNlcnZpY2U6IFwibGFtYmRhXCIsXG4gICAgICAgIHJlc291cmNlOiBcImZ1bmN0aW9uXCIsXG4gICAgICAgIHJlc291cmNlTmFtZTogZnVuY3Rpb25OYW1lLFxuICAgICAgICBhcm5Gb3JtYXQ6IEFybkZvcm1hdC5DT0xPTl9SRVNPVVJDRV9OQU1FLFxuICAgICAgfSksXG4gICAgICBzYW1lRW52aXJvbm1lbnQ6IHRydWUsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSW1wb3J0IGEgbGFtYmRhIGZ1bmN0aW9uIGludG8gdGhlIFRlcnJhQ29uc3RydWN0IHNwZWMgdXNpbmcgaXRzIEFSTi5cbiAgICpcbiAgICogRm9yIGBGdW5jdGlvbi5hZGRQZXJtaXNzaW9ucygpYCB0byB3b3JrIG9uIHRoaXMgaW1wb3J0ZWQgbGFtYmRhLCBtYWtlIHN1cmUgdGhhdCBpc1xuICAgKiBpbiB0aGUgc2FtZSBhY2NvdW50IGFuZCByZWdpb24gYXMgdGhlIHN0YWNrIHlvdSBhcmUgaW1wb3J0aW5nIGl0IGludG8uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21GdW5jdGlvbkFybihcbiAgICBzY29wZTogQ29uc3RydWN0LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgZnVuY3Rpb25Bcm46IHN0cmluZyxcbiAgKTogSUZ1bmN0aW9uIHtcbiAgICByZXR1cm4gTGFtYmRhRnVuY3Rpb24uZnJvbUZ1bmN0aW9uQXR0cmlidXRlcyhzY29wZSwgaWQsIHsgZnVuY3Rpb25Bcm4gfSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIExhbWJkYSBmdW5jdGlvbiBvYmplY3Qgd2hpY2ggcmVwcmVzZW50cyBhIGZ1bmN0aW9uIG5vdCBkZWZpbmVkXG4gICAqIHdpdGhpbiB0aGlzIHN0YWNrLlxuICAgKlxuICAgKiBGb3IgYEZ1bmN0aW9uLmFkZFBlcm1pc3Npb25zKClgIHRvIHdvcmsgb24gdGhpcyBpbXBvcnRlZCBsYW1iZGEsIHNldCB0aGUgc2FtZUVudmlyb25tZW50IHByb3BlcnR5IHRvIHRydWVcbiAgICogaWYgdGhpcyBpbXBvcnRlZCBsYW1iZGEgaXMgaW4gdGhlIHNhbWUgYWNjb3VudCBhbmQgcmVnaW9uIGFzIHRoZSBzdGFjayB5b3UgYXJlIGltcG9ydGluZyBpdCBpbnRvLlxuICAgKlxuICAgKiBAcGFyYW0gc2NvcGUgVGhlIHBhcmVudCBjb25zdHJ1Y3RcbiAgICogQHBhcmFtIGlkIFRoZSBuYW1lIG9mIHRoZSBsYW1iZGEgY29uc3RydWN0XG4gICAqIEBwYXJhbSBhdHRycyB0aGUgYXR0cmlidXRlcyBvZiB0aGUgZnVuY3Rpb24gdG8gaW1wb3J0XG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21GdW5jdGlvbkF0dHJpYnV0ZXMoXG4gICAgc2NvcGU6IENvbnN0cnVjdCxcbiAgICBpZDogc3RyaW5nLFxuICAgIGF0dHJzOiBGdW5jdGlvbkF0dHJpYnV0ZXMsXG4gICk6IElGdW5jdGlvbiB7XG4gICAgY29uc3QgZnVuY3Rpb25Bcm4gPSBhdHRycy5mdW5jdGlvbkFybjtcbiAgICBjb25zdCBmdW5jdGlvbk5hbWUgPSBleHRyYWN0TmFtZUZyb21Bcm4oYXR0cnMuZnVuY3Rpb25Bcm4pO1xuICAgIGNvbnN0IHJvbGUgPSBhdHRycy5yb2xlO1xuXG4gICAgY2xhc3MgSW1wb3J0IGV4dGVuZHMgTGFtYmRhRnVuY3Rpb25CYXNlIHtcbiAgICAgIHB1YmxpYyByZWFkb25seSByZXNvdXJjZTogZGF0YUF3c0xhbWJkYUZ1bmN0aW9uLkRhdGFBd3NMYW1iZGFGdW5jdGlvbjtcbiAgICAgIHB1YmxpYyByZWFkb25seSBmdW5jdGlvbk5hbWUgPSBmdW5jdGlvbk5hbWU7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgZnVuY3Rpb25Bcm4gPSBmdW5jdGlvbkFybjtcbiAgICAgIHB1YmxpYyBnZXQgZnVuY3Rpb25RdWFsaWZpZWRJbnZva2VBcm4oKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgeyByZWdpb24sIHBhcnRpdGlvbiB9ID0gQXJuLnNwbGl0KFxuICAgICAgICAgIGZ1bmN0aW9uQXJuLFxuICAgICAgICAgIEFybkZvcm1hdC5DT0xPTl9SRVNPVVJDRV9OQU1FLFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gYGFybjoke3BhcnRpdGlvbn06YXBpZ2F0ZXdheToke3JlZ2lvbn06bGFtYmRhOnBhdGgvMjAxNS0wMy0zMS9mdW5jdGlvbnMvJHtmdW5jdGlvbkFybn0vaW52b2NhdGlvbnNgO1xuICAgICAgfVxuICAgICAgcHVibGljIGdldCBmdW5jdGlvbkludm9rZUFybigpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCB7IHJlZ2lvbiwgcGFydGl0aW9uIH0gPSBBcm4uc3BsaXQoXG4gICAgICAgICAgZnVuY3Rpb25Bcm4sXG4gICAgICAgICAgQXJuRm9ybWF0LkNPTE9OX1JFU09VUkNFX05BTUUsXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBgYXJuOiR7cGFydGl0aW9ufTphcGlnYXRld2F5OiR7cmVnaW9ufTpsYW1iZGE6cGF0aC8yMDE1LTAzLTMxL2Z1bmN0aW9ucy8ke2Z1bmN0aW9uQXJufS9pbnZvY2F0aW9uc2A7XG4gICAgICB9XG4gICAgICAvLyBUT0RPOiBSZXNvbHZlIHJvbGUgYW5kIHByaW5jaXBhbCByZXNvbHZlIGZyb20gVEYgZGF0YSBzb3VyY2U/XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgZ3JhbnRQcmluY2lwYWw6IGlhbS5JUHJpbmNpcGFsO1xuICAgICAgcHVibGljIHJlYWRvbmx5IHJvbGUgPSByb2xlO1xuICAgICAgcHVibGljIHJlYWRvbmx5IHBlcm1pc3Npb25zTm9kZSA9IHRoaXMubm9kZTtcbiAgICAgIC8qKlxuICAgICAgICogVGhlIHZlcnNpb24gb2YgdGhlIExhbWJkYSBmdW5jdGlvbiByZXR1cm5lZC5cbiAgICAgICAqXG4gICAgICAgKiBJZiBxdWFsaWZpZXIgaXMgbm90IHNldCwgdGhpcyB3aWxsIHJlc29sdmUgdG8gdGhlIG1vc3QgcmVjZW50IHB1Ymxpc2hlZCB2ZXJzaW9uLlxuICAgICAgICogSWYgbm8gcHVibGlzaGVkIHZlcnNpb24gb2YgdGhlIGZ1bmN0aW9uIGV4aXN0cywgdmVyc2lvbiB3aWxsIHJlc29sdmUgdG8gYCRMQVRFU1RgLlxuICAgICAgICovXG4gICAgICBwdWJsaWMgZ2V0IHZlcnNpb24oKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVzb3VyY2UudmVyc2lvbjtcbiAgICAgIH1cbiAgICAgIC8vIEZvcmNlIHVzZXIgdG8gcHJvdmlkZSBhcmNoIG9yIGFzc3VtZSBYODZfNjRcbiAgICAgIHB1YmxpYyByZWFkb25seSBhcmNoaXRlY3R1cmUgPSBhdHRycy5hcmNoaXRlY3R1cmUgPz8gQXJjaGl0ZWN0dXJlLlg4Nl82NDtcbiAgICAgIC8vIHB1YmxpYyBnZXQgYXJjaGl0ZWN0dXJlKCk6IHN0cmluZyB7XG4gICAgICAvLyAgIHJldHVybiBGbi5lbGVtZW50KHRoaXMucmVzb3VyY2UuYXJjaGl0ZWN0dXJlcywgMCkgYXMgc3RyaW5nO1xuICAgICAgLy8gfVxuICAgICAgcHVibGljIHJlYWRvbmx5IHJlc291cmNlQXJuc0ZvckdyYW50SW52b2tlID0gW1xuICAgICAgICB0aGlzLmZ1bmN0aW9uQXJuLFxuICAgICAgICBgJHt0aGlzLmZ1bmN0aW9uQXJufToqYCxcbiAgICAgIF07XG4gICAgICBwdWJsaWMgZ2V0IGZ1bmN0aW9uT3V0cHV0cygpOiBGdW5jdGlvbk91dHB1dHMge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG5hbWU6IHRoaXMuZnVuY3Rpb25OYW1lLFxuICAgICAgICAgIGFybjogdGhpcy5mdW5jdGlvbkFybixcbiAgICAgICAgICByb2xlQXJuOiB0aGlzLnJvbGU/LnJvbGVBcm4gPz8gXCJcIixcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHB1YmxpYyBnZXQgb3V0cHV0cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZnVuY3Rpb25PdXRwdXRzO1xuICAgICAgfVxuICAgICAgcHJvdGVjdGVkIHJlYWRvbmx5IGNhbkNyZWF0ZVBlcm1pc3Npb25zID1cbiAgICAgICAgYXR0cnMuc2FtZUVudmlyb25tZW50ID8/IHRoaXMuX2lzU3RhY2tBY2NvdW50KCk7XG4gICAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgX3NraXBQZXJtaXNzaW9ucyA9IGF0dHJzLnNraXBQZXJtaXNzaW9ucyA/PyBmYWxzZTtcblxuICAgICAgY29uc3RydWN0b3IoczogQ29uc3RydWN0LCBpOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIocywgaSwge1xuICAgICAgICAgIGVudmlyb25tZW50RnJvbUFybjogZnVuY3Rpb25Bcm4sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuZ3JhbnRQcmluY2lwYWwgPVxuICAgICAgICAgIHJvbGUgfHwgbmV3IGlhbS5Vbmtub3duUHJpbmNpcGFsKHsgcmVzb3VyY2U6IHRoaXMgfSk7XG4gICAgICAgIHRoaXMucmVzb3VyY2UgPSBuZXcgZGF0YUF3c0xhbWJkYUZ1bmN0aW9uLkRhdGFBd3NMYW1iZGFGdW5jdGlvbihcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIFwiUmVzb3VyY2VcIixcbiAgICAgICAgICB7XG4gICAgICAgICAgICBmdW5jdGlvbk5hbWU6IHRoaXMuZnVuY3Rpb25OYW1lLFxuICAgICAgICAgIH0sXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gLy8gVE9ETzogcmUtYWRkIHN1cHBvcnQgZm9yIEVDMiBjb25uZWN0aW9uc1xuICAgICAgICAvLyBpZiAoYXR0cnMuc2VjdXJpdHlHcm91cCkge1xuICAgICAgICAvLyAgIHRoaXMuX2Nvbm5lY3Rpb25zID0gbmV3IGVjMi5Db25uZWN0aW9ucyh7XG4gICAgICAgIC8vICAgICBzZWN1cml0eUdyb3VwczogW2F0dHJzLnNlY3VyaXR5R3JvdXBdLFxuICAgICAgICAvLyAgIH0pO1xuICAgICAgICAvLyB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBJbXBvcnQoc2NvcGUsIGlkKTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZWFkb25seSByZXNvdXJjZTogbGFtYmRhRnVuY3Rpb24uTGFtYmRhRnVuY3Rpb247XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfb3V0cHV0czogRnVuY3Rpb25PdXRwdXRzO1xuXG4gIC8qKiBTdHJvbmdseSBUeXBlZCBGdW5jdGlvbiBPdXRwdXRzICovXG4gIHB1YmxpYyBnZXQgZnVuY3Rpb25PdXRwdXRzKCk6IEZ1bmN0aW9uT3V0cHV0cyB7XG4gICAgcmV0dXJuIHRoaXMuX291dHB1dHM7XG4gIH1cbiAgcHVibGljIGdldCBvdXRwdXRzKCk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgIHJldHVybiB0aGlzLmZ1bmN0aW9uT3V0cHV0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZnVuY3Rpb25OYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBBUk4gZm8gdGhlIGZ1bmN0aW9uLlxuICAgKi9cbiAgcHVibGljIGdldCBmdW5jdGlvbkFybigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnJlc291cmNlLmFybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgQVJOIGZvIHRoZSBmdW5jdGlvbi5cbiAgICogKGlmIHZlcnNpb25pbmcgaXMgZW5hYmxlZCB2aWEgcHVibGlzaCA9IHRydWUpXG4gICAqL1xuICBwdWJsaWMgZ2V0IGZ1bmN0aW9uUXVhbGlmaWVkQXJuKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucmVzb3VyY2UucXVhbGlmaWVkQXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBGdWxseSBRdWFsaWZpZWQgSW52b2tlIEFSTiBmbyB0aGUgZnVuY3Rpb24gdG8gYmUgdXNlZCBmcm9tIEFQSSBHYXRld2F5LlxuICAgKlxuICAgKiBOT1RFOiBUaGlzIGRvZXMgbm90IHNlZW0gdG8gd29yayB3aXRoIEF1dGhvcml6ZXJzXG4gICAqL1xuICBwdWJsaWMgZ2V0IGZ1bmN0aW9uUXVhbGlmaWVkSW52b2tlQXJuKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucmVzb3VyY2UucXVhbGlmaWVkSW52b2tlQXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBJbnZva2UgQVJOIGZvIHRoZSBmdW5jdGlvbiB0byBiZSB1c2VkIGZyb20gQVBJIEdhdGV3YXkuXG4gICAqXG4gICAqIE5PVEU6IFVzZSB0aGlzIGZvciBBdXRob3JpemVyc1xuICAgKi9cbiAgcHVibGljIGdldCBmdW5jdGlvbkludm9rZUFybigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnJlc291cmNlLmludm9rZUFybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYXJjaGl0ZWN0dXJlIG9mIHRoaXMgTGFtYmRhIEZ1bmN0aW9uLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGFyY2hpdGVjdHVyZTogQXJjaGl0ZWN0dXJlO1xuXG4gIC8qKlxuICAgKiBUaGUgcHJpbmNpcGFsIHRoaXMgTGFtYmRhIEZ1bmN0aW9uIGlzIHJ1bm5pbmcgYXNcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBncmFudFByaW5jaXBhbDogaWFtLklQcmluY2lwYWw7XG5cbiAgLyoqXG4gICAqIFRoZSBJQU0gcm9sZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBmdW5jdGlvbi5cbiAgICpcbiAgICogVW5kZWZpbmVkIGlmIHRoZSBmdW5jdGlvbiB3YXMgaW1wb3J0ZWQgd2l0aG91dCBhIHJvbGUuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcm9sZT86IGlhbS5JUm9sZTtcblxuICAvKipcbiAgICogVGhlIHJ1bnRpbWUgY29uZmlndXJlZCBmb3IgdGhpcyBsYW1iZGEuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcnVudGltZTogUnVudGltZTtcblxuICAvKipcbiAgICogVGhlIERMUSAoYXMgcXVldWUpIGFzc29jaWF0ZWQgd2l0aCB0aGlzIExhbWJkYSBGdW5jdGlvbiAodGhpcyBpcyBhbiBvcHRpb25hbCBhdHRyaWJ1dGUpLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGRlYWRMZXR0ZXJRdWV1ZT86IElRdWV1ZTtcblxuICAvKipcbiAgICogVGhlIHRpbWVvdXQgY29uZmlndXJlZCBmb3IgdGhpcyBsYW1iZGEuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdGltZW91dD86IER1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBUaGUgY29uc3RydWN0IG5vZGUgd2hlcmUgcGVybWlzc2lvbnMgYXJlIGF0dGFjaGVkLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHBlcm1pc3Npb25zTm9kZSA9IHRoaXMubm9kZTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgY2FuQ3JlYXRlUGVybWlzc2lvbnMgPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBNYXBwaW5nIG9mIGludm9jYXRpb24gcHJpbmNpcGFscyB0byBncmFudHMuIFVzZWQgdG8gZGUtZHVwZSBgZ3JhbnRJbnZva2UoKWAgY2FsbHMuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHJvdGVjdGVkIF9pbnZvY2F0aW9uR3JhbnRzOiBSZWNvcmQ8c3RyaW5nLCBpYW0uR3JhbnQ+ID0ge307XG5cbiAgLyoqXG4gICAqIE1hcHBpbmcgb2YgZnVjbnRpb24gVVJMIGludm9jYXRpb24gcHJpbmNpcGFscyB0byBncmFudHMuIFVzZWQgdG8gZGUtZHVwZSBgZ3JhbnRJbnZva2VVcmwoKWAgY2FsbHMuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHJvdGVjdGVkIF9mdW5jdGlvblVybEludm9jYXRpb25HcmFudHM6IFJlY29yZDxzdHJpbmcsIGlhbS5HcmFudD4gPSB7fTtcblxuICAvLyAvLyBUZXJhZm9ybSBwcm92aWRlciBmb3IgQVdTIEF1dG9tYXRpY2FsbHkgbWFuYWdlcyBGdW5jdGlvbiBWZXJzaW9uaW5nIHRocm91Z2ggY29kZSBoYXNoLi5cbiAgLy8gLy8gbmVlZCB0byBkcm9wIG1vc3Qgb2YgdGhpcyB2ZXJzaW9uIGxvZ2ljLi5cblxuICAvLyBwcml2YXRlIHJlYWRvbmx5IGN1cnJlbnRWZXJzaW9uT3B0aW9ucz86IFZlcnNpb25PcHRpb25zO1xuICAvLyBwcml2YXRlIF9jdXJyZW50VmVyc2lvbj86IFZlcnNpb247XG4gIC8vIC8qKlxuICAvLyAgKiBSZXR1cm5zIGEgYGxhbWJkYS5WZXJzaW9uYCB3aGljaCByZXByZXNlbnRzIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgdGhpc1xuICAvLyAgKiBMYW1iZGEgZnVuY3Rpb24uIEEgbmV3IHZlcnNpb24gd2lsbCBiZSBjcmVhdGVkIGV2ZXJ5IHRpbWUgdGhlIGZ1bmN0aW9uJ3NcbiAgLy8gICogY29uZmlndXJhdGlvbiBjaGFuZ2VzLlxuICAvLyAgKlxuICAvLyAgKiBZb3UgY2FuIHNwZWNpZnkgb3B0aW9ucyBmb3IgdGhpcyB2ZXJzaW9uIHVzaW5nIHRoZSBgY3VycmVudFZlcnNpb25PcHRpb25zYFxuICAvLyAgKiBwcm9wIHdoZW4gaW5pdGlhbGl6aW5nIHRoZSBgbGFtYmRhLkZ1bmN0aW9uYC5cbiAgLy8gICovXG4gIC8vIHB1YmxpYyBnZXQgY3VycmVudFZlcnNpb24oKTogVmVyc2lvbiB7XG4gIC8vICAgaWYgKHRoaXMuX2N1cnJlbnRWZXJzaW9uKSB7XG4gIC8vICAgICByZXR1cm4gdGhpcy5fY3VycmVudFZlcnNpb247XG4gIC8vICAgfVxuXG4gIC8vICAgLy8gaWYgKHRoaXMuX3dhcm5JZkN1cnJlbnRWZXJzaW9uQ2FsbGVkKSB7XG4gIC8vICAgLy8gICB0aGlzLndhcm5JbnZva2VGdW5jdGlvblBlcm1pc3Npb25zKHRoaXMpO1xuICAvLyAgIC8vIH1cblxuICAvLyAgIHRoaXMuX2N1cnJlbnRWZXJzaW9uID0gbmV3IFZlcnNpb24odGhpcywgXCJDdXJyZW50VmVyc2lvblwiLCB7XG4gIC8vICAgICBsYW1iZGE6IHRoaXMsXG4gIC8vICAgICAuLi50aGlzLmN1cnJlbnRWZXJzaW9uT3B0aW9ucyxcbiAgLy8gICB9KTtcblxuICAvLyAgIC8vIG92ZXJyaWRlIHRoZSB2ZXJzaW9uJ3MgbG9naWNhbCBJRCB3aXRoIGEgbGF6eSBzdHJpbmcgd2hpY2ggaW5jbHVkZXMgdGhlXG4gIC8vICAgLy8gaGFzaCBvZiB0aGUgZnVuY3Rpb24gaXRzZWxmLCBzbyBhIG5ldyB2ZXJzaW9uIHJlc291cmNlIGlzIGNyZWF0ZWQgd2hlblxuICAvLyAgIC8vIHRoZSBmdW5jdGlvbiBjb25maWd1cmF0aW9uIGNoYW5nZXMuXG4gIC8vICAgY29uc3QgY2ZuID0gdGhpcy5fY3VycmVudFZlcnNpb24ubm9kZS5kZWZhdWx0Q2hpbGQgYXMgVGVycmFmb3JtUmVzb3VyY2U7XG4gIC8vICAgY29uc3Qgb3JpZ2luYWxMb2dpY2FsSWQgPSB0aGlzLnN0YWNrLnJlc29sdmUoY2ZuLmxvZ2ljYWxJZCkgYXMgc3RyaW5nO1xuXG4gIC8vICAgY2ZuLm92ZXJyaWRlTG9naWNhbElkKFxuICAvLyAgICAgTGF6eS5zdHJpbmdWYWx1ZSh7XG4gIC8vICAgICAgIHByb2R1Y2U6ICgpID0+IHtcbiAgLy8gICAgICAgICBjb25zdCBoYXNoID0gY2FsY3VsYXRlRnVuY3Rpb25IYXNoKHRoaXMsIHRoaXMuaGFzaE1peGlucy5qb2luKFwiXCIpKTtcbiAgLy8gICAgICAgICBjb25zdCBsb2dpY2FsSWQgPSB0cmltRnJvbVN0YXJ0KG9yaWdpbmFsTG9naWNhbElkLCAyNTUgLSAzMik7XG4gIC8vICAgICAgICAgcmV0dXJuIGAke2xvZ2ljYWxJZH0ke2hhc2h9YDtcbiAgLy8gICAgICAgfSxcbiAgLy8gICAgIH0pLFxuICAvLyAgICk7XG5cbiAgLy8gICByZXR1cm4gdGhpcy5fY3VycmVudFZlcnNpb247XG4gIC8vIH1cblxuICAvKipcbiAgICogVGhlIEFSTihzKSB0byBwdXQgaW50byB0aGUgcmVzb3VyY2UgZmllbGQgb2YgdGhlIGdlbmVyYXRlZCBJQU0gcG9saWN5IGZvciBncmFudEludm9rZSgpXG4gICAqL1xuICBwdWJsaWMgZ2V0IHJlc291cmNlQXJuc0ZvckdyYW50SW52b2tlKCkge1xuICAgIC8vIFRPRE86IHNob3VsZCB0aGlzIGJlIHF1YWxpZmllZEFybiBvciBxdWFsaWZpZWRJbnZva2VBcm4/XG4gICAgLy8gaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9hd3MvNS42OC4wL2RvY3MvcmVzb3VyY2VzL2xhbWJkYV9mdW5jdGlvbiNxdWFsaWZpZWRfYXJuXG4gICAgcmV0dXJuIFt0aGlzLmZ1bmN0aW9uQXJuLCB0aGlzLmZ1bmN0aW9uUXVhbGlmaWVkSW52b2tlQXJuXTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHVibGljIHJlYWRvbmx5IF9sb2dHcm91cDogY2xvdWR3YXRjaExvZ0dyb3VwLkNsb3Vkd2F0Y2hMb2dHcm91cDtcblxuICAvKipcbiAgICogRW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciB0aGlzIGZ1bmN0aW9uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZW52aXJvbm1lbnQ6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7fTtcblxuICBwcml2YXRlIF91cmw/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBIVFRQIEVuZHBvaW50IGZvciB0aGlzIGZ1bmN0aW9uIGlmIGRlZmluZWQuXG4gICAqXG4gICAqIHVzZSBgYWRkRnVuY3Rpb25VcmxgIHRvIGVuYWJsZSBFbmRwb2ludC5cbiAgICovXG4gIHB1YmxpYyBnZXQgdXJsKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3VybDtcbiAgfVxuXG4gIHByaXZhdGUgX2V2ZW50U291cmNlczoge1xuICAgIFtpZDogc3RyaW5nXTogbGFtYmRhRXZlbnRTb3VyY2VNYXBwaW5nLkxhbWJkYUV2ZW50U291cmNlTWFwcGluZztcbiAgfSA9IHt9O1xuICBwdWJsaWMgZ2V0IGV2ZW50U291cmNlcygpOiBsYW1iZGFFdmVudFNvdXJjZU1hcHBpbmcuTGFtYmRhRXZlbnRTb3VyY2VNYXBwaW5nW10ge1xuICAgIHJldHVybiBPYmplY3QudmFsdWVzKHRoaXMuX2V2ZW50U291cmNlcyk7XG4gIH1cblxuICBwcml2YXRlIF9zZWN1cml0eUdyb3VwPzogc2VjdXJpdHlHcm91cC5TZWN1cml0eUdyb3VwO1xuICBwdWJsaWMgZ2V0IHNlY3VyaXR5R3JvdXAoKTogc2VjdXJpdHlHcm91cC5TZWN1cml0eUdyb3VwIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fc2VjdXJpdHlHcm91cDtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIG5hbWU6IHN0cmluZywgcHJvcHM6IEZ1bmN0aW9uUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgbmFtZSwgcHJvcHMpO1xuXG4gICAgY29uc3Qge1xuICAgICAgZGVzY3JpcHRpb24sXG4gICAgICBlbnZpcm9ubWVudDogdmFyaWFibGVzLFxuICAgICAgbG9nUmV0ZW50aW9uSW5EYXlzID0gUmV0ZW50aW9uRGF5cy5PTkVfV0VFSyxcbiAgICAgIG1lbW9yeVNpemUgPSAxMjgsXG4gICAgICB0aW1lb3V0ID0gRHVyYXRpb24uc2Vjb25kcygzKSxcbiAgICAgIGxheWVycyxcbiAgICAgIHJlc2VydmVkQ29uY3VycmVudEV4ZWN1dGlvbnMsXG4gICAgfSA9IHByb3BzO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb3IgQVJOIG9mIHRoZSBMYW1iZGEgZnVuY3Rpb24uXG4gICAgICogaXMgbGltaXRlZCB0byA2NCBjaGFyYWN0ZXJzIGluIGxlbmd0aC5cbiAgICAgKlxuICAgICAqIEFSTiBQYXR0ZXJuOiAoW2EtekEtWjAtOS1fXSspKDooXFwkTEFURVNUfFthLXpBLVowLTktX10rKSk/XG4gICAgICovXG4gICAgY29uc3QgZnVuY3Rpb25OYW1lID1cbiAgICAgIHByb3BzLmZ1bmN0aW9uTmFtZSA/P1xuICAgICAgdGhpcy5zdGFjay51bmlxdWVSZXNvdXJjZU5hbWVQcmVmaXgodGhpcywge1xuICAgICAgICBwcmVmaXg6IHByb3BzLmZ1bmN0aW9uTmFtZVByZWZpeCA/PyB0aGlzLmdyaWRVVUlEICsgXCItXCIsXG4gICAgICAgIGFsbG93ZWRTcGVjaWFsQ2hhcmFjdGVyczogXCIrXCIsXG4gICAgICAgIG1heExlbmd0aDogNjQsXG4gICAgICB9KTtcblxuICAgIGlmIChmdW5jdGlvbk5hbWUgJiYgIVRva2VuLmlzVW5yZXNvbHZlZChmdW5jdGlvbk5hbWUpKSB7XG4gICAgICBpZiAoZnVuY3Rpb25OYW1lLmxlbmd0aCA+IDY0KSB7XG4gICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICAgYEZ1bmN0aW9uIG5hbWUgY2FuIG5vdCBiZSBsb25nZXIgdGhhbiA2NCBjaGFyYWN0ZXJzIGJ1dCBoYXMgJHtmdW5jdGlvbk5hbWUubGVuZ3RofSBjaGFyYWN0ZXJzLmAsXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmICghL15bYS16QS1aMC05LV9dKyQvLnRlc3QoZnVuY3Rpb25OYW1lKSkge1xuICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICAgIGBGdW5jdGlvbiBuYW1lICR7ZnVuY3Rpb25OYW1lfSBjYW4gY29udGFpbiBvbmx5IGxldHRlcnMsIG51bWJlcnMsIGh5cGhlbnMsIG9yIHVuZGVyc2NvcmVzIHdpdGggbm8gc3BhY2VzLmAsXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZGVzY3JpcHRpb24gJiYgIVRva2VuLmlzVW5yZXNvbHZlZChkZXNjcmlwdGlvbikpIHtcbiAgICAgIGlmIChkZXNjcmlwdGlvbi5sZW5ndGggPiAyNTYpIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICBgRnVuY3Rpb24gZGVzY3JpcHRpb24gY2FuIG5vdCBiZSBsb25nZXIgdGhhbiAyNTYgY2hhcmFjdGVycyBidXQgaGFzICR7ZGVzY3JpcHRpb24ubGVuZ3RofSBjaGFyYWN0ZXJzLmAsXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBtYW5hZ2VkUG9saWNpZXMgPSBuZXcgQXJyYXk8aWFtLklNYW5hZ2VkUG9saWN5PigpO1xuICAgIC8vIHRoZSBhcm4gaXMgaW4gdGhlIGZvcm0gb2YgLSBhcm46YXdzOmlhbTo6YXdzOnBvbGljeS9zZXJ2aWNlLXJvbGUvQVdTTGFtYmRhQmFzaWNFeGVjdXRpb25Sb2xlXG4gICAgbWFuYWdlZFBvbGljaWVzLnB1c2goXG4gICAgICBpYW0uTWFuYWdlZFBvbGljeS5mcm9tQXdzTWFuYWdlZFBvbGljeU5hbWUoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIFwiQVdTTGFtYmRhQmFzaWNFeGVjdXRpb25Sb2xlXCIsXG4gICAgICAgIFwic2VydmljZS1yb2xlL0FXU0xhbWJkYUJhc2ljRXhlY3V0aW9uUm9sZVwiLFxuICAgICAgKSxcbiAgICApO1xuICAgIGlmIChwcm9wcy52cGMgfHwgcHJvcHMubmV0d29ya0NvbmZpZykge1xuICAgICAgLy8gUG9saWN5IHRoYXQgd2lsbCBoYXZlIEVOSSBjcmVhdGlvbiBwZXJtaXNzaW9uc1xuICAgICAgLy8gbm90IHN1cmUgaWYgdGltZS5zbGVlcCBpcyBuZWNlc3Nhcnk/XG4gICAgICAvLyByZWY6XG4gICAgICAvLyAgLSBodHRwczovL2dpdGh1Yi5jb20vcHVsdW1pL3B1bHVtaS1hd3MvaXNzdWVzLzIyNjAjaXNzdWVjb21tZW50LTE5Nzc2MDY1MDlcbiAgICAgIC8vICAtIGh0dHBzOi8vZ2l0aHViLmNvbS9oYXNoaWNvcnAvdGVycmFmb3JtLXByb3ZpZGVyLWF3cy9pc3N1ZXMvMjk4MjgjaXNzdWVjb21tZW50LTE2OTMzMDc1MDBcbiAgICAgIG1hbmFnZWRQb2xpY2llcy5wdXNoKFxuICAgICAgICBpYW0uTWFuYWdlZFBvbGljeS5mcm9tQXdzTWFuYWdlZFBvbGljeU5hbWUoXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICBcIkFXU0xhbWJkYVZQQ0FjY2Vzc0V4ZWN1dGlvblJvbGVcIixcbiAgICAgICAgICBcInNlcnZpY2Utcm9sZS9BV1NMYW1iZGFWUENBY2Nlc3NFeGVjdXRpb25Sb2xlXCIsXG4gICAgICAgICksXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFRPRE86IEFueSBjb25jZXJuIG5vdCBzY29waW5nIHRoZSBsb2dHcm91cCBJQU0gUGVybWlzc2lvbnM/XG4gICAgLy8gLmFsbG93KClcbiAgICAvLyAudG9DcmVhdGVMb2dTdHJlYW0oKVxuICAgIC8vIC50b1B1dExvZ0V2ZW50cygpXG4gICAgLy8gLm9uKGxvZ0dyb3VwLmFybiwgYCR7bG9nR3JvdXAuYXJufTpsb2ctc3RyZWFtOipgKSxcblxuICAgIHRoaXMucm9sZSA9XG4gICAgICBwcm9wcy5yb2xlIHx8XG4gICAgICBuZXcgaWFtLlJvbGUodGhpcywgXCJTZXJ2aWNlUm9sZVwiLCB7XG4gICAgICAgIGFzc3VtZWRCeTogbmV3IGlhbS5TZXJ2aWNlUHJpbmNpcGFsKFwibGFtYmRhLmFtYXpvbmF3cy5jb21cIiksXG4gICAgICAgIG1hbmFnZWRQb2xpY2llcyxcbiAgICAgIH0pO1xuICAgIHRoaXMuZ3JhbnRQcmluY2lwYWwgPSB0aGlzLnJvbGU7XG4gICAgLy8gVE9ETzogUmUtYWRkIGZpbGVzeXN0ZW0gLyBsb2NhbE1vdW50UGF0aCBzdXBwb3J0XG4gICAgLy8gcmVmOiBmaWxlc3lzdGVtLmNvbmZpZy5wb2xpY2llcyB0byBiZSBhZGRlZCB0byBwcmluY2lwYWxcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvYmxvYi92Mi4xNjAuMC9wYWNrYWdlcy9hd3MtY2RrLWxpYi9hd3MtbGFtYmRhL2xpYi9mdW5jdGlvbi50cyNMOTQ5LUw5NjVcblxuICAgIGZvciAoY29uc3Qgc3RhdGVtZW50IG9mIHByb3BzLmluaXRpYWxQb2xpY3kgfHwgW10pIHtcbiAgICAgIHRoaXMucm9sZS5hZGRUb1ByaW5jaXBhbFBvbGljeShzdGF0ZW1lbnQpO1xuICAgIH1cblxuICAgIC8vIE11c3Qgc2V0IHJ1bnRpbWUgcHJvcGVydHkgdXNlZCBieSBiaW5kXG4gICAgdGhpcy5ydW50aW1lID0gcHJvcHMucnVudGltZTtcbiAgICBjb25zdCBjb2RlID0gcHJvcHMuY29kZS5iaW5kKHRoaXMpO1xuICAgIHZlcmlmeUNvZGVDb25maWcoY29kZSwgcHJvcHMpO1xuXG4gICAgLy8gYWRkIHN1cHBvcnQgZm9yIEFXU19DT0RFR1VSVSBQcm9maWxlIGVudiB2YXJpYWJsZXMuLi5cbiAgICBjb25zdCBlbnYgPSB2YXJpYWJsZXMgfHwge307XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZW52KSkge1xuICAgICAgdGhpcy5hZGRFbnZpcm9ubWVudChrZXksIHZhbHVlKTtcbiAgICB9XG5cbiAgICAvLyBETFEgY2FuIGJlIGVpdGhlciBzbnMuSVRvcGljIG9yIHNxcy5JUXVldWVcbiAgICBjb25zdCBkbHFUb3BpY09yUXVldWUgPSB0aGlzLmJ1aWxkRGVhZExldHRlclF1ZXVlKHByb3BzKTtcbiAgICBpZiAoZGxxVG9waWNPclF1ZXVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICh0aGlzLmlzUXVldWUoZGxxVG9waWNPclF1ZXVlKSkge1xuICAgICAgICB0aGlzLmRlYWRMZXR0ZXJRdWV1ZSA9IGRscVRvcGljT3JRdWV1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkRlYWRMZXR0ZXJUb3BpYyBpcyBub3Qgc3VwcG9ydGVkIHlldFwiKTtcbiAgICAgICAgLy8gdGhpcy5kZWFkTGV0dGVyVG9waWMgPSBkbHFUb3BpY09yUXVldWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgbG9nR3JvdXAgPSBuZXcgY2xvdWR3YXRjaExvZ0dyb3VwLkNsb3Vkd2F0Y2hMb2dHcm91cChcbiAgICAgIHRoaXMsXG4gICAgICBcIkxvZ0dyb3VwXCIsXG4gICAgICB7XG4gICAgICAgIG5hbWU6IGAvYXdzL2xhbWJkYS8ke2Z1bmN0aW9uTmFtZX1gLFxuICAgICAgICByZXRlbnRpb25JbkRheXM6IGxvZ1JldGVudGlvbkluRGF5cyxcbiAgICAgIH0sXG4gICAgKTtcbiAgICB0aGlzLl9sb2dHcm91cCA9IGxvZ0dyb3VwO1xuICAgIHRoaXMucmVzb3VyY2UgPSBuZXcgbGFtYmRhRnVuY3Rpb24uTGFtYmRhRnVuY3Rpb24odGhpcywgXCJSZXNvdXJjZVwiLCB7XG4gICAgICBmdW5jdGlvbk5hbWUsXG4gICAgICBkZXNjcmlwdGlvbixcbiAgICAgIC8vIE5PVEU6IGZvciB0aGUgdW5kZXJsYXlpbmcgcmVzb3VyY2UsIEV4YWN0bHkgb25lIG9mIGZpbGVuYW1lLCBpbWFnZV91cmksIG9yIHMzX2J1Y2tldCBtdXN0IGJlIHNwZWNpZmllZFxuICAgICAgczNCdWNrZXQ6IGNvZGUuczNMb2NhdGlvbiAmJiBjb2RlLnMzTG9jYXRpb24uYnVja2V0TmFtZSxcbiAgICAgIHMzS2V5OiBjb2RlLnMzTG9jYXRpb24gJiYgY29kZS5zM0xvY2F0aW9uLm9iamVjdEtleSxcbiAgICAgIHMzT2JqZWN0VmVyc2lvbjogY29kZS5zM0xvY2F0aW9uICYmIGNvZGUuczNMb2NhdGlvbi5vYmplY3RWZXJzaW9uLFxuICAgICAgZmlsZW5hbWU6IGNvZGUuaW5saW5lQ29kZSxcbiAgICAgIHNvdXJjZUNvZGVIYXNoOiBjb2RlLnNvdXJjZUNvZGVIYXNoLFxuICAgICAgaW1hZ2VVcmk6IGNvZGUuaW1hZ2U/LmltYWdlVXJpLFxuICAgICAgbGF5ZXJzLCAvLyBUT0RPOiBTdXBwb3J0IElMYXllciB3aXRoIExhenkgbGlzdCBvZiBhcm5zXG4gICAgICBoYW5kbGVyOiBwcm9wcy5oYW5kbGVyID09PSBIYW5kbGVyLkZST01fSU1BR0UgPyB1bmRlZmluZWQgOiBwcm9wcy5oYW5kbGVyLFxuICAgICAgdGltZW91dDogdGltZW91dC50b1NlY29uZHMoKSxcbiAgICAgIHBhY2thZ2VUeXBlOiBwcm9wcy5ydW50aW1lID09PSBSdW50aW1lLkZST01fSU1BR0UgPyBcIkltYWdlXCIgOiB1bmRlZmluZWQsXG4gICAgICBydW50aW1lOlxuICAgICAgICBwcm9wcy5ydW50aW1lID09PSBSdW50aW1lLkZST01fSU1BR0UgPyB1bmRlZmluZWQgOiBwcm9wcy5ydW50aW1lLm5hbWUsXG4gICAgICAvLyAvLyBTb3VyY2UgQ29kZSBLTVMgbm90IHN1cHBvcnRlZCBieSBUZXJyYWZvcm0gcHJvdmlkZXI/XG4gICAgICAvLyAvLyBzZWU6IGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVGVtcGxhdGVSZWZlcmVuY2UvYXdzLXByb3BlcnRpZXMtbGFtYmRhLWZ1bmN0aW9uLWNvZGUuaHRtbCNjZm4tbGFtYmRhLWZ1bmN0aW9uLWNvZGUtc291cmNla21za2V5YXJuXG4gICAgICAvLyBzb3VyY2VLbXNLZXlBcm46IGNvZGUuc291cmNlS01TS2V5QXJuLFxuICAgICAgcm9sZTogdGhpcy5yb2xlLnJvbGVBcm4sXG4gICAgICAvLyBUT0RPOiBDREsgU29ydHMgZW52aXJvbm1lbnQgdG8gbWF0Y2ggTGFtYmRhIEhhc2ggYmVoYXZpb3VyXG4gICAgICAvLyBUT0RPOiBEbyBub3Qgc2V0IHRoaXMgYXQgYWxsIGlmIG5vIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgc2V0IChDb21wbGV4TGlzdCBjYW4ndCBiZSBJUmVzb2x2YWJsZSlcbiAgICAgIC8vIHJlZjogaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2Jsb2IvdjIuMTU2LjAvcGFja2FnZXMvYXdzLWNkay1saWIvYXdzLWxhbWJkYS9saWIvZnVuY3Rpb24udHMjTDE0NjdcbiAgICAgIGVudmlyb25tZW50OiB7XG4gICAgICAgIHZhcmlhYmxlczogTGF6eS5hbnlWYWx1ZSh7XG4gICAgICAgICAgcHJvZHVjZTogKF9jb250ZXh0OiBJUmVzb2x2ZUNvbnRleHQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmVudmlyb25tZW50O1xuICAgICAgICAgIH0sXG4gICAgICAgIH0pIGFzIGFueSxcbiAgICAgIH0sXG4gICAgICBtZW1vcnlTaXplLFxuICAgICAgLy8gVE9ETzogcmUtYWRkIGVwaGVtZXJhbFN0b3JhZ2VcbiAgICAgIHZwY0NvbmZpZzpcbiAgICAgICAgdGhpcy5wYXJzZVZwY0NvbmZpZyhwcm9wcy5uZXR3b3JrQ29uZmlnKSA/PyB0aGlzLmNvbmZpZ3VyZVZwYyhwcm9wcyksXG4gICAgICBkZWFkTGV0dGVyQ29uZmlnOiB0aGlzLnBhcnNlRGVhZExldHRlckNvbmZpZyhkbHFUb3BpY09yUXVldWUpLFxuICAgICAgcmVzZXJ2ZWRDb25jdXJyZW50RXhlY3V0aW9ucyxcbiAgICAgIGltYWdlQ29uZmlnOiB1bmRlZmluZWRJZk5vS2V5cyh7XG4gICAgICAgIGNvbW1hbmQ6IGNvZGUuaW1hZ2U/LmNtZCxcbiAgICAgICAgZW50cnlQb2ludDogY29kZS5pbWFnZT8uZW50cnlwb2ludCxcbiAgICAgICAgd29ya2luZ0RpcmVjdG9yeTogY29kZS5pbWFnZT8ud29ya2luZ0RpcmVjdG9yeSxcbiAgICAgIH0pLFxuICAgICAgLy8gVE9ETzogcmUtYWRkIGttc0tleUFybiBmb3IgZW52aXJvbm1lbnQgZW5jcnlwdGlvblxuICAgICAgLy8gVE9ETzogcmUtYWRkIGZpbGVTeXN0ZW1Db25maWdzIGZvciBFRlMgc3VwcG9ydCxcbiAgICAgIC8vIFRPRE86IHJlLWFkZCBjb2RlU2lnbmluZ0NvbmZpZ0FyblxuICAgICAgYXJjaGl0ZWN0dXJlczogW1xuICAgICAgICAvLyBUaGlzIGlzIGFuIGFycmF5LCBidXQgbWF4aW11bSBsZW5ndGggaXMgMSFcbiAgICAgICAgLy8gaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0Nsb3VkRm9ybWF0aW9uL2xhdGVzdC9Vc2VyR3VpZGUvYXdzLXJlc291cmNlLWxhbWJkYS1mdW5jdGlvbi5odG1sI2Nmbi1sYW1iZGEtZnVuY3Rpb24tYXJjaGl0ZWN0dXJlc1xuICAgICAgICBwcm9wcy5hcmNoaXRlY3R1cmU/LnRvU3RyaW5nKCkgPz8gQXJjaGl0ZWN0dXJlLlg4Nl82NC50b1N0cmluZygpLFxuICAgICAgXSxcbiAgICAgIC8vIFRPRE86IHJlLWFkZCBydW50aW1lTWFuYWdlbWVudENvbmZpZ1xuICAgICAgLy8gVE9ETzogcmUtYWRkIHNuYXBTdGFydFxuICAgICAgbG9nZ2luZ0NvbmZpZzogdGhpcy5nZXRMb2dnaW5nQ29uZmlnKHRoaXMuX2xvZ0dyb3VwLm5hbWUsIHByb3BzKSxcbiAgICAgIC8vIFRPRE86IHJlLWFkZCByZWN1cnNpdmVMb29wIGRldGVjdGlvblxuICAgICAgdHJhY2luZ0NvbmZpZzogdGhpcy5wYXJzZVRyYWNpbmdDb25maWcocHJvcHMudHJhY2luZyA/PyBUcmFjaW5nLkFDVElWRSksXG4gICAgICBwdWJsaXNoOiBwcm9wcy5wdWJsaXNoLFxuICAgICAgLy8gVE9ETzogdXNlIGxvZ0dyb3VwLm5vZGUuYWRkRGVwZW5kZW5jeSB3aGVuIGxvZ0dyb3VwIGlzIGltcGxlbWVudGVkXG4gICAgICBkZXBlbmRzT246IFtsb2dHcm91cF0sXG4gICAgfSk7XG4gICAgLy8gTk9URTogU2hvdWxkIHRoaXMgYmUgZnVuY3Rpb25OYW1lIGlucHV0IGluc3RlYWQgb2YgVE9LRU4/XG4gICAgdGhpcy5mdW5jdGlvbk5hbWUgPSB0aGlzLnJlc291cmNlLmZ1bmN0aW9uTmFtZTtcblxuICAgIC8vIG1ha2Ugc3VyZSBhbnkgcm9sZSBhdHRhY2htZW50cyBhcmUgYWRkZWQgYXMgZGVwZW5kZW5jaWVzIGZvciB0aGlzIGxhbWJkYVxuICAgIC8vIHRoaXMgYWNoaWV2ZWQgYnkgdGhlIENES1RGIEFzcGVjdCBvbiB0aGUgcGFyZW50IFN0YWNrQmFzZVxuICAgIHRoaXMucmVzb3VyY2Uubm9kZS5hZGREZXBlbmRlbmN5KHRoaXMucm9sZSk7XG5cbiAgICB0aGlzLnRpbWVvdXQgPSBwcm9wcy50aW1lb3V0O1xuXG4gICAgdGhpcy5hcmNoaXRlY3R1cmUgPSBwcm9wcy5hcmNoaXRlY3R1cmUgPz8gQXJjaGl0ZWN0dXJlLlg4Nl82NDtcblxuICAgIC8vIFRPRE86IEFkZCBhd3NfbGFtYmRhX3Byb3Zpc2lvbmVkX2NvbmN1cnJlbmN5X2NvbmZpZ1xuXG4gICAgZm9yIChjb25zdCBldmVudCBvZiBwcm9wcy5ldmVudHMgfHwgW10pIHtcbiAgICAgIHRoaXMuYWRkRXZlbnRTb3VyY2UoZXZlbnQpO1xuICAgIH1cblxuICAgIC8vIC8vIFRPRE86IHBlbmRpbmcgY3VzdG9tIENMSSB0byBtb2NrIExhbWJkYSBmdW5jdGlvbiBpbnZvY2F0aW9ucyBsb2NhbGx5XG4gICAgLy8gcHJvcHMuY29kZS5iaW5kVG9SZXNvdXJjZSh0aGlzKTtcblxuICAgIC8vIEV2ZW50IEludm9rZSBDb25maWdcbiAgICBpZiAoXG4gICAgICBwcm9wcy5vbkZhaWx1cmUgfHxcbiAgICAgIHByb3BzLm9uU3VjY2VzcyB8fFxuICAgICAgcHJvcHMubWF4RXZlbnRBZ2UgfHxcbiAgICAgIHByb3BzLnJldHJ5QXR0ZW1wdHMgIT09IHVuZGVmaW5lZFxuICAgICkge1xuICAgICAgdGhpcy5jb25maWd1cmVBc3luY0ludm9rZSh7XG4gICAgICAgIG9uRmFpbHVyZTogcHJvcHMub25GYWlsdXJlLFxuICAgICAgICBvblN1Y2Nlc3M6IHByb3BzLm9uU3VjY2VzcyxcbiAgICAgICAgbWF4RXZlbnRBZ2U6IHByb3BzLm1heEV2ZW50QWdlLFxuICAgICAgICByZXRyeUF0dGVtcHRzOiBwcm9wcy5yZXRyeUF0dGVtcHRzLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5fb3V0cHV0cyA9IHtcbiAgICAgIG5hbWU6IHRoaXMuZnVuY3Rpb25OYW1lLFxuICAgICAgYXJuOiB0aGlzLnJlc291cmNlLmFybixcbiAgICAgIHJvbGVBcm46IHRoaXMucm9sZS5yb2xlQXJuLFxuICAgICAgLy8gb25seSBrbm93biBhdCBzeW50aCB0aW1lXG4gICAgICAvLyBleHBsaWNpdCBgbnVsbGAgcmVxdWlyZWQgdG8gYXZvaWQgc3ludGF4IGVycm9ycyB3aGVuIHVzaW5nIHN0cmluZ1ZhbHVlICYmIFwidW5kZWZpbmVkXCJcbiAgICAgIHVybDogTGF6eS5hbnlWYWx1ZSh7XG4gICAgICAgIHByb2R1Y2U6ICgpID0+IHRoaXMuX3VybCA/PyBudWxsLFxuICAgICAgfSksXG4gICAgICBkZWZhdWx0U2VjdXJpdHlHcm91cDogTGF6eS5hbnlWYWx1ZSh7XG4gICAgICAgIHByb2R1Y2U6ICgpID0+IHRoaXMuX3NlY3VyaXR5R3JvdXA/LmlkID8/IG51bGwsXG4gICAgICB9KSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gdGhpcyBMYW1iZGEgZnVuY3Rpb24uXG4gICAqIElmIHRoaXMgaXMgYSByZWYgdG8gYSBMYW1iZGEgZnVuY3Rpb24sIHRoaXMgb3BlcmF0aW9uIHJlc3VsdHMgaW4gYSBuby1vcC5cbiAgICogQHBhcmFtIGtleSBUaGUgZW52aXJvbm1lbnQgdmFyaWFibGUga2V5LlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIGVudmlyb25tZW50IHZhcmlhYmxlJ3MgdmFsdWUuXG4gICAqL1xuICBwdWJsaWMgYWRkRW52aXJvbm1lbnQoa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBJRnVuY3Rpb24ge1xuICAgIC8vIFJlc2VydmVkIGVudmlyb25tZW50IHZhcmlhYmxlcyB3aWxsIGZhaWwgZHVyaW5nIGNsb3VkZm9ybWF0aW9uIGRlcGxveSBpZiB0aGV5J3JlIHNldC5cbiAgICAvLyBUaGlzIGNoZWNrIGlzIGp1c3QgdG8gYWxsb3cgQ0RLIHRvIGZhaWwgZmFzdGVyIHdoZW4gdGhlc2UgYXJlIHNwZWNpZmllZC5cbiAgICBjb25zdCByZXNlcnZlZEVudmlyb25tZW50VmFyaWFibGVzID0gW1xuICAgICAgXCJfSEFORExFUlwiLFxuICAgICAgXCJfWF9BTVpOX1RSQUNFX0lEXCIsXG4gICAgICBcIkFXU19ERUZBVUxUX1JFR0lPTlwiLFxuICAgICAgXCJBV1NfUkVHSU9OXCIsXG4gICAgICBcIkFXU19FWEVDVVRJT05fRU5WXCIsXG4gICAgICBcIkFXU19MQU1CREFfRlVOQ1RJT05fTkFNRVwiLFxuICAgICAgXCJBV1NfTEFNQkRBX0ZVTkNUSU9OX01FTU9SWV9TSVpFXCIsXG4gICAgICBcIkFXU19MQU1CREFfRlVOQ1RJT05fVkVSU0lPTlwiLFxuICAgICAgXCJBV1NfTEFNQkRBX0lOSVRJQUxJWkFUSU9OX1RZUEVcIixcbiAgICAgIFwiQVdTX0xBTUJEQV9MT0dfR1JPVVBfTkFNRVwiLFxuICAgICAgXCJBV1NfTEFNQkRBX0xPR19TVFJFQU1fTkFNRVwiLFxuICAgICAgXCJBV1NfQUNDRVNTX0tFWVwiLFxuICAgICAgXCJBV1NfQUNDRVNTX0tFWV9JRFwiLFxuICAgICAgXCJBV1NfU0VDUkVUX0FDQ0VTU19LRVlcIixcbiAgICAgIFwiQVdTX1NFU1NJT05fVE9LRU5cIixcbiAgICAgIFwiQVdTX0xBTUJEQV9SVU5USU1FX0FQSVwiLFxuICAgICAgXCJMQU1CREFfVEFTS19ST09UXCIsXG4gICAgICBcIkxBTUJEQV9SVU5USU1FX0RJUlwiLFxuICAgIF07XG4gICAgaWYgKHJlc2VydmVkRW52aXJvbm1lbnRWYXJpYWJsZXMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgYCR7a2V5fSBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyByZXNlcnZlZCBieSB0aGUgbGFtYmRhIHJ1bnRpbWUgYW5kIGNhbiBub3QgYmUgc2V0IG1hbnVhbGx5LiBTZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2xhbWJkYS9sYXRlc3QvZGcvY29uZmlndXJhdGlvbi1lbnZ2YXJzLmh0bWxgLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy5lbnZpcm9ubWVudFtrZXldID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBwdWJsaWMgYWRkRnVuY3Rpb25Vcmwob3B0aW9ucz86IEZ1bmN0aW9uVXJsT3B0aW9ucyk6IEZ1bmN0aW9uVXJsIHtcbiAgICBjb25zdCBlbmRwb2ludCA9IHN1cGVyLmFkZEZ1bmN0aW9uVXJsKG9wdGlvbnMpO1xuICAgIHRoaXMuX3VybCA9IGVuZHBvaW50LnVybDtcbiAgICByZXR1cm4gZW5kcG9pbnQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IExvZ2dpbmcgQ29uZmlnIHByb3BldHkgZm9yIHRoZSBmdW5jdGlvbi5cbiAgICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgZnVuY3Rpb24gTG9nZ2luZ0NvbmZpZyBQcm9wZXJ0eSBpZiB0aGUgcHJvcGVydHkgaXMgc2V0IG9uIHRoZVxuICAgKiBmdW5jdGlvbiBhbmQgdW5kZWZpbmVkIGlmIG5vdC5cbiAgICovXG4gIHByaXZhdGUgZ2V0TG9nZ2luZ0NvbmZpZyhcbiAgICBsb2dHcm91cE5hbWU6IHN0cmluZyxcbiAgICBwcm9wczogRnVuY3Rpb25Qcm9wcyxcbiAgKTogbGFtYmRhRnVuY3Rpb24uTGFtYmRhRnVuY3Rpb25Mb2dnaW5nQ29uZmlnIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAocHJvcHMuYXBwbGljYXRpb25Mb2dMZXZlbCB8fCBwcm9wcy5zeXN0ZW1Mb2dMZXZlbCkge1xuICAgICAgaWYgKHByb3BzLmxvZ2dpbmdGb3JtYXQgIT09IExvZ2dpbmdGb3JtYXQuSlNPTikge1xuICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICAgIGBUbyB1c2UgQXBwbGljYXRpb25Mb2dMZXZlbCBhbmQvb3IgU3lzdGVtTG9nTGV2ZWwgeW91IG11c3Qgc2V0IExvZ2dpbmdGb3JtYXQgdG8gJyR7TG9nZ2luZ0Zvcm1hdC5KU09OfScsIGdvdCAnJHtwcm9wcy5sb2dnaW5nRm9ybWF0fScuYCxcbiAgICAgICAgICB0aGlzLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBsb2dnaW5nQ29uZmlnOiBsYW1iZGFGdW5jdGlvbi5MYW1iZGFGdW5jdGlvbkxvZ2dpbmdDb25maWc7XG4gICAgaWYgKHByb3BzLmxvZ2dpbmdGb3JtYXQpIHtcbiAgICAgIGxvZ2dpbmdDb25maWcgPSB7XG4gICAgICAgIGxvZ0Zvcm1hdDogcHJvcHMubG9nZ2luZ0Zvcm1hdCxcbiAgICAgICAgc3lzdGVtTG9nTGV2ZWw6IHByb3BzLnN5c3RlbUxvZ0xldmVsLFxuICAgICAgICBhcHBsaWNhdGlvbkxvZ0xldmVsOiBwcm9wcy5hcHBsaWNhdGlvbkxvZ0xldmVsLFxuICAgICAgICBsb2dHcm91cDogbG9nR3JvdXBOYW1lLFxuICAgICAgfTtcbiAgICAgIHJldHVybiBsb2dnaW5nQ29uZmlnO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIERlZmluZXMgYW4gYWxpYXMgZm9yIHRoaXMgZnVuY3Rpb24uXG4gICAqXG4gICAqIFRoZSBhbGlhcyB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgdXBkYXRlZCB0byBwb2ludCB0byB0aGUgbGF0ZXN0IHZlcnNpb24gb2ZcbiAgICogdGhlIGZ1bmN0aW9uIGFzIGl0IGlzIGJlaW5nIHVwZGF0ZWQgZHVyaW5nIGEgZGVwbG95bWVudC5cbiAgICpcbiAgICogYGBgdHNcbiAgICogZGVjbGFyZSBjb25zdCBmbjogY29tcHV0ZS5MYW1iZGFGdW5jdGlvbjtcbiAgICpcbiAgICogZm4uYWRkQWxpYXMoJ0xpdmUnKTtcbiAgICpcbiAgICogLy8gSXMgZXF1aXZhbGVudCB0b1xuICAgKlxuICAgKiBuZXcgY29tcHV0ZS5BbGlhcyh0aGlzLCAnQWxpYXNMaXZlJywge1xuICAgKiAgIGFsaWFzTmFtZTogJ0xpdmUnLFxuICAgKiAgIHZlcnNpb246IGZuLnZlcnNpb24sXG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICpcbiAgICogQHBhcmFtIGFsaWFzTmFtZSBUaGUgbmFtZSBvZiB0aGUgYWxpYXNcbiAgICogQHBhcmFtIG9wdGlvbnMgQWxpYXMgb3B0aW9uc1xuICAgKi9cbiAgcHVibGljIGFkZEFsaWFzKGFsaWFzTmFtZTogc3RyaW5nLCBvcHRpb25zPzogQWxpYXNPcHRpb25zKTogQWxpYXMge1xuICAgIHJldHVybiBhZGRBbGlhcyh0aGlzLCB0aGlzLCB0aGlzLnZlcnNpb24sIGFsaWFzTmFtZSwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogT3B0aW9uYWxseSBjcmVhdGUgTGFtYmRhRnVuY3Rpb25WcGNDb25maWdcbiAgICovXG4gIHByaXZhdGUgcGFyc2VWcGNDb25maWcoXG4gICAgY29uZmlnPzogVnBjQ29uZmlnLFxuICApOiBsYW1iZGFGdW5jdGlvbi5MYW1iZGFGdW5jdGlvblZwY0NvbmZpZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCFjb25maWcpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGxldCBzZWN1cml0eUdyb3VwSWRzID0gY29uZmlnLnNlY3VyaXR5R3JvdXBJZHM7XG4gICAgaWYgKCFzZWN1cml0eUdyb3VwSWRzKSB7XG4gICAgICB0aGlzLl9zZWN1cml0eUdyb3VwID0gbmV3IHNlY3VyaXR5R3JvdXAuU2VjdXJpdHlHcm91cChcbiAgICAgICAgdGhpcyxcbiAgICAgICAgXCJTZWN1cml0eUdyb3VwXCIsXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiB0aGlzLmZ1bmN0aW9uTmFtZSxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogdGhpcy5mdW5jdGlvbk5hbWUsXG4gICAgICAgICAgdnBjSWQ6IGNvbmZpZy52cGNJZCxcblxuICAgICAgICAgIGVncmVzczogY29uZmlnLmVncmVzcyA/PyBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGZyb21Qb3J0OiAwLFxuICAgICAgICAgICAgICB0b1BvcnQ6IDAsXG4gICAgICAgICAgICAgIHByb3RvY29sOiBcIi0xXCIsXG4gICAgICAgICAgICAgIGNpZHJCbG9ja3M6IFtcIjAuMC4wLjAvMFwiXSxcbiAgICAgICAgICAgICAgaXB2NkNpZHJCbG9ja3M6IFtcIjo6LzBcIl0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICApO1xuICAgICAgc2VjdXJpdHlHcm91cElkcyA9IFt0aGlzLl9zZWN1cml0eUdyb3VwLmlkXTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Ym5ldElkczogY29uZmlnLnN1Ym5ldElkcyxcbiAgICAgIGlwdjZBbGxvd2VkRm9yRHVhbFN0YWNrOiBjb25maWcuaXB2NkFsbG93ZWRGb3JEdWFsU3RhY2ssXG4gICAgICBzZWN1cml0eUdyb3VwSWRzLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogSWYgY29uZmlndXJlZCwgc2V0IHVwIHRoZSBWUEMtcmVsYXRlZCBwcm9wZXJ0aWVzXG4gICAqXG4gICAqIFJldHVybnMgdGhlIFZwY0NvbmZpZyB0aGF0IHNob3VsZCBiZSBhZGRlZCB0byB0aGVcbiAgICogTGFtYmRhIGNyZWF0aW9uIHByb3BlcnRpZXMuXG4gICAqL1xuICBwcml2YXRlIGNvbmZpZ3VyZVZwYyhcbiAgICBwcm9wczogRnVuY3Rpb25Qcm9wcyxcbiAgKTogbGFtYmRhRnVuY3Rpb24uTGFtYmRhRnVuY3Rpb25WcGNDb25maWcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGhhc1NlY3VyaXR5R3JvdXBzID1cbiAgICAgIHByb3BzLnNlY3VyaXR5R3JvdXBzICYmIHByb3BzLnNlY3VyaXR5R3JvdXBzLmxlbmd0aCA+IDA7XG4gICAgaWYgKCFwcm9wcy52cGMpIHtcbiAgICAgIGlmIChwcm9wcy5hbGxvd0FsbE91dGJvdW5kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICBcIkNhbm5vdCBjb25maWd1cmUgJ2FsbG93QWxsT3V0Ym91bmQnIHdpdGhvdXQgY29uZmlndXJpbmcgYSBWUENcIixcbiAgICAgICAgICB0aGlzLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKGhhc1NlY3VyaXR5R3JvdXBzKSB7XG4gICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICAgXCJDYW5ub3QgY29uZmlndXJlICdzZWN1cml0eUdyb3Vwcycgd2l0aG91dCBjb25maWd1cmluZyBhIFZQQ1wiLFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAocHJvcHMudnBjU3VibmV0cykge1xuICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICAgIFwiQ2Fubm90IGNvbmZpZ3VyZSAndnBjU3VibmV0cycgd2l0aG91dCBjb25maWd1cmluZyBhIFZQQ1wiLFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAocHJvcHMuaXB2NkFsbG93ZWRGb3JEdWFsU3RhY2spIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICBcIkNhbm5vdCBjb25maWd1cmUgJ2lwdjZBbGxvd2VkRm9yRHVhbFN0YWNrJyB3aXRob3V0IGNvbmZpZ3VyaW5nIGEgVlBDXCIsXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChwcm9wcy5hbGxvd0FsbElwdjZPdXRib3VuZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICAgXCJDYW5ub3QgY29uZmlndXJlICdhbGxvd0FsbElwdjZPdXRib3VuZCcgd2l0aG91dCBjb25maWd1cmluZyBhIFZQQ1wiLFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGlmIChwcm9wcy5hbGxvd0FsbE91dGJvdW5kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChoYXNTZWN1cml0eUdyb3Vwcykge1xuICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICAgIFwiQ29uZmlndXJlICdhbGxvd0FsbE91dGJvdW5kJyBkaXJlY3RseSBvbiB0aGUgc3VwcGxpZWQgU2VjdXJpdHlHcm91cHMuXCIsXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocHJvcHMuYWxsb3dBbGxJcHY2T3V0Ym91bmQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKGhhc1NlY3VyaXR5R3JvdXBzKSB7XG4gICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICAgXCJDb25maWd1cmUgJ2FsbG93QWxsSXB2Nk91dGJvdW5kJyBkaXJlY3RseSBvbiB0aGUgc3VwcGxpZWQgU2VjdXJpdHlHcm91cHMuXCIsXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgc2VjdXJpdHlHcm91cHM6IElTZWN1cml0eUdyb3VwW107XG5cbiAgICBpZiAoaGFzU2VjdXJpdHlHcm91cHMpIHtcbiAgICAgIHNlY3VyaXR5R3JvdXBzID0gcHJvcHMuc2VjdXJpdHlHcm91cHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHNlY0dyb3VwID0gbmV3IFNlY3VyaXR5R3JvdXAodGhpcywgXCJTZWN1cml0eUdyb3VwXCIsIHtcbiAgICAgICAgdnBjOiBwcm9wcy52cGMsXG4gICAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAgIFwiQXV0b21hdGljIHNlY3VyaXR5IGdyb3VwIGZvciBMYW1iZGEgRnVuY3Rpb24gXCIgK1xuICAgICAgICAgIEF3c1N0YWNrLnVuaXF1ZUlkKHRoaXMpLFxuICAgICAgICBhbGxvd0FsbE91dGJvdW5kOiBwcm9wcy5hbGxvd0FsbE91dGJvdW5kLFxuICAgICAgICBhbGxvd0FsbElwdjZPdXRib3VuZDogcHJvcHMuYWxsb3dBbGxJcHY2T3V0Ym91bmQsXG4gICAgICB9KTtcbiAgICAgIHNlY3VyaXR5R3JvdXBzID0gW3NlY0dyb3VwXTtcbiAgICB9XG5cbiAgICB0aGlzLl9jb25uZWN0aW9ucyA9IG5ldyBDb25uZWN0aW9ucyh7IHNlY3VyaXR5R3JvdXBzIH0pO1xuXG4gICAgLy8gVE9ETzogYWRkIHdoZW4gZmlsZXN5c3RlbSBjb25maWcgaXMgYmFja1xuICAgIC8vIGlmIChwcm9wcy5maWxlc3lzdGVtKSB7XG4gICAgLy8gICBpZiAocHJvcHMuZmlsZXN5c3RlbS5jb25maWcuY29ubmVjdGlvbnMpIHtcbiAgICAvLyAgICAgdGhpcy5jb25uZWN0aW9ucy5hbGxvd1RvKFxuICAgIC8vICAgICAgIHByb3BzLmZpbGVzeXN0ZW0uY29uZmlnLmNvbm5lY3Rpb25zLFxuICAgIC8vICAgICAgIHByb3BzLmZpbGVzeXN0ZW0uY29uZmlnLmNvbm5lY3Rpb25zLmRlZmF1bHRQb3J0ID8/XG4gICAgLy8gICAgICAgICBQb3J0LnRjcChGaWxlU3lzdGVtLkRFRkFVTFRfUE9SVCksXG4gICAgLy8gICAgICk7XG4gICAgLy8gICB9XG4gICAgLy8gfVxuXG4gICAgY29uc3QgaXB2NkFsbG93ZWRGb3JEdWFsU3RhY2sgPSBwcm9wcy5pcHY2QWxsb3dlZEZvckR1YWxTdGFjaztcbiAgICBjb25zdCBhbGxvd1B1YmxpY1N1Ym5ldCA9IHByb3BzLmFsbG93UHVibGljU3VibmV0ID8/IGZhbHNlO1xuICAgIGNvbnN0IHNlbGVjdGVkU3VibmV0cyA9IHByb3BzLnZwYy5zZWxlY3RTdWJuZXRzKHByb3BzLnZwY1N1Ym5ldHMpO1xuICAgIGNvbnN0IHB1YmxpY1N1Ym5ldElkcyA9IG5ldyBTZXQoXG4gICAgICBwcm9wcy52cGMucHVibGljU3VibmV0cy5tYXAoKHMpID0+IHMuc3VibmV0SWQpLFxuICAgICk7XG4gICAgZm9yIChjb25zdCBzdWJuZXRJZCBvZiBzZWxlY3RlZFN1Ym5ldHMuc3VibmV0SWRzKSB7XG4gICAgICBpZiAocHVibGljU3VibmV0SWRzLmhhcyhzdWJuZXRJZCkgJiYgIWFsbG93UHVibGljU3VibmV0KSB7XG4gICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICAgXCJMYW1iZGEgRnVuY3Rpb25zIGluIGEgcHVibGljIHN1Ym5ldCBjYW4gTk9UIGFjY2VzcyB0aGUgaW50ZXJuZXQuIFwiICtcbiAgICAgICAgICAgIFwiSWYgeW91IGFyZSBhd2FyZSBvZiB0aGlzIGxpbWl0YXRpb24gYW5kIHdvdWxkIHN0aWxsIGxpa2UgdG8gcGxhY2UgdGhlIGZ1bmN0aW9uIGluIGEgcHVibGljIHN1Ym5ldCwgc2V0IGBhbGxvd1B1YmxpY1N1Ym5ldGAgdG8gdHJ1ZVwiLFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMubm9kZS5hZGREZXBlbmRlbmN5KHNlbGVjdGVkU3VibmV0cy5pbnRlcm5ldENvbm5lY3Rpdml0eUVzdGFibGlzaGVkKTtcblxuICAgIC8vIExpc3QgY2FuJ3QgYmUgZW1wdHkgaGVyZSwgaWYgd2UgZ290IHRoaXMgZmFyIHlvdSBpbnRlbmRlZCB0byBwdXQgeW91ciBMYW1iZGFcbiAgICAvLyBpbiBzdWJuZXRzLiBXZSdyZSBnb2luZyB0byBndWFyYW50ZWUgdGhhdCB3ZSBnZXQgdGhlIG5pY2UgZXJyb3IgbWVzc2FnZSBieVxuICAgIC8vIG1ha2luZyBWcGNOZXR3b3JrIGRvIHRoZSBzZWxlY3Rpb24gYWdhaW4uXG4gICAgaWYgKHByb3BzLmlwdjZBbGxvd2VkRm9yRHVhbFN0YWNrICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlwdjZBbGxvd2VkRm9yRHVhbFN0YWNrOiBpcHY2QWxsb3dlZEZvckR1YWxTdGFjayxcbiAgICAgICAgc3VibmV0SWRzOiBzZWxlY3RlZFN1Ym5ldHMuc3VibmV0SWRzLFxuICAgICAgICBzZWN1cml0eUdyb3VwSWRzOiBzZWN1cml0eUdyb3Vwcy5tYXAoKHNnKSA9PiBzZy5zZWN1cml0eUdyb3VwSWQpLFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VibmV0SWRzOiBzZWxlY3RlZFN1Ym5ldHMuc3VibmV0SWRzLFxuICAgICAgICBzZWN1cml0eUdyb3VwSWRzOiBzZWN1cml0eUdyb3Vwcy5tYXAoKHNnKSA9PiBzZy5zZWN1cml0eUdyb3VwSWQpLFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGlzUXVldWUoZGVhZExldHRlclF1ZXVlOiBJUXVldWUpOiBkZWFkTGV0dGVyUXVldWUgaXMgSVF1ZXVlIHtcbiAgICByZXR1cm4gKDxJUXVldWU+ZGVhZExldHRlclF1ZXVlKS5xdWV1ZUFybiAhPT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZERlYWRMZXR0ZXJRdWV1ZShwcm9wczogRnVuY3Rpb25Qcm9wcyk6IElRdWV1ZSB8IHVuZGVmaW5lZCB7XG4gICAgLy8gfCBzbnMuSVRvcGljXG4gICAgaWYgKFxuICAgICAgIXByb3BzLmRlYWRMZXR0ZXJRdWV1ZSAmJlxuICAgICAgIXByb3BzLmRlYWRMZXR0ZXJRdWV1ZUVuYWJsZWRcbiAgICAgIC8vICYmICFwcm9wcy5kZWFkTGV0dGVyVG9waWNcbiAgICApIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmIChwcm9wcy5kZWFkTGV0dGVyUXVldWUgJiYgcHJvcHMuZGVhZExldHRlclF1ZXVlRW5hYmxlZCA9PT0gZmFsc2UpIHtcbiAgICAgIHRocm93IEVycm9yKFxuICAgICAgICBcImRlYWRMZXR0ZXJRdWV1ZSBkZWZpbmVkIGJ1dCBkZWFkTGV0dGVyUXVldWVFbmFibGVkIGV4cGxpY2l0bHkgc2V0IHRvIGZhbHNlXCIsXG4gICAgICApO1xuICAgIH1cbiAgICAvLyBpZiAoXG4gICAgLy8gICBwcm9wcy5kZWFkTGV0dGVyVG9waWMgJiZcbiAgICAvLyAgIChwcm9wcy5kZWFkTGV0dGVyUXVldWUgfHwgcHJvcHMuZGVhZExldHRlclF1ZXVlRW5hYmxlZCAhPT0gdW5kZWZpbmVkKVxuICAgIC8vICkge1xuICAgIC8vICAgdGhyb3cgbmV3IEVycm9yKFxuICAgIC8vICAgICBcImRlYWRMZXR0ZXJRdWV1ZSBhbmQgZGVhZExldHRlclRvcGljIGNhbm5vdCBiZSBzcGVjaWZpZWQgdG9nZXRoZXIgYXQgdGhlIHNhbWUgdGltZVwiLFxuICAgIC8vICAgKTtcbiAgICAvLyB9XG5cbiAgICBsZXQgZGVhZExldHRlclF1ZXVlOiBJUXVldWU7IC8vIHwgSVRvcGljO1xuICAgIC8vIGlmIChwcm9wcy5kZWFkTGV0dGVyVG9waWMpIHtcbiAgICAvLyAgIGRlYWRMZXR0ZXJRdWV1ZSA9IHByb3BzLmRlYWRMZXR0ZXJUb3BpYztcbiAgICAvLyAgIHRoaXMuYWRkVG9Sb2xlUG9saWN5KFxuICAgIC8vICAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgLy8gICAgICAgYWN0aW9uczogW1wic25zOlB1Ymxpc2hcIl0sXG4gICAgLy8gICAgICAgcmVzb3VyY2VzOiBbZGVhZExldHRlclF1ZXVlLnRvcGljQXJuXSxcbiAgICAvLyAgICAgfSksXG4gICAgLy8gICApO1xuICAgIC8vIH0gZWxzZSB7XG4gICAgZGVhZExldHRlclF1ZXVlID1cbiAgICAgIHByb3BzLmRlYWRMZXR0ZXJRdWV1ZSB8fFxuICAgICAgbmV3IFF1ZXVlKHRoaXMsIFwiRGVhZExldHRlclF1ZXVlXCIsIHtcbiAgICAgICAgbWVzc2FnZVJldGVudGlvblNlY29uZHM6IER1cmF0aW9uLmRheXMoMTQpLnRvU2Vjb25kcygpLFxuICAgICAgfSk7XG4gICAgdGhpcy5hZGRUb1JvbGVQb2xpY3koXG4gICAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGFjdGlvbnM6IFtcInNxczpTZW5kTWVzc2FnZVwiXSxcbiAgICAgICAgcmVzb3VyY2VzOiBbZGVhZExldHRlclF1ZXVlLnF1ZXVlQXJuXSxcbiAgICAgIH0pLFxuICAgICk7XG4gICAgLy8gfVxuXG4gICAgcmV0dXJuIGRlYWRMZXR0ZXJRdWV1ZTtcbiAgfVxuXG4gIC8vIFRPRE86IFN1cHBvcnQgc25zLklUb3BpYyArIHNuczpQdWJsaXNoIHRvcGljQXJuXG4gIC8qKlxuICAgKiBPcHRpb25hbGx5IGNyZWF0ZSBMYW1iZGFGdW5jdGlvbkRlYWRMZXR0ZXJDb25maWdcbiAgICovXG4gIHByaXZhdGUgcGFyc2VEZWFkTGV0dGVyQ29uZmlnKFxuICAgIGRlYWRMZXR0ZXJRdWV1ZT86IElRdWV1ZSwgLy8gfCBzbnMuSVRvcGljXG4gICk6IGxhbWJkYUZ1bmN0aW9uLkxhbWJkYUZ1bmN0aW9uRGVhZExldHRlckNvbmZpZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKGRlYWRMZXR0ZXJRdWV1ZSkge1xuICAgICAgLy8gdGhpcy5pc1F1ZXVlKGRlYWRMZXR0ZXJRdWV1ZSkgPyBkZWFkTGV0dGVyUXVldWUucXVldWVBcm4gOiAuLi5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRhcmdldEFybjogZGVhZExldHRlclF1ZXVlLnF1ZXVlQXJuLFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHBhcnNlVHJhY2luZ0NvbmZpZyhcbiAgICB0cmFjaW5nOiBUcmFjaW5nLFxuICApOiBsYW1iZGFGdW5jdGlvbi5MYW1iZGFGdW5jdGlvblRyYWNpbmdDb25maWcgfCB1bmRlZmluZWQge1xuICAgIGlmICh0cmFjaW5nID09PSB1bmRlZmluZWQgfHwgdHJhY2luZyA9PT0gVHJhY2luZy5ESVNBQkxFRCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICB0aGlzLmFkZFRvUm9sZVBvbGljeShcbiAgICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgYWN0aW9uczogW1wieHJheTpQdXRUcmFjZVNlZ21lbnRzXCIsIFwieHJheTpQdXRUZWxlbWV0cnlSZWNvcmRzXCJdLFxuICAgICAgICByZXNvdXJjZXM6IFtcIipcIl0sXG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIG1vZGU6IHRyYWNpbmcsXG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIEdpdmVuIGFuIG9wYXF1ZSAodG9rZW4pIEFSTiwgcmV0dXJucyBhIFRGIGV4cHJlc3Npb24gdGhhdCBleHRyYWN0cyB0aGUgZnVuY3Rpb25cbiAqIG5hbWUgZnJvbSB0aGUgQVJOLlxuICpcbiAqIEZ1bmN0aW9uIEFSTnMgbG9vayBsaWtlIHRoaXM6XG4gKlxuICogICBhcm46YXdzOmxhbWJkYTpyZWdpb246YWNjb3VudC1pZDpmdW5jdGlvbjpmdW5jdGlvbi1uYW1lXG4gKlxuICogLi53aGljaCBtZWFucyB0aGF0IGluIG9yZGVyIHRvIGV4dHJhY3QgdGhlIGBmdW5jdGlvbi1uYW1lYCBjb21wb25lbnQgZnJvbSB0aGUgQVJOLCB3ZSBjYW5cbiAqIHNwbGl0IHRoZSBBUk4gdXNpbmcgXCI6XCIgYW5kIHNlbGVjdCB0aGUgY29tcG9uZW50IGluIGluZGV4IDYuXG4gKlxuICogQHJldHVybnMgYGVsZW1lbnQoc3BsaXQoJzonLCBhcm4pLCA2KWBcbiAqL1xuZnVuY3Rpb24gZXh0cmFjdE5hbWVGcm9tQXJuKGFybjogc3RyaW5nKSB7XG4gIGNvbnN0IHsgcmVzb3VyY2VOYW1lIH0gPSBBcm4uc3BsaXQoYXJuLCBBcm5Gb3JtYXQuQ09MT05fUkVTT1VSQ0VfTkFNRSk7XG4gIGlmICghcmVzb3VyY2VOYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIExhbWJkYSBmdW5jdGlvbiBBUk46ICR7YXJufWApO1xuICB9XG4gIC8vIGlmIChyZXNvdXJjZU5hbWUuaW5jbHVkZXMoXCI6XCIpKSBzcGxpdCBvZmYgdGhlIHZlcnNpb25cbiAgaWYgKHJlc291cmNlTmFtZS5pbmNsdWRlcyhcIjpcIikpIHtcbiAgICByZXR1cm4gcmVzb3VyY2VOYW1lLnNwbGl0KFwiOlwiKVswXTtcbiAgfVxuICByZXR1cm4gcmVzb3VyY2VOYW1lO1xufVxuXG4vKipcbiAqIFgtUmF5IFRyYWNpbmcgTW9kZXMgKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9sYW1iZGEvbGF0ZXN0L2RnL0FQSV9UcmFjaW5nQ29uZmlnLmh0bWwpXG4gKi9cbmV4cG9ydCBlbnVtIFRyYWNpbmcge1xuICAvKipcbiAgICogTGFtYmRhIHdpbGwgcmVzcGVjdCBhbnkgdHJhY2luZyBoZWFkZXIgaXQgcmVjZWl2ZXMgZnJvbSBhbiB1cHN0cmVhbSBzZXJ2aWNlLlxuICAgKiBJZiBubyB0cmFjaW5nIGhlYWRlciBpcyByZWNlaXZlZCwgTGFtYmRhIHdpbGwgc2FtcGxlIHRoZSByZXF1ZXN0IGJhc2VkIG9uIGEgZml4ZWQgcmF0ZS4gUGxlYXNlIHNlZSB0aGUgW1VzaW5nIEFXUyBMYW1iZGEgd2l0aCBBV1MgWC1SYXldKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9sYW1iZGEvbGF0ZXN0L2RnL3NlcnZpY2VzLXhyYXkuaHRtbCkgZG9jdW1lbnRhdGlvbiBmb3IgZGV0YWlscyBvbiB0aGlzIHNhbXBsaW5nIGJlaGF2aW9yLlxuICAgKi9cbiAgQUNUSVZFID0gXCJBY3RpdmVcIixcbiAgLyoqXG4gICAqIExhbWJkYSB3aWxsIG9ubHkgdHJhY2UgdGhlIHJlcXVlc3QgZnJvbSBhbiB1cHN0cmVhbSBzZXJ2aWNlXG4gICAqIGlmIGl0IGNvbnRhaW5zIGEgdHJhY2luZyBoZWFkZXIgd2l0aCBcInNhbXBsZWQ9MVwiXG4gICAqL1xuICBQQVNTX1RIUk9VR0ggPSBcIlBhc3NUaHJvdWdoXCIsXG4gIC8qKlxuICAgKiBMYW1iZGEgd2lsbCBub3QgdHJhY2UgYW55IHJlcXVlc3QuXG4gICAqL1xuICBESVNBQkxFRCA9IFwiRGlzYWJsZWRcIixcbn1cblxuLyoqXG4gKiBMYW1iZGEgc2VydmljZSB3aWxsIGF1dG9tYXRpY2FsbHkgY2FwdHVyZXMgc3lzdGVtIGxvZ3MgYWJvdXQgZnVuY3Rpb24gaW52b2NhdGlvblxuICogZ2VuZXJhdGVkIGJ5IHRoZSBMYW1iZGEgc2VydmljZSAoa25vd24gYXMgc3lzdGVtIGxvZ3MpIGFuZCBzZW5kcyB0aGVzZSBsb2dzIHRvIGFcbiAqIGRlZmF1bHQgQ2xvdWRXYXRjaCBsb2cgZ3JvdXAgbmFtZWQgYWZ0ZXIgdGhlIExhbWJkYSBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IGVudW0gU3lzdGVtTG9nTGV2ZWwge1xuICAvKipcbiAgICogTGFtYmRhIHdpbGwgY2FwdHVyZSBvbmx5IGxvZ3MgYXQgaW5mbyBsZXZlbC5cbiAgICovXG4gIElORk8gPSBcIklORk9cIixcbiAgLyoqXG4gICAqIExhbWJkYSB3aWxsIGNhcHR1cmUgb25seSBsb2dzIGF0IGRlYnVnIGxldmVsLlxuICAgKi9cbiAgREVCVUcgPSBcIkRFQlVHXCIsXG4gIC8qKlxuICAgKiBMYW1iZGEgd2lsbCBjYXB0dXJlIG9ubHkgbG9ncyBhdCB3YXJuIGxldmVsLlxuICAgKi9cbiAgV0FSTiA9IFwiV0FSTlwiLFxufVxuXG4vKipcbiAqIExhbWJkYSBzZXJ2aWNlIGF1dG9tYXRpY2FsbHkgY2FwdHVyZXMgbG9ncyBnZW5lcmF0ZWQgYnkgdGhlIGZ1bmN0aW9uIGNvZGVcbiAqIChrbm93biBhcyBhcHBsaWNhdGlvbiBsb2dzKSBhbmQgc2VuZHMgdGhlc2UgbG9ncyB0byBhIGRlZmF1bHQgQ2xvdWRXYXRjaFxuICogbG9nIGdyb3VwIG5hbWVkIGFmdGVyIHRoZSBMYW1iZGEgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBlbnVtIEFwcGxpY2F0aW9uTG9nTGV2ZWwge1xuICAvKipcbiAgICogTGFtYmRhIHdpbGwgY2FwdHVyZSBvbmx5IGxvZ3MgYXQgaW5mbyBsZXZlbC5cbiAgICovXG4gIElORk8gPSBcIklORk9cIixcbiAgLyoqXG4gICAqIExhbWJkYSB3aWxsIGNhcHR1cmUgb25seSBsb2dzIGF0IGRlYnVnIGxldmVsLlxuICAgKi9cbiAgREVCVUcgPSBcIkRFQlVHXCIsXG4gIC8qKlxuICAgKiBMYW1iZGEgd2lsbCBjYXB0dXJlIG9ubHkgbG9ncyBhdCB3YXJuIGxldmVsLlxuICAgKi9cbiAgV0FSTiA9IFwiV0FSTlwiLFxuICAvKipcbiAgICogTGFtYmRhIHdpbGwgY2FwdHVyZSBvbmx5IGxvZ3MgYXQgdHJhY2UgbGV2ZWwuXG4gICAqL1xuICBUUkFDRSA9IFwiVFJBQ0VcIixcbiAgLyoqXG4gICAqIExhbWJkYSB3aWxsIGNhcHR1cmUgb25seSBsb2dzIGF0IGVycm9yIGxldmVsLlxuICAgKi9cbiAgRVJST1IgPSBcIkVSUk9SXCIsXG4gIC8qKlxuICAgKiBMYW1iZGEgd2lsbCBjYXB0dXJlIG9ubHkgbG9ncyBhdCBmYXRhbCBsZXZlbC5cbiAgICovXG4gIEZBVEFMID0gXCJGQVRBTFwiLFxufVxuXG4vKipcbiAqIFRoaXMgZmllbGQgdGFrZXMgaW4gMiB2YWx1ZXMgZWl0aGVyIFRleHQgb3IgSlNPTi4gQnkgc2V0dGluZyB0aGlzIHZhbHVlIHRvIFRleHQsXG4gKiB3aWxsIHJlc3VsdCBpbiB0aGUgY3VycmVudCBzdHJ1Y3R1cmUgb2YgbG9ncyBmb3JtYXQsIHdoZXJlYXMsIGJ5IHNldHRpbmcgdGhpcyB2YWx1ZSB0byBKU09OLFxuICogTGFtYmRhIHdpbGwgcHJpbnQgdGhlIGxvZ3MgYXMgU3RydWN0dXJlZCBKU09OIExvZ3MsIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgdGltZXN0YW1wIGFuZCBsb2cgbGV2ZWxcbiAqIG9mIGVhY2ggZXZlbnQuIFNlbGVjdGluZyDigJhKU09O4oCZIGZvcm1hdCB3aWxsIG9ubHkgYWxsb3cgY3VzdG9tZXLigJlzIHRvIGhhdmUgZGlmZmVyZW50IGxvZyBsZXZlbFxuICogQXBwbGljYXRpb24gbG9nIGxldmVsIGFuZCB0aGUgU3lzdGVtIGxvZyBsZXZlbC5cbiAqL1xuZXhwb3J0IGVudW0gTG9nZ2luZ0Zvcm1hdCB7XG4gIC8qKlxuICAgKiBMYW1iZGEgTG9ncyB0ZXh0IGZvcm1hdC5cbiAgICovXG4gIFRFWFQgPSBcIlRleHRcIixcbiAgLyoqXG4gICAqIExhbWJkYSBzdHJ1Y3R1cmVkIGxvZ2dpbmcgaW4gSnNvbiBmb3JtYXQuXG4gICAqL1xuICBKU09OID0gXCJKU09OXCIsXG59XG5cbi8qKlxuICogQSBkZXN0aW5hdGlvbiBjb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGxxRGVzdGluYXRpb25Db25maWcge1xuICAvKipcbiAgICogVGhlIEFtYXpvbiBSZXNvdXJjZSBOYW1lIChBUk4pIG9mIHRoZSBkZXN0aW5hdGlvbiByZXNvdXJjZVxuICAgKi9cbiAgcmVhZG9ubHkgZGVzdGluYXRpb246IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIERMUSBmb3IgYW4gZXZlbnQgc291cmNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUV2ZW50U291cmNlRGxxIHtcbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIERMUSBkZXN0aW5hdGlvbiBjb25maWcgb2YgdGhlIERMUVxuICAgKi9cbiAgYmluZChcbiAgICB0YXJnZXQ6IElFdmVudFNvdXJjZU1hcHBpbmcsXG4gICAgdGFyZ2V0SGFuZGxlcjogSUZ1bmN0aW9uLFxuICApOiBEbHFEZXN0aW5hdGlvbkNvbmZpZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZlcmlmeUNvZGVDb25maWcoY29kZTogQ29kZUNvbmZpZywgcHJvcHM6IEZ1bmN0aW9uUHJvcHMpIHtcbiAgLy8gbXV0dWFsbHkgZXhjbHVzaXZlXG4gIGNvbnN0IGNvZGVUeXBlID0gW2NvZGUuaW5saW5lQ29kZSwgY29kZS5zM0xvY2F0aW9uLCBjb2RlLmltYWdlXTtcblxuICBpZiAoY29kZVR5cGUuZmlsdGVyKCh4KSA9PiAhIXgpLmxlbmd0aCAhPT0gMSkge1xuICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihcbiAgICAgICdsYW1iZGEuQ29kZSBtdXN0IHNwZWNpZnkgZXhhY3RseSBvbmUgb2Y6IFwiaW5saW5lQ29kZVwiLCBcInMzTG9jYXRpb25cIiwgb3IgXCJpbWFnZVwiJyxcbiAgICApO1xuICB9XG5cbiAgaWYgKCEhY29kZS5pbWFnZSA9PT0gKHByb3BzLmhhbmRsZXIgIT09IEhhbmRsZXIuRlJPTV9JTUFHRSkpIHtcbiAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IoXG4gICAgICBcImhhbmRsZXIgbXVzdCBiZSBgSGFuZGxlci5GUk9NX0lNQUdFYCB3aGVuIHVzaW5nIGltYWdlIGFzc2V0IGZvciBMYW1iZGEgZnVuY3Rpb25cIixcbiAgICApO1xuICB9XG5cbiAgaWYgKCEhY29kZS5pbWFnZSA9PT0gKHByb3BzLnJ1bnRpbWUgIT09IFJ1bnRpbWUuRlJPTV9JTUFHRSkpIHtcbiAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IoXG4gICAgICBcInJ1bnRpbWUgbXVzdCBiZSBgUnVudGltZS5GUk9NX0lNQUdFYCB3aGVuIHVzaW5nIGltYWdlIGFzc2V0IGZvciBMYW1iZGEgZnVuY3Rpb25cIixcbiAgICApO1xuICB9XG5cbiAgLy8gaWYgdGhpcyBpcyBpbmxpbmUgY29kZSwgY2hlY2sgdGhhdCB0aGUgcnVudGltZSBzdXBwb3J0c1xuICBpZiAoY29kZS5pbmxpbmVDb2RlICYmICFwcm9wcy5ydW50aW1lLnN1cHBvcnRzSW5saW5lQ29kZSkge1xuICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihcbiAgICAgIGBJbmxpbmUgc291cmNlIG5vdCBhbGxvd2VkIGZvciAke3Byb3BzLnJ1bnRpbWUhLm5hbWV9YCxcbiAgICApO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVuZGVmaW5lZElmTm9LZXlzPEEgZXh0ZW5kcyB7IFtrZXk6IHN0cmluZ106IHVua25vd24gfT4oXG4gIHN0cnVjdDogQSxcbik6IEEgfCB1bmRlZmluZWQge1xuICBjb25zdCBhbGxVbmRlZmluZWQgPSBPYmplY3QudmFsdWVzKHN0cnVjdCkuZXZlcnkoKHZhbCkgPT4gdmFsID09PSB1bmRlZmluZWQpO1xuICByZXR1cm4gYWxsVW5kZWZpbmVkID8gdW5kZWZpbmVkIDogc3RydWN0O1xufVxuIl19
|
|
871
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVuY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXdzL2NvbXB1dGUvZnVuY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQXc3Q0EsNENBNEJDOztBQXA5Q0QsNkpBQTZKO0FBQzdKLDJIQUEySDtBQUMzSCxzREFNNkI7QUFDN0IsaUNBQWtFO0FBRWxFLHlDQUF3RTtBQUN4RSxnQ0FBd0M7QUFDeEMsNENBQXdDO0FBQ3hDLG9EQUFpRDtBQUNqRCxpREFBOEM7QUFLOUMsbURBS3lCO0FBR3pCLHVDQUFvQztBQUNwQyx1Q0FBb0M7QUFDcEMscURBQWlFO0FBQ2pFLGlDQUFrQztBQUVsQyw2Q0FBMEM7QUFDMUMseUNBQXlDO0FBQ3pDLDhCQUE4QjtBQUM5QixzQ0FBMEM7QUFDMUMsK0NBQTRDO0FBbVY1QywyQkFBMkI7QUFFM0IsTUFBTTtBQUNOLHdCQUF3QjtBQUN4QixNQUFNO0FBQ04scUVBQXFFO0FBRXJFLFFBQVE7QUFDUixxREFBcUQ7QUFDckQsUUFBUTtBQUNSLDJEQUEyRDtBQUMzRCxJQUFJO0FBRUo7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsTUFBYSxjQUFlLFNBQVEsa0NBQWtCO0lBQ3BELDZEQUE2RDtJQUU3RDs7T0FFRztJQUNILElBQVcsT0FBTztRQUNoQiwyQ0FBMkM7UUFDM0MsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQztJQUMvQixDQUFDO0lBRUQ7O09BRUc7SUFDSSxNQUFNLENBQUMsZ0JBQWdCLENBQzVCLEtBQWdCLEVBQ2hCLEVBQVUsRUFDVixZQUFvQjtRQUVwQixPQUFPLGNBQWMsQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFO1lBQ3RELFdBQVcsRUFBRSxvQkFBUSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxTQUFTLENBQUM7Z0JBQ3BELE9BQU8sRUFBRSxRQUFRO2dCQUNqQixRQUFRLEVBQUUsVUFBVTtnQkFDcEIsWUFBWSxF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QVUsQ0FBQyxFQUFFLENBQUM7UUFDNUQsTUFBTSxJQUFJLGdDQUF1QixDQUMvQixpRkFBaUYsQ0FDbEYsQ0FBQztJQUNKLENBQUM7SUFFRCwwREFBMEQ7SUFDMUQsSUFBSSxJQUFJLENBQUMsVUFBVSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQ3pELE1BQU0sSUFBSSxnQ0FBdUIsQ0FDL0IsaUNBQWlDLEtBQUssQ0FBQyxPQUFRLENBQUMsSUFBSSxFQUFFLENBQ3ZELENBQUM7SUFDSixDQUFDO0FBQ0gsQ0FBQztBQUVELFNBQVMsaUJBQWlCLENBQ3hCLE1BQVM7SUFFVCxNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxLQUFLLFNBQVMsQ0FBQyxDQUFDO0lBQzdFLE9BQU8sWUFBWSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztBQUMzQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gc291cmNlOiBodHRwczovL2dpdGh1Yi5jb20vY2RrdGYtcGx1cy9jZGt0Zi1wbHVzL2Jsb2IvNTg2YWFiYWQzYWIyZmIyYTJlOTNlMDVlZDMzZjk0NDc0ZWJlOTM5Ny9wYWNrYWdlcy8lNDBjZGt0Zi1wbHVzL2F3cy9saWIvYXdzLWxhbWJkYS1mdW5jdGlvbi9pbmRleC50c1xuLy8gdXBkYXRlIHRvIGFsaWduIGNsb3NlciB3aXRoIGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9ibG9iL3YyLjE1Ni4wL3BhY2thZ2VzL2F3cy1jZGstbGliL2F3cy1sYW1iZGEvbGliL2Z1bmN0aW9uLnRzXG5pbXBvcnQge1xuICBsYW1iZGFGdW5jdGlvbixcbiAgY2xvdWR3YXRjaExvZ0dyb3VwLFxuICBzZWN1cml0eUdyb3VwLFxuICBsYW1iZGFFdmVudFNvdXJjZU1hcHBpbmcsXG4gIGRhdGFBd3NMYW1iZGFGdW5jdGlvbixcbn0gZnJvbSBcIkBjZGt0Zi9wcm92aWRlci1hd3NcIjtcbmltcG9ydCB7IElSZXNvbHZlQ29udGV4dCwgTGF6eSwgSVJlc29sdmFibGUsIFRva2VuIH0gZnJvbSBcImNka3RmXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHsgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IsIFZhbGlkYXRpb25FcnJvciB9IGZyb20gXCIuLi8uLi9lcnJvcnNcIjtcbmltcG9ydCB7IEFybkZvcm1hdCwgQXJuIH0gZnJvbSBcIi4uL2FyblwiO1xuaW1wb3J0IHsgQXdzU3RhY2sgfSBmcm9tIFwiLi4vYXdzLXN0YWNrXCI7XG5pbXBvcnQgeyBSZXRlbnRpb25EYXlzIH0gZnJvbSBcIi4uL2xvZy1yZXRlbnRpb25cIjtcbmltcG9ydCB7IEFyY2hpdGVjdHVyZSB9IGZyb20gXCIuL2FyY2hpdGVjdHVyZVwiO1xuaW1wb3J0IHsgQ29kZSwgQ29kZUNvbmZpZyB9IGZyb20gXCIuL2NvZGVcIjtcbmltcG9ydCB7IEV2ZW50SW52b2tlQ29uZmlnT3B0aW9ucyB9IGZyb20gXCIuL2V2ZW50LWludm9rZS1jb25maWdcIjtcbmltcG9ydCB7IElFdmVudFNvdXJjZU1hcHBpbmcgfSBmcm9tIFwiLi9ldmVudC1zb3VyY2UtbWFwcGluZ1wiO1xuaW1wb3J0IHsgQWxpYXNPcHRpb25zLCBBbGlhcyB9IGZyb20gXCIuL2Z1bmN0aW9uLWFsaWFzXCI7XG5pbXBvcnQge1xuICBMYW1iZGFGdW5jdGlvbkJhc2UsXG4gIElGdW5jdGlvbixcbiAgRnVuY3Rpb25BdHRyaWJ1dGVzLFxuICBJRXZlbnRTb3VyY2UsXG59IGZyb20gXCIuL2Z1bmN0aW9uLWJhc2VcIjtcbmltcG9ydCB7IEZ1bmN0aW9uVXJsLCBGdW5jdGlvblVybE9wdGlvbnMgfSBmcm9tIFwiLi9mdW5jdGlvbi11cmxcIjtcbmltcG9ydCB7IFZwY0NvbmZpZyB9IGZyb20gXCIuL2Z1bmN0aW9uLXZwYy1jb25maWcuZ2VuZXJhdGVkXCI7XG5pbXBvcnQgeyBIYW5kbGVyIH0gZnJvbSBcIi4vaGFuZGxlclwiO1xuaW1wb3J0IHsgUnVudGltZSB9IGZyb20gXCIuL3J1bnRpbWVcIjtcbmltcG9ydCB7IElTZWN1cml0eUdyb3VwLCBTZWN1cml0eUdyb3VwIH0gZnJvbSBcIi4vc2VjdXJpdHktZ3JvdXBcIjtcbmltcG9ydCB7IGFkZEFsaWFzIH0gZnJvbSBcIi4vdXRpbFwiO1xuaW1wb3J0IHsgSVZwYywgU3VibmV0U2VsZWN0aW9uIH0gZnJvbSBcIi4vdnBjXCI7XG5pbXBvcnQgeyBEdXJhdGlvbiB9IGZyb20gXCIuLi8uLi9kdXJhdGlvblwiO1xuLy8gaW1wb3J0IHsgRm4gfSBmcm9tIFwiLi4vLi4vdGVycmEtZnVuY1wiO1xuaW1wb3J0ICogYXMgaWFtIGZyb20gXCIuLi9pYW1cIjtcbmltcG9ydCB7IElRdWV1ZSwgUXVldWUgfSBmcm9tIFwiLi4vbm90aWZ5XCI7XG5pbXBvcnQgeyBDb25uZWN0aW9ucyB9IGZyb20gXCIuL2Nvbm5lY3Rpb25zXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRnVuY3Rpb25PdXRwdXRzIHtcbiAgLyoqXG4gICAqIEFXUyBMYW1iZGEgZnVuY3Rpb24gbmFtZVxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBV1MgTGFtYmRhIGFybiBvZiB0aGUgZnVuY3Rpb25cbiAgICovXG4gIHJlYWRvbmx5IGFybjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgSUFNIFJvbGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBMYW1iZGEgZnVuY3Rpb25cbiAgICovXG4gIHJlYWRvbmx5IHJvbGVBcm46IHN0cmluZztcblxuICAvKipcbiAgICogRnVuY3Rpb24gVVJMIGlmIGVuYWJsZWRcbiAgICovXG4gIHJlYWRvbmx5IHVybD86IHN0cmluZyB8IElSZXNvbHZhYmxlO1xuXG4gIC8qKlxuICAgKiBTZWN1cml0eSBncm91cCBvZiB0aGUgZnVuY3Rpb24gaWYgY3JlYXRlZFxuICAgKi9cbiAgcmVhZG9ubHkgZGVmYXVsdFNlY3VyaXR5R3JvdXA/OiBzdHJpbmcgfCBJUmVzb2x2YWJsZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGdW5jdGlvbk9wdGlvbnMgZXh0ZW5kcyBFdmVudEludm9rZUNvbmZpZ09wdGlvbnMge1xuICAvKipcbiAgICogRm9yY2UgZnVuY3Rpb24gbmFtZSAoZm9yIGFkb3B0aW9uIG9mIGV4aXN0aW5nIHJlc291cmNlcykuXG4gICAqXG4gICAqIFByZWZlciB0byB1c2UgZnVuY3Rpb25OYW1lUHJlZml4LlxuICAgKlxuICAgKiBVc2UgW1RlcnJhZm9ybSBSZXNvdXJjZSBNZXRhIEFyZ3VtZW50c10oaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvcmVzb3VyY2VzL3N5bnRheCNtZXRhLWFyZ3VtZW50cylcbiAgICogdG8gY29udHJvbCBsaWZlY3ljbGUgd2hlbiByZXBsYWNpbmcgdGhlIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIElmIG9taXR0ZWQsIFJlZmVyIHRvIGBmdW5jdGlvbk5hbWVQcmVmaXhgLlxuICAgKi9cbiAgcmVhZG9ubHkgZnVuY3Rpb25OYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIG5hbWUgcHJlZml4IGZvciB0aGUgZnVuY3Rpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gR3JpZCBnZW5lcmF0ZXMgYSB1bmlxdWUgcGh5c2ljYWwgSUQgYW5kIHVzZXMgdGhhdFxuICAgKiBJRCBmb3IgdGhlIGZ1bmN0aW9uJ3MgbmFtZS5cbiAgICovXG4gIHJlYWRvbmx5IGZ1bmN0aW9uTmFtZVByZWZpeD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyB0byBiZSBwYXNzZWQgdG8gdGhlIExhbWJkYSBmdW5jdGlvbi5cbiAgICpcbiAgICogS2V5LXZhbHVlIHBhaXJzIHRoYXQgTGFtYmRhIGNhY2hlcyBhbmQgbWFrZXMgYXZhaWxhYmxlIGZvciB5b3VyIExhbWJkYVxuICAgKiBmdW5jdGlvbnMuIFVzZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gYXBwbHkgY29uZmlndXJhdGlvbiBjaGFuZ2VzLCBzdWNoXG4gICAqIGFzIHRlc3QgYW5kIHByb2R1Y3Rpb24gZW52aXJvbm1lbnQgY29uZmlndXJhdGlvbnMsIHdpdGhvdXQgY2hhbmdpbmcgeW91clxuICAgKiBMYW1iZGEgZnVuY3Rpb24gc291cmNlIGNvZGUuXG4gICAqL1xuICByZWFkb25seSBlbnZpcm9ubWVudD86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG5cbiAgLyoqXG4gICAqIERlc2NyaXB0aW9uIG9mIHdoYXQgeW91ciBMYW1iZGEgRnVuY3Rpb24gZG9lcy5cbiAgICovXG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgc3lzdGVtIGFyY2hpdGVjdHVyZXMgY29tcGF0aWJsZSB3aXRoIHRoaXMgbGFtYmRhIGZ1bmN0aW9uLlxuICAgKiBAZGVmYXVsdCBBcmNoaXRlY3R1cmUuWDg2XzY0XG4gICAqL1xuICByZWFkb25seSBhcmNoaXRlY3R1cmU/OiBBcmNoaXRlY3R1cmU7XG5cbiAgLyoqXG4gICAqIFRoZSB0cmFjaW5nIG1vZGUgZm9yIHRoZSBMYW1iZGEgZnVuY3Rpb24uXG4gICAqXG4gICAqIFRoZSBMYW1iZGEgZnVuY3Rpb24gaWFtIHJvbGUgd2lsbCByZWNlaXZlIHBlcm1pc3Npb24gdG9cbiAgICogd3JpdGUgdG8gQVdTIFgtUmF5LlxuICAgKlxuICAgKiBAZGVmYXVsdCBUcmFjaW5nLkFDVElWRVxuICAgKi9cbiAgcmVhZG9ubHkgdHJhY2luZz86IFRyYWNpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBsb2cgcmV0ZW50aW9uIHBlcmlvZCBpbiBkYXlzLiBEZWZhdWx0cyB0byA3LlxuICAgKi9cbiAgcmVhZG9ubHkgbG9nUmV0ZW50aW9uSW5EYXlzPzogUmV0ZW50aW9uRGF5cztcblxuICAvKipcbiAgICogVGhlIG1lbW9yeSBsaW1pdCBpbiBNQi5cbiAgICpcbiAgICogQGRlZmF1bHQgMTI4LlxuICAgKi9cbiAgcmVhZG9ubHkgbWVtb3J5U2l6ZT86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIGZ1bmN0aW9uIGV4ZWN1dGlvbiB0aW1lIChpbiBzZWNvbmRzKSBhZnRlciB3aGljaCBMYW1iZGEgdGVybWluYXRlc1xuICAgKiB0aGUgZnVuY3Rpb24uIEJlY2F1c2UgdGhlIGV4ZWN1dGlvbiB0aW1lIGFmZmVjdHMgY29zdCwgc2V0IHRoaXMgdmFsdWVcbiAgICogYmFzZWQgb24gdGhlIGZ1bmN0aW9uJ3MgZXhwZWN0ZWQgZXhlY3V0aW9uIHRpbWUuXG4gICAqXG4gICAqIEBkZWZhdWx0IER1cmF0aW9uLnNlY29uZHMoMylcbiAgICovXG4gIHJlYWRvbmx5IHRpbWVvdXQ/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogTGF5ZXJzIGZvciB0aGUgTGFtYmRhLlxuICAgKi9cbiAgcmVhZG9ubHkgbGF5ZXJzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEluaXRpYWwgcG9saWN5IHN0YXRlbWVudHMgdG8gYWRkIHRvIHRoZSBjcmVhdGVkIExhbWJkYSBSb2xlLlxuICAgKlxuICAgKiBZb3UgY2FuIGNhbGwgYGFkZFRvUm9sZVBvbGljeWAgdG8gdGhlIGNyZWF0ZWQgbGFtYmRhIHRvIGFkZCBzdGF0ZW1lbnRzIHBvc3QgY3JlYXRpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gcG9saWN5IHN0YXRlbWVudHMgYXJlIGFkZGVkIHRvIHRoZSBjcmVhdGVkIExhbWJkYSByb2xlLlxuICAgKi9cbiAgcmVhZG9ubHkgaW5pdGlhbFBvbGljeT86IGlhbS5Qb2xpY3lTdGF0ZW1lbnRbXTtcblxuICAvKipcbiAgICogTGFtYmRhIGV4ZWN1dGlvbiByb2xlLlxuICAgKlxuICAgKiBUaGlzIGlzIHRoZSByb2xlIHRoYXQgd2lsbCBiZSBhc3N1bWVkIGJ5IHRoZSBmdW5jdGlvbiB1cG9uIGV4ZWN1dGlvbi5cbiAgICogSXQgY29udHJvbHMgdGhlIHBlcm1pc3Npb25zIHRoYXQgdGhlIGZ1bmN0aW9uIHdpbGwgaGF2ZS4gVGhlIFJvbGUgbXVzdFxuICAgKiBiZSBhc3N1bWFibGUgYnkgdGhlICdsYW1iZGEuYW1hem9uYXdzLmNvbScgc2VydmljZSBwcmluY2lwYWwuXG4gICAqXG4gICAqIFRoZSBkZWZhdWx0IFJvbGUgYXV0b21hdGljYWxseSBoYXMgcGVybWlzc2lvbnMgZ3JhbnRlZCBmb3IgTGFtYmRhIGV4ZWN1dGlvbi4gSWYgeW91XG4gICAqIHByb3ZpZGUgYSBSb2xlLCB5b3UgbXVzdCBhZGQgdGhlIHJlbGV2YW50IEFXUyBtYW5hZ2VkIHBvbGljaWVzIHlvdXJzZWxmLlxuICAgKlxuICAgKiBUaGUgcmVsZXZhbnQgbWFuYWdlZCBwb2xpY2llcyBhcmUgXCJzZXJ2aWNlLXJvbGUvQVdTTGFtYmRhQmFzaWNFeGVjdXRpb25Sb2xlXCIgYW5kXG4gICAqIFwic2VydmljZS1yb2xlL0FXU0xhbWJkYVZQQ0FjY2Vzc0V4ZWN1dGlvblJvbGVcIi5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBBIHVuaXF1ZSByb2xlIHdpbGwgYmUgZ2VuZXJhdGVkIGZvciB0aGlzIGxhbWJkYSBmdW5jdGlvbi5cbiAgICogQm90aCBzdXBwbGllZCBhbmQgZ2VuZXJhdGVkIHJvbGVzIGNhbiBhbHdheXMgYmUgY2hhbmdlZCBieSBjYWxsaW5nIGBhZGRUb1JvbGVQb2xpY3lgLlxuICAgKi9cbiAgcmVhZG9ubHkgcm9sZT86IGlhbS5JUm9sZTtcblxuICAvKipcbiAgICogTGFtYmRhIEZ1bmN0aW9ucyBpbiBhIHB1YmxpYyBzdWJuZXQgY2FuIE5PVCBhY2Nlc3MgdGhlIGludGVybmV0LlxuICAgKiBVc2UgdGhpcyBwcm9wZXJ0eSB0byBhY2tub3dsZWRnZSB0aGlzIGxpbWl0YXRpb24gYW5kIHN0aWxsIHBsYWNlIHRoZSBmdW5jdGlvbiBpbiBhIHB1YmxpYyBzdWJuZXQuXG4gICAqIEBzZWUgaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNTI5OTIwODUvd2h5LWNhbnQtYW4tYXdzLWxhbWJkYS1mdW5jdGlvbi1pbnNpZGUtYS1wdWJsaWMtc3VibmV0LWluLWEtdnBjLWNvbm5lY3QtdG8tdGhlLzUyOTk0ODQxIzUyOTk0ODQxXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBhbGxvd1B1YmxpY1N1Ym5ldD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIENvbmZpZyBmb3IgbmV0d29yayBjb25uZWN0aXZpdHkgdG8gQVdTIHJlc291cmNlcyBpbiBhIFZQQywgc3BlY2lmeSBhIGxpc3RcbiAgICogb2Ygc3VibmV0LCBhbmQgb3B0aW9uYWxseSBzZWN1cml0eSBncm91cHMsIGluIHRoZSBWUEMuXG4gICAqXG4gICAqIFRoZSBMYW1iZGEgZnVuY3Rpb24gaWFtIHJvbGUgd2lsbCByZWNlaXZlIHBlcm1pc3Npb24gdG9cbiAgICogbWFuYWdlIEVOSXMgd2l0aGluIHRoZSBwcm92aWRlZCBuZXR3b3JrLlxuICAgKlxuICAgKiBXaGVuIHlvdSBjb25uZWN0IGEgZnVuY3Rpb24gdG8gYSBWUEMsIGl0IGNhbiBvbmx5IGFjY2VzcyByZXNvdXJjZXMgYW5kIHRoZSBpbnRlcm5ldCB0aHJvdWdoIHRoYXQgVlBDLlxuICAgKlxuICAgKiBTZWUgW1ZQQyBTZXR0aW5nc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2xhbWJkYS9sYXRlc3QvZGcvY29uZmlndXJhdGlvbi12cGMuaHRtbCkuXG4gICAqXG4gICAqIEBkZXByZWNhdGVkIC0gVGhpcyBwcm9wZXJ0eSBpcyBkZXByZWNhdGVkLCB1c2UgdnBjIGFuZCBvdGhlciByZWxhdGVkIHByb3BlcnRpZXMgaW5zdGVhZFxuICAgKi9cbiAgcmVhZG9ubHkgbmV0d29ya0NvbmZpZz86IFZwY0NvbmZpZztcblxuICAvKipcbiAgICogVlBDIG5ldHdvcmsgdG8gcGxhY2UgTGFtYmRhIG5ldHdvcmsgaW50ZXJmYWNlc1xuICAgKlxuICAgKiBTcGVjaWZ5IHRoaXMgaWYgdGhlIExhbWJkYSBmdW5jdGlvbiBuZWVkcyB0byBhY2Nlc3MgcmVzb3VyY2VzIGluIGEgVlBDLlxuICAgKiBUaGlzIGlzIHJlcXVpcmVkIHdoZW4gYHZwY1N1Ym5ldHNgIGlzIHNwZWNpZmllZC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBGdW5jdGlvbiBpcyBub3QgcGxhY2VkIHdpdGhpbiBhIFZQQy5cbiAgICovXG4gIHJlYWRvbmx5IHZwYz86IElWcGM7XG5cbiAgLyoqXG4gICAqIEFsbG93cyBvdXRib3VuZCBJUHY2IHRyYWZmaWMgb24gVlBDIGZ1bmN0aW9ucyB0aGF0IGFyZSBjb25uZWN0ZWQgdG8gZHVhbC1zdGFjayBzdWJuZXRzLlxuICAgKlxuICAgKiBPbmx5IHVzZWQgaWYgJ3ZwYycgaXMgc3VwcGxpZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBpcHY2QWxsb3dlZEZvckR1YWxTdGFjaz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXJlIHRvIHBsYWNlIHRoZSBuZXR3b3JrIGludGVyZmFjZXMgd2l0aGluIHRoZSBWUEMuXG4gICAqXG4gICAqIFRoaXMgcmVxdWlyZXMgYHZwY2AgdG8gYmUgc3BlY2lmaWVkIGluIG9yZGVyIGZvciBpbnRlcmZhY2VzIHRvIGFjdHVhbGx5IGJlXG4gICAqIHBsYWNlZCBpbiB0aGUgc3VibmV0cy4gSWYgYHZwY2AgaXMgbm90IHNwZWNpZnksIHRoaXMgd2lsbCByYWlzZSBhbiBlcnJvci5cbiAgICpcbiAgICogTm90ZTogSW50ZXJuZXQgYWNjZXNzIGZvciBMYW1iZGEgRnVuY3Rpb25zIHJlcXVpcmVzIGEgTkFUIEdhdGV3YXksIHNvIHBpY2tpbmdcbiAgICogcHVibGljIHN1Ym5ldHMgaXMgbm90IGFsbG93ZWQgKHVubGVzcyBgYWxsb3dQdWJsaWNTdWJuZXRgIGlzIHNldCB0byBgdHJ1ZWApLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHRoZSBWcGMgZGVmYXVsdCBzdHJhdGVneSBpZiBub3Qgc3BlY2lmaWVkXG4gICAqL1xuICByZWFkb25seSB2cGNTdWJuZXRzPzogU3VibmV0U2VsZWN0aW9uO1xuXG4gIC8qKlxuICAgKiBUaGUgbGlzdCBvZiBzZWN1cml0eSBncm91cHMgdG8gYXNzb2NpYXRlIHdpdGggdGhlIExhbWJkYSdzIG5ldHdvcmsgaW50ZXJmYWNlcy5cbiAgICpcbiAgICogT25seSB1c2VkIGlmICd2cGMnIGlzIHN1cHBsaWVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIElmIHRoZSBmdW5jdGlvbiBpcyBwbGFjZWQgd2l0aGluIGEgVlBDIGFuZCBhIHNlY3VyaXR5IGdyb3VwIGlzXG4gICAqIG5vdCBzcGVjaWZpZWQsIGVpdGhlciBieSB0aGlzIG9yIHNlY3VyaXR5R3JvdXAgcHJvcCwgYSBkZWRpY2F0ZWQgc2VjdXJpdHlcbiAgICogZ3JvdXAgd2lsbCBiZSBjcmVhdGVkIGZvciB0aGlzIGZ1bmN0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgc2VjdXJpdHlHcm91cHM/OiBJU2VjdXJpdHlHcm91cFtdO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGFsbG93IHRoZSBMYW1iZGEgdG8gc2VuZCBhbGwgbmV0d29yayB0cmFmZmljIChleGNlcHQgaXB2NilcbiAgICpcbiAgICogSWYgc2V0IHRvIGZhbHNlLCB5b3UgbXVzdCBpbmRpdmlkdWFsbHkgYWRkIHRyYWZmaWMgcnVsZXMgdG8gYWxsb3cgdGhlXG4gICAqIExhbWJkYSB0byBjb25uZWN0IHRvIG5ldHdvcmsgdGFyZ2V0cy5cbiAgICpcbiAgICogRG8gbm90IHNwZWNpZnkgdGhpcyBwcm9wZXJ0eSBpZiB0aGUgYHNlY3VyaXR5R3JvdXBzYCBvciBgc2VjdXJpdHlHcm91cGAgcHJvcGVydHkgaXMgc2V0LlxuICAgKiBJbnN0ZWFkLCBjb25maWd1cmUgYGFsbG93QWxsT3V0Ym91bmRgIGRpcmVjdGx5IG9uIHRoZSBzZWN1cml0eSBncm91cC5cbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgYWxsb3dBbGxPdXRib3VuZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYWxsb3cgdGhlIExhbWJkYSB0byBzZW5kIGFsbCBpcHY2IG5ldHdvcmsgdHJhZmZpY1xuICAgKlxuICAgKiBJZiBzZXQgdG8gdHJ1ZSwgdGhlcmUgd2lsbCBvbmx5IGJlIGEgc2luZ2xlIGVncmVzcyBydWxlIHdoaWNoIGFsbG93cyBhbGxcbiAgICogb3V0Ym91bmQgaXB2NiB0cmFmZmljLiBJZiBzZXQgdG8gZmFsc2UsIHlvdSBtdXN0IGluZGl2aWR1YWxseSBhZGQgdHJhZmZpYyBydWxlcyB0byBhbGxvdyB0aGVcbiAgICogTGFtYmRhIHRvIGNvbm5lY3QgdG8gbmV0d29yayB0YXJnZXRzIHVzaW5nIGlwdjYuXG4gICAqXG4gICAqIERvIG5vdCBzcGVjaWZ5IHRoaXMgcHJvcGVydHkgaWYgdGhlIGBzZWN1cml0eUdyb3Vwc2Agb3IgYHNlY3VyaXR5R3JvdXBgIHByb3BlcnR5IGlzIHNldC5cbiAgICogSW5zdGVhZCwgY29uZmlndXJlIGBhbGxvd0FsbElwdjZPdXRib3VuZGAgZGlyZWN0bHkgb24gdGhlIHNlY3VyaXR5IGdyb3VwLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgYWxsb3dBbGxJcHY2T3V0Ym91bmQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgU1FTIERMUS5cbiAgICpcbiAgICogVGhlIExhbWJkYSBmdW5jdGlvbiBpYW0gcm9sZSB3aWxsIHJlY2VpdmUgcGVybWlzc2lvbiB0b1xuICAgKiBzZW5kIG1lc3NhZ2VzIG9uIHRoaXMgcXVldWUuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gZGVhZGxldHRlciBxdWV1ZVxuICAgKi9cbiAgcmVhZG9ubHkgZGVhZExldHRlclF1ZXVlPzogSVF1ZXVlO1xuXG4gIC8qKlxuICAgKiBFbmFibGVkIERMUS4gSWYgYGRlYWRMZXR0ZXJRdWV1ZWAgaXMgdW5kZWZpbmVkLFxuICAgKiBhbiBTUVMgcXVldWUgd2l0aCBkZWZhdWx0IG9wdGlvbnMgd2lsbCBiZSBkZWZpbmVkIGZvciB5b3VyIEZ1bmN0aW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGZhbHNlIHVubGVzcyBgZGVhZExldHRlclF1ZXVlYCBpcyBzZXQsIHdoaWNoIGltcGxpZXMgRExRIGlzIGVuYWJsZWQuXG4gICAqL1xuICByZWFkb25seSBkZWFkTGV0dGVyUXVldWVFbmFibGVkPzogYm9vbGVhbjtcblxuICAvLyBUT0RPOiByZS1hZGQgU05TIGRlYWRMZXR0ZXJUb3BpY1xuXG4gIC8qKlxuICAgKiBFdmVudCBzb3VyY2VzIGZvciB0aGlzIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBZb3UgY2FuIGFsc28gYWRkIGV2ZW50IHNvdXJjZXMgdXNpbmcgYGFkZEV2ZW50U291cmNlYC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBldmVudCBzb3VyY2VzLlxuICAgKi9cbiAgcmVhZG9ubHkgZXZlbnRzPzogSUV2ZW50U291cmNlW107XG5cbiAgLyoqXG4gICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9hd3MvNS42MC4wL2RvY3MvcmVzb3VyY2VzL2xhbWJkYV9mdW5jdGlvbiNyZXNlcnZlZF9jb25jdXJyZW50X2V4ZWN1dGlvbnMgTGFtYmRhRnVuY3Rpb24jcmVzZXJ2ZWRfY29uY3VycmVudF9leGVjdXRpb25zfVxuICAgKi9cbiAgcmVhZG9ubHkgcmVzZXJ2ZWRDb25jdXJyZW50RXhlY3V0aW9ucz86IG51bWJlcjtcblxuICAvKipcbiAgICogVGFncyB0byBhcHBseSB0byB0aGUgTGFtYmRhIGZ1bmN0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgdGFncz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG5cbiAgLyoqXG4gICAqIFNldHRpbmcgdGhpcyBwcm9wZXJ0eSBpbmZvcm1zIHRoZSBDREsgdGhhdCB0aGUgaW1wb3J0ZWQgZnVuY3Rpb24gQUxSRUFEWSBIQVMgdGhlIG5lY2Vzc2FyeSBwZXJtaXNzaW9uc1xuICAgKiBmb3Igd2hhdCB5b3UgYXJlIHRyeWluZyB0byBkby4gV2hlbiBub3QgY29uZmlndXJlZCwgdGhlIENESyBhdHRlbXB0cyB0byBhdXRvLWRldGVybWluZSB3aGV0aGVyIG9yIG5vdFxuICAgKiBhZGRpdGlvbmFsIHBlcm1pc3Npb25zIGFyZSBuZWNlc3Nhcnkgb24gdGhlIGZ1bmN0aW9uIHdoZW4gZ3JhbnQgQVBJcyBhcmUgdXNlZC4gSWYgdGhlIENESyB0cmllZCB0byBhZGRcbiAgICogcGVybWlzc2lvbnMgb24gYW4gaW1wb3J0ZWQgbGFtYmRhLCBpdCB3aWxsIGZhaWwuXG4gICAqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5ICpPTkxZIElGKiB5b3UgYXJlIGNvbW1pdHRpbmcgdG8gbWFuYWdlIHRoZSBpbXBvcnRlZCBmdW5jdGlvbidzIHBlcm1pc3Npb25zIG91dHNpZGUgb2ZcbiAgICogQ0RLLiBZb3UgYXJlIGFja25vd2xlZGdpbmcgdGhhdCB5b3VyIENESyBjb2RlIGFsb25lIHdpbGwgaGF2ZSBpbnN1ZmZpY2llbnQgcGVybWlzc2lvbnMgdG8gYWNjZXNzIHRoZVxuICAgKiBpbXBvcnRlZCBmdW5jdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHNraXBQZXJtaXNzaW9ucz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGxvZ2dpbmdGb3JtYXQgZm9yIHRoZSBmdW5jdGlvbi5cbiAgICogQGRlZmF1bHQgTG9nZ2luZ0Zvcm1hdC5URVhUXG4gICAqL1xuICByZWFkb25seSBsb2dnaW5nRm9ybWF0PzogTG9nZ2luZ0Zvcm1hdDtcblxuICAvKipcbiAgICogU2V0cyB0aGUgYXBwbGljYXRpb24gbG9nIGxldmVsIGZvciB0aGUgZnVuY3Rpb24uXG4gICAqIEBkZWZhdWx0IEFwcGxpY2F0aW9uTG9nTGV2ZWwuSU5GT1xuICAgKi9cbiAgcmVhZG9ubHkgYXBwbGljYXRpb25Mb2dMZXZlbD86IEFwcGxpY2F0aW9uTG9nTGV2ZWw7XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHN5c3RlbSBsb2cgbGV2ZWwgZm9yIHRoZSBmdW5jdGlvbi5cbiAgICogQGRlZmF1bHQgU3lzdGVtTG9nTGV2ZWwuSU5GT1xuICAgKi9cbiAgcmVhZG9ubHkgc3lzdGVtTG9nTGV2ZWw/OiBTeXN0ZW1Mb2dMZXZlbDtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcHVibGlzaCBjcmVhdGlvbi9jaGFuZ2UgYXMgbmV3IExhbWJkYSBGdW5jdGlvbiBWZXJzaW9uLlxuICAgKlxuICAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXdzL2xhdGVzdC9kb2NzL3Jlc291cmNlcy9sYW1iZGFfZnVuY3Rpb24jcHVibGlzaCBMYW1iZGFGdW5jdGlvbiNwdWJsaXNofVxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgcHVibGlzaD86IGJvb2xlYW4gfCBJUmVzb2x2YWJsZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGdW5jdGlvblByb3BzIGV4dGVuZHMgRnVuY3Rpb25PcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBydW50aW1lIGVudmlyb25tZW50IGZvciB0aGUgTGFtYmRhIGZ1bmN0aW9uIHRoYXQgeW91IGFyZSB1cGxvYWRpbmcuXG4gICAqIEZvciB2YWxpZCB2YWx1ZXMsIHNlZSB0aGUgUnVudGltZSBwcm9wZXJ0eSBpbiB0aGUgQVdTIExhbWJkYSBEZXZlbG9wZXJcbiAgICogR3VpZGUuXG4gICAqXG4gICAqIFVzZSBgUnVudGltZS5GUk9NX0lNQUdFYCB3aGVuIGRlZmluaW5nIGEgZnVuY3Rpb24gZnJvbSBhIERvY2tlciBpbWFnZS5cbiAgICovXG4gIHJlYWRvbmx5IHJ1bnRpbWU6IFJ1bnRpbWU7XG5cbiAgLyoqXG4gICAqIFRoZSBzb3VyY2UgY29kZSBvZiB5b3VyIExhbWJkYSBmdW5jdGlvbi4gWW91IGNhbiBwb2ludCB0byBhIGZpbGUgaW4gYW5cbiAgICogQW1hem9uIFNpbXBsZSBTdG9yYWdlIFNlcnZpY2UgKEFtYXpvbiBTMykgYnVja2V0IG9yIHNwZWNpZnkgeW91ciBzb3VyY2VcbiAgICogY29kZSBhcyBpbmxpbmUgdGV4dC5cbiAgICovXG4gIHJlYWRvbmx5IGNvZGU6IENvZGU7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBtZXRob2Qgd2l0aGluIHlvdXIgY29kZSB0aGF0IExhbWJkYSBjYWxscyB0byBleGVjdXRlXG4gICAqIHlvdXIgZnVuY3Rpb24uIFRoZSBmb3JtYXQgaW5jbHVkZXMgdGhlIGZpbGUgbmFtZS4gSXQgY2FuIGFsc28gaW5jbHVkZVxuICAgKiBuYW1lc3BhY2VzIGFuZCBvdGhlciBxdWFsaWZpZXJzLCBkZXBlbmRpbmcgb24gdGhlIHJ1bnRpbWUuXG4gICAqIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2xhbWJkYS9sYXRlc3QvZGcvZm91bmRhdGlvbi1wcm9nbW9kZWwuaHRtbC5cbiAgICpcbiAgICogVXNlIGBIYW5kbGVyLkZST01fSU1BR0VgIHdoZW4gZGVmaW5pbmcgYSBmdW5jdGlvbiBmcm9tIGEgRG9ja2VyIGltYWdlLlxuICAgKlxuICAgKiBOT1RFOiBJZiB5b3Ugc3BlY2lmeSB5b3VyIHNvdXJjZSBjb2RlIGFzIGlubGluZSB0ZXh0IGJ5IHNwZWNpZnlpbmcgdGhlXG4gICAqIFppcEZpbGUgcHJvcGVydHkgd2l0aGluIHRoZSBDb2RlIHByb3BlcnR5LCBzcGVjaWZ5IGluZGV4LmZ1bmN0aW9uX25hbWUgYXNcbiAgICogdGhlIGhhbmRsZXIuXG4gICAqL1xuICByZWFkb25seSBoYW5kbGVyOiBzdHJpbmc7XG59XG5cbi8vIHJlLWFkZCBlYzIuSUNvbm5lY3RhYmxlP1xuXG4vLyAvKipcbi8vICAqIEEgTGFtYmRhIGZ1bmN0aW9uLlxuLy8gICovXG4vLyBleHBvcnQgaW50ZXJmYWNlIElGdW5jdGlvbiBleHRlbmRzIElBd3NDb25zdHJ1Y3QsIGlhbS5JR3JhbnRhYmxlIHtcblxuLy8gICAvKipcbi8vICAgICogQWRkIGFuIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIHRoaXMgZnVuY3Rpb24uXG4vLyAgICAqL1xuLy8gICBhZGRFbnZpcm9ubWVudChrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IElGdW5jdGlvbjtcbi8vIH1cblxuLyoqXG4gKiBQcm92aWRlcyBhIExhbWJkYSBGdW5jdGlvbiByZXNvdXJjZS4gTGFtYmRhIGFsbG93cyB5b3UgdG8gdHJpZ2dlciBleGVjdXRpb25cbiAqIG9mIGNvZGUgaW4gcmVzcG9uc2UgdG8gZXZlbnRzIGluIEFXUywgZW5hYmxpbmcgc2VydmVybGVzcyBiYWNrZW5kIHNvbHV0aW9ucy5cbiAqXG4gKiBUaGUgTGFtYmRhIEZ1bmN0aW9uIGl0c2VsZiBpbmNsdWRlcyBzb3VyY2UgY29kZSBhbmQgcnVudGltZSBjb25maWd1cmF0aW9uLlxuICpcbiAqIFRoaXMgQ29uc3RydWN0IG1hbmFnZXMgcGVybWlzc2lvbnMgYXMgcGFydCBvZiB0aGUgZnVuY3Rpb24gUHJpbmNpcGFsIGlhbSBwb2xpY3kuXG4gKiBUaGlzIHdvcmtzIGZvciBzYW1lIGFjY291bnQgcmVzb3VyY2VzLCBidXQgZm9yIGNyb3NzLWFjY291bnQgcmVzb3VyY2VzLFxuICogeW91IG1heSBuZWVkIHRvIG1hbmFnZSBhY2Nlc3MgYXMgcGFydCBvZiB0aGUgUmVzb3VyY2UgaWFtIHBvbGljeS5cbiAqXG4gKiBAcmVzb3VyY2UgYXdzX2xhbWJkYV9mdW5jdGlvblxuICogQGJlYWNvbi1jbGFzcyBjb21wdXRlLklGdW5jdGlvblxuICovXG5leHBvcnQgY2xhc3MgTGFtYmRhRnVuY3Rpb24gZXh0ZW5kcyBMYW1iZGFGdW5jdGlvbkJhc2UgaW1wbGVtZW50cyBJRnVuY3Rpb24ge1xuICAvLyBUT0RPOiBUZXJyYWZvcm0gYXdzX2xhbWJkYV9mdW5jdGlvbiA9PSBDREsgRnVuY3Rpb25WZXJzaW9uXG5cbiAgLyoqXG4gICAqIExhdGVzdCBwdWJsaXNoZWQgdmVyc2lvbiBvZiB5b3VyIExhbWJkYSBGdW5jdGlvbi5cbiAgICovXG4gIHB1YmxpYyBnZXQgdmVyc2lvbigpOiBzdHJpbmcge1xuICAgIC8vIFRPRE86IFdoYXQgaXMgdGhpcyBpZiBwdWJsaXNoIGlzIGZhbHNlPz9cbiAgICByZXR1cm4gdGhpcy5yZXNvdXJjZS52ZXJzaW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcG9ydCBhIGxhbWJkYSBmdW5jdGlvbiBpbnRvIHRoZSBUZXJyYUNvbnN0cnVjdCBzcGVjIHVzaW5nIGl0cyBuYW1lXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21GdW5jdGlvbk5hbWUoXG4gICAgc2NvcGU6IENvbnN0cnVjdCxcbiAgICBpZDogc3RyaW5nLFxuICAgIGZ1bmN0aW9uTmFtZTogc3RyaW5nLFxuICApOiBJRnVuY3Rpb24ge1xuICAgIHJldHVybiBMYW1iZGFGdW5jdGlvbi5mcm9tRnVuY3Rpb25BdHRyaWJ1dGVzKHNjb3BlLCBpZCwge1xuICAgICAgZnVuY3Rpb25Bcm46IEF3c1N0YWNrLm9mQXdzQ29uc3RydWN0KHNjb3BlKS5mb3JtYXRBcm4oe1xuICAgICAgICBzZXJ2aWNlOiBcImxhbWJkYVwiLFxuICAgICAgICByZXNvdXJjZTogXCJmdW5jdGlvblwiLFxuICAgICAgICByZXNvdXJjZU5hbWU6IGZ1bmN0aW9uTmFtZSxcbiAgICAgICAgYXJuRm9ybWF0OiBBcm5Gb3JtYXQuQ09MT05fUkVTT1VSQ0VfTkFNRSxcbiAgICAgIH0pLFxuICAgICAgc2FtZUVudmlyb25tZW50OiB0cnVlLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcG9ydCBhIGxhbWJkYSBmdW5jdGlvbiBpbnRvIHRoZSBUZXJyYUNvbnN0cnVjdCBzcGVjIHVzaW5nIGl0cyBBUk4uXG4gICAqXG4gICAqIEZvciBgRnVuY3Rpb24uYWRkUGVybWlzc2lvbnMoKWAgdG8gd29yayBvbiB0aGlzIGltcG9ydGVkIGxhbWJkYSwgbWFrZSBzdXJlIHRoYXQgaXNcbiAgICogaW4gdGhlIHNhbWUgYWNjb3VudCBhbmQgcmVnaW9uIGFzIHRoZSBzdGFjayB5b3UgYXJlIGltcG9ydGluZyBpdCBpbnRvLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tRnVuY3Rpb25Bcm4oXG4gICAgc2NvcGU6IENvbnN0cnVjdCxcbiAgICBpZDogc3RyaW5nLFxuICAgIGZ1bmN0aW9uQXJuOiBzdHJpbmcsXG4gICk6IElGdW5jdGlvbiB7XG4gICAgcmV0dXJuIExhbWJkYUZ1bmN0aW9uLmZyb21GdW5jdGlvbkF0dHJpYnV0ZXMoc2NvcGUsIGlkLCB7IGZ1bmN0aW9uQXJuIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBMYW1iZGEgZnVuY3Rpb24gb2JqZWN0IHdoaWNoIHJlcHJlc2VudHMgYSBmdW5jdGlvbiBub3QgZGVmaW5lZFxuICAgKiB3aXRoaW4gdGhpcyBzdGFjay5cbiAgICpcbiAgICogRm9yIGBGdW5jdGlvbi5hZGRQZXJtaXNzaW9ucygpYCB0byB3b3JrIG9uIHRoaXMgaW1wb3J0ZWQgbGFtYmRhLCBzZXQgdGhlIHNhbWVFbnZpcm9ubWVudCBwcm9wZXJ0eSB0byB0cnVlXG4gICAqIGlmIHRoaXMgaW1wb3J0ZWQgbGFtYmRhIGlzIGluIHRoZSBzYW1lIGFjY291bnQgYW5kIHJlZ2lvbiBhcyB0aGUgc3RhY2sgeW91IGFyZSBpbXBvcnRpbmcgaXQgaW50by5cbiAgICpcbiAgICogQHBhcmFtIHNjb3BlIFRoZSBwYXJlbnQgY29uc3RydWN0XG4gICAqIEBwYXJhbSBpZCBUaGUgbmFtZSBvZiB0aGUgbGFtYmRhIGNvbnN0cnVjdFxuICAgKiBAcGFyYW0gYXR0cnMgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIGZ1bmN0aW9uIHRvIGltcG9ydFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tRnVuY3Rpb25BdHRyaWJ1dGVzKFxuICAgIHNjb3BlOiBDb25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBhdHRyczogRnVuY3Rpb25BdHRyaWJ1dGVzLFxuICApOiBJRnVuY3Rpb24ge1xuICAgIGNvbnN0IGZ1bmN0aW9uQXJuID0gYXR0cnMuZnVuY3Rpb25Bcm47XG4gICAgY29uc3QgZnVuY3Rpb25OYW1lID0gZXh0cmFjdE5hbWVGcm9tQXJuKGF0dHJzLmZ1bmN0aW9uQXJuKTtcbiAgICBjb25zdCByb2xlID0gYXR0cnMucm9sZTtcblxuICAgIGNsYXNzIEltcG9ydCBleHRlbmRzIExhbWJkYUZ1bmN0aW9uQmFzZSB7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgcmVzb3VyY2U6IGRhdGFBd3NMYW1iZGFGdW5jdGlvbi5EYXRhQXdzTGFtYmRhRnVuY3Rpb247XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgZnVuY3Rpb25OYW1lID0gZnVuY3Rpb25OYW1lO1xuICAgICAgcHVibGljIHJlYWRvbmx5IGZ1bmN0aW9uQXJuID0gZnVuY3Rpb25Bcm47XG4gICAgICBwdWJsaWMgZ2V0IGZ1bmN0aW9uUXVhbGlmaWVkSW52b2tlQXJuKCk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IHsgcmVnaW9uLCBwYXJ0aXRpb24gfSA9IEFybi5zcGxpdChcbiAgICAgICAgICBmdW5jdGlvbkFybixcbiAgICAgICAgICBBcm5Gb3JtYXQuQ09MT05fUkVTT1VSQ0VfTkFNRSxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIGBhcm46JHtwYXJ0aXRpb259OmFwaWdhdGV3YXk6JHtyZWdpb259OmxhbWJkYTpwYXRoLzIwMTUtMDMtMzEvZnVuY3Rpb25zLyR7ZnVuY3Rpb25Bcm59L2ludm9jYXRpb25zYDtcbiAgICAgIH1cbiAgICAgIHB1YmxpYyBnZXQgZnVuY3Rpb25JbnZva2VBcm4oKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgeyByZWdpb24sIHBhcnRpdGlvbiB9ID0gQXJuLnNwbGl0KFxuICAgICAgICAgIGZ1bmN0aW9uQXJuLFxuICAgICAgICAgIEFybkZvcm1hdC5DT0xPTl9SRVNPVVJDRV9OQU1FLFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gYGFybjoke3BhcnRpdGlvbn06YXBpZ2F0ZXdheToke3JlZ2lvbn06bGFtYmRhOnBhdGgvMjAxNS0wMy0zMS9mdW5jdGlvbnMvJHtmdW5jdGlvbkFybn0vaW52b2NhdGlvbnNgO1xuICAgICAgfVxuICAgICAgLy8gVE9ETzogUmVzb2x2ZSByb2xlIGFuZCBwcmluY2lwYWwgcmVzb2x2ZSBmcm9tIFRGIGRhdGEgc291cmNlP1xuICAgICAgcHVibGljIHJlYWRvbmx5IGdyYW50UHJpbmNpcGFsOiBpYW0uSVByaW5jaXBhbDtcbiAgICAgIHB1YmxpYyByZWFkb25seSByb2xlID0gcm9sZTtcbiAgICAgIHB1YmxpYyByZWFkb25seSBwZXJtaXNzaW9uc05vZGUgPSB0aGlzLm5vZGU7XG4gICAgICAvKipcbiAgICAgICAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBMYW1iZGEgZnVuY3Rpb24gcmV0dXJuZWQuXG4gICAgICAgKlxuICAgICAgICogSWYgcXVhbGlmaWVyIGlzIG5vdCBzZXQsIHRoaXMgd2lsbCByZXNvbHZlIHRvIHRoZSBtb3N0IHJlY2VudCBwdWJsaXNoZWQgdmVyc2lvbi5cbiAgICAgICAqIElmIG5vIHB1Ymxpc2hlZCB2ZXJzaW9uIG9mIHRoZSBmdW5jdGlvbiBleGlzdHMsIHZlcnNpb24gd2lsbCByZXNvbHZlIHRvIGAkTEFURVNUYC5cbiAgICAgICAqL1xuICAgICAgcHVibGljIGdldCB2ZXJzaW9uKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlc291cmNlLnZlcnNpb247XG4gICAgICB9XG4gICAgICAvLyBGb3JjZSB1c2VyIHRvIHByb3ZpZGUgYXJjaCBvciBhc3N1bWUgWDg2XzY0XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgYXJjaGl0ZWN0dXJlID0gYXR0cnMuYXJjaGl0ZWN0dXJlID8/IEFyY2hpdGVjdHVyZS5YODZfNjQ7XG4gICAgICAvLyBwdWJsaWMgZ2V0IGFyY2hpdGVjdHVyZSgpOiBzdHJpbmcge1xuICAgICAgLy8gICByZXR1cm4gRm4uZWxlbWVudCh0aGlzLnJlc291cmNlLmFyY2hpdGVjdHVyZXMsIDApIGFzIHN0cmluZztcbiAgICAgIC8vIH1cbiAgICAgIHB1YmxpYyByZWFkb25seSByZXNvdXJjZUFybnNGb3JHcmFudEludm9rZSA9IFtcbiAgICAgICAgdGhpcy5mdW5jdGlvbkFybixcbiAgICAgICAgYCR7dGhpcy5mdW5jdGlvbkFybn06KmAsXG4gICAgICBdO1xuICAgICAgcHVibGljIGdldCBmdW5jdGlvbk91dHB1dHMoKTogRnVuY3Rpb25PdXRwdXRzIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBuYW1lOiB0aGlzLmZ1bmN0aW9uTmFtZSxcbiAgICAgICAgICBhcm46IHRoaXMuZnVuY3Rpb25Bcm4sXG4gICAgICAgICAgcm9sZUFybjogdGhpcy5yb2xlPy5yb2xlQXJuID8/IFwiXCIsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBwdWJsaWMgZ2V0IG91dHB1dHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZ1bmN0aW9uT3V0cHV0cztcbiAgICAgIH1cbiAgICAgIHByb3RlY3RlZCByZWFkb25seSBjYW5DcmVhdGVQZXJtaXNzaW9ucyA9XG4gICAgICAgIGF0dHJzLnNhbWVFbnZpcm9ubWVudCA/PyB0aGlzLl9pc1N0YWNrQWNjb3VudCgpO1xuICAgICAgcHJvdGVjdGVkIHJlYWRvbmx5IF9za2lwUGVybWlzc2lvbnMgPSBhdHRycy5za2lwUGVybWlzc2lvbnMgPz8gZmFsc2U7XG5cbiAgICAgIGNvbnN0cnVjdG9yKHM6IENvbnN0cnVjdCwgaTogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKHMsIGksIHtcbiAgICAgICAgICBlbnZpcm9ubWVudEZyb21Bcm46IGZ1bmN0aW9uQXJuLFxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmdyYW50UHJpbmNpcGFsID1cbiAgICAgICAgICByb2xlIHx8IG5ldyBpYW0uVW5rbm93blByaW5jaXBhbCh7IHJlc291cmNlOiB0aGlzIH0pO1xuICAgICAgICB0aGlzLnJlc291cmNlID0gbmV3IGRhdGFBd3NMYW1iZGFGdW5jdGlvbi5EYXRhQXdzTGFtYmRhRnVuY3Rpb24oXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICBcIlJlc291cmNlXCIsXG4gICAgICAgICAge1xuICAgICAgICAgICAgZnVuY3Rpb25OYW1lOiB0aGlzLmZ1bmN0aW9uTmFtZSxcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIC8vIFRPRE86IHJlLWFkZCBzdXBwb3J0IGZvciBFQzIgY29ubmVjdGlvbnNcbiAgICAgICAgLy8gaWYgKGF0dHJzLnNlY3VyaXR5R3JvdXApIHtcbiAgICAgICAgLy8gICB0aGlzLl9jb25uZWN0aW9ucyA9IG5ldyBlYzIuQ29ubmVjdGlvbnMoe1xuICAgICAgICAvLyAgICAgc2VjdXJpdHlHcm91cHM6IFthdHRycy5zZWN1cml0eUdyb3VwXSxcbiAgICAgICAgLy8gICB9KTtcbiAgICAgICAgLy8gfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBuZXcgSW1wb3J0KHNjb3BlLCBpZCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcmVzb3VyY2U6IGxhbWJkYUZ1bmN0aW9uLkxhbWJkYUZ1bmN0aW9uO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX291dHB1dHM6IEZ1bmN0aW9uT3V0cHV0cztcblxuICAvKiogU3Ryb25nbHkgVHlwZWQgRnVuY3Rpb24gT3V0cHV0cyAqL1xuICBwdWJsaWMgZ2V0IGZ1bmN0aW9uT3V0cHV0cygpOiBGdW5jdGlvbk91dHB1dHMge1xuICAgIHJldHVybiB0aGlzLl9vdXRwdXRzO1xuICB9XG4gIHB1YmxpYyBnZXQgb3V0cHV0cygpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5mdW5jdGlvbk91dHB1dHM7XG4gIH1cblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGZ1bmN0aW9uTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgQVJOIGZvIHRoZSBmdW5jdGlvbi5cbiAgICovXG4gIHB1YmxpYyBnZXQgZnVuY3Rpb25Bcm4oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5yZXNvdXJjZS5hcm47XG4gIH1cblxuICAvKipcbiAgICogVGhlIEFSTiBmbyB0aGUgZnVuY3Rpb24uXG4gICAqIChpZiB2ZXJzaW9uaW5nIGlzIGVuYWJsZWQgdmlhIHB1Ymxpc2ggPSB0cnVlKVxuICAgKi9cbiAgcHVibGljIGdldCBmdW5jdGlvblF1YWxpZmllZEFybigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnJlc291cmNlLnF1YWxpZmllZEFybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgRnVsbHkgUXVhbGlmaWVkIEludm9rZSBBUk4gZm8gdGhlIGZ1bmN0aW9uIHRvIGJlIHVzZWQgZnJvbSBBUEkgR2F0ZXdheS5cbiAgICpcbiAgICogTk9URTogVGhpcyBkb2VzIG5vdCBzZWVtIHRvIHdvcmsgd2l0aCBBdXRob3JpemVyc1xuICAgKi9cbiAgcHVibGljIGdldCBmdW5jdGlvblF1YWxpZmllZEludm9rZUFybigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnJlc291cmNlLnF1YWxpZmllZEludm9rZUFybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgSW52b2tlIEFSTiBmbyB0aGUgZnVuY3Rpb24gdG8gYmUgdXNlZCBmcm9tIEFQSSBHYXRld2F5LlxuICAgKlxuICAgKiBOT1RFOiBVc2UgdGhpcyBmb3IgQXV0aG9yaXplcnNcbiAgICovXG4gIHB1YmxpYyBnZXQgZnVuY3Rpb25JbnZva2VBcm4oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5yZXNvdXJjZS5pbnZva2VBcm47XG4gIH1cblxuICAvKipcbiAgICogVGhlIGFyY2hpdGVjdHVyZSBvZiB0aGlzIExhbWJkYSBGdW5jdGlvbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBhcmNoaXRlY3R1cmU6IEFyY2hpdGVjdHVyZTtcblxuICAvKipcbiAgICogVGhlIHByaW5jaXBhbCB0aGlzIExhbWJkYSBGdW5jdGlvbiBpcyBydW5uaW5nIGFzXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZ3JhbnRQcmluY2lwYWw6IGlhbS5JUHJpbmNpcGFsO1xuXG4gIC8qKlxuICAgKiBUaGUgSUFNIHJvbGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZnVuY3Rpb24uXG4gICAqXG4gICAqIFVuZGVmaW5lZCBpZiB0aGUgZnVuY3Rpb24gd2FzIGltcG9ydGVkIHdpdGhvdXQgYSByb2xlLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHJvbGU/OiBpYW0uSVJvbGU7XG5cbiAgLyoqXG4gICAqIFRoZSBydW50aW1lIGNvbmZpZ3VyZWQgZm9yIHRoaXMgbGFtYmRhLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHJ1bnRpbWU6IFJ1bnRpbWU7XG5cbiAgLyoqXG4gICAqIFRoZSBETFEgKGFzIHF1ZXVlKSBhc3NvY2lhdGVkIHdpdGggdGhpcyBMYW1iZGEgRnVuY3Rpb24gKHRoaXMgaXMgYW4gb3B0aW9uYWwgYXR0cmlidXRlKS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBkZWFkTGV0dGVyUXVldWU/OiBJUXVldWU7XG5cbiAgLyoqXG4gICAqIFRoZSB0aW1lb3V0IGNvbmZpZ3VyZWQgZm9yIHRoaXMgbGFtYmRhLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHRpbWVvdXQ/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogVGhlIGNvbnN0cnVjdCBub2RlIHdoZXJlIHBlcm1pc3Npb25zIGFyZSBhdHRhY2hlZC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwZXJtaXNzaW9uc05vZGUgPSB0aGlzLm5vZGU7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGNhbkNyZWF0ZVBlcm1pc3Npb25zID0gdHJ1ZTtcblxuICAvKipcbiAgICogTWFwcGluZyBvZiBpbnZvY2F0aW9uIHByaW5jaXBhbHMgdG8gZ3JhbnRzLiBVc2VkIHRvIGRlLWR1cGUgYGdyYW50SW52b2tlKClgIGNhbGxzLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHByb3RlY3RlZCBfaW52b2NhdGlvbkdyYW50czogUmVjb3JkPHN0cmluZywgaWFtLkdyYW50PiA9IHt9O1xuXG4gIC8qKlxuICAgKiBNYXBwaW5nIG9mIGZ1Y250aW9uIFVSTCBpbnZvY2F0aW9uIHByaW5jaXBhbHMgdG8gZ3JhbnRzLiBVc2VkIHRvIGRlLWR1cGUgYGdyYW50SW52b2tlVXJsKClgIGNhbGxzLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHByb3RlY3RlZCBfZnVuY3Rpb25VcmxJbnZvY2F0aW9uR3JhbnRzOiBSZWNvcmQ8c3RyaW5nLCBpYW0uR3JhbnQ+ID0ge307XG5cbiAgLy8gLy8gVGVyYWZvcm0gcHJvdmlkZXIgZm9yIEFXUyBBdXRvbWF0aWNhbGx5IG1hbmFnZXMgRnVuY3Rpb24gVmVyc2lvbmluZyB0aHJvdWdoIGNvZGUgaGFzaC4uXG4gIC8vIC8vIG5lZWQgdG8gZHJvcCBtb3N0IG9mIHRoaXMgdmVyc2lvbiBsb2dpYy4uXG5cbiAgLy8gcHJpdmF0ZSByZWFkb25seSBjdXJyZW50VmVyc2lvbk9wdGlvbnM/OiBWZXJzaW9uT3B0aW9ucztcbiAgLy8gcHJpdmF0ZSBfY3VycmVudFZlcnNpb24/OiBWZXJzaW9uO1xuICAvLyAvKipcbiAgLy8gICogUmV0dXJucyBhIGBsYW1iZGEuVmVyc2lvbmAgd2hpY2ggcmVwcmVzZW50cyB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIHRoaXNcbiAgLy8gICogTGFtYmRhIGZ1bmN0aW9uLiBBIG5ldyB2ZXJzaW9uIHdpbGwgYmUgY3JlYXRlZCBldmVyeSB0aW1lIHRoZSBmdW5jdGlvbidzXG4gIC8vICAqIGNvbmZpZ3VyYXRpb24gY2hhbmdlcy5cbiAgLy8gICpcbiAgLy8gICogWW91IGNhbiBzcGVjaWZ5IG9wdGlvbnMgZm9yIHRoaXMgdmVyc2lvbiB1c2luZyB0aGUgYGN1cnJlbnRWZXJzaW9uT3B0aW9uc2BcbiAgLy8gICogcHJvcCB3aGVuIGluaXRpYWxpemluZyB0aGUgYGxhbWJkYS5GdW5jdGlvbmAuXG4gIC8vICAqL1xuICAvLyBwdWJsaWMgZ2V0IGN1cnJlbnRWZXJzaW9uKCk6IFZlcnNpb24ge1xuICAvLyAgIGlmICh0aGlzLl9jdXJyZW50VmVyc2lvbikge1xuICAvLyAgICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRWZXJzaW9uO1xuICAvLyAgIH1cblxuICAvLyAgIC8vIGlmICh0aGlzLl93YXJuSWZDdXJyZW50VmVyc2lvbkNhbGxlZCkge1xuICAvLyAgIC8vICAgdGhpcy53YXJuSW52b2tlRnVuY3Rpb25QZXJtaXNzaW9ucyh0aGlzKTtcbiAgLy8gICAvLyB9XG5cbiAgLy8gICB0aGlzLl9jdXJyZW50VmVyc2lvbiA9IG5ldyBWZXJzaW9uKHRoaXMsIFwiQ3VycmVudFZlcnNpb25cIiwge1xuICAvLyAgICAgbGFtYmRhOiB0aGlzLFxuICAvLyAgICAgLi4udGhpcy5jdXJyZW50VmVyc2lvbk9wdGlvbnMsXG4gIC8vICAgfSk7XG5cbiAgLy8gICAvLyBvdmVycmlkZSB0aGUgdmVyc2lvbidzIGxvZ2ljYWwgSUQgd2l0aCBhIGxhenkgc3RyaW5nIHdoaWNoIGluY2x1ZGVzIHRoZVxuICAvLyAgIC8vIGhhc2ggb2YgdGhlIGZ1bmN0aW9uIGl0c2VsZiwgc28gYSBuZXcgdmVyc2lvbiByZXNvdXJjZSBpcyBjcmVhdGVkIHdoZW5cbiAgLy8gICAvLyB0aGUgZnVuY3Rpb24gY29uZmlndXJhdGlvbiBjaGFuZ2VzLlxuICAvLyAgIGNvbnN0IGNmbiA9IHRoaXMuX2N1cnJlbnRWZXJzaW9uLm5vZGUuZGVmYXVsdENoaWxkIGFzIFRlcnJhZm9ybVJlc291cmNlO1xuICAvLyAgIGNvbnN0IG9yaWdpbmFsTG9naWNhbElkID0gdGhpcy5zdGFjay5yZXNvbHZlKGNmbi5sb2dpY2FsSWQpIGFzIHN0cmluZztcblxuICAvLyAgIGNmbi5vdmVycmlkZUxvZ2ljYWxJZChcbiAgLy8gICAgIExhenkuc3RyaW5nVmFsdWUoe1xuICAvLyAgICAgICBwcm9kdWNlOiAoKSA9PiB7XG4gIC8vICAgICAgICAgY29uc3QgaGFzaCA9IGNhbGN1bGF0ZUZ1bmN0aW9uSGFzaCh0aGlzLCB0aGlzLmhhc2hNaXhpbnMuam9pbihcIlwiKSk7XG4gIC8vICAgICAgICAgY29uc3QgbG9naWNhbElkID0gdHJpbUZyb21TdGFydChvcmlnaW5hbExvZ2ljYWxJZCwgMjU1IC0gMzIpO1xuICAvLyAgICAgICAgIHJldHVybiBgJHtsb2dpY2FsSWR9JHtoYXNofWA7XG4gIC8vICAgICAgIH0sXG4gIC8vICAgICB9KSxcbiAgLy8gICApO1xuXG4gIC8vICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRWZXJzaW9uO1xuICAvLyB9XG5cbiAgLyoqXG4gICAqIFRoZSBBUk4ocykgdG8gcHV0IGludG8gdGhlIHJlc291cmNlIGZpZWxkIG9mIHRoZSBnZW5lcmF0ZWQgSUFNIHBvbGljeSBmb3IgZ3JhbnRJbnZva2UoKVxuICAgKi9cbiAgcHVibGljIGdldCByZXNvdXJjZUFybnNGb3JHcmFudEludm9rZSgpIHtcbiAgICAvLyBUT0RPOiBzaG91bGQgdGhpcyBiZSBxdWFsaWZpZWRBcm4gb3IgcXVhbGlmaWVkSW52b2tlQXJuP1xuICAgIC8vIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXdzLzUuNjguMC9kb2NzL3Jlc291cmNlcy9sYW1iZGFfZnVuY3Rpb24jcXVhbGlmaWVkX2FyblxuICAgIHJldHVybiBbdGhpcy5mdW5jdGlvbkFybiwgdGhpcy5mdW5jdGlvblF1YWxpZmllZEludm9rZUFybl07XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIHB1YmxpYyByZWFkb25seSBfbG9nR3JvdXA6IGNsb3Vkd2F0Y2hMb2dHcm91cC5DbG91ZHdhdGNoTG9nR3JvdXA7XG5cbiAgLyoqXG4gICAqIEVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgdGhpcyBmdW5jdGlvblxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGVudmlyb25tZW50OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge307XG5cbiAgcHJpdmF0ZSBfdXJsPzogc3RyaW5nO1xuICAvKipcbiAgICogSFRUUCBFbmRwb2ludCBmb3IgdGhpcyBmdW5jdGlvbiBpZiBkZWZpbmVkLlxuICAgKlxuICAgKiB1c2UgYGFkZEZ1bmN0aW9uVXJsYCB0byBlbmFibGUgRW5kcG9pbnQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHVybCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl91cmw7XG4gIH1cblxuICBwcml2YXRlIF9ldmVudFNvdXJjZXM6IHtcbiAgICBbaWQ6IHN0cmluZ106IGxhbWJkYUV2ZW50U291cmNlTWFwcGluZy5MYW1iZGFFdmVudFNvdXJjZU1hcHBpbmc7XG4gIH0gPSB7fTtcbiAgcHVibGljIGdldCBldmVudFNvdXJjZXMoKTogbGFtYmRhRXZlbnRTb3VyY2VNYXBwaW5nLkxhbWJkYUV2ZW50U291cmNlTWFwcGluZ1tdIHtcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh0aGlzLl9ldmVudFNvdXJjZXMpO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2VjdXJpdHlHcm91cD86IHNlY3VyaXR5R3JvdXAuU2VjdXJpdHlHcm91cDtcbiAgcHVibGljIGdldCBzZWN1cml0eUdyb3VwKCk6IHNlY3VyaXR5R3JvdXAuU2VjdXJpdHlHcm91cCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3NlY3VyaXR5R3JvdXA7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBuYW1lOiBzdHJpbmcsIHByb3BzOiBGdW5jdGlvblByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIG5hbWUsIHByb3BzKTtcblxuICAgIGNvbnN0IHtcbiAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgZW52aXJvbm1lbnQ6IHZhcmlhYmxlcyxcbiAgICAgIGxvZ1JldGVudGlvbkluRGF5cyA9IFJldGVudGlvbkRheXMuT05FX1dFRUssXG4gICAgICBtZW1vcnlTaXplID0gMTI4LFxuICAgICAgdGltZW91dCA9IER1cmF0aW9uLnNlY29uZHMoMyksXG4gICAgICBsYXllcnMsXG4gICAgICByZXNlcnZlZENvbmN1cnJlbnRFeGVjdXRpb25zLFxuICAgIH0gPSBwcm9wcztcblxuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9yIEFSTiBvZiB0aGUgTGFtYmRhIGZ1bmN0aW9uLlxuICAgICAqIGlzIGxpbWl0ZWQgdG8gNjQgY2hhcmFjdGVycyBpbiBsZW5ndGguXG4gICAgICpcbiAgICAgKiBBUk4gUGF0dGVybjogKFthLXpBLVowLTktX10rKSg6KFxcJExBVEVTVHxbYS16QS1aMC05LV9dKykpP1xuICAgICAqL1xuICAgIGNvbnN0IGZ1bmN0aW9uTmFtZSA9XG4gICAgICBwcm9wcy5mdW5jdGlvbk5hbWUgPz9cbiAgICAgIHRoaXMuc3RhY2sudW5pcXVlUmVzb3VyY2VOYW1lUHJlZml4KHRoaXMsIHtcbiAgICAgICAgcHJlZml4OiBwcm9wcy5mdW5jdGlvbk5hbWVQcmVmaXggPz8gdGhpcy5ncmlkVVVJRCArIFwiLVwiLFxuICAgICAgICBhbGxvd2VkU3BlY2lhbENoYXJhY3RlcnM6IFwiK1wiLFxuICAgICAgICBtYXhMZW5ndGg6IDY0LFxuICAgICAgfSk7XG5cbiAgICBpZiAoZnVuY3Rpb25OYW1lICYmICFUb2tlbi5pc1VucmVzb2x2ZWQoZnVuY3Rpb25OYW1lKSkge1xuICAgICAgaWYgKGZ1bmN0aW9uTmFtZS5sZW5ndGggPiA2NCkge1xuICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICAgIGBGdW5jdGlvbiBuYW1lIGNhbiBub3QgYmUgbG9uZ2VyIHRoYW4gNjQgY2hhcmFjdGVycyBidXQgaGFzICR7ZnVuY3Rpb25OYW1lLmxlbmd0aH0gY2hhcmFjdGVycy5gLFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAoIS9eW2EtekEtWjAtOS1fXSskLy50ZXN0KGZ1bmN0aW9uTmFtZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICBgRnVuY3Rpb24gbmFtZSAke2Z1bmN0aW9uTmFtZX0gY2FuIGNvbnRhaW4gb25seSBsZXR0ZXJzLCBudW1iZXJzLCBoeXBoZW5zLCBvciB1bmRlcnNjb3JlcyB3aXRoIG5vIHNwYWNlcy5gLFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGRlc2NyaXB0aW9uICYmICFUb2tlbi5pc1VucmVzb2x2ZWQoZGVzY3JpcHRpb24pKSB7XG4gICAgICBpZiAoZGVzY3JpcHRpb24ubGVuZ3RoID4gMjU2KSB7XG4gICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICAgYEZ1bmN0aW9uIGRlc2NyaXB0aW9uIGNhbiBub3QgYmUgbG9uZ2VyIHRoYW4gMjU2IGNoYXJhY3RlcnMgYnV0IGhhcyAke2Rlc2NyaXB0aW9uLmxlbmd0aH0gY2hhcmFjdGVycy5gLFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgbWFuYWdlZFBvbGljaWVzID0gbmV3IEFycmF5PGlhbS5JTWFuYWdlZFBvbGljeT4oKTtcbiAgICAvLyB0aGUgYXJuIGlzIGluIHRoZSBmb3JtIG9mIC0gYXJuOmF3czppYW06OmF3czpwb2xpY3kvc2VydmljZS1yb2xlL0FXU0xhbWJkYUJhc2ljRXhlY3V0aW9uUm9sZVxuICAgIG1hbmFnZWRQb2xpY2llcy5wdXNoKFxuICAgICAgaWFtLk1hbmFnZWRQb2xpY3kuZnJvbUF3c01hbmFnZWRQb2xpY3lOYW1lKFxuICAgICAgICB0aGlzLFxuICAgICAgICBcIkFXU0xhbWJkYUJhc2ljRXhlY3V0aW9uUm9sZVwiLFxuICAgICAgICBcInNlcnZpY2Utcm9sZS9BV1NMYW1iZGFCYXNpY0V4ZWN1dGlvblJvbGVcIixcbiAgICAgICksXG4gICAgKTtcbiAgICBpZiAocHJvcHMudnBjIHx8IHByb3BzLm5ldHdvcmtDb25maWcpIHtcbiAgICAgIC8vIFBvbGljeSB0aGF0IHdpbGwgaGF2ZSBFTkkgY3JlYXRpb24gcGVybWlzc2lvbnNcbiAgICAgIC8vIG5vdCBzdXJlIGlmIHRpbWUuc2xlZXAgaXMgbmVjZXNzYXJ5P1xuICAgICAgLy8gcmVmOlxuICAgICAgLy8gIC0gaHR0cHM6Ly9naXRodWIuY29tL3B1bHVtaS9wdWx1bWktYXdzL2lzc3Vlcy8yMjYwI2lzc3VlY29tbWVudC0xOTc3NjA2NTA5XG4gICAgICAvLyAgLSBodHRwczovL2dpdGh1Yi5jb20vaGFzaGljb3JwL3RlcnJhZm9ybS1wcm92aWRlci1hd3MvaXNzdWVzLzI5ODI4I2lzc3VlY29tbWVudC0xNjkzMzA3NTAwXG4gICAgICBtYW5hZ2VkUG9saWNpZXMucHVzaChcbiAgICAgICAgaWFtLk1hbmFnZWRQb2xpY3kuZnJvbUF3c01hbmFnZWRQb2xpY3lOYW1lKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgXCJBV1NMYW1iZGFWUENBY2Nlc3NFeGVjdXRpb25Sb2xlXCIsXG4gICAgICAgICAgXCJzZXJ2aWNlLXJvbGUvQVdTTGFtYmRhVlBDQWNjZXNzRXhlY3V0aW9uUm9sZVwiLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBUT0RPOiBBbnkgY29uY2VybiBub3Qgc2NvcGluZyB0aGUgbG9nR3JvdXAgSUFNIFBlcm1pc3Npb25zP1xuICAgIC8vIC5hbGxvdygpXG4gICAgLy8gLnRvQ3JlYXRlTG9nU3RyZWFtKClcbiAgICAvLyAudG9QdXRMb2dFdmVudHMoKVxuICAgIC8vIC5vbihsb2dHcm91cC5hcm4sIGAke2xvZ0dyb3VwLmFybn06bG9nLXN0cmVhbToqYCksXG5cbiAgICB0aGlzLnJvbGUgPVxuICAgICAgcHJvcHMucm9sZSB8fFxuICAgICAgbmV3IGlhbS5Sb2xlKHRoaXMsIFwiU2VydmljZVJvbGVcIiwge1xuICAgICAgICBhc3N1bWVkQnk6IG5ldyBpYW0uU2VydmljZVByaW5jaXBhbChcImxhbWJkYS5hbWF6b25hd3MuY29tXCIpLFxuICAgICAgICBtYW5hZ2VkUG9saWNpZXMsXG4gICAgICB9KTtcbiAgICB0aGlzLmdyYW50UHJpbmNpcGFsID0gdGhpcy5yb2xlO1xuICAgIC8vIFRPRE86IFJlLWFkZCBmaWxlc3lzdGVtIC8gbG9jYWxNb3VudFBhdGggc3VwcG9ydFxuICAgIC8vIHJlZjogZmlsZXN5c3RlbS5jb25maWcucG9saWNpZXMgdG8gYmUgYWRkZWQgdG8gcHJpbmNpcGFsXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2Jsb2IvdjIuMTYwLjAvcGFja2FnZXMvYXdzLWNkay1saWIvYXdzLWxhbWJkYS9saWIvZnVuY3Rpb24udHMjTDk0OS1MOTY1XG5cbiAgICBmb3IgKGNvbnN0IHN0YXRlbWVudCBvZiBwcm9wcy5pbml0aWFsUG9saWN5IHx8IFtdKSB7XG4gICAgICB0aGlzLnJvbGUuYWRkVG9QcmluY2lwYWxQb2xpY3koc3RhdGVtZW50KTtcbiAgICB9XG5cbiAgICAvLyBNdXN0IHNldCBydW50aW1lIHByb3BlcnR5IHVzZWQgYnkgYmluZFxuICAgIHRoaXMucnVudGltZSA9IHByb3BzLnJ1bnRpbWU7XG4gICAgY29uc3QgY29kZSA9IHByb3BzLmNvZGUuYmluZCh0aGlzKTtcbiAgICB2ZXJpZnlDb2RlQ29uZmlnKGNvZGUsIHByb3BzKTtcblxuICAgIC8vIGFkZCBzdXBwb3J0IGZvciBBV1NfQ09ERUdVUlUgUHJvZmlsZSBlbnYgdmFyaWFibGVzLi4uXG4gICAgY29uc3QgZW52ID0gdmFyaWFibGVzIHx8IHt9O1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGVudikpIHtcbiAgICAgIHRoaXMuYWRkRW52aXJvbm1lbnQoa2V5LCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgLy8gRExRIGNhbiBiZSBlaXRoZXIgc25zLklUb3BpYyBvciBzcXMuSVF1ZXVlXG4gICAgY29uc3QgZGxxVG9waWNPclF1ZXVlID0gdGhpcy5idWlsZERlYWRMZXR0ZXJRdWV1ZShwcm9wcyk7XG4gICAgaWYgKGRscVRvcGljT3JRdWV1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAodGhpcy5pc1F1ZXVlKGRscVRvcGljT3JRdWV1ZSkpIHtcbiAgICAgICAgdGhpcy5kZWFkTGV0dGVyUXVldWUgPSBkbHFUb3BpY09yUXVldWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJEZWFkTGV0dGVyVG9waWMgaXMgbm90IHN1cHBvcnRlZCB5ZXRcIik7XG4gICAgICAgIC8vIHRoaXMuZGVhZExldHRlclRvcGljID0gZGxxVG9waWNPclF1ZXVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGxvZ0dyb3VwID0gbmV3IGNsb3Vkd2F0Y2hMb2dHcm91cC5DbG91ZHdhdGNoTG9nR3JvdXAoXG4gICAgICB0aGlzLFxuICAgICAgXCJMb2dHcm91cFwiLFxuICAgICAge1xuICAgICAgICBuYW1lOiBgL2F3cy9sYW1iZGEvJHtmdW5jdGlvbk5hbWV9YCxcbiAgICAgICAgcmV0ZW50aW9uSW5EYXlzOiBsb2dSZXRlbnRpb25JbkRheXMsXG4gICAgICB9LFxuICAgICk7XG4gICAgdGhpcy5fbG9nR3JvdXAgPSBsb2dHcm91cDtcbiAgICB0aGlzLnJlc291cmNlID0gbmV3IGxhbWJkYUZ1bmN0aW9uLkxhbWJkYUZ1bmN0aW9uKHRoaXMsIFwiUmVzb3VyY2VcIiwge1xuICAgICAgZnVuY3Rpb25OYW1lLFxuICAgICAgZGVzY3JpcHRpb24sXG4gICAgICAvLyBOT1RFOiBmb3IgdGhlIHVuZGVybGF5aW5nIHJlc291cmNlLCBFeGFjdGx5IG9uZSBvZiBmaWxlbmFtZSwgaW1hZ2VfdXJpLCBvciBzM19idWNrZXQgbXVzdCBiZSBzcGVjaWZpZWRcbiAgICAgIHMzQnVja2V0OiBjb2RlLnMzTG9jYXRpb24gJiYgY29kZS5zM0xvY2F0aW9uLmJ1Y2tldE5hbWUsXG4gICAgICBzM0tleTogY29kZS5zM0xvY2F0aW9uICYmIGNvZGUuczNMb2NhdGlvbi5vYmplY3RLZXksXG4gICAgICBzM09iamVjdFZlcnNpb246IGNvZGUuczNMb2NhdGlvbiAmJiBjb2RlLnMzTG9jYXRpb24ub2JqZWN0VmVyc2lvbixcbiAgICAgIGZpbGVuYW1lOiBjb2RlLmlubGluZUNvZGUsXG4gICAgICBzb3VyY2VDb2RlSGFzaDogY29kZS5zb3VyY2VDb2RlSGFzaCxcbiAgICAgIGltYWdlVXJpOiBjb2RlLmltYWdlPy5pbWFnZVVyaSxcbiAgICAgIGxheWVycywgLy8gVE9ETzogU3VwcG9ydCBJTGF5ZXIgd2l0aCBMYXp5IGxpc3Qgb2YgYXJuc1xuICAgICAgaGFuZGxlcjogcHJvcHMuaGFuZGxlciA9PT0gSGFuZGxlci5GUk9NX0lNQUdFID8gdW5kZWZpbmVkIDogcHJvcHMuaGFuZGxlcixcbiAgICAgIHRpbWVvdXQ6IHRpbWVvdXQudG9TZWNvbmRzKCksXG4gICAgICBwYWNrYWdlVHlwZTogcHJvcHMucnVudGltZSA9PT0gUnVudGltZS5GUk9NX0lNQUdFID8gXCJJbWFnZVwiIDogdW5kZWZpbmVkLFxuICAgICAgcnVudGltZTpcbiAgICAgICAgcHJvcHMucnVudGltZSA9PT0gUnVudGltZS5GUk9NX0lNQUdFID8gdW5kZWZpbmVkIDogcHJvcHMucnVudGltZS5uYW1lLFxuICAgICAgLy8gLy8gU291cmNlIENvZGUgS01TIG5vdCBzdXBwb3J0ZWQgYnkgVGVycmFmb3JtIHByb3ZpZGVyP1xuICAgICAgLy8gLy8gc2VlOiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTQ2xvdWRGb3JtYXRpb24vbGF0ZXN0L1RlbXBsYXRlUmVmZXJlbmNlL2F3cy1wcm9wZXJ0aWVzLWxhbWJkYS1mdW5jdGlvbi1jb2RlLmh0bWwjY2ZuLWxhbWJkYS1mdW5jdGlvbi1jb2RlLXNvdXJjZWttc2tleWFyblxuICAgICAgLy8gc291cmNlS21zS2V5QXJuOiBjb2RlLnNvdXJjZUtNU0tleUFybixcbiAgICAgIHJvbGU6IHRoaXMucm9sZS5yb2xlQXJuLFxuICAgICAgLy8gVE9ETzogQ0RLIFNvcnRzIGVudmlyb25tZW50IHRvIG1hdGNoIExhbWJkYSBIYXNoIGJlaGF2aW91clxuICAgICAgLy8gVE9ETzogRG8gbm90IHNldCB0aGlzIGF0IGFsbCBpZiBubyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIHNldCAoQ29tcGxleExpc3QgY2FuJ3QgYmUgSVJlc29sdmFibGUpXG4gICAgICAvLyByZWY6IGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9ibG9iL3YyLjE1Ni4wL3BhY2thZ2VzL2F3cy1jZGstbGliL2F3cy1sYW1iZGEvbGliL2Z1bmN0aW9uLnRzI0wxNDY3XG4gICAgICBlbnZpcm9ubWVudDoge1xuICAgICAgICB2YXJpYWJsZXM6IExhenkuYW55VmFsdWUoe1xuICAgICAgICAgIHByb2R1Y2U6IChfY29udGV4dDogSVJlc29sdmVDb250ZXh0KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lbnZpcm9ubWVudDtcbiAgICAgICAgICB9LFxuICAgICAgICB9KSBhcyBhbnksXG4gICAgICB9LFxuICAgICAgbWVtb3J5U2l6ZSxcbiAgICAgIC8vIFRPRE86IHJlLWFkZCBlcGhlbWVyYWxTdG9yYWdlXG4gICAgICB2cGNDb25maWc6XG4gICAgICAgIHRoaXMucGFyc2VWcGNDb25maWcocHJvcHMubmV0d29ya0NvbmZpZykgPz8gdGhpcy5jb25maWd1cmVWcGMocHJvcHMpLFxuICAgICAgZGVhZExldHRlckNvbmZpZzogdGhpcy5wYXJzZURlYWRMZXR0ZXJDb25maWcoZGxxVG9waWNPclF1ZXVlKSxcbiAgICAgIHJlc2VydmVkQ29uY3VycmVudEV4ZWN1dGlvbnMsXG4gICAgICBpbWFnZUNvbmZpZzogdW5kZWZpbmVkSWZOb0tleXMoe1xuICAgICAgICBjb21tYW5kOiBjb2RlLmltYWdlPy5jbWQsXG4gICAgICAgIGVudHJ5UG9pbnQ6IGNvZGUuaW1hZ2U/LmVudHJ5cG9pbnQsXG4gICAgICAgIHdvcmtpbmdEaXJlY3Rvcnk6IGNvZGUuaW1hZ2U/LndvcmtpbmdEaXJlY3RvcnksXG4gICAgICB9KSxcbiAgICAgIC8vIFRPRE86IHJlLWFkZCBrbXNLZXlBcm4gZm9yIGVudmlyb25tZW50IGVuY3J5cHRpb25cbiAgICAgIC8vIFRPRE86IHJlLWFkZCBmaWxlU3lzdGVtQ29uZmlncyBmb3IgRUZTIHN1cHBvcnQsXG4gICAgICAvLyBUT0RPOiByZS1hZGQgY29kZVNpZ25pbmdDb25maWdBcm5cbiAgICAgIGFyY2hpdGVjdHVyZXM6IFtcbiAgICAgICAgLy8gVGhpcyBpcyBhbiBhcnJheSwgYnV0IG1heGltdW0gbGVuZ3RoIGlzIDEhXG4gICAgICAgIC8vIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVXNlckd1aWRlL2F3cy1yZXNvdXJjZS1sYW1iZGEtZnVuY3Rpb24uaHRtbCNjZm4tbGFtYmRhLWZ1bmN0aW9uLWFyY2hpdGVjdHVyZXNcbiAgICAgICAgcHJvcHMuYXJjaGl0ZWN0dXJlPy50b1N0cmluZygpID8/IEFyY2hpdGVjdHVyZS5YODZfNjQudG9TdHJpbmcoKSxcbiAgICAgIF0sXG4gICAgICAvLyBUT0RPOiByZS1hZGQgcnVudGltZU1hbmFnZW1lbnRDb25maWdcbiAgICAgIC8vIFRPRE86IHJlLWFkZCBzbmFwU3RhcnRcbiAgICAgIGxvZ2dpbmdDb25maWc6IHRoaXMuZ2V0TG9nZ2luZ0NvbmZpZyh0aGlzLl9sb2dHcm91cC5uYW1lLCBwcm9wcyksXG4gICAgICAvLyBUT0RPOiByZS1hZGQgcmVjdXJzaXZlTG9vcCBkZXRlY3Rpb25cbiAgICAgIHRyYWNpbmdDb25maWc6IHRoaXMucGFyc2VUcmFjaW5nQ29uZmlnKHByb3BzLnRyYWNpbmcgPz8gVHJhY2luZy5BQ1RJVkUpLFxuICAgICAgcHVibGlzaDogcHJvcHMucHVibGlzaCxcbiAgICAgIC8vIFRPRE86IHVzZSBsb2dHcm91cC5ub2RlLmFkZERlcGVuZGVuY3kgd2hlbiBsb2dHcm91cCBpcyBpbXBsZW1lbnRlZFxuICAgICAgZGVwZW5kc09uOiBbbG9nR3JvdXBdLFxuICAgIH0pO1xuICAgIC8vIE5PVEU6IFNob3VsZCB0aGlzIGJlIGZ1bmN0aW9uTmFtZSBpbnB1dCBpbnN0ZWFkIG9mIFRPS0VOP1xuICAgIHRoaXMuZnVuY3Rpb25OYW1lID0gdGhpcy5yZXNvdXJjZS5mdW5jdGlvbk5hbWU7XG5cbiAgICAvLyBtYWtlIHN1cmUgYW55IHJvbGUgYXR0YWNobWVudHMgYXJlIGFkZGVkIGFzIGRlcGVuZGVuY2llcyBmb3IgdGhpcyBsYW1iZGFcbiAgICAvLyB0aGlzIGFjaGlldmVkIGJ5IHRoZSBDREtURiBBc3BlY3Qgb24gdGhlIHBhcmVudCBTdGFja0Jhc2VcbiAgICB0aGlzLnJlc291cmNlLm5vZGUuYWRkRGVwZW5kZW5jeSh0aGlzLnJvbGUpO1xuXG4gICAgdGhpcy50aW1lb3V0ID0gcHJvcHMudGltZW91dDtcblxuICAgIHRoaXMuYXJjaGl0ZWN0dXJlID0gcHJvcHMuYXJjaGl0ZWN0dXJlID8/IEFyY2hpdGVjdHVyZS5YODZfNjQ7XG5cbiAgICAvLyBUT0RPOiBBZGQgYXdzX2xhbWJkYV9wcm92aXNpb25lZF9jb25jdXJyZW5jeV9jb25maWdcblxuICAgIGZvciAoY29uc3QgZXZlbnQgb2YgcHJvcHMuZXZlbnRzIHx8IFtdKSB7XG4gICAgICB0aGlzLmFkZEV2ZW50U291cmNlKGV2ZW50KTtcbiAgICB9XG5cbiAgICAvLyAvLyBUT0RPOiBwZW5kaW5nIGN1c3RvbSBDTEkgdG8gbW9jayBMYW1iZGEgZnVuY3Rpb24gaW52b2NhdGlvbnMgbG9jYWxseVxuICAgIC8vIHByb3BzLmNvZGUuYmluZFRvUmVzb3VyY2UodGhpcyk7XG5cbiAgICAvLyBFdmVudCBJbnZva2UgQ29uZmlnXG4gICAgaWYgKFxuICAgICAgcHJvcHMub25GYWlsdXJlIHx8XG4gICAgICBwcm9wcy5vblN1Y2Nlc3MgfHxcbiAgICAgIHByb3BzLm1heEV2ZW50QWdlIHx8XG4gICAgICBwcm9wcy5yZXRyeUF0dGVtcHRzICE9PSB1bmRlZmluZWRcbiAgICApIHtcbiAgICAgIHRoaXMuY29uZmlndXJlQXN5bmNJbnZva2Uoe1xuICAgICAgICBvbkZhaWx1cmU6IHByb3BzLm9uRmFpbHVyZSxcbiAgICAgICAgb25TdWNjZXNzOiBwcm9wcy5vblN1Y2Nlc3MsXG4gICAgICAgIG1heEV2ZW50QWdlOiBwcm9wcy5tYXhFdmVudEFnZSxcbiAgICAgICAgcmV0cnlBdHRlbXB0czogcHJvcHMucmV0cnlBdHRlbXB0cyxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuX291dHB1dHMgPSB7XG4gICAgICBuYW1lOiB0aGlzLmZ1bmN0aW9uTmFtZSxcbiAgICAgIGFybjogdGhpcy5yZXNvdXJjZS5hcm4sXG4gICAgICByb2xlQXJuOiB0aGlzLnJvbGUucm9sZUFybixcbiAgICAgIC8vIG9ubHkga25vd24gYXQgc3ludGggdGltZVxuICAgICAgLy8gZXhwbGljaXQgYG51bGxgIHJlcXVpcmVkIHRvIGF2b2lkIHN5bnRheCBlcnJvcnMgd2hlbiB1c2luZyBzdHJpbmdWYWx1ZSAmJiBcInVuZGVmaW5lZFwiXG4gICAgICB1cmw6IExhenkuYW55VmFsdWUoe1xuICAgICAgICBwcm9kdWNlOiAoKSA9PiB0aGlzLl91cmwgPz8gbnVsbCxcbiAgICAgIH0pLFxuICAgICAgZGVmYXVsdFNlY3VyaXR5R3JvdXA6IExhenkuYW55VmFsdWUoe1xuICAgICAgICBwcm9kdWNlOiAoKSA9PiB0aGlzLl9zZWN1cml0eUdyb3VwPy5pZCA/PyBudWxsLFxuICAgICAgfSksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGFuIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIHRoaXMgTGFtYmRhIGZ1bmN0aW9uLlxuICAgKiBJZiB0aGlzIGlzIGEgcmVmIHRvIGEgTGFtYmRhIGZ1bmN0aW9uLCB0aGlzIG9wZXJhdGlvbiByZXN1bHRzIGluIGEgbm8tb3AuXG4gICAqIEBwYXJhbSBrZXkgVGhlIGVudmlyb25tZW50IHZhcmlhYmxlIGtleS5cbiAgICogQHBhcmFtIHZhbHVlIFRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSdzIHZhbHVlLlxuICAgKi9cbiAgcHVibGljIGFkZEVudmlyb25tZW50KGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogSUZ1bmN0aW9uIHtcbiAgICAvLyBSZXNlcnZlZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgd2lsbCBmYWlsIGR1cmluZyBjbG91ZGZvcm1hdGlvbiBkZXBsb3kgaWYgdGhleSdyZSBzZXQuXG4gICAgLy8gVGhpcyBjaGVjayBpcyBqdXN0IHRvIGFsbG93IENESyB0byBmYWlsIGZhc3RlciB3aGVuIHRoZXNlIGFyZSBzcGVjaWZpZWQuXG4gICAgY29uc3QgcmVzZXJ2ZWRFbnZpcm9ubWVudFZhcmlhYmxlcyA9IFtcbiAgICAgIFwiX0hBTkRMRVJcIixcbiAgICAgIFwiX1hfQU1aTl9UUkFDRV9JRFwiLFxuICAgICAgXCJBV1NfREVGQVVMVF9SRUdJT05cIixcbiAgICAgIFwiQVdTX1JFR0lPTlwiLFxuICAgICAgXCJBV1NfRVhFQ1VUSU9OX0VOVlwiLFxuICAgICAgXCJBV1NfTEFNQkRBX0ZVTkNUSU9OX05BTUVcIixcbiAgICAgIFwiQVdTX0xBTUJEQV9GVU5DVElPTl9NRU1PUllfU0laRVwiLFxuICAgICAgXCJBV1NfTEFNQkRBX0ZVTkNUSU9OX1ZFUlNJT05cIixcbiAgICAgIFwiQVdTX0xBTUJEQV9JTklUSUFMSVpBVElPTl9UWVBFXCIsXG4gICAgICBcIkFXU19MQU1CREFfTE9HX0dST1VQX05BTUVcIixcbiAgICAgIFwiQVdTX0xBTUJEQV9MT0dfU1RSRUFNX05BTUVcIixcbiAgICAgIFwiQVdTX0FDQ0VTU19LRVlcIixcbiAgICAgIFwiQVdTX0FDQ0VTU19LRVlfSURcIixcbiAgICAgIFwiQVdTX1NFQ1JFVF9BQ0NFU1NfS0VZXCIsXG4gICAgICBcIkFXU19TRVNTSU9OX1RPS0VOXCIsXG4gICAgICBcIkFXU19MQU1CREFfUlVOVElNRV9BUElcIixcbiAgICAgIFwiTEFNQkRBX1RBU0tfUk9PVFwiLFxuICAgICAgXCJMQU1CREFfUlVOVElNRV9ESVJcIixcbiAgICBdO1xuICAgIGlmIChyZXNlcnZlZEVudmlyb25tZW50VmFyaWFibGVzLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIGAke2tleX0gZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgcmVzZXJ2ZWQgYnkgdGhlIGxhbWJkYSBydW50aW1lIGFuZCBjYW4gbm90IGJlIHNldCBtYW51YWxseS4gU2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9sYW1iZGEvbGF0ZXN0L2RnL2NvbmZpZ3VyYXRpb24tZW52dmFycy5odG1sYCxcbiAgICAgICAgdGhpcyxcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMuZW52aXJvbm1lbnRba2V5XSA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgcHVibGljIGFkZEZ1bmN0aW9uVXJsKG9wdGlvbnM/OiBGdW5jdGlvblVybE9wdGlvbnMpOiBGdW5jdGlvblVybCB7XG4gICAgY29uc3QgZW5kcG9pbnQgPSBzdXBlci5hZGRGdW5jdGlvblVybChvcHRpb25zKTtcbiAgICB0aGlzLl91cmwgPSBlbmRwb2ludC51cmw7XG4gICAgcmV0dXJuIGVuZHBvaW50O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBMb2dnaW5nIENvbmZpZyBwcm9wZXR5IGZvciB0aGUgZnVuY3Rpb24uXG4gICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGZ1bmN0aW9uIExvZ2dpbmdDb25maWcgUHJvcGVydHkgaWYgdGhlIHByb3BlcnR5IGlzIHNldCBvbiB0aGVcbiAgICogZnVuY3Rpb24gYW5kIHVuZGVmaW5lZCBpZiBub3QuXG4gICAqL1xuICBwcml2YXRlIGdldExvZ2dpbmdDb25maWcoXG4gICAgbG9nR3JvdXBOYW1lOiBzdHJpbmcsXG4gICAgcHJvcHM6IEZ1bmN0aW9uUHJvcHMsXG4gICk6IGxhbWJkYUZ1bmN0aW9uLkxhbWJkYUZ1bmN0aW9uTG9nZ2luZ0NvbmZpZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHByb3BzLmFwcGxpY2F0aW9uTG9nTGV2ZWwgfHwgcHJvcHMuc3lzdGVtTG9nTGV2ZWwpIHtcbiAgICAgIGlmIChwcm9wcy5sb2dnaW5nRm9ybWF0ICE9PSBMb2dnaW5nRm9ybWF0LkpTT04pIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICBgVG8gdXNlIEFwcGxpY2F0aW9uTG9nTGV2ZWwgYW5kL29yIFN5c3RlbUxvZ0xldmVsIHlvdSBtdXN0IHNldCBMb2dnaW5nRm9ybWF0IHRvICcke0xvZ2dpbmdGb3JtYXQuSlNPTn0nLCBnb3QgJyR7cHJvcHMubG9nZ2luZ0Zvcm1hdH0nLmAsXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgbG9nZ2luZ0NvbmZpZzogbGFtYmRhRnVuY3Rpb24uTGFtYmRhRnVuY3Rpb25Mb2dnaW5nQ29uZmlnO1xuICAgIGlmIChwcm9wcy5sb2dnaW5nRm9ybWF0KSB7XG4gICAgICBsb2dnaW5nQ29uZmlnID0ge1xuICAgICAgICBsb2dGb3JtYXQ6IHByb3BzLmxvZ2dpbmdGb3JtYXQsXG4gICAgICAgIHN5c3RlbUxvZ0xldmVsOiBwcm9wcy5zeXN0ZW1Mb2dMZXZlbCxcbiAgICAgICAgYXBwbGljYXRpb25Mb2dMZXZlbDogcHJvcHMuYXBwbGljYXRpb25Mb2dMZXZlbCxcbiAgICAgICAgbG9nR3JvdXA6IGxvZ0dyb3VwTmFtZSxcbiAgICAgIH07XG4gICAgICByZXR1cm4gbG9nZ2luZ0NvbmZpZztcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZpbmVzIGFuIGFsaWFzIGZvciB0aGlzIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBUaGUgYWxpYXMgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIHVwZGF0ZWQgdG8gcG9pbnQgdG8gdGhlIGxhdGVzdCB2ZXJzaW9uIG9mXG4gICAqIHRoZSBmdW5jdGlvbiBhcyBpdCBpcyBiZWluZyB1cGRhdGVkIGR1cmluZyBhIGRlcGxveW1lbnQuXG4gICAqXG4gICAqIGBgYHRzXG4gICAqIGRlY2xhcmUgY29uc3QgZm46IGNvbXB1dGUuTGFtYmRhRnVuY3Rpb247XG4gICAqXG4gICAqIGZuLmFkZEFsaWFzKCdMaXZlJyk7XG4gICAqXG4gICAqIC8vIElzIGVxdWl2YWxlbnQgdG9cbiAgICpcbiAgICogbmV3IGNvbXB1dGUuQWxpYXModGhpcywgJ0FsaWFzTGl2ZScsIHtcbiAgICogICBhbGlhc05hbWU6ICdMaXZlJyxcbiAgICogICB2ZXJzaW9uOiBmbi52ZXJzaW9uLFxuICAgKiB9KTtcbiAgICogYGBgXG4gICAqXG4gICAqIEBwYXJhbSBhbGlhc05hbWUgVGhlIG5hbWUgb2YgdGhlIGFsaWFzXG4gICAqIEBwYXJhbSBvcHRpb25zIEFsaWFzIG9wdGlvbnNcbiAgICovXG4gIHB1YmxpYyBhZGRBbGlhcyhhbGlhc05hbWU6IHN0cmluZywgb3B0aW9ucz86IEFsaWFzT3B0aW9ucyk6IEFsaWFzIHtcbiAgICByZXR1cm4gYWRkQWxpYXModGhpcywgdGhpcywgdGhpcy52ZXJzaW9uLCBhbGlhc05hbWUsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsbHkgY3JlYXRlIExhbWJkYUZ1bmN0aW9uVnBjQ29uZmlnXG4gICAqL1xuICBwcml2YXRlIHBhcnNlVnBjQ29uZmlnKFxuICAgIGNvbmZpZz86IFZwY0NvbmZpZyxcbiAgKTogbGFtYmRhRnVuY3Rpb24uTGFtYmRhRnVuY3Rpb25WcGNDb25maWcgfCB1bmRlZmluZWQge1xuICAgIGlmICghY29uZmlnKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBsZXQgc2VjdXJpdHlHcm91cElkcyA9IGNvbmZpZy5zZWN1cml0eUdyb3VwSWRzO1xuICAgIGlmICghc2VjdXJpdHlHcm91cElkcykge1xuICAgICAgdGhpcy5fc2VjdXJpdHlHcm91cCA9IG5ldyBzZWN1cml0eUdyb3VwLlNlY3VyaXR5R3JvdXAoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIFwiU2VjdXJpdHlHcm91cFwiLFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogdGhpcy5mdW5jdGlvbk5hbWUsXG4gICAgICAgICAgZGVzY3JpcHRpb246IHRoaXMuZnVuY3Rpb25OYW1lLFxuICAgICAgICAgIHZwY0lkOiBjb25maWcudnBjSWQsXG5cbiAgICAgICAgICBlZ3Jlc3M6IGNvbmZpZy5lZ3Jlc3MgPz8gW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBmcm9tUG9ydDogMCxcbiAgICAgICAgICAgICAgdG9Qb3J0OiAwLFxuICAgICAgICAgICAgICBwcm90b2NvbDogXCItMVwiLFxuICAgICAgICAgICAgICBjaWRyQmxvY2tzOiBbXCIwLjAuMC4wLzBcIl0sXG4gICAgICAgICAgICAgIGlwdjZDaWRyQmxvY2tzOiBbXCI6Oi8wXCJdLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICAgIHNlY3VyaXR5R3JvdXBJZHMgPSBbdGhpcy5fc2VjdXJpdHlHcm91cC5pZF07XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBzdWJuZXRJZHM6IGNvbmZpZy5zdWJuZXRJZHMsXG4gICAgICBpcHY2QWxsb3dlZEZvckR1YWxTdGFjazogY29uZmlnLmlwdjZBbGxvd2VkRm9yRHVhbFN0YWNrLFxuICAgICAgc2VjdXJpdHlHcm91cElkcyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIElmIGNvbmZpZ3VyZWQsIHNldCB1cCB0aGUgVlBDLXJlbGF0ZWQgcHJvcGVydGllc1xuICAgKlxuICAgKiBSZXR1cm5zIHRoZSBWcGNDb25maWcgdGhhdCBzaG91bGQgYmUgYWRkZWQgdG8gdGhlXG4gICAqIExhbWJkYSBjcmVhdGlvbiBwcm9wZXJ0aWVzLlxuICAgKi9cbiAgcHJpdmF0ZSBjb25maWd1cmVWcGMoXG4gICAgcHJvcHM6IEZ1bmN0aW9uUHJvcHMsXG4gICk6IGxhbWJkYUZ1bmN0aW9uLkxhbWJkYUZ1bmN0aW9uVnBjQ29uZmlnIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBoYXNTZWN1cml0eUdyb3VwcyA9XG4gICAgICBwcm9wcy5zZWN1cml0eUdyb3VwcyAmJiBwcm9wcy5zZWN1cml0eUdyb3Vwcy5sZW5ndGggPiAwO1xuICAgIGlmICghcHJvcHMudnBjKSB7XG4gICAgICBpZiAocHJvcHMuYWxsb3dBbGxPdXRib3VuZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICAgXCJDYW5ub3QgY29uZmlndXJlICdhbGxvd0FsbE91dGJvdW5kJyB3aXRob3V0IGNvbmZpZ3VyaW5nIGEgVlBDXCIsXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChoYXNTZWN1cml0eUdyb3Vwcykge1xuICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICAgIFwiQ2Fubm90IGNvbmZpZ3VyZSAnc2VjdXJpdHlHcm91cHMnIHdpdGhvdXQgY29uZmlndXJpbmcgYSBWUENcIixcbiAgICAgICAgICB0aGlzLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKHByb3BzLnZwY1N1Ym5ldHMpIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICBcIkNhbm5vdCBjb25maWd1cmUgJ3ZwY1N1Ym5ldHMnIHdpdGhvdXQgY29uZmlndXJpbmcgYSBWUENcIixcbiAgICAgICAgICB0aGlzLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKHByb3BzLmlwdjZBbGxvd2VkRm9yRHVhbFN0YWNrKSB7XG4gICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICAgXCJDYW5ub3QgY29uZmlndXJlICdpcHY2QWxsb3dlZEZvckR1YWxTdGFjaycgd2l0aG91dCBjb25maWd1cmluZyBhIFZQQ1wiLFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAocHJvcHMuYWxsb3dBbGxJcHY2T3V0Ym91bmQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICAgIFwiQ2Fubm90IGNvbmZpZ3VyZSAnYWxsb3dBbGxJcHY2T3V0Ym91bmQnIHdpdGhvdXQgY29uZmlndXJpbmcgYSBWUENcIixcbiAgICAgICAgICB0aGlzLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpZiAocHJvcHMuYWxsb3dBbGxPdXRib3VuZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoaGFzU2VjdXJpdHlHcm91cHMpIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICBcIkNvbmZpZ3VyZSAnYWxsb3dBbGxPdXRib3VuZCcgZGlyZWN0bHkgb24gdGhlIHN1cHBsaWVkIFNlY3VyaXR5R3JvdXBzLlwiLFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHByb3BzLmFsbG93QWxsSXB2Nk91dGJvdW5kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChoYXNTZWN1cml0eUdyb3Vwcykge1xuICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICAgIFwiQ29uZmlndXJlICdhbGxvd0FsbElwdjZPdXRib3VuZCcgZGlyZWN0bHkgb24gdGhlIHN1cHBsaWVkIFNlY3VyaXR5R3JvdXBzLlwiLFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IHNlY3VyaXR5R3JvdXBzOiBJU2VjdXJpdHlHcm91cFtdO1xuXG4gICAgaWYgKGhhc1NlY3VyaXR5R3JvdXBzKSB7XG4gICAgICBzZWN1cml0eUdyb3VwcyA9IHByb3BzLnNlY3VyaXR5R3JvdXBzO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBzZWNHcm91cCA9IG5ldyBTZWN1cml0eUdyb3VwKHRoaXMsIFwiU2VjdXJpdHlHcm91cFwiLCB7XG4gICAgICAgIHZwYzogcHJvcHMudnBjLFxuICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICBcIkF1dG9tYXRpYyBzZWN1cml0eSBncm91cCBmb3IgTGFtYmRhIEZ1bmN0aW9uIFwiICtcbiAgICAgICAgICBBd3NTdGFjay51bmlxdWVJZCh0aGlzKSxcbiAgICAgICAgYWxsb3dBbGxPdXRib3VuZDogcHJvcHMuYWxsb3dBbGxPdXRib3VuZCxcbiAgICAgICAgYWxsb3dBbGxJcHY2T3V0Ym91bmQ6IHByb3BzLmFsbG93QWxsSXB2Nk91dGJvdW5kLFxuICAgICAgfSk7XG4gICAgICBzZWN1cml0eUdyb3VwcyA9IFtzZWNHcm91cF07XG4gICAgfVxuXG4gICAgdGhpcy5fY29ubmVjdGlvbnMgPSBuZXcgQ29ubmVjdGlvbnMoeyBzZWN1cml0eUdyb3VwcyB9KTtcblxuICAgIC8vIFRPRE86IGFkZCB3aGVuIGZpbGVzeXN0ZW0gY29uZmlnIGlzIGJhY2tcbiAgICAvLyBpZiAocHJvcHMuZmlsZXN5c3RlbSkge1xuICAgIC8vICAgaWYgKHByb3BzLmZpbGVzeXN0ZW0uY29uZmlnLmNvbm5lY3Rpb25zKSB7XG4gICAgLy8gICAgIHRoaXMuY29ubmVjdGlvbnMuYWxsb3dUbyhcbiAgICAvLyAgICAgICBwcm9wcy5maWxlc3lzdGVtLmNvbmZpZy5jb25uZWN0aW9ucyxcbiAgICAvLyAgICAgICBwcm9wcy5maWxlc3lzdGVtLmNvbmZpZy5jb25uZWN0aW9ucy5kZWZhdWx0UG9ydCA/P1xuICAgIC8vICAgICAgICAgUG9ydC50Y3AoRmlsZVN5c3RlbS5ERUZBVUxUX1BPUlQpLFxuICAgIC8vICAgICApO1xuICAgIC8vICAgfVxuICAgIC8vIH1cblxuICAgIGNvbnN0IGlwdjZBbGxvd2VkRm9yRHVhbFN0YWNrID0gcHJvcHMuaXB2NkFsbG93ZWRGb3JEdWFsU3RhY2s7XG4gICAgY29uc3QgYWxsb3dQdWJsaWNTdWJuZXQgPSBwcm9wcy5hbGxvd1B1YmxpY1N1Ym5ldCA/PyBmYWxzZTtcbiAgICBjb25zdCBzZWxlY3RlZFN1Ym5ldHMgPSBwcm9wcy52cGMuc2VsZWN0U3VibmV0cyhwcm9wcy52cGNTdWJuZXRzKTtcbiAgICBjb25zdCBwdWJsaWNTdWJuZXRJZHMgPSBuZXcgU2V0KFxuICAgICAgcHJvcHMudnBjLnB1YmxpY1N1Ym5ldHMubWFwKChzKSA9PiBzLnN1Ym5ldElkKSxcbiAgICApO1xuICAgIGZvciAoY29uc3Qgc3VibmV0SWQgb2Ygc2VsZWN0ZWRTdWJuZXRzLnN1Ym5ldElkcykge1xuICAgICAgaWYgKHB1YmxpY1N1Ym5ldElkcy5oYXMoc3VibmV0SWQpICYmICFhbGxvd1B1YmxpY1N1Ym5ldCkge1xuICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICAgIFwiTGFtYmRhIEZ1bmN0aW9ucyBpbiBhIHB1YmxpYyBzdWJuZXQgY2FuIE5PVCBhY2Nlc3MgdGhlIGludGVybmV0LiBcIiArXG4gICAgICAgICAgICBcIklmIHlvdSBhcmUgYXdhcmUgb2YgdGhpcyBsaW1pdGF0aW9uIGFuZCB3b3VsZCBzdGlsbCBsaWtlIHRvIHBsYWNlIHRoZSBmdW5jdGlvbiBpbiBhIHB1YmxpYyBzdWJuZXQsIHNldCBgYWxsb3dQdWJsaWNTdWJuZXRgIHRvIHRydWVcIixcbiAgICAgICAgICB0aGlzLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLm5vZGUuYWRkRGVwZW5kZW5jeShzZWxlY3RlZFN1Ym5ldHMuaW50ZXJuZXRDb25uZWN0aXZpdHlFc3RhYmxpc2hlZCk7XG5cbiAgICAvLyBMaXN0IGNhbid0IGJlIGVtcHR5IGhlcmUsIGlmIHdlIGdvdCB0aGlzIGZhciB5b3UgaW50ZW5kZWQgdG8gcHV0IHlvdXIgTGFtYmRhXG4gICAgLy8gaW4gc3VibmV0cy4gV2UncmUgZ29pbmcgdG8gZ3VhcmFudGVlIHRoYXQgd2UgZ2V0IHRoZSBuaWNlIGVycm9yIG1lc3NhZ2UgYnlcbiAgICAvLyBtYWtpbmcgVnBjTmV0d29yayBkbyB0aGUgc2VsZWN0aW9uIGFnYWluLlxuICAgIGlmIChwcm9wcy5pcHY2QWxsb3dlZEZvckR1YWxTdGFjayAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBpcHY2QWxsb3dlZEZvckR1YWxTdGFjazogaXB2NkFsbG93ZWRGb3JEdWFsU3RhY2ssXG4gICAgICAgIHN1Ym5ldElkczogc2VsZWN0ZWRTdWJuZXRzLnN1Ym5ldElkcyxcbiAgICAgICAgc2VjdXJpdHlHcm91cElkczogc2VjdXJpdHlHcm91cHMubWFwKChzZykgPT4gc2cuc2VjdXJpdHlHcm91cElkKSxcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Ym5ldElkczogc2VsZWN0ZWRTdWJuZXRzLnN1Ym5ldElkcyxcbiAgICAgICAgc2VjdXJpdHlHcm91cElkczogc2VjdXJpdHlHcm91cHMubWFwKChzZykgPT4gc2cuc2VjdXJpdHlHcm91cElkKSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpc1F1ZXVlKGRlYWRMZXR0ZXJRdWV1ZTogSVF1ZXVlKTogZGVhZExldHRlclF1ZXVlIGlzIElRdWV1ZSB7XG4gICAgcmV0dXJuICg8SVF1ZXVlPmRlYWRMZXR0ZXJRdWV1ZSkucXVldWVBcm4gIT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGREZWFkTGV0dGVyUXVldWUocHJvcHM6IEZ1bmN0aW9uUHJvcHMpOiBJUXVldWUgfCB1bmRlZmluZWQge1xuICAgIC8vIHwgc25zLklUb3BpY1xuICAgIGlmIChcbiAgICAgICFwcm9wcy5kZWFkTGV0dGVyUXVldWUgJiZcbiAgICAgICFwcm9wcy5kZWFkTGV0dGVyUXVldWVFbmFibGVkXG4gICAgICAvLyAmJiAhcHJvcHMuZGVhZExldHRlclRvcGljXG4gICAgKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBpZiAocHJvcHMuZGVhZExldHRlclF1ZXVlICYmIHByb3BzLmRlYWRMZXR0ZXJRdWV1ZUVuYWJsZWQgPT09IGZhbHNlKSB7XG4gICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgXCJkZWFkTGV0dGVyUXVldWUgZGVmaW5lZCBidXQgZGVhZExldHRlclF1ZXVlRW5hYmxlZCBleHBsaWNpdGx5IHNldCB0byBmYWxzZVwiLFxuICAgICAgKTtcbiAgICB9XG4gICAgLy8gaWYgKFxuICAgIC8vICAgcHJvcHMuZGVhZExldHRlclRvcGljICYmXG4gICAgLy8gICAocHJvcHMuZGVhZExldHRlclF1ZXVlIHx8IHByb3BzLmRlYWRMZXR0ZXJRdWV1ZUVuYWJsZWQgIT09IHVuZGVmaW5lZClcbiAgICAvLyApIHtcbiAgICAvLyAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgLy8gICAgIFwiZGVhZExldHRlclF1ZXVlIGFuZCBkZWFkTGV0dGVyVG9waWMgY2Fubm90IGJlIHNwZWNpZmllZCB0b2dldGhlciBhdCB0aGUgc2FtZSB0aW1lXCIsXG4gICAgLy8gICAgIHRoaXMsXG4gICAgLy8gICApO1xuICAgIC8vIH1cblxuICAgIGxldCBkZWFkTGV0dGVyUXVldWU6IElRdWV1ZTsgLy8gfCBJVG9waWM7XG4gICAgLy8gaWYgKHByb3BzLmRlYWRMZXR0ZXJUb3BpYykge1xuICAgIC8vICAgZGVhZExldHRlclF1ZXVlID0gcHJvcHMuZGVhZExldHRlclRvcGljO1xuICAgIC8vICAgdGhpcy5hZGRUb1JvbGVQb2xpY3koXG4gICAgLy8gICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAvLyAgICAgICBhY3Rpb25zOiBbXCJzbnM6UHVibGlzaFwiXSxcbiAgICAvLyAgICAgICByZXNvdXJjZXM6IFtkZWFkTGV0dGVyUXVldWUudG9waWNBcm5dLFxuICAgIC8vICAgICB9KSxcbiAgICAvLyAgICk7XG4gICAgLy8gfSBlbHNlIHtcbiAgICBkZWFkTGV0dGVyUXVldWUgPVxuICAgICAgcHJvcHMuZGVhZExldHRlclF1ZXVlIHx8XG4gICAgICBuZXcgUXVldWUodGhpcywgXCJEZWFkTGV0dGVyUXVldWVcIiwge1xuICAgICAgICBtZXNzYWdlUmV0ZW50aW9uU2Vjb25kczogRHVyYXRpb24uZGF5cygxNCkudG9TZWNvbmRzKCksXG4gICAgICB9KTtcbiAgICB0aGlzLmFkZFRvUm9sZVBvbGljeShcbiAgICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgYWN0aW9uczogW1wic3FzOlNlbmRNZXNzYWdlXCJdLFxuICAgICAgICByZXNvdXJjZXM6IFtkZWFkTGV0dGVyUXVldWUucXVldWVBcm5dLFxuICAgICAgfSksXG4gICAgKTtcbiAgICAvLyB9XG5cbiAgICByZXR1cm4gZGVhZExldHRlclF1ZXVlO1xuICB9XG5cbiAgLy8gVE9ETzogU3VwcG9ydCBzbnMuSVRvcGljICsgc25zOlB1Ymxpc2ggdG9waWNBcm5cbiAgLyoqXG4gICAqIE9wdGlvbmFsbHkgY3JlYXRlIExhbWJkYUZ1bmN0aW9uRGVhZExldHRlckNvbmZpZ1xuICAgKi9cbiAgcHJpdmF0ZSBwYXJzZURlYWRMZXR0ZXJDb25maWcoXG4gICAgZGVhZExldHRlclF1ZXVlPzogSVF1ZXVlLCAvLyB8IHNucy5JVG9waWNcbiAgKTogbGFtYmRhRnVuY3Rpb24uTGFtYmRhRnVuY3Rpb25EZWFkTGV0dGVyQ29uZmlnIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoZGVhZExldHRlclF1ZXVlKSB7XG4gICAgICAvLyB0aGlzLmlzUXVldWUoZGVhZExldHRlclF1ZXVlKSA/IGRlYWRMZXR0ZXJRdWV1ZS5xdWV1ZUFybiA6IC4uLlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdGFyZ2V0QXJuOiBkZWFkTGV0dGVyUXVldWUucXVldWVBcm4sXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VUcmFjaW5nQ29uZmlnKFxuICAgIHRyYWNpbmc6IFRyYWNpbmcsXG4gICk6IGxhbWJkYUZ1bmN0aW9uLkxhbWJkYUZ1bmN0aW9uVHJhY2luZ0NvbmZpZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRyYWNpbmcgPT09IHVuZGVmaW5lZCB8fCB0cmFjaW5nID09PSBUcmFjaW5nLkRJU0FCTEVEKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHRoaXMuYWRkVG9Sb2xlUG9saWN5KFxuICAgICAgbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICBhY3Rpb25zOiBbXCJ4cmF5OlB1dFRyYWNlU2VnbWVudHNcIiwgXCJ4cmF5OlB1dFRlbGVtZXRyeVJlY29yZHNcIl0sXG4gICAgICAgIHJlc291cmNlczogW1wiKlwiXSxcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgbW9kZTogdHJhY2luZyxcbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogR2l2ZW4gYW4gb3BhcXVlICh0b2tlbikgQVJOLCByZXR1cm5zIGEgVEYgZXhwcmVzc2lvbiB0aGF0IGV4dHJhY3RzIHRoZSBmdW5jdGlvblxuICogbmFtZSBmcm9tIHRoZSBBUk4uXG4gKlxuICogRnVuY3Rpb24gQVJOcyBsb29rIGxpa2UgdGhpczpcbiAqXG4gKiAgIGFybjphd3M6bGFtYmRhOnJlZ2lvbjphY2NvdW50LWlkOmZ1bmN0aW9uOmZ1bmN0aW9uLW5hbWVcbiAqXG4gKiAuLndoaWNoIG1lYW5zIHRoYXQgaW4gb3JkZXIgdG8gZXh0cmFjdCB0aGUgYGZ1bmN0aW9uLW5hbWVgIGNvbXBvbmVudCBmcm9tIHRoZSBBUk4sIHdlIGNhblxuICogc3BsaXQgdGhlIEFSTiB1c2luZyBcIjpcIiBhbmQgc2VsZWN0IHRoZSBjb21wb25lbnQgaW4gaW5kZXggNi5cbiAqXG4gKiBAcmV0dXJucyBgZWxlbWVudChzcGxpdCgnOicsIGFybiksIDYpYFxuICovXG5mdW5jdGlvbiBleHRyYWN0TmFtZUZyb21Bcm4oYXJuOiBzdHJpbmcpIHtcbiAgY29uc3QgeyByZXNvdXJjZU5hbWUgfSA9IEFybi5zcGxpdChhcm4sIEFybkZvcm1hdC5DT0xPTl9SRVNPVVJDRV9OQU1FKTtcbiAgaWYgKCFyZXNvdXJjZU5hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgTGFtYmRhIGZ1bmN0aW9uIEFSTjogJHthcm59YCk7XG4gIH1cbiAgLy8gaWYgKHJlc291cmNlTmFtZS5pbmNsdWRlcyhcIjpcIikpIHNwbGl0IG9mZiB0aGUgdmVyc2lvblxuICBpZiAocmVzb3VyY2VOYW1lLmluY2x1ZGVzKFwiOlwiKSkge1xuICAgIHJldHVybiByZXNvdXJjZU5hbWUuc3BsaXQoXCI6XCIpWzBdO1xuICB9XG4gIHJldHVybiByZXNvdXJjZU5hbWU7XG59XG5cbi8qKlxuICogWC1SYXkgVHJhY2luZyBNb2RlcyAoaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2xhbWJkYS9sYXRlc3QvZGcvQVBJX1RyYWNpbmdDb25maWcuaHRtbClcbiAqL1xuZXhwb3J0IGVudW0gVHJhY2luZyB7XG4gIC8qKlxuICAgKiBMYW1iZGEgd2lsbCByZXNwZWN0IGFueSB0cmFjaW5nIGhlYWRlciBpdCByZWNlaXZlcyBmcm9tIGFuIHVwc3RyZWFtIHNlcnZpY2UuXG4gICAqIElmIG5vIHRyYWNpbmcgaGVhZGVyIGlzIHJlY2VpdmVkLCBMYW1iZGEgd2lsbCBzYW1wbGUgdGhlIHJlcXVlc3QgYmFzZWQgb24gYSBmaXhlZCByYXRlLiBQbGVhc2Ugc2VlIHRoZSBbVXNpbmcgQVdTIExhbWJkYSB3aXRoIEFXUyBYLVJheV0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2xhbWJkYS9sYXRlc3QvZGcvc2VydmljZXMteHJheS5odG1sKSBkb2N1bWVudGF0aW9uIGZvciBkZXRhaWxzIG9uIHRoaXMgc2FtcGxpbmcgYmVoYXZpb3IuXG4gICAqL1xuICBBQ1RJVkUgPSBcIkFjdGl2ZVwiLFxuICAvKipcbiAgICogTGFtYmRhIHdpbGwgb25seSB0cmFjZSB0aGUgcmVxdWVzdCBmcm9tIGFuIHVwc3RyZWFtIHNlcnZpY2VcbiAgICogaWYgaXQgY29udGFpbnMgYSB0cmFjaW5nIGhlYWRlciB3aXRoIFwic2FtcGxlZD0xXCJcbiAgICovXG4gIFBBU1NfVEhST1VHSCA9IFwiUGFzc1Rocm91Z2hcIixcbiAgLyoqXG4gICAqIExhbWJkYSB3aWxsIG5vdCB0cmFjZSBhbnkgcmVxdWVzdC5cbiAgICovXG4gIERJU0FCTEVEID0gXCJEaXNhYmxlZFwiLFxufVxuXG4vKipcbiAqIExhbWJkYSBzZXJ2aWNlIHdpbGwgYXV0b21hdGljYWxseSBjYXB0dXJlcyBzeXN0ZW0gbG9ncyBhYm91dCBmdW5jdGlvbiBpbnZvY2F0aW9uXG4gKiBnZW5lcmF0ZWQgYnkgdGhlIExhbWJkYSBzZXJ2aWNlIChrbm93biBhcyBzeXN0ZW0gbG9ncykgYW5kIHNlbmRzIHRoZXNlIGxvZ3MgdG8gYVxuICogZGVmYXVsdCBDbG91ZFdhdGNoIGxvZyBncm91cCBuYW1lZCBhZnRlciB0aGUgTGFtYmRhIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgZW51bSBTeXN0ZW1Mb2dMZXZlbCB7XG4gIC8qKlxuICAgKiBMYW1iZGEgd2lsbCBjYXB0dXJlIG9ubHkgbG9ncyBhdCBpbmZvIGxldmVsLlxuICAgKi9cbiAgSU5GTyA9IFwiSU5GT1wiLFxuICAvKipcbiAgICogTGFtYmRhIHdpbGwgY2FwdHVyZSBvbmx5IGxvZ3MgYXQgZGVidWcgbGV2ZWwuXG4gICAqL1xuICBERUJVRyA9IFwiREVCVUdcIixcbiAgLyoqXG4gICAqIExhbWJkYSB3aWxsIGNhcHR1cmUgb25seSBsb2dzIGF0IHdhcm4gbGV2ZWwuXG4gICAqL1xuICBXQVJOID0gXCJXQVJOXCIsXG59XG5cbi8qKlxuICogTGFtYmRhIHNlcnZpY2UgYXV0b21hdGljYWxseSBjYXB0dXJlcyBsb2dzIGdlbmVyYXRlZCBieSB0aGUgZnVuY3Rpb24gY29kZVxuICogKGtub3duIGFzIGFwcGxpY2F0aW9uIGxvZ3MpIGFuZCBzZW5kcyB0aGVzZSBsb2dzIHRvIGEgZGVmYXVsdCBDbG91ZFdhdGNoXG4gKiBsb2cgZ3JvdXAgbmFtZWQgYWZ0ZXIgdGhlIExhbWJkYSBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IGVudW0gQXBwbGljYXRpb25Mb2dMZXZlbCB7XG4gIC8qKlxuICAgKiBMYW1iZGEgd2lsbCBjYXB0dXJlIG9ubHkgbG9ncyBhdCBpbmZvIGxldmVsLlxuICAgKi9cbiAgSU5GTyA9IFwiSU5GT1wiLFxuICAvKipcbiAgICogTGFtYmRhIHdpbGwgY2FwdHVyZSBvbmx5IGxvZ3MgYXQgZGVidWcgbGV2ZWwuXG4gICAqL1xuICBERUJVRyA9IFwiREVCVUdcIixcbiAgLyoqXG4gICAqIExhbWJkYSB3aWxsIGNhcHR1cmUgb25seSBsb2dzIGF0IHdhcm4gbGV2ZWwuXG4gICAqL1xuICBXQVJOID0gXCJXQVJOXCIsXG4gIC8qKlxuICAgKiBMYW1iZGEgd2lsbCBjYXB0dXJlIG9ubHkgbG9ncyBhdCB0cmFjZSBsZXZlbC5cbiAgICovXG4gIFRSQUNFID0gXCJUUkFDRVwiLFxuICAvKipcbiAgICogTGFtYmRhIHdpbGwgY2FwdHVyZSBvbmx5IGxvZ3MgYXQgZXJyb3IgbGV2ZWwuXG4gICAqL1xuICBFUlJPUiA9IFwiRVJST1JcIixcbiAgLyoqXG4gICAqIExhbWJkYSB3aWxsIGNhcHR1cmUgb25seSBsb2dzIGF0IGZhdGFsIGxldmVsLlxuICAgKi9cbiAgRkFUQUwgPSBcIkZBVEFMXCIsXG59XG5cbi8qKlxuICogVGhpcyBmaWVsZCB0YWtlcyBpbiAyIHZhbHVlcyBlaXRoZXIgVGV4dCBvciBKU09OLiBCeSBzZXR0aW5nIHRoaXMgdmFsdWUgdG8gVGV4dCxcbiAqIHdpbGwgcmVzdWx0IGluIHRoZSBjdXJyZW50IHN0cnVjdHVyZSBvZiBsb2dzIGZvcm1hdCwgd2hlcmVhcywgYnkgc2V0dGluZyB0aGlzIHZhbHVlIHRvIEpTT04sXG4gKiBMYW1iZGEgd2lsbCBwcmludCB0aGUgbG9ncyBhcyBTdHJ1Y3R1cmVkIEpTT04gTG9ncywgd2l0aCB0aGUgY29ycmVzcG9uZGluZyB0aW1lc3RhbXAgYW5kIGxvZyBsZXZlbFxuICogb2YgZWFjaCBldmVudC4gU2VsZWN0aW5nIOKAmEpTT07igJkgZm9ybWF0IHdpbGwgb25seSBhbGxvdyBjdXN0b21lcuKAmXMgdG8gaGF2ZSBkaWZmZXJlbnQgbG9nIGxldmVsXG4gKiBBcHBsaWNhdGlvbiBsb2cgbGV2ZWwgYW5kIHRoZSBTeXN0ZW0gbG9nIGxldmVsLlxuICovXG5leHBvcnQgZW51bSBMb2dnaW5nRm9ybWF0IHtcbiAgLyoqXG4gICAqIExhbWJkYSBMb2dzIHRleHQgZm9ybWF0LlxuICAgKi9cbiAgVEVYVCA9IFwiVGV4dFwiLFxuICAvKipcbiAgICogTGFtYmRhIHN0cnVjdHVyZWQgbG9nZ2luZyBpbiBKc29uIGZvcm1hdC5cbiAgICovXG4gIEpTT04gPSBcIkpTT05cIixcbn1cblxuLyoqXG4gKiBBIGRlc3RpbmF0aW9uIGNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEbHFEZXN0aW5hdGlvbkNvbmZpZyB7XG4gIC8qKlxuICAgKiBUaGUgQW1hem9uIFJlc291cmNlIE5hbWUgKEFSTikgb2YgdGhlIGRlc3RpbmF0aW9uIHJlc291cmNlXG4gICAqL1xuICByZWFkb25seSBkZXN0aW5hdGlvbjogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgRExRIGZvciBhbiBldmVudCBzb3VyY2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJRXZlbnRTb3VyY2VEbHEge1xuICAvKipcbiAgICogUmV0dXJucyB0aGUgRExRIGRlc3RpbmF0aW9uIGNvbmZpZyBvZiB0aGUgRExRXG4gICAqL1xuICBiaW5kKFxuICAgIHRhcmdldDogSUV2ZW50U291cmNlTWFwcGluZyxcbiAgICB0YXJnZXRIYW5kbGVyOiBJRnVuY3Rpb24sXG4gICk6IERscURlc3RpbmF0aW9uQ29uZmlnO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdmVyaWZ5Q29kZUNvbmZpZyhjb2RlOiBDb2RlQ29uZmlnLCBwcm9wczogRnVuY3Rpb25Qcm9wcykge1xuICAvLyBtdXR1YWxseSBleGNsdXNpdmVcbiAgY29uc3QgY29kZVR5cGUgPSBbY29kZS5pbmxpbmVDb2RlLCBjb2RlLnMzTG9jYXRpb24sIGNvZGUuaW1hZ2VdO1xuXG4gIGlmIChjb2RlVHlwZS5maWx0ZXIoKHgpID0+ICEheCkubGVuZ3RoICE9PSAxKSB7XG4gICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKFxuICAgICAgJ2xhbWJkYS5Db2RlIG11c3Qgc3BlY2lmeSBleGFjdGx5IG9uZSBvZjogXCJpbmxpbmVDb2RlXCIsIFwiczNMb2NhdGlvblwiLCBvciBcImltYWdlXCInLFxuICAgICk7XG4gIH1cblxuICBpZiAoISFjb2RlLmltYWdlID09PSAocHJvcHMuaGFuZGxlciAhPT0gSGFuZGxlci5GUk9NX0lNQUdFKSkge1xuICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihcbiAgICAgIFwiaGFuZGxlciBtdXN0IGJlIGBIYW5kbGVyLkZST01fSU1BR0VgIHdoZW4gdXNpbmcgaW1hZ2UgYXNzZXQgZm9yIExhbWJkYSBmdW5jdGlvblwiLFxuICAgICk7XG4gIH1cblxuICBpZiAoISFjb2RlLmltYWdlID09PSAocHJvcHMucnVudGltZSAhPT0gUnVudGltZS5GUk9NX0lNQUdFKSkge1xuICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihcbiAgICAgIFwicnVudGltZSBtdXN0IGJlIGBSdW50aW1lLkZST01fSU1BR0VgIHdoZW4gdXNpbmcgaW1hZ2UgYXNzZXQgZm9yIExhbWJkYSBmdW5jdGlvblwiLFxuICAgICk7XG4gIH1cblxuICAvLyBpZiB0aGlzIGlzIGlubGluZSBjb2RlLCBjaGVjayB0aGF0IHRoZSBydW50aW1lIHN1cHBvcnRzXG4gIGlmIChjb2RlLmlubGluZUNvZGUgJiYgIXByb3BzLnJ1bnRpbWUuc3VwcG9ydHNJbmxpbmVDb2RlKSB7XG4gICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKFxuICAgICAgYElubGluZSBzb3VyY2Ugbm90IGFsbG93ZWQgZm9yICR7cHJvcHMucnVudGltZSEubmFtZX1gLFxuICAgICk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdW5kZWZpbmVkSWZOb0tleXM8QSBleHRlbmRzIHsgW2tleTogc3RyaW5nXTogdW5rbm93biB9PihcbiAgc3RydWN0OiBBLFxuKTogQSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGFsbFVuZGVmaW5lZCA9IE9iamVjdC52YWx1ZXMoc3RydWN0KS5ldmVyeSgodmFsKSA9PiB2YWwgPT09IHVuZGVmaW5lZCk7XG4gIHJldHVybiBhbGxVbmRlZmluZWQgPyB1bmRlZmluZWQgOiBzdHJ1Y3Q7XG59XG4iXX0=
|
|
@@ -50,7 +50,7 @@ class GatewayResponse extends aws_construct_1.AwsConstructBase {
|
|
|
50
50
|
}
|
|
51
51
|
exports.GatewayResponse = GatewayResponse;
|
|
52
52
|
_a = JSII_RTTI_SYMBOL_1;
|
|
53
|
-
GatewayResponse[_a] = { fqn: "terraconstructs.aws.compute.GatewayResponse", version: "0.1.
|
|
53
|
+
GatewayResponse[_a] = { fqn: "terraconstructs.aws.compute.GatewayResponse", version: "0.1.9" };
|
|
54
54
|
/**
|
|
55
55
|
* Supported types of gateway responses.
|
|
56
56
|
* @see https://docs.aws.amazon.com/apigateway/latest/developerguide/supported-gateway-response-types.html
|
|
@@ -66,7 +66,7 @@ class ResponseType {
|
|
|
66
66
|
}
|
|
67
67
|
exports.ResponseType = ResponseType;
|
|
68
68
|
_b = JSII_RTTI_SYMBOL_1;
|
|
69
|
-
ResponseType[_b] = { fqn: "terraconstructs.aws.compute.ResponseType", version: "0.1.
|
|
69
|
+
ResponseType[_b] = { fqn: "terraconstructs.aws.compute.ResponseType", version: "0.1.9" };
|
|
70
70
|
/**
|
|
71
71
|
* The gateway response for authorization failure.
|
|
72
72
|
*/
|
|
@@ -12,7 +12,7 @@ class Handler {
|
|
|
12
12
|
}
|
|
13
13
|
exports.Handler = Handler;
|
|
14
14
|
_a = JSII_RTTI_SYMBOL_1;
|
|
15
|
-
Handler[_a] = { fqn: "terraconstructs.aws.compute.Handler", version: "0.1.
|
|
15
|
+
Handler[_a] = { fqn: "terraconstructs.aws.compute.Handler", version: "0.1.9" };
|
|
16
16
|
/**
|
|
17
17
|
* A special handler when the function handler is part of a Docker image.
|
|
18
18
|
*/
|