UNPKG

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

Version:

The CDK Construct Library for Amazon Bedrock

207 lines 20.6 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.S3ApiSchema = exports.InlineApiSchema = exports.AssetApiSchema = exports.ApiSchema = void 0; const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); const aws_cdk_lib_1 = require("aws-cdk-lib"); const aws_iam_1 = require("aws-cdk-lib/aws-iam"); const s3_assets = require("aws-cdk-lib/aws-s3-assets"); const base_schema_1 = require("./base-schema"); /** * Error thrown when an ApiSchema is not properly initialized. */ class ApiSchemaError extends Error { cause; constructor(message, cause) { super(message); this.cause = cause; this.name = 'ApiSchemaError'; } } /****************************************************************************** * API SCHEMA CLASS *****************************************************************************/ /** * Represents the concept of an API Schema for a Gateway Target. */ class ApiSchema extends base_schema_1.TargetSchema { static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-bedrock-agentcore-alpha.ApiSchema", version: "2.227.0-alpha.0" }; /** * Creates an API Schema from a local file. * @param path - the path to the local file containing the OpenAPI schema for the action group */ static fromLocalAsset(path) { return new AssetApiSchema(path); } /** * Creates an API Schema from an inline string. * @param schema - the JSON or YAML payload defining the schema (OpenAPI or Smithy) */ static fromInline(schema) { return new InlineApiSchema(schema); } /** * Creates an API Schema from an S3 File * @param bucket - the bucket containing the local file containing the OpenAPI schema for the action group * @param objectKey - object key in the bucket * @param bucketOwnerAccountId - optional The account ID of the Amazon S3 bucket owner. This ID is used for cross-account access to the bucket. */ static fromS3File(bucket, objectKey, bucketOwnerAccountId) { return new S3ApiSchema({ bucketName: bucket.bucketName, objectKey: objectKey, }, bucketOwnerAccountId); } /** * The S3 location of the API schema file, if using an S3-based schema. * Contains the bucket name and object key information. */ s3File; /** * The inline OpenAPI schema definition as a string, if using an inline schema. * Can be in JSON or YAML format. */ inlineSchema; /** * The account ID of the S3 bucket owner for cross-account access */ bucketOwnerAccountId; constructor(s3File, bucketOwnerAccountId, inlineSchema) { super(); this.s3File = s3File; this.inlineSchema = inlineSchema; this.bucketOwnerAccountId = bucketOwnerAccountId; } } exports.ApiSchema = ApiSchema; /** * API Schema from a local asset. * * The asset is uploaded to an S3 staging bucket, then moved to its final location * by CloudFormation during deployment. */ class AssetApiSchema extends ApiSchema { path; options; static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-bedrock-agentcore-alpha.AssetApiSchema", version: "2.227.0-alpha.0" }; asset; constructor(path, options = {}) { super(); this.path = path; this.options = options; } /** * Gets the file path for internal validation purposes * @internal */ _getFilePath() { return this.path; } /** * Binds this API schema to a construct scope. * This method initializes the S3 asset if it hasn't been initialized yet. * Must be called before rendering the schema as CFN properties. * * @param scope - The construct scope to bind to */ bind(scope) { // If the same AssetApiSchema is used multiple times, retain only the first instantiation if (!this.asset) { // Note: Validation is handled at the target configuration level where we know the schema type // and whether validation is enabled this.asset = new s3_assets.Asset(scope, 'Schema', { path: this.path, ...this.options, }); // Note: Permissions will be granted by the Gateway target construct when adding the target } } /** * Format as CFN properties * @internal This is an internal core function and should not be called directly. */ _render() { if (!this.asset) { throw new ApiSchemaError('ApiSchema must be bound to a scope before rendering. Call bind() first.', 'Asset not initialized'); } return { s3: { uri: `s3://${this.asset.s3BucketName}/${this.asset.s3ObjectKey}`, }, }; } grantPermissionsToRole(role) { if (this.asset) { this.asset.grantRead(role); } } } exports.AssetApiSchema = AssetApiSchema; // ------------------------------------------------------ /** * Class to define an API Schema from an inline string. * The schema can be provided directly as a string. * Validation is performed at the target configuration level where the schema type is known. */ class InlineApiSchema extends ApiSchema { schema; static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-bedrock-agentcore-alpha.InlineApiSchema", version: "2.227.0-alpha.0" }; constructor(schema) { super(undefined, undefined, schema); this.schema = schema; } /** * @internal This is an internal core function and should not be called directly. */ _render() { return { inlinePayload: this.schema, }; } grantPermissionsToRole(_role) { } bind(scope) { if (scope) { } } } exports.InlineApiSchema = InlineApiSchema; // ------------------------------------------------------ // S3 File // ------------------------------------------------------ /** * Class to define an API Schema from an S3 object. */ class S3ApiSchema extends ApiSchema { location; bucketOwnerAccountId; static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-bedrock-agentcore-alpha.S3ApiSchema", version: "2.227.0-alpha.0" }; constructor(location, bucketOwnerAccountId) { super(location, bucketOwnerAccountId, undefined); this.location = location; this.bucketOwnerAccountId = bucketOwnerAccountId; } /** * @internal This is an internal core function and should not be called directly. */ _render() { return { s3: { uri: `s3://${this.location.bucketName}/${this.location.objectKey}`, ...(this.bucketOwnerAccountId && { bucketOwnerAccountId: this.bucketOwnerAccountId }), }, }; } bind(scope) { if (scope) { } } grantPermissionsToRole(role) { aws_iam_1.Grant.addToPrincipal({ grantee: role, actions: ['s3:GetObject'], resourceArns: [`arn:${aws_cdk_lib_1.Aws.PARTITION}:s3:::${this.location.bucketName}/${this.location.objectKey}`], }); } } exports.S3ApiSchema = S3ApiSchema; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLXNjaGVtYS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImFwaS1zY2hlbWEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLDZDQUFrQztBQUNsQyxpREFBbUQ7QUFFbkQsdURBQXVEO0FBRXZELCtDQUE2QztBQUU3Qzs7R0FFRztBQUNILE1BQU0sY0FBZSxTQUFRLEtBQUs7SUFDYTtJQUE3QyxZQUFZLE9BQWUsRUFBa0IsS0FBYztRQUN6RCxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFENEIsVUFBSyxHQUFMLEtBQUssQ0FBUztRQUV6RCxJQUFJLENBQUMsSUFBSSxHQUFHLGdCQUFnQixDQUFDO0tBQzlCO0NBQ0Y7QUFFRDs7K0VBRStFO0FBQy9FOztHQUVHO0FBQ0gsTUFBc0IsU0FBVSxTQUFRLDBCQUFZOztJQUNsRDs7O09BR0c7SUFDSSxNQUFNLENBQUMsY0FBYyxDQUFDLElBQVk7UUFDdkMsT0FBTyxJQUFJLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUNqQztJQUVEOzs7T0FHRztJQUNJLE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBYztRQUNyQyxPQUFPLElBQUksZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0tBQ3BDO0lBRUQ7Ozs7O09BS0c7SUFDSSxNQUFNLENBQUMsVUFBVSxDQUFDLE1BQWUsRUFBRSxTQUFpQixFQUFFLG9CQUE2QjtRQUN4RixPQUFPLElBQUksV0FBVyxDQUNwQjtZQUNFLFVBQVUsRUFBRSxNQUFNLENBQUMsVUFBVTtZQUM3QixTQUFTLEVBQUUsU0FBUztTQUNyQixFQUNELG9CQUFvQixDQUNyQixDQUFDO0tBQ0g7SUFFRDs7O09BR0c7SUFDYSxNQUFNLENBQVk7SUFFbEM7OztPQUdHO0lBQ2EsWUFBWSxDQUFVO0lBRXRDOztPQUVHO0lBQ2Esb0JBQW9CLENBQVU7SUFFOUMsWUFBc0IsTUFBaUIsRUFBRSxvQkFBNkIsRUFBRSxZQUFxQjtRQUMzRixLQUFLLEVBQUUsQ0FBQztRQUNSLElBQUks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QUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO2FBQ3RGO1NBQ0YsQ0FBQztLQUNIO0lBRU0sSUFBSSxDQUFDLEtBQWdCO1FBQzFCLElBQUksS0FBSyxFQUFFLENBQUM7UUFDWixDQUFDO0tBRUY7SUFFTSxzQkFBc0IsQ0FBQyxJQUFXO1FBQ3ZDLGVBQUssQ0FBQyxjQUFjLENBQUM7WUFDbkIsT0FBTyxFQUFFLElBQUk7WUFDYixPQUFPLEVBQUUsQ0FBQyxjQUFjLENBQUM7WUFDekIsWUFBWSxFQUFFLENBQUMsT0FBTyxpQkFBRyxDQUFDLFNBQVMsU0FBUyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDO1NBQ25HLENBQUMsQ0FBQztLQUNKOztBQTVCSCxrQ0E2QkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBd3MgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBHcmFudCwgSVJvbGUgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCB7IElCdWNrZXQsIExvY2F0aW9uIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXMzJztcbmltcG9ydCAqIGFzIHMzX2Fzc2V0cyBmcm9tICdhd3MtY2RrLWxpYi9hd3MtczMtYXNzZXRzJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgVGFyZ2V0U2NoZW1hIH0gZnJvbSAnLi9iYXNlLXNjaGVtYSc7XG5cbi8qKlxuICogRXJyb3IgdGhyb3duIHdoZW4gYW4gQXBpU2NoZW1hIGlzIG5vdCBwcm9wZXJseSBpbml0aWFsaXplZC5cbiAqL1xuY2xhc3MgQXBpU2NoZW1hRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZywgcHVibGljIHJlYWRvbmx5IGNhdXNlPzogc3RyaW5nKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gICAgdGhpcy5uYW1lID0gJ0FwaVNjaGVtYUVycm9yJztcbiAgfVxufVxuXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gKiAgICAgICAgICAgICAgICAgICAgICAgQVBJIFNDSEVNQSBDTEFTU1xuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBjb25jZXB0IG9mIGFuIEFQSSBTY2hlbWEgZm9yIGEgR2F0ZXdheSBUYXJnZXQuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBcGlTY2hlbWEgZXh0ZW5kcyBUYXJnZXRTY2hlbWEge1xuICAvKipcbiAgICogQ3JlYXRlcyBhbiBBUEkgU2NoZW1hIGZyb20gYSBsb2NhbCBmaWxlLlxuICAgKiBAcGFyYW0gcGF0aCAtIHRoZSBwYXRoIHRvIHRoZSBsb2NhbCBmaWxlIGNvbnRhaW5pbmcgdGhlIE9wZW5BUEkgc2NoZW1hIGZvciB0aGUgYWN0aW9uIGdyb3VwXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21Mb2NhbEFzc2V0KHBhdGg6IHN0cmluZyk6IEFzc2V0QXBpU2NoZW1hIHtcbiAgICByZXR1cm4gbmV3IEFzc2V0QXBpU2NoZW1hKHBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gQVBJIFNjaGVtYSBmcm9tIGFuIGlubGluZSBzdHJpbmcuXG4gICAqIEBwYXJhbSBzY2hlbWEgLSB0aGUgSlNPTiBvciBZQU1MIHBheWxvYWQgZGVmaW5pbmcgdGhlIHNjaGVtYSAoT3BlbkFQSSBvciBTbWl0aHkpXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21JbmxpbmUoc2NoZW1hOiBzdHJpbmcpOiBJbmxpbmVBcGlTY2hlbWEge1xuICAgIHJldHVybiBuZXcgSW5saW5lQXBpU2NoZW1hKHNjaGVtYSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBBUEkgU2NoZW1hIGZyb20gYW4gUzMgRmlsZVxuICAgKiBAcGFyYW0gYnVja2V0IC0gdGhlIGJ1Y2tldCBjb250YWluaW5nIHRoZSBsb2NhbCBmaWxlIGNvbnRhaW5pbmcgdGhlIE9wZW5BUEkgc2NoZW1hIGZvciB0aGUgYWN0aW9uIGdyb3VwXG4gICAqIEBwYXJhbSBvYmplY3RLZXkgLSBvYmplY3Qga2V5IGluIHRoZSBidWNrZXRcbiAgICogQHBhcmFtIGJ1Y2tldE93bmVyQWNjb3VudElkIC0gb3B0aW9uYWwgVGhlIGFjY291bnQgSUQgb2YgdGhlIEFtYXpvbiBTMyBidWNrZXQgb3duZXIuIFRoaXMgSUQgaXMgdXNlZCBmb3IgY3Jvc3MtYWNjb3VudCBhY2Nlc3MgdG8gdGhlIGJ1Y2tldC5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbVMzRmlsZShidWNrZXQ6IElCdWNrZXQsIG9iamVjdEtleTogc3RyaW5nLCBidWNrZXRPd25lckFjY291bnRJZD86IHN0cmluZyk6IFMzQXBpU2NoZW1hIHtcbiAgICByZXR1cm4gbmV3IFMzQXBpU2NoZW1hKFxuICAgICAge1xuICAgICAgICBidWNrZXROYW1lOiBidWNrZXQuYnVja2V0TmFtZSxcbiAgICAgICAgb2JqZWN0S2V5OiBvYmplY3RLZXksXG4gICAgICB9LFxuICAgICAgYnVja2V0T3duZXJBY2NvdW50SWQsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgUzMgbG9jYXRpb24gb2YgdGhlIEFQSSBzY2hlbWEgZmlsZSwgaWYgdXNpbmcgYW4gUzMtYmFzZWQgc2NoZW1hLlxuICAgKiBDb250YWlucyB0aGUgYnVja2V0IG5hbWUgYW5kIG9iamVjdCBrZXkgaW5mb3JtYXRpb24uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgczNGaWxlPzogTG9jYXRpb247XG5cbiAgLyoqXG4gICAqIFRoZSBpbmxpbmUgT3BlbkFQSSBzY2hlbWEgZGVmaW5pdGlvbiBhcyBhIHN0cmluZywgaWYgdXNpbmcgYW4gaW5saW5lIHNjaGVtYS5cbiAgICogQ2FuIGJlIGluIEpTT04gb3IgWUFNTCBmb3JtYXQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaW5saW5lU2NoZW1hPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgYWNjb3VudCBJRCBvZiB0aGUgUzMgYnVja2V0IG93bmVyIGZvciBjcm9zcy1hY2NvdW50IGFjY2Vzc1xuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGJ1Y2tldE93bmVyQWNjb3VudElkPzogc3RyaW5nO1xuXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihzM0ZpbGU/OiBMb2NhdGlvbiwgYnVja2V0T3duZXJBY2NvdW50SWQ/OiBzdHJpbmcsIGlubGluZVNjaGVtYT86IHN0cmluZykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5zM0ZpbGUgPSBzM0ZpbGU7XG4gICAgdGhpcy5pbmxpbmVTY2hlbWEgPSBpbmxpbmVTY2hlbWE7XG4gICAgdGhpcy5idWNrZXRPd25lckFjY291bnRJZCA9IGJ1Y2tldE93bmVyQWNjb3VudElkO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdCBhcyBDRk4gcHJvcGVydGllc1xuICAgKiBAaW50ZXJuYWwgVGhpcyBpcyBhbiBpbnRlcm5hbCBjb3JlIGZ1bmN0aW9uIGFuZCBzaG91bGQgbm90IGJlIGNhbGxlZCBkaXJlY3RseS5cbiAgICovXG4gIHB1YmxpYyBhYnN0cmFjdCBfcmVuZGVyKCk6IGFueTtcbn1cblxuLyoqXG4gKiBBUEkgU2NoZW1hIGZyb20gYSBsb2NhbCBhc3NldC5cbiAqXG4gKiBUaGUgYXNzZXQgaXMgdXBsb2FkZWQgdG8gYW4gUzMgc3RhZ2luZyBidWNrZXQsIHRoZW4gbW92ZWQgdG8gaXRzIGZpbmFsIGxvY2F0aW9uXG4gKiBieSBDbG91ZEZvcm1hdGlvbiBkdXJpbmcgZGVwbG95bWVudC5cbiAqL1xuZXhwb3J0IGNsYXNzIEFzc2V0QXBpU2NoZW1hIGV4dGVuZHMgQXBpU2NoZW1hIHtcbiAgcHJpdmF0ZSBhc3NldD86IHMzX2Fzc2V0cy5Bc3NldDtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHBhdGg6IHN0cmluZywgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBzM19hc3NldHMuQXNzZXRPcHRpb25zID0ge30pIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGZpbGUgcGF0aCBmb3IgaW50ZXJuYWwgdmFsaWRhdGlvbiBwdXJwb3Nlc1xuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBfZ2V0RmlsZVBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wYXRoO1xuICB9XG5cbiAgLyoqXG4gICAqIEJpbmRzIHRoaXMgQVBJIHNjaGVtYSB0byBhIGNvbnN0cnVjdCBzY29wZS5cbiAgICogVGhpcyBtZXRob2QgaW5pdGlhbGl6ZXMgdGhlIFMzIGFzc2V0IGlmIGl0IGhhc24ndCBiZWVuIGluaXRpYWxpemVkIHlldC5cbiAgICogTXVzdCBiZSBjYWxsZWQgYmVmb3JlIHJlbmRlcmluZyB0aGUgc2NoZW1hIGFzIENGTiBwcm9wZXJ0aWVzLlxuICAgKlxuICAgKiBAcGFyYW0gc2NvcGUgLSBUaGUgY29uc3RydWN0IHNjb3BlIHRvIGJpbmQgdG9cbiAgICovXG4gIHB1YmxpYyBiaW5kKHNjb3BlOiBDb25zdHJ1Y3QpOiB2b2lkIHtcbiAgICAvLyBJZiB0aGUgc2FtZSBBc3NldEFwaVNjaGVtYSBpcyB1c2VkIG11bHRpcGxlIHRpbWVzLCByZXRhaW4gb25seSB0aGUgZmlyc3QgaW5zdGFudGlhdGlvblxuICAgIGlmICghdGhpcy5hc3NldCkge1xuICAgICAgLy8gTm90ZTogVmFsaWRhdGlvbiBpcyBoYW5kbGVkIGF0IHRoZSB0YXJnZXQgY29uZmlndXJhdGlvbiBsZXZlbCB3aGVyZSB3ZSBrbm93IHRoZSBzY2hlbWEgdHlwZVxuICAgICAgLy8gYW5kIHdoZXRoZXIgdmFsaWRhdGlvbiBpcyBlbmFibGVkXG4gICAgICB0aGlzLmFzc2V0ID0gbmV3IHMzX2Fzc2V0cy5Bc3NldChzY29wZSwgJ1NjaGVtYScsIHtcbiAgICAgICAgcGF0aDogdGhpcy5wYXRoLFxuICAgICAgICAuLi50aGlzLm9wdGlvbnMsXG4gICAgICB9KTtcbiAgICAgIC8vIE5vdGU6IFBlcm1pc3Npb25zIHdpbGwgYmUgZ3JhbnRlZCBieSB0aGUgR2F0ZXdheSB0YXJnZXQgY29uc3RydWN0IHdoZW4gYWRkaW5nIHRoZSB0YXJnZXRcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRm9ybWF0IGFzIENGTiBwcm9wZXJ0aWVzXG4gICAqIEBpbnRlcm5hbCBUaGlzIGlzIGFuIGludGVybmFsIGNvcmUgZnVuY3Rpb24gYW5kIHNob3VsZCBub3QgYmUgY2FsbGVkIGRpcmVjdGx5LlxuICAgKi9cbiAgcHVibGljIF9yZW5kZXIoKTogYW55IHtcbiAgICBpZiAoIXRoaXMuYXNzZXQpIHtcbiAgICAgIHRocm93IG5ldyBBcGlTY2hlbWFFcnJvcihcbiAgICAgICAgJ0FwaVNjaGVtYSBtdXN0IGJlIGJvdW5kIHRvIGEgc2NvcGUgYmVmb3JlIHJlbmRlcmluZy4gQ2FsbCBiaW5kKCkgZmlyc3QuJyxcbiAgICAgICAgJ0Fzc2V0IG5vdCBpbml0aWFsaXplZCcsXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBzMzoge1xuICAgICAgICB1cmk6IGBzMzovLyR7dGhpcy5hc3NldC5zM0J1Y2tldE5hbWV9LyR7dGhpcy5hc3NldC5zM09iamVjdEtleX1gLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIGdyYW50UGVybWlzc2lvbnNUb1JvbGUocm9sZTogSVJvbGUpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5hc3NldCkge1xuICAgICAgdGhpcy5hc3NldC5ncmFudFJlYWQocm9sZSk7XG4gICAgfVxuICB9XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLyoqXG4gKiBDbGFzcyB0byBkZWZpbmUgYW4gQVBJIFNjaGVtYSBmcm9tIGFuIGlubGluZSBzdHJpbmcuXG4gKiBUaGUgc2NoZW1hIGNhbiBiZSBwcm92aWRlZCBkaXJlY3RseSBhcyBhIHN0cmluZy5cbiAqIFZhbGlkYXRpb24gaXMgcGVyZm9ybWVkIGF0IHRoZSB0YXJnZXQgY29uZmlndXJhdGlvbiBsZXZlbCB3aGVyZSB0aGUgc2NoZW1hIHR5cGUgaXMga25vd24uXG4gKi9cbmV4cG9ydCBjbGFzcyBJbmxpbmVBcGlTY2hlbWEgZXh0ZW5kcyBBcGlTY2hlbWEge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHNjaGVtYTogc3RyaW5nKSB7XG4gICAgc3VwZXIodW5kZWZpbmVkLCB1bmRlZmluZWQsIHNjaGVtYSk7XG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsIFRoaXMgaXMgYW4gaW50ZXJuYWwgY29yZSBmdW5jdGlvbiBhbmQgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZGlyZWN0bHkuXG4gICAqL1xuICBwdWJsaWMgX3JlbmRlcigpOiBhbnkge1xuICAgIHJldHVybiB7XG4gICAgICBpbmxpbmVQYXlsb2FkOiB0aGlzLnNjaGVtYSxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIGdyYW50UGVybWlzc2lvbnNUb1JvbGUoX3JvbGU6IElSb2xlKTogdm9pZCB7XG4gICAgLy8gTm8tb3AgLSBJbmxpbmVBcGlTY2hlbWEgZG9lc24ndCBuZWVkIHBlcm1pc3Npb25zXG4gIH1cblxuICBwdWJsaWMgYmluZChzY29wZTogQ29uc3RydWN0KTogdm9pZCB7XG4gICAgaWYgKHNjb3BlKSB7XG4gICAgfVxuICAgIC8vIE5vLW9wIC0gdmFsaWRhdGlvbiBpcyBoYW5kbGVkIGF0IHRoZSB0YXJnZXQgY29uZmlndXJhdGlvbiBsZXZlbFxuICAgIC8vIHdoZXJlIHdlIGtub3cgd2hldGhlciB0aGlzIGlzIE9wZW5BUEkgb3IgU21pdGh5XG4gIH1cbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBTMyBGaWxlXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8qKlxuICogQ2xhc3MgdG8gZGVmaW5lIGFuIEFQSSBTY2hlbWEgZnJvbSBhbiBTMyBvYmplY3QuXG4gKi9cbmV4cG9ydCBjbGFzcyBTM0FwaVNjaGVtYSBleHRlbmRzIEFwaVNjaGVtYSB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgbG9jYXRpb246IExvY2F0aW9uLCBwdWJsaWMgcmVhZG9ubHkgYnVja2V0T3duZXJBY2NvdW50SWQ/OiBzdHJpbmcpIHtcbiAgICBzdXBlcihsb2NhdGlvbiwgYnVja2V0T3duZXJBY2NvdW50SWQsIHVuZGVmaW5lZCk7XG4gIH1cbiAgLyoqXG4gICAqIEBpbnRlcm5hbCBUaGlzIGlzIGFuIGludGVybmFsIGNvcmUgZnVuY3Rpb24gYW5kIHNob3VsZCBub3QgYmUgY2FsbGVkIGRpcmVjdGx5LlxuICAgKi9cbiAgcHVibGljIF9yZW5kZXIoKTogYW55IHtcbiAgICByZXR1cm4ge1xuICAgICAgczM6IHtcbiAgICAgICAgdXJpOiBgczM6Ly8ke3RoaXMubG9jYXRpb24uYnVja2V0TmFtZX0vJHt0aGlzLmxvY2F0aW9uLm9iamVjdEtleX1gLFxuICAgICAgICAuLi4odGhpcy5idWNrZXRPd25lckFjY291bnRJZCAmJiB7IGJ1Y2tldE93bmVyQWNjb3VudElkOiB0aGlzLmJ1Y2tldE93bmVyQWNjb3VudElkIH0pLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIGJpbmQoc2NvcGU6IENvbnN0cnVjdCk6IHZvaWQge1xuICAgIGlmIChzY29wZSkge1xuICAgIH1cbiAgICAvLyBOby1vcFxuICB9XG5cbiAgcHVibGljIGdyYW50UGVybWlzc2lvbnNUb1JvbGUocm9sZTogSVJvbGUpOiB2b2lkIHtcbiAgICBHcmFudC5hZGRUb1ByaW5jaXBhbCh7XG4gICAgICBncmFudGVlOiByb2xlLFxuICAgICAgYWN0aW9uczogWydzMzpHZXRPYmplY3QnXSxcbiAgICAgIHJlc291cmNlQXJuczogW2Bhcm46JHtBd3MuUEFSVElUSU9OfTpzMzo6OiR7dGhpcy5sb2NhdGlvbi5idWNrZXROYW1lfS8ke3RoaXMubG9jYXRpb24ub2JqZWN0S2V5fWBdLFxuICAgIH0pO1xuICB9XG59XG4iXX0=