UNPKG

@aws-cdk/aws-bedrock-agentcore-alpha

Version:

The CDK Construct Library for Amazon Bedrock

521 lines 65.7 kB
"use strict"; var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) { var useValue = arguments.length > 2; for (var i = 0; i < initializers.length; i++) { value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg); } return useValue ? value : void 0; }; var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) { function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; } var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value"; var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null; var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {}); var _, done = false; for (var i = decorators.length - 1; i >= 0; i--) { var context = {}; for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p]; for (var p in contextIn.access) context.access[p] = contextIn.access[p]; context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); }; var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context); if (kind === "accessor") { if (result === void 0) continue; if (result === null || typeof result !== "object") throw new TypeError("Object expected"); if (_ = accept(result.get)) descriptor.get = _; if (_ = accept(result.set)) descriptor.set = _; if (_ = accept(result.init)) initializers.unshift(_); } else if (_ = accept(result)) { if (kind === "field") initializers.unshift(_); else descriptor[key] = _; } } if (target) Object.defineProperty(target, contextIn.name, descriptor); done = true; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.Gateway = void 0; const jsiiDeprecationWarnings = require("../../.warnings.jsii.js"); const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); const aws_cdk_lib_1 = require("aws-cdk-lib"); const bedrockagentcore = require("aws-cdk-lib/aws-bedrockagentcore"); const cognito = require("aws-cdk-lib/aws-cognito"); const iam = require("aws-cdk-lib/aws-iam"); const metadata_resource_1 = require("aws-cdk-lib/core/lib/metadata-resource"); const prop_injectable_1 = require("aws-cdk-lib/core/lib/prop-injectable"); // Internal imports const gateway_base_1 = require("./gateway-base"); const authorizer_1 = require("./inbound-auth/authorizer"); const perms_1 = require("./perms"); const protocol_1 = require("./protocol"); const target_1 = require("./targets/target"); const validation_helpers_1 = require("./validation-helpers"); /****************************************************************************** * Class *****************************************************************************/ /** * Gateway resource for AWS Bedrock Agent Core. * Serves as an integration point between your agent and external services. * * @resource AWS::BedrockAgentCore::Gateway * @see https://docs.aws.amazon.com/bedrock-agentcore-control/latest/APIReference/API_CreateGateway.html */ let Gateway = (() => { let _classDecorators = [prop_injectable_1.propertyInjectable]; let _classDescriptor; let _classExtraInitializers = []; let _classThis; let _classSuper = gateway_base_1.GatewayBase; let _instanceExtraInitializers = []; let _addLambdaTarget_decorators; let _addOpenApiTarget_decorators; let _addSmithyTarget_decorators; let _addMcpServerTarget_decorators; var Gateway = class extends _classSuper { static { _classThis = this; } static { const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0; _addLambdaTarget_decorators = [(0, metadata_resource_1.MethodMetadata)()]; _addOpenApiTarget_decorators = [(0, metadata_resource_1.MethodMetadata)()]; _addSmithyTarget_decorators = [(0, metadata_resource_1.MethodMetadata)()]; _addMcpServerTarget_decorators = [(0, metadata_resource_1.MethodMetadata)()]; __esDecorate(this, null, _addLambdaTarget_decorators, { kind: "method", name: "addLambdaTarget", static: false, private: false, access: { has: obj => "addLambdaTarget" in obj, get: obj => obj.addLambdaTarget }, metadata: _metadata }, null, _instanceExtraInitializers); __esDecorate(this, null, _addOpenApiTarget_decorators, { kind: "method", name: "addOpenApiTarget", static: false, private: false, access: { has: obj => "addOpenApiTarget" in obj, get: obj => obj.addOpenApiTarget }, metadata: _metadata }, null, _instanceExtraInitializers); __esDecorate(this, null, _addSmithyTarget_decorators, { kind: "method", name: "addSmithyTarget", static: false, private: false, access: { has: obj => "addSmithyTarget" in obj, get: obj => obj.addSmithyTarget }, metadata: _metadata }, null, _instanceExtraInitializers); __esDecorate(this, null, _addMcpServerTarget_decorators, { kind: "method", name: "addMcpServerTarget", static: false, private: false, access: { has: obj => "addMcpServerTarget" in obj, get: obj => obj.addMcpServerTarget }, metadata: _metadata }, null, _instanceExtraInitializers); __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers); Gateway = _classThis = _classDescriptor.value; if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata }); } static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-bedrock-agentcore-alpha.Gateway", version: "2.227.0-alpha.0" }; /** Uniquely identifies this class. */ static PROPERTY_INJECTION_ID = '@aws-cdk.aws-bedrock-agentcore-alpha.Gateway'; /** * Import an existing Gateway using its attributes * * @param scope The construct scope * @param id The construct id * @param attrs The attributes of the existing Gateway * @returns An IGateway instance representing the imported gateway */ static fromGatewayAttributes(scope, id, attrs) { try { jsiiDeprecationWarnings._aws_cdk_aws_bedrock_agentcore_alpha_GatewayAttributes(attrs); } catch (error) { if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { Error.captureStackTrace(error, this.fromGatewayAttributes); } throw error; } class ImportedGateway extends gateway_base_1.GatewayBase { gatewayArn = attrs.gatewayArn; gatewayId = attrs.gatewayId; name = attrs.gatewayName; description = undefined; protocolConfiguration; authorizerConfiguration; exceptionLevel = undefined; kmsKey = undefined; role = attrs.role; gatewayUrl = undefined; status = undefined; statusReason = undefined; createdAt = undefined; updatedAt = undefined; constructor(s, i) { super(s, i); // Create placeholder protocol and authorizer configurations this.protocolConfiguration = new protocol_1.McpProtocolConfiguration({ supportedVersions: [protocol_1.MCPProtocolVersion.MCP_2025_03_26], searchType: protocol_1.McpGatewaySearchType.SEMANTIC, instructions: 'Imported gateway', }); this.authorizerConfiguration = authorizer_1.GatewayAuthorizer.usingAwsIam(); } } return new ImportedGateway(scope, id); } /** * The ARN of the gateway * @attribute */ gatewayArn = __runInitializers(this, _instanceExtraInitializers); /** * The unique identifier of the gateway * @attribute */ gatewayId; /** * The name of the gateway */ name; /** * The description of the gateway */ description; /** * The protocol configuration for the gateway */ protocolConfiguration; /** * The authorizer configuration for the gateway */ authorizerConfiguration; /** * The exception level for the gateway */ exceptionLevel; /** * The KMS key used for encryption */ kmsKey; /** * The IAM role for the gateway */ role; /** * The URL endpoint for the gateway * @attribute */ gatewayUrl; /** * The status of the gateway * @attribute */ status; /** * The status reasons for the gateway * @attribute */ statusReason; /** * Timestamp when the gateway was created * @attribute */ createdAt; /** * Timestamp when the gateway was last updated * @attribute */ updatedAt; /** * Tags applied to the gateway */ tags; /** * The Cognito User Pool created for the gateway (if using default Cognito authorizer) */ userPool; /** * The Cognito User Pool Client created for the gateway (if using default Cognito authorizer) */ userPoolClient; constructor(scope, id, props) { super(scope, id); try { jsiiDeprecationWarnings._aws_cdk_aws_bedrock_agentcore_alpha_GatewayProps(props); } catch (error) { if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { Error.captureStackTrace(error, Gateway); } throw error; } // Enhanced CDK Analytics Telemetry (0, metadata_resource_1.addConstructMetadata)(this, props); // ------------------------------------------------------ // Assignments // ------------------------------------------------------ this.name = props.gatewayName; this.validateGatewayName(this.name); this.description = props.description; if (this.description) { this.validateDescription(this.description); } this.kmsKey = props.kmsKey; this.role = props.role ?? this.createGatewayRole(); if (this.kmsKey && this.role) { this.kmsKey.grantEncryptDecrypt(this.role); } this.protocolConfiguration = props.protocolConfiguration ?? this.createDefaultMcpProtocolConfiguration(); this.authorizerConfiguration = props.authorizerConfiguration ?? this.createDefaultCognitoAuthorizerConfig(); this.exceptionLevel = props.exceptionLevel; this.tags = props.tags ?? {}; // ------------------------------------------------------ // L1 Instantiation // ------------------------------------------------------ const _resource = new bedrockagentcore.CfnGateway(this, 'Resource', { authorizerConfiguration: this.authorizerConfiguration._render(), authorizerType: this.authorizerConfiguration.authorizerType, description: this.description, exceptionLevel: this.exceptionLevel, kmsKeyArn: this.kmsKey?.keyArn, name: this.name, protocolConfiguration: this.protocolConfiguration._render(), protocolType: this.protocolConfiguration.protocolType, roleArn: this.role?.roleArn, tags: this.tags, }); this.gatewayId = _resource.attrGatewayIdentifier; this.gatewayArn = _resource.attrGatewayArn; this.gatewayUrl = _resource.attrGatewayUrl; this.status = _resource.attrStatus; this.createdAt = _resource.attrCreatedAt; this.updatedAt = _resource.attrUpdatedAt; this.statusReason = _resource.attrStatusReasons; } /** * Add a Lambda target to this gateway * This is a convenience method that creates a GatewayTarget associated with this gateway * * @param id The construct id for the target * @param props Properties for the Lambda target * @returns The created GatewayTarget */ addLambdaTarget(id, props) { try { jsiiDeprecationWarnings._aws_cdk_aws_bedrock_agentcore_alpha_AddLambdaTargetOptions(props); } catch (error) { if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { Error.captureStackTrace(error, this.addLambdaTarget); } throw error; } // Lambda invoke permissions are automatically granted in LambdaTargetConfiguration.bind() // Build target props, conditionally including credentials if array has items const targetProps = { gatewayTargetName: props.gatewayTargetName, description: props.description, gateway: this, lambdaFunction: props.lambdaFunction, toolSchema: props.toolSchema, ...(props.credentialProviderConfigurations && props.credentialProviderConfigurations.length > 0 ? { credentialProviderConfigurations: props.credentialProviderConfigurations } : {}), }; const target = target_1.GatewayTarget.forLambda(this, id, targetProps); return target; } /** * Add an OpenAPI target to this gateway * This is a convenience method that creates a GatewayTarget associated with this gateway * * @param id The construct id for the target * @param props Properties for the OpenAPI target * @returns The created GatewayTarget */ addOpenApiTarget(id, props) { try { jsiiDeprecationWarnings._aws_cdk_aws_bedrock_agentcore_alpha_AddOpenApiTargetOptions(props); } catch (error) { if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { Error.captureStackTrace(error, this.addOpenApiTarget); } throw error; } const target = target_1.GatewayTarget.forOpenApi(this, id, { gatewayTargetName: props.gatewayTargetName, description: props.description, gateway: this, apiSchema: props.apiSchema, validateOpenApiSchema: props.validateOpenApiSchema, credentialProviderConfigurations: props.credentialProviderConfigurations, }); return target; } /** * Add a Smithy target to this gateway * This is a convenience method that creates a GatewayTarget associated with this gateway * * @param id The construct id for the target * @param props Properties for the Smithy target * @returns The created GatewayTarget */ addSmithyTarget(id, props) { try { jsiiDeprecationWarnings._aws_cdk_aws_bedrock_agentcore_alpha_AddSmithyTargetOptions(props); } catch (error) { if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { Error.captureStackTrace(error, this.addSmithyTarget); } throw error; } // Build target props, conditionally including credentials if array has items const targetProps = { gatewayTargetName: props.gatewayTargetName, description: props.description, gateway: this, smithyModel: props.smithyModel, ...(props.credentialProviderConfigurations && props.credentialProviderConfigurations.length > 0 ? { credentialProviderConfigurations: props.credentialProviderConfigurations } : {}), }; const target = target_1.GatewayTarget.forSmithy(this, id, targetProps); return target; } /** * Add an MCP server target to this gateway * This is a convenience method that creates a GatewayTarget associated with this gateway * * @param id The construct id for the target * @param props Properties for the MCP server target * @returns The created GatewayTarget * @see https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/gateway-target-MCPservers.html */ addMcpServerTarget(id, props) { try { jsiiDeprecationWarnings._aws_cdk_aws_bedrock_agentcore_alpha_AddMcpServerTargetOptions(props); } catch (error) { if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { Error.captureStackTrace(error, this.addMcpServerTarget); } throw error; } // Build target props, conditionally including credentials if array has items const targetProps = { gatewayTargetName: props.gatewayTargetName, description: props.description, gateway: this, endpoint: props.endpoint, ...(props.credentialProviderConfigurations && props.credentialProviderConfigurations.length > 0 ? { credentialProviderConfigurations: props.credentialProviderConfigurations } : {}), }; const target = target_1.GatewayTarget.forMcpServer(this, id, targetProps); return target; } /** * Creates the service role for the gateway to assume * * The service role starts with minimal permissions. Additional permissions * are added automatically when targets are configured: * - KMS encryption: Automatically grants encrypt/decrypt permissions * * For other target types, manually grant permissions using standard CDK grant methods: * @internal */ createGatewayRole() { const role = new iam.Role(this, 'ServiceRole', { assumedBy: new iam.ServicePrincipal('bedrock-agentcore.amazonaws.com'), description: `Service role for Bedrock AgentCore Gateway ${this.name}`, }); const region = aws_cdk_lib_1.Stack.of(this).region; const account = aws_cdk_lib_1.Stack.of(this).account; const partition = aws_cdk_lib_1.Stack.of(this).partition; // This restricts role assumption to the specific gateway resource only in this account, // preventing other accounts from assuming this role. // See:https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/gateway-prerequisites-permissions.html#gateway-service-role-permissions role.assumeRolePolicy?.addStatements(new iam.PolicyStatement({ effect: iam.Effect.ALLOW, principals: [new iam.ServicePrincipal('bedrock-agentcore.amazonaws.com')], actions: perms_1.GatewayPerms.ASSUME_ROLE, conditions: { StringEquals: { 'aws:SourceAccount': account, }, ArnLike: { 'aws:SourceArn': `arn:${partition}:bedrock-agentcore:${region}:${account}:gateway/${this.name}*`, }, }, })); if (this.kmsKey) { role.addToPolicy(new iam.PolicyStatement({ effect: iam.Effect.ALLOW, actions: perms_1.GatewayPerms.KMS_KEY_PERMS, resources: [this.kmsKey.keyArn], })); } return role; } /** * Validates the gateway name format * Pattern: ^([0-9a-zA-Z][-]?){1,100}$ * Max length: 48 characters * @param name The gateway name to validate * @throws Error if the name is invalid * @internal */ validateGatewayName(name) { if (aws_cdk_lib_1.Token.isUnresolved(name)) { return; } const lengthErrors = (0, validation_helpers_1.validateStringField)({ value: name, minLength: 1, maxLength: 48, fieldName: 'Gateway name', }); if (lengthErrors.length > 0) { throw new validation_helpers_1.ValidationError(lengthErrors.join('\n')); } const patternErrors = (0, validation_helpers_1.validateFieldPattern)(name, 'Gateway name', /^([0-9a-zA-Z][-]?){1,100}$/, 'Gateway name must contain only alphanumeric characters and hyphens, with hyphens only between characters'); if (patternErrors.length > 0) { throw new validation_helpers_1.ValidationError(patternErrors.join('\n')); } } /** * Validates the description format * Max length: 200 characters * @param description The description to validate * @throws Error if validation fails * @internal */ validateDescription(description) { if (aws_cdk_lib_1.Token.isUnresolved(description)) { return; } const errors = (0, validation_helpers_1.validateStringField)({ value: description, minLength: 1, maxLength: 200, fieldName: 'Description', }); if (errors.length > 0) { throw new validation_helpers_1.ValidationError(errors.join('\n')); } } /** * Creates a default Cognito authorizer for the gateway * Provisions a Cognito User Pool and configures JWT authentication * @internal */ createDefaultCognitoAuthorizerConfig() { const userPool = new cognito.UserPool(this, 'UserPool', { userPoolName: `${this.name}-gw-userpool`, signInCaseSensitive: false, }); const userPoolClient = userPool.addClient('DefaultClient', { userPoolClientName: `${this.name}-gw-client`, }); this.userPool = userPool; this.userPoolClient = userPoolClient; return authorizer_1.GatewayAuthorizer.usingCognito({ userPool: userPool, allowedClients: [userPoolClient], }); } /** * Creates a default MCP protocol configuration for the gateway * Provides sensible defaults for MCP protocol settings * @internal */ createDefaultMcpProtocolConfiguration() { return new protocol_1.McpProtocolConfiguration({ supportedVersions: [protocol_1.MCPProtocolVersion.MCP_2025_03_26], searchType: protocol_1.McpGatewaySearchType.SEMANTIC, instructions: 'Default gateway to connect to external MCP tools', }); } static { __runInitializers(_classThis, _classExtraInitializers); } }; return Gateway = _classThis; })(); exports.Gateway = Gateway; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2F0ZXdheS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImdhdGV3YXkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsNkNBQTJDO0FBQzNDLHFFQUFxRTtBQUNyRSxtREFBbUQ7QUFDbkQsMkNBQTJDO0FBRzNDLDhFQUE4RjtBQUM5RiwwRUFBMEU7QUFFMUUsbUJBQW1CO0FBQ25CLGlEQUE4RTtBQUM5RSwwREFBd0Y7QUFFeEYsbUNBQXVDO0FBQ3ZDLHlDQUF3SDtBQUd4SCw2Q0FBaUQ7QUFDakQsNkRBQWtHO0FBZ09sRzs7K0VBRStFO0FBQy9FOzs7Ozs7R0FNRztJQUVVLE9BQU87NEJBRG5CLG9DQUFrQjs7OztzQkFDVSwwQkFBVzs7Ozs7O3VCQUFuQixTQUFRLFdBQVc7Ozs7MkNBd01yQyxJQUFBLGtDQUFjLEdBQUU7NENBK0JoQixJQUFBLGtDQUFjLEdBQUU7MkNBeUJoQixJQUFBLGtDQUFjLEdBQUU7OENBOEJoQixJQUFBLGtDQUFjLEdBQUU7WUFyRmpCLGdNQUFPLGVBQWUsNkRBb0JyQjtZQVdELG1NQUFPLGdCQUFnQiw2REFjdEI7WUFXRCxnTUFBTyxlQUFlLDZEQWtCckI7WUFZRCx5TUFBTyxrQkFBa0IsNkRBa0J4QjtZQWpUSCw2S0FpY0M7Ozs7O1FBaGNDLHNDQUFzQztRQUMvQixNQUFNLENBQVUscUJBQXFCLEdBQVcsOENBQThDLENBQUM7UUFDdEc7Ozs7Ozs7V0FPRztRQUNJLE1BQU0sQ0FBQyxxQkFBcUIsQ0FDakMsS0FBZ0IsRUFDaEIsRUFBVSxFQUNWLEtBQXdCOzs7Ozs7Ozs7O1lBRXhCLE1BQU0sZUFBZ0IsU0FBUSwwQkFBVztnQkFDdkIsVUFBVSxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUM7Z0JBQzlCLFNBQVMsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDO2dCQUM1QixJQUFJLEdBQUcsS0FBSyxDQUFDLFdBQVcsQ0FBQztnQkFDekIsV0FBVyxH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QztZQUN6QixJQUFJLENBQUMsY0FBYyxHQUFHLGNBQWMsQ0FBQztZQUNyQyxPQUFPLDhCQUFpQixDQUFDLFlBQVksQ0FBQztnQkFDcEMsUUFBUSxFQUFFLFFBQVE7Z0JBQ2xCLGNBQWMsRUFBRSxDQUFDLGNBQWMsQ0FBQzthQUNqQyxDQUFDLENBQUM7U0FDSjtRQUVEOzs7O1dBSUc7UUFDSyxxQ0FBcUM7WUFDM0MsT0FBTyxJQUFJLG1DQUF3QixDQUFDO2dCQUNsQyxpQkFBaUIsRUFBRSxDQUFDLDZCQUFrQixDQUFDLGNBQWMsQ0FBQztnQkFDdEQsVUFBVSxFQUFFLCtCQUFvQixDQUFDLFFBQVE7Z0JBQ3pDLFlBQVksRUFBRSxrREFBa0Q7YUFDakUsQ0FBQyxDQUFDO1NBQ0o7O1lBaGNVLHVEQUFPOzs7OztBQUFQLDBCQUFPIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3RhY2ssIFRva2VuIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0ICogYXMgYmVkcm9ja2FnZW50Y29yZSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtYmVkcm9ja2FnZW50Y29yZSc7XG5pbXBvcnQgKiBhcyBjb2duaXRvIGZyb20gJ2F3cy1jZGstbGliL2F3cy1jb2duaXRvJztcbmltcG9ydCAqIGFzIGlhbSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCAqIGFzIGttcyBmcm9tICdhd3MtY2RrLWxpYi9hd3Mta21zJztcbmltcG9ydCB7IElGdW5jdGlvbiB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1sYW1iZGEnO1xuaW1wb3J0IHsgYWRkQ29uc3RydWN0TWV0YWRhdGEsIE1ldGhvZE1ldGFkYXRhIH0gZnJvbSAnYXdzLWNkay1saWIvY29yZS9saWIvbWV0YWRhdGEtcmVzb3VyY2UnO1xuaW1wb3J0IHsgcHJvcGVydHlJbmplY3RhYmxlIH0gZnJvbSAnYXdzLWNkay1saWIvY29yZS9saWIvcHJvcC1pbmplY3RhYmxlJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuLy8gSW50ZXJuYWwgaW1wb3J0c1xuaW1wb3J0IHsgR2F0ZXdheUJhc2UsIEdhdGV3YXlFeGNlcHRpb25MZXZlbCwgSUdhdGV3YXkgfSBmcm9tICcuL2dhdGV3YXktYmFzZSc7XG5pbXBvcnQgeyBHYXRld2F5QXV0aG9yaXplciwgSUdhdGV3YXlBdXRob3JpemVyQ29uZmlnIH0gZnJvbSAnLi9pbmJvdW5kLWF1dGgvYXV0aG9yaXplcic7XG5pbXBvcnQgeyBJQ3JlZGVudGlhbFByb3ZpZGVyQ29uZmlnIH0gZnJvbSAnLi9vdXRib3VuZC1hdXRoL2NyZWRlbnRpYWwtcHJvdmlkZXInO1xuaW1wb3J0IHsgR2F0ZXdheVBlcm1zIH0gZnJvbSAnLi9wZXJtcyc7XG5pbXBvcnQgeyBJR2F0ZXdheVByb3RvY29sQ29uZmlnLCBNY3BHYXRld2F5U2VhcmNoVHlwZSwgTWNwUHJvdG9jb2xDb25maWd1cmF0aW9uLCBNQ1BQcm90b2NvbFZlcnNpb24gfSBmcm9tICcuL3Byb3RvY29sJztcbmltcG9ydCB7IEFwaVNjaGVtYSB9IGZyb20gJy4vdGFyZ2V0cy9zY2hlbWEvYXBpLXNjaGVtYSc7XG5pbXBvcnQgeyBUb29sU2NoZW1hIH0gZnJvbSAnLi90YXJnZXRzL3NjaGVtYS90b29sLXNjaGVtYSc7XG5pbXBvcnQgeyBHYXRld2F5VGFyZ2V0IH0gZnJvbSAnLi90YXJnZXRzL3RhcmdldCc7XG5pbXBvcnQgeyB2YWxpZGF0ZVN0cmluZ0ZpZWxkLCB2YWxpZGF0ZUZpZWxkUGF0dGVybiwgVmFsaWRhdGlvbkVycm9yIH0gZnJvbSAnLi92YWxpZGF0aW9uLWhlbHBlcnMnO1xuXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcHNcbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuLyoqXG4gKiBPcHRpb25zIGZvciBhZGRpbmcgYSBMYW1iZGEgdGFyZ2V0IHRvIGEgZ2F0ZXdheVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFkZExhbWJkYVRhcmdldE9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGdhdGV3YXkgdGFyZ2V0XG4gICAqIFZhbGlkIGNoYXJhY3RlcnMgYXJlIGEteiwgQS1aLCAwLTksIF8gKHVuZGVyc2NvcmUpIGFuZCAtIChoeXBoZW4pXG4gICAqL1xuICByZWFkb25seSBnYXRld2F5VGFyZ2V0TmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBkZXNjcmlwdGlvbiBmb3IgdGhlIGdhdGV3YXkgdGFyZ2V0XG4gICAqIEBkZWZhdWx0IC0gTm8gZGVzY3JpcHRpb25cbiAgICovXG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgTGFtYmRhIGZ1bmN0aW9uIHRvIGFzc29jaWF0ZSB3aXRoIHRoaXMgdGFyZ2V0XG4gICAqL1xuICByZWFkb25seSBsYW1iZGFGdW5jdGlvbjogSUZ1bmN0aW9uO1xuXG4gIC8qKlxuICAgKiBUaGUgdG9vbCBzY2hlbWEgZGVmaW5pbmcgdGhlIGF2YWlsYWJsZSB0b29sc1xuICAgKi9cbiAgcmVhZG9ubHkgdG9vbFNjaGVtYTogVG9vbFNjaGVtYTtcblxuICAvKipcbiAgICogQ3JlZGVudGlhbCBwcm92aWRlcnMgZm9yIGF1dGhlbnRpY2F0aW9uXG4gICAqIEBkZWZhdWx0IC0gW0dhdGV3YXlDcmVkZW50aWFsUHJvdmlkZXIuaWFtUm9sZSgpXVxuICAgKi9cbiAgcmVhZG9ubHkgY3JlZGVudGlhbFByb3ZpZGVyQ29uZmlndXJhdGlvbnM/OiBJQ3JlZGVudGlhbFByb3ZpZGVyQ29uZmlnW107XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgYWRkaW5nIGFuIE9wZW5BUEkgdGFyZ2V0IHRvIGEgZ2F0ZXdheVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFkZE9wZW5BcGlUYXJnZXRPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBnYXRld2F5IHRhcmdldFxuICAgKiBWYWxpZCBjaGFyYWN0ZXJzIGFyZSBhLXosIEEtWiwgMC05LCBfICh1bmRlcnNjb3JlKSBhbmQgLSAoaHlwaGVuKVxuICAgKi9cbiAgcmVhZG9ubHkgZ2F0ZXdheVRhcmdldE5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogT3B0aW9uYWwgZGVzY3JpcHRpb24gZm9yIHRoZSBnYXRld2F5IHRhcmdldFxuICAgKiBAZGVmYXVsdCAtIE5vIGRlc2NyaXB0aW9uXG4gICAqL1xuICByZWFkb25seSBkZXNjcmlwdGlvbj86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIE9wZW5BUEkgc2NoZW1hIGRlZmluaW5nIHRoZSBBUElcbiAgICovXG4gIHJlYWRvbmx5IGFwaVNjaGVtYTogQXBpU2NoZW1hO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHZhbGlkYXRlIHRoZSBPcGVuQVBJIHNjaGVtYSBvciBub3RcbiAgICogTm90ZTogVmFsaWRhdGlvbiBpcyBvbmx5IHBlcmZvcm1lZCBmb3IgaW5saW5lIGFuZCBhc3NldC1iYXNlZCBzY2hlbWEgYW5kICBkdXJpbmcgQ0RLIHN5bnRoZXNpcy5cbiAgICogUzMgc2NoZW1hcyBjYW5ub3QgYmUgdmFsaWRhdGVkIGF0IHN5bnRoZXNpcyB0aW1lLlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSB2YWxpZGF0ZU9wZW5BcGlTY2hlbWE/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBDcmVkZW50aWFsIHByb3ZpZGVycyBmb3IgYXV0aGVudGljYXRpb25cbiAgICogQGRlZmF1bHQgLSBbR2F0ZXdheUNyZWRlbnRpYWxQcm92aWRlci5pYW1Sb2xlKCldXG4gICAqL1xuICByZWFkb25seSBjcmVkZW50aWFsUHJvdmlkZXJDb25maWd1cmF0aW9ucz86IElDcmVkZW50aWFsUHJvdmlkZXJDb25maWdbXTtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBhZGRpbmcgYSBTbWl0aHkgdGFyZ2V0IHRvIGEgZ2F0ZXdheVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFkZFNtaXRoeVRhcmdldE9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGdhdGV3YXkgdGFyZ2V0XG4gICAqIFZhbGlkIGNoYXJhY3RlcnMgYXJlIGEteiwgQS1aLCAwLTksIF8gKHVuZGVyc2NvcmUpIGFuZCAtIChoeXBoZW4pXG4gICAqL1xuICByZWFkb25seSBnYXRld2F5VGFyZ2V0TmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBkZXNjcmlwdGlvbiBmb3IgdGhlIGdhdGV3YXkgdGFyZ2V0XG4gICAqIEBkZWZhdWx0IC0gTm8gZGVzY3JpcHRpb25cbiAgICovXG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgU21pdGh5IG1vZGVsIGRlZmluaW5nIHRoZSBBUElcbiAgICovXG4gIHJlYWRvbmx5IHNtaXRoeU1vZGVsOiBBcGlTY2hlbWE7XG5cbiAgLyoqXG4gICAqIENyZWRlbnRpYWwgcHJvdmlkZXJzIGZvciBhdXRoZW50aWNhdGlvblxuICAgKiBAZGVmYXVsdCAtIFtHYXRld2F5Q3JlZGVudGlhbFByb3ZpZGVyLmlhbVJvbGUoKV1cbiAgICovXG4gIHJlYWRvbmx5IGNyZWRlbnRpYWxQcm92aWRlckNvbmZpZ3VyYXRpb25zPzogSUNyZWRlbnRpYWxQcm92aWRlckNvbmZpZ1tdO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGFkZGluZyBhbiBNQ1AgU2VydmVyIHRhcmdldCB0byBhIGdhdGV3YXlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBZGRNY3BTZXJ2ZXJUYXJnZXRPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBnYXRld2F5IHRhcmdldFxuICAgKiBWYWxpZCBjaGFyYWN0ZXJzIGFyZSBhLXosIEEtWiwgMC05LCBfICh1bmRlcnNjb3JlKSBhbmQgLSAoaHlwaGVuKVxuICAgKi9cbiAgcmVhZG9ubHkgZ2F0ZXdheVRhcmdldE5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogT3B0aW9uYWwgZGVzY3JpcHRpb24gZm9yIHRoZSBnYXRld2F5IHRhcmdldFxuICAgKiBAZGVmYXVsdCAtIE5vIGRlc2NyaXB0aW9uXG4gICAqL1xuICByZWFkb25seSBkZXNjcmlwdGlvbj86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIEhUVFBTIGVuZHBvaW50IFVSTCBvZiB0aGUgTUNQIHNlcnZlclxuICAgKlxuICAgKiBUaGUgZW5kcG9pbnQgbXVzdDpcbiAgICogLSBVc2UgSFRUUFMgcHJvdG9jb2xcbiAgICogLSBCZSBwcm9wZXJseSBVUkwtZW5jb2RlZFxuICAgKiAtIFBvaW50IHRvIGFuIE1DUCBzZXJ2ZXIgdGhhdCBpbXBsZW1lbnRzIHRvb2wgY2FwYWJpbGl0aWVzXG4gICAqL1xuICByZWFkb25seSBlbmRwb2ludDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDcmVkZW50aWFsIHByb3ZpZGVycyBmb3IgYXV0aGVudGljYXRpb25cbiAgICpcbiAgICogTUNQIHNlcnZlcnMgcmVxdWlyZSBleHBsaWNpdCBhdXRoZW50aWNhdGlvbiBjb25maWd1cmF0aW9uLlxuICAgKiBPQXV0aDIgaXMgc3Ryb25nbHkgcmVjb21tZW5kZWQgb3ZlciBOb0F1dGguXG4gICAqL1xuICByZWFkb25seSBjcmVkZW50aWFsUHJvdmlkZXJDb25maWd1cmF0aW9uczogSUNyZWRlbnRpYWxQcm92aWRlckNvbmZpZ1tdO1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIGRlZmluaW5nIGEgR2F0ZXdheVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdhdGV3YXlQcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgZ2F0ZXdheVxuICAgKiBWYWxpZCBjaGFyYWN0ZXJzIGFyZSBhLXosIEEtWiwgMC05LCBfICh1bmRlcnNjb3JlKSBhbmQgLSAoaHlwaGVuKVxuICAgKiBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4geW91ciBhY2NvdW50XG4gICAqL1xuICByZWFkb25seSBnYXRld2F5TmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBkZXNjcmlwdGlvbiBmb3IgdGhlIGdhdGV3YXlcbiAgICogVmFsaWQgY2hhcmFjdGVycyBhcmUgYS16LCBBLVosIDAtOSwgXyAodW5kZXJzY29yZSksIC0gKGh5cGhlbikgYW5kIHNwYWNlc1xuICAgKiBUaGUgZGVzY3JpcHRpb24gY2FuIGhhdmUgdXAgdG8gMjAwIGNoYXJhY3RlcnNcbiAgICogQGRlZmF1bHQgLSBObyBkZXNjcmlwdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwcm90b2NvbCBjb25maWd1cmF0aW9uIGZvciB0aGUgZ2F0ZXdheVxuICAgKiBAZGVmYXVsdCAtIEEgZGVmYXVsdCBwcm90b2NvbCBjb25maWd1cmF0aW9uIHdpbGwgYmUgY3JlYXRlZCB1c2luZyBNQ1Agd2l0aCBmb2xsb3dpbmcgcGFyYW1zXG4gICAqICBzdXBwb3J0ZWRWZXJzaW9uczogW01DUFByb3RvY29sVmVyc2lvbi5NQ1BfMjAyNV8wM18yNl0sXG4gICAqICBzZWFyY2hUeXBlOiBNY3BHYXRld2F5U2VhcmNoVHlwZS5TRU1BTlRJQyxcbiAgICogIGluc3RydWN0aW9uczogXCJEZWZhdWx0IGdhdGV3YXkgdG8gY29ubmVjdCB0byBleHRlcm5hbCBNQ1AgdG9vbHNcIixcbiAgICovXG4gIHJlYWRvbmx5IHByb3RvY29sQ29uZmlndXJhdGlvbj86IElHYXRld2F5UHJvdG9jb2xDb25maWc7XG5cbiAgLyoqXG4gICAqIFRoZSBhdXRob3JpemVyIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBnYXRld2F5XG4gICAqIEBkZWZhdWx0IC0gQSBkZWZhdWx0IGF1dGhvcml6ZXIgd2lsbCBiZSBjcmVhdGVkIHVzaW5nIENvZ25pdG9cbiAgICovXG4gIHJlYWRvbmx5IGF1dGhvcml6ZXJDb25maWd1cmF0aW9uPzogSUdhdGV3YXlBdXRob3JpemVyQ29uZmlnO1xuXG4gIC8qKlxuICAgKiBUaGUgdmVyYm9zaXR5IG9mIGV4Y2VwdGlvbiBtZXNzYWdlc1xuICAgKiBVc2UgREVCVUcgbW9kZSB0byBzZWUgZ3JhbnVsYXIgZXhjZXB0aW9uIG1lc3NhZ2VzIGZyb20gYSBHYXRld2F5XG4gICAqIEBkZWZhdWx0IC0gRXhjZXB0aW9uIG1lc3NhZ2VzIGFyZSBzYW5pdGl6ZWQgZm9yIHByZXNlbnRhdGlvbiB0byBlbmQgdXNlcnNcbiAgICovXG4gIHJlYWRvbmx5IGV4Y2VwdGlvbkxldmVsPzogR2F0ZXdheUV4Y2VwdGlvbkxldmVsO1xuXG4gIC8qKlxuICAgKiBUaGUgQVdTIEtNUyBrZXkgdXNlZCB0byBlbmNyeXB0IGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBnYXRld2F5XG4gICAqIEBkZWZhdWx0IC0gTm8gZW5jcnlwdGlvblxuICAgKi9cbiAgcmVhZG9ubHkga21zS2V5Pzoga21zLklLZXk7XG5cbiAgLyoqXG4gICAqIFRoZSBJQU0gcm9sZSB0aGF0IHByb3ZpZGVzIHBlcm1pc3Npb25zIGZvciB0aGUgZ2F0ZXdheSB0byBhY2Nlc3MgQVdTIHNlcnZpY2VzXG4gICAqIEBkZWZhdWx0IC0gQSBuZXcgcm9sZSB3aWxsIGJlIGNyZWF0ZWRcbiAgICovXG4gIHJlYWRvbmx5IHJvbGU/OiBpYW0uSVJvbGU7XG5cbiAgLyoqXG4gICAqIFRhZ3MgZm9yIHRoZSBnYXRld2F5XG4gICAqIEEgbGlzdCBvZiBrZXk6dmFsdWUgcGFpcnMgb2YgdGFncyB0byBhcHBseSB0byB0aGlzIEdhdGV3YXkgcmVzb3VyY2VcbiAgICogQGRlZmF1bHQgLSBObyB0YWdzXG4gICAqL1xuICByZWFkb25seSB0YWdzPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcbn1cblxuLyoqXG4gKiBBdHRyaWJ1dGVzIGZvciBpbXBvcnRpbmcgYW4gZXhpc3RpbmcgR2F0ZXdheVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdhdGV3YXlBdHRyaWJ1dGVzIHtcbiAgLyoqXG4gICAqIFRoZSBBUk4gb2YgdGhlIGdhdGV3YXlcbiAgICovXG4gIHJlYWRvbmx5IGdhdGV3YXlBcm46IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIElEIG9mIHRoZSBnYXRld2F5XG4gICAqL1xuICByZWFkb25seSBnYXRld2F5SWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGdhdGV3YXlcbiAgICovXG4gIHJlYWRvbmx5IGdhdGV3YXlOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBJQU0gcm9sZSB0aGF0IHByb3ZpZGVzIHBlcm1pc3Npb25zIGZvciB0aGUgZ2F0ZXdheVxuICAgKi9cbiAgcmVhZG9ubHkgcm9sZTogaWFtLklSb2xlO1xufVxuXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NcbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKlxuICogR2F0ZXdheSByZXNvdXJjZSBmb3IgQVdTIEJlZHJvY2sgQWdlbnQgQ29yZS5cbiAqIFNlcnZlcyBhcyBhbiBpbnRlZ3JhdGlvbiBwb2ludCBiZXR3ZWVuIHlvdXIgYWdlbnQgYW5kIGV4dGVybmFsIHNlcnZpY2VzLlxuICpcbiAqIEByZXNvdXJjZSBBV1M6OkJlZHJvY2tBZ2VudENvcmU6OkdhdGV3YXlcbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2JlZHJvY2stYWdlbnRjb3JlLWNvbnRyb2wvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQ3JlYXRlR2F0ZXdheS5odG1sXG4gKi9cbkBwcm9wZXJ0eUluamVjdGFibGVcbmV4cG9ydCBjbGFzcyBHYXRld2F5IGV4dGVuZHMgR2F0ZXdheUJhc2Uge1xuICAvKiogVW5pcXVlbHkgaWRlbnRpZmllcyB0aGlzIGNsYXNzLiAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFBST1BFUlRZX0lOSkVDVElPTl9JRDogc3RyaW5nID0gJ0Bhd3MtY2RrLmF3cy1iZWRyb2NrLWFnZW50Y29yZS1hbHBoYS5HYXRld2F5JztcbiAgLyoqXG4gICAqIEltcG9ydCBhbiBleGlzdGluZyBHYXRld2F5IHVzaW5nIGl0cyBhdHRyaWJ1dGVzXG4gICAqXG4gICAqIEBwYXJhbSBzY29wZSBUaGUgY29uc3RydWN0IHNjb3BlXG4gICAqIEBwYXJhbSBpZCBUaGUgY29uc3RydWN0IGlkXG4gICAqIEBwYXJhbSBhdHRycyBUaGUgYXR0cmlidXRlcyBvZiB0aGUgZXhpc3RpbmcgR2F0ZXdheVxuICAgKiBAcmV0dXJucyBBbiBJR2F0ZXdheSBpbnN0YW5jZSByZXByZXNlbnRpbmcgdGhlIGltcG9ydGVkIGdhdGV3YXlcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbUdhdGV3YXlBdHRyaWJ1dGVzKFxuICAgIHNjb3BlOiBDb25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBhdHRyczogR2F0ZXdheUF0dHJpYnV0ZXMsXG4gICk6IElHYXRld2F5IHtcbiAgICBjbGFzcyBJbXBvcnRlZEdhdGV3YXkgZXh0ZW5kcyBHYXRld2F5QmFzZSB7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgZ2F0ZXdheUFybiA9IGF0dHJzLmdhdGV3YXlBcm47XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgZ2F0ZXdheUlkID0gYXR0cnMuZ2F0ZXdheUlkO1xuICAgICAgcHVibGljIHJlYWRvbmx5IG5hbWUgPSBhdHRycy5nYXRld2F5TmFtZTtcbiAgICAgIHB1YmxpYyByZWFkb25seSBkZXNjcmlwdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgIHB1YmxpYyByZWFkb25seSBwcm90b2NvbENvbmZpZ3VyYXRpb246IElHYXRld2F5UHJvdG9jb2xDb25maWc7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgYXV0aG9yaXplckNvbmZpZ3VyYXRpb246IElHYXRld2F5QXV0aG9yaXplckNvbmZpZztcbiAgICAgIHB1YmxpYyByZWFkb25seSBleGNlcHRpb25MZXZlbCA9IHVuZGVmaW5lZDtcbiAgICAgIHB1YmxpYyByZWFkb25seSBrbXNLZXkgPSB1bmRlZmluZWQ7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgcm9sZSA9IGF0dHJzLnJvbGU7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgZ2F0ZXdheVVybCA9IHVuZGVmaW5lZDtcbiAgICAgIHB1YmxpYyByZWFkb25seSBzdGF0dXMgPSB1bmRlZmluZWQ7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgc3RhdHVzUmVhc29uID0gdW5kZWZpbmVkO1xuICAgICAgcHVibGljIHJlYWRvbmx5IGNyZWF0ZWRBdCA9IHVuZGVmaW5lZDtcbiAgICAgIHB1YmxpYyByZWFkb25seSB1cGRhdGVkQXQgPSB1bmRlZmluZWQ7XG5cbiAgICAgIGNvbnN0cnVjdG9yKHM6IENvbnN0cnVjdCwgaTogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKHMsIGkpO1xuICAgICAgICAvLyBDcmVhdGUgcGxhY2Vob2xkZXIgcHJvdG9jb2wgYW5kIGF1dGhvcml6ZXIgY29uZmlndXJhdGlvbnNcbiAgICAgICAgdGhpcy5wcm90b2NvbENvbmZpZ3VyYXRpb24gPSBuZXcgTWNwUHJvdG9jb2xDb25maWd1cmF0aW9uKHtcbiAgICAgICAgICBzdXBwb3J0ZWRWZXJzaW9uczogW01DUFByb3RvY29sVmVyc2lvbi5NQ1BfMjAyNV8wM18yNl0sXG4gICAgICAgICAgc2VhcmNoVHlwZTogTWNwR2F0ZXdheVNlYXJjaFR5cGUuU0VNQU5USUMsXG4gICAgICAgICAgaW5zdHJ1Y3Rpb25zOiAnSW1wb3J0ZWQgZ2F0ZXdheScsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmF1dGhvcml6ZXJDb25maWd1cmF0aW9uID0gR2F0ZXdheUF1dGhvcml6ZXIudXNpbmdBd3NJYW0oKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5ldyBJbXBvcnRlZEdhdGV3YXkoc2NvcGUsIGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgQVJOIG9mIHRoZSBnYXRld2F5XG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBnYXRld2F5QXJuOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgZ2F0ZXdheVxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZ2F0ZXdheUlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBnYXRld2F5XG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIGdhdGV3YXlcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBkZXNjcmlwdGlvbj86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHByb3RvY29sIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBnYXRld2F5XG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcHJvdG9jb2xDb25maWd1cmF0aW9uOiBJR2F0ZXdheVByb3RvY29sQ29uZmlnO1xuXG4gIC8qKlxuICAgKiBUaGUgYXV0aG9yaXplciBjb25maWd1cmF0aW9uIGZvciB0aGUgZ2F0ZXdheVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGF1dGhvcml6ZXJDb25maWd1cmF0aW9uOiBJR2F0ZXdheUF1dGhvcml6ZXJDb25maWc7XG5cbiAgLyoqXG4gICAqIFRoZSBleGNlcHRpb24gbGV2ZWwgZm9yIHRoZSBnYXRld2F5XG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZXhjZXB0aW9uTGV2ZWw/OiBHYXRld2F5RXhjZXB0aW9uTGV2ZWw7XG5cbiAgLyoqXG4gICAqIFRoZSBLTVMga2V5IHVzZWQgZm9yIGVuY3J5cHRpb25cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBrbXNLZXk/OiBrbXMuSUtleTtcblxuICAvKipcbiAgICogVGhlIElBTSByb2xlIGZvciB0aGUgZ2F0ZXdheVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHJvbGU6IGlhbS5JUm9sZTtcblxuICAvK