UNPKG

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

Version:

The CDK Construct Library for Amazon Bedrock

209 lines 29.5 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ManagedMemoryStrategy = 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 memory_strategy_1 = require("../memory-strategy"); const validation_helpers_1 = require("../validation-helpers"); /****************************************************************************** * CONSTANTS *****************************************************************************/ /** * Minimum length for prompt * @internal */ const PROMPT_MIN_LENGTH = 1; /** * Maximum length for prompt * @internal */ const PROMPT_MAX_LENGTH = 30000; /** * Managed memory strategy that handles both built-in and override configurations. * This strategy can be used for quick setup with built-in defaults or customized * with specific models and prompt templates. */ class ManagedMemoryStrategy { static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-bedrock-agentcore-alpha.ManagedMemoryStrategy", version: "2.227.0-alpha.0" }; name; description; /** * The namespaces for the strategy */ namespaces; /** * The configuration for the custom consolidation. */ consolidationOverride; /** * The configuration for the custom extraction. */ extractionOverride; strategyType; /** * Constructor to create a new managed memory strategy * @param strategyType the strategy type * @param props the properties for the strategy */ constructor(strategyType, props) { try { jsiiDeprecationWarnings._aws_cdk_aws_bedrock_agentcore_alpha_MemoryStrategyType(strategyType); jsiiDeprecationWarnings._aws_cdk_aws_bedrock_agentcore_alpha_ManagedStrategyProps(props); } catch (error) { if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { Error.captureStackTrace(error, ManagedMemoryStrategy); } throw error; } // ------------------------------------------------------ // Set properties and defaults // ------------------------------------------------------ this.name = props.name; this.description = props.description; this.namespaces = props.namespaces; this.strategyType = strategyType; this.consolidationOverride = props.customConsolidation; this.extractionOverride = props.customExtraction; // ------------------------------------------------------ // Validations // ------------------------------------------------------ (0, validation_helpers_1.throwIfInvalid)(this._validatePrompt, this.consolidationOverride?.appendToPrompt); (0, validation_helpers_1.throwIfInvalid)(this._validatePrompt, this.extractionOverride?.appendToPrompt); (0, validation_helpers_1.throwIfInvalid)(this._validateMemoryStrategyName, this.name); if (this.namespaces) { (0, validation_helpers_1.throwIfInvalid)(this._validateMemoryStrategyNamespaces, this.namespaces); } } /** * Renders the network configuration as a CloudFormation property. * @returns The CloudFormation property for the memory strategy. */ render() { // If no overrides, use built-in strategy format if (!this.consolidationOverride && !this.extractionOverride) { const cfnStrategyMap = { [memory_strategy_1.MemoryStrategyType.USER_PREFERENCE]: 'userPreferenceMemoryStrategy', [memory_strategy_1.MemoryStrategyType.SEMANTIC]: 'semanticMemoryStrategy', [memory_strategy_1.MemoryStrategyType.SUMMARIZATION]: 'summaryMemoryStrategy', [memory_strategy_1.MemoryStrategyType.CUSTOM]: 'customMemoryStrategy', }; const strategyKey = cfnStrategyMap[this.strategyType]; return { [strategyKey]: { name: this.name, description: this.description, namespaces: this.namespaces, type: this.strategyType, }, }; } // If overrides are provided, use custom strategy format const cfnStrategyMap = { [memory_strategy_1.MemoryStrategyType.USER_PREFERENCE]: 'userPreferenceOverride', [memory_strategy_1.MemoryStrategyType.SEMANTIC]: 'semanticOverride', [memory_strategy_1.MemoryStrategyType.SUMMARIZATION]: 'summaryOverride', [memory_strategy_1.MemoryStrategyType.CUSTOM]: '', }; const strategyKey = cfnStrategyMap[this.strategyType]; return { customMemoryStrategy: { name: this.name, description: this.description, namespaces: this.namespaces, type: this.strategyType, configuration: { [strategyKey]: { ...(this.consolidationOverride && { consolidation: { modelId: aws_cdk_lib_1.Arn.split(this.consolidationOverride.model.invokableArn, aws_cdk_lib_1.ArnFormat.SLASH_RESOURCE_NAME) .resourceName, appendToPrompt: this.consolidationOverride.appendToPrompt, }, }), ...(this.extractionOverride && { extraction: { modelId: aws_cdk_lib_1.Arn.split(this.extractionOverride.model.invokableArn, aws_cdk_lib_1.ArnFormat.SLASH_RESOURCE_NAME) .resourceName, appendToPrompt: this.extractionOverride.appendToPrompt, }, }), }, }, }, }; } /** * Grants the necessary permissions to the role * @param grantee - The grantee to grant permissions to * @returns The Grant object for chaining */ grant(grantee) { const grant1 = this.consolidationOverride?.model.grantInvoke(grantee); const grant2 = this.extractionOverride?.model.grantInvoke(grantee); return grant1 && grant2 ? grant1.combine(grant2) : grant1 || grant2; } // ------------------------------------------------------ // VALIDATORS // ------------------------------------------------------ /** * Validates the memory strategy name * @param name - The name to validate * @returns Array of validation error messages, empty if valid */ _validateMemoryStrategyName = (name, scope) => { let errors = []; errors.push(...(0, validation_helpers_1.validateStringFieldLength)({ value: name, fieldName: 'Memory name', minLength: memory_strategy_1.MEMORY_NAME_MIN_LENGTH, maxLength: memory_strategy_1.MEMORY_NAME_MAX_LENGTH, }, scope)); // Check if name matches the AWS API pattern: [a-zA-Z][a-zA-Z0-9_]{0,47} // Must start with a letter, followed by up to 47 letters, numbers, or underscores const validNamePattern = /^[a-zA-Z][a-zA-Z0-9_]{0,47}$/; errors.push(...(0, validation_helpers_1.validateFieldPattern)(name, 'Memory name', validNamePattern, undefined, scope)); return errors; }; /** * Validates the prompt * @param prompt - The prompt to validate * @returns Array of validation error messages, empty if valid */ _validatePrompt = (prompt, scope) => { let errors = []; if (!prompt) { return errors; } errors.push(...(0, validation_helpers_1.validateStringFieldLength)({ value: prompt, fieldName: 'Prompt', minLength: PROMPT_MIN_LENGTH, maxLength: PROMPT_MAX_LENGTH, }, scope)); return errors; }; /** * Validates the memory strategy namespaces * @param namespaces - The namespaces to validate * @returns Array of validation error messages, empty if valid */ _validateMemoryStrategyNamespaces = (namespaces) => { let errors = []; if (namespaces.length === 0) { return errors; } for (const namespace of namespaces) { // Only check for template variables in namespace definition if (namespace.includes('{') && !(namespace.includes('{actorId}') || namespace.includes('{sessionId}') || namespace.includes('{memoryStrategyId}'))) { errors.push(`Namespace with templates should contain valid variables: ${namespace}`); } } return errors; }; } exports.ManagedMemoryStrategy = ManagedMemoryStrategy; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFuYWdlZC1zdHJhdGVneS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIm1hbmFnZWQtc3RyYXRlZ3kudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFjQSw2Q0FBNkM7QUFJN0Msd0RBQW9KO0FBQ3BKLDhEQUF3RztBQUV4Rzs7K0VBRStFO0FBQy9FOzs7R0FHRztBQUNILE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxDQUFDO0FBQzVCOzs7R0FHRztBQUNILE1BQU0saUJBQWlCLEdBQUcsS0FBSyxDQUFDO0FBNkRoQzs7OztHQUlHO0FBQ0gsTUFBYSxxQkFBcUI7O0lBQ2hCLElBQUksQ0FBUztJQUNiLFdBQVcsQ0FBVTtJQUNyQzs7T0FFRztJQUNhLFVBQVUsQ0FBVztJQUNyQzs7T0FFRztJQUNhLHFCQUFxQixDQUFrQjtJQUN2RDs7T0FFRztJQUNhLGtCQUFrQixDQUFrQjtJQUNwQyxZQUFZLENBQXFCO0lBRWpEOzs7O09BSUc7SUFDSCxZQUFZLFlBQWdDLEVBQUUsS0FBMkI7Ozs7Ozs7K0NBdEI5RCxxQkFBcUI7Ozs7UUF1QjlCLHlEQUF5RDtRQUN6RCw4QkFBOEI7UUFDOUIseURBQXlEO1FBQ3pELElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQztRQUN2QixJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUM7UUFDckMsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUMsVUFBVSxDQUFDO1FBQ25DLElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxLQUFLLENBQUMsbUJBQW1CLENBQUM7UUFDdkQsSUFBSSxDQUFDLGtCQUFrQixHQUFHLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQztRQUVqRCx5REFBeUQ7UUFDekQsY0FBYztRQUNkLHlEQUF5RDtRQUN6RCxJQUFBLG1DQUFjLEVBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMscUJB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TUFBTSxHQUFhLEVBQUUsQ0FBQztRQUMxQixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDWixPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDO1FBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUEsOENBQXlCLEVBQUM7WUFDdkMsS0FBSyxFQUFFLE1BQU07WUFDYixTQUFTLEVBQUUsUUFBUTtZQUNuQixTQUFTLEVBQUUsaUJBQWlCO1lBQzVCLFNBQVMsRUFBRSxpQkFBaUI7U0FDN0IsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ1gsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQyxDQUFDO0lBRUY7Ozs7T0FJRztJQUNLLGlDQUFpQyxHQUFHLENBQUMsVUFBb0IsRUFBWSxFQUFFO1FBQzdFLElBQUksTUFBTSxHQUFhLEVBQUUsQ0FBQztRQUUxQixJQUFJLFVBQVUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDNUIsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQztRQUVELEtBQUssTUFBTSxTQUFTLElBQUksVUFBVSxFQUFFLENBQUM7WUFDbkMsNERBQTREO1lBQzVELElBQUksU0FBUyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQzlCLFNBQVMsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDO2dCQUMzQixTQUFTLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQztnQkFDakMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxDQUM3QyxFQUFFLENBQUM7Z0JBQ0YsTUFBTSxDQUFDLElBQUksQ0FBQyw0REFBNEQsU0FBUyxFQUFFLENBQUMsQ0FBQztZQUN2RixDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUMsQ0FBQzs7QUF6TEosc0RBMExDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiAgQ29weXJpZ2h0IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIikuIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqICB3aXRoIHRoZSBMaWNlbnNlLiBBIGNvcHkgb2YgdGhlIExpY2Vuc2UgaXMgbG9jYXRlZCBhdFxuICpcbiAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogIG9yIGluIHRoZSAnbGljZW5zZScgZmlsZSBhY2NvbXBhbnlpbmcgdGhpcyBmaWxlLiBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgb24gYW4gJ0FTIElTJyBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTXG4gKiAgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnNcbiAqICBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgSUJlZHJvY2tJbnZva2FibGUgfSBmcm9tICdAYXdzLWNkay9hd3MtYmVkcm9jay1hbHBoYSc7XG5pbXBvcnQgeyBBcm4sIEFybkZvcm1hdCB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IElDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCAqIGFzIGJlZHJvY2thZ2VudGNvcmUgZnJvbSAnYXdzLWNkay1saWIvYXdzLWJlZHJvY2thZ2VudGNvcmUnO1xuaW1wb3J0IHsgR3JhbnQsIElHcmFudGFibGUgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCB7IE1lbW9yeVN0cmF0ZWd5Q29tbW9uUHJvcHMsIElNZW1vcnlTdHJhdGVneSwgTWVtb3J5U3RyYXRlZ3lUeXBlLCBNRU1PUllfTkFNRV9NSU5fTEVOR1RILCBNRU1PUllfTkFNRV9NQVhfTEVOR1RIIH0gZnJvbSAnLi4vbWVtb3J5LXN0cmF0ZWd5JztcbmltcG9ydCB7IHZhbGlkYXRlU3RyaW5nRmllbGRMZW5ndGgsIHRocm93SWZJbnZhbGlkLCB2YWxpZGF0ZUZpZWxkUGF0dGVybiB9IGZyb20gJy4uL3ZhbGlkYXRpb24taGVscGVycyc7XG5cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OU1RBTlRTXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKipcbiAqIE1pbmltdW0gbGVuZ3RoIGZvciBwcm9tcHRcbiAqIEBpbnRlcm5hbFxuICovXG5jb25zdCBQUk9NUFRfTUlOX0xFTkdUSCA9IDE7XG4vKipcbiAqIE1heGltdW0gbGVuZ3RoIGZvciBwcm9tcHRcbiAqIEBpbnRlcm5hbFxuICovXG5jb25zdCBQUk9NUFRfTUFYX0xFTkdUSCA9IDMwMDAwO1xuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIG92ZXJyaWRpbmcgbW9kZWwgYW5kIHByb21wdCB0ZW1wbGF0ZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIE92ZXJyaWRlQ29uZmlnIHtcbiAgLyoqXG4gICAqIFRoZSBtb2RlbCB0byB1c2UgZm9yIGNvbnNvbGlkYXRpb24vZXh0cmFjdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgbW9kZWw6IElCZWRyb2NrSW52b2thYmxlO1xuICAvKipcbiAgICogVGhlIHByb21wdCB0aGF0IHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlIHN5c3RlbSBwcm9tcHQgdG8gZGVmaW5lXG4gICAqIHRoZSBtb2RlbCdzIG1lbW9yeSBjb25zb2xpZGF0aW9uL2V4dHJhY3Rpb24gc3RyYXRlZ3kuXG4gICAqIFRoaXMgY29uZmlndXJhdGlvbiBwcm92aWRlcyBjdXN0b21pemF0aW9uIHRvIGhvdyB0aGUgbW9kZWwgaWRlbnRpZmllcyBhbmQgZXh0cmFjdHNcbiAgICogcmVsZXZhbnQgaW5mb3JtYXRpb24gZm9yIG1lbW9yeSBzdG9yYWdlLiBZb3UgY2FuIHVzZSB0aGUgZGVmYXVsdCB1c2VyIHByb21wdCBvciBjcmVhdGUgYSBjdXN0b21pemVkIG9uZS5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYmVkcm9jay1hZ2VudGNvcmUvbGF0ZXN0L2Rldmd1aWRlL3N5c3RlbS1wcm9tcHRzLmh0bWxcbiAgICovXG4gIHJlYWRvbmx5IGFwcGVuZFRvUHJvbXB0OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGZvciBhIG1lbW9yeSBzdHJhdGVneSB0aGF0IGNhbiBvdmVycmlkZVxuICogZXhpc3RpbmcgYnVpbHQtaW4gZGVmYXVsdCBwcm9tcHRzL21vZGVsc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIE1hbmFnZWRTdHJhdGVneVByb3BzIGV4dGVuZHMgTWVtb3J5U3RyYXRlZ3lDb21tb25Qcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgY29uZmlndXJhdGlvbiBmb3IgdGhlIGN1c3RvbSBleHRyYWN0aW9uLlxuICAgKiBUaGlzIGNvbmZpZ3VyYXRpb24gcHJvdmlkZXMgY3VzdG9taXphdGlvbiB0byBob3cgdGhlIG1vZGVsIGlkZW50aWZpZXNcbiAgICogYW5kIGV4dHJhY3RzIHJlbGV2YW50IGluZm9ybWF0aW9uIGZvciBtZW1vcnkgc3RvcmFnZS5cbiAgICogQGRlZmF1bHQgLSBObyBjdXN0b20gZXh0cmFjdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgY3VzdG9tRXh0cmFjdGlvbj86IE92ZXJyaWRlQ29uZmlnO1xuICAvKipcbiAgICogVGhlIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBjdXN0b20gY29uc29saWRhdGlvbi5cbiAgICogVGhpcyBjb25maWd1cmF0aW9uIHByb3ZpZGVzIGN1c3RvbWl6YXRpb24gdG8gaG93IHRoZSBtb2RlbCBpZGVudGlmaWVzXG4gICAqIGFuZCBleHRyYWN0cyByZWxldmFudCBpbmZvcm1hdGlvbiBmb3IgbWVtb3J5IHN0b3JhZ2UuXG4gICAqIEBkZWZhdWx0IC0gTm8gY3VzdG9tIGV4dHJhY3Rpb25cbiAgICovXG4gIHJlYWRvbmx5IGN1c3RvbUNvbnNvbGlkYXRpb24/OiBPdmVycmlkZUNvbmZpZztcbiAgLyoqXG4gICAqIFRoZSBuYW1lc3BhY2VzIGZvciB0aGUgc3RyYXRlZ3lcbiAgICogUmVwcmVzZW50cyBhIG5hbWVzcGFjZSBmb3Igb3JnYW5pemluZyBtZW1vcnkgZGF0YVxuICAgKiBVc2UgYSBoaWVyYXJjaGljYWwgZm9ybWF0IHNlcGFyYXRlZCBieSBmb3J3YXJkIHNsYXNoZXMgKC8pXG4gICAqXG4gICAqIFVzZSBhIGhpZXJhcmNoaWNhbCBmb3JtYXQgc2VwYXJhdGVkIGJ5IGZvcndhcmQgc2xhc2hlcyAoLykgdG8gb3JnYW5pemUgbmFtZXNwYWNlcyBsb2dpY2FsbHkuXG4gICAqIFlvdSBjYW4gaW5jbHVkZSB0aGVzZSBkZWZpbmVkIHZhcmlhYmxlczpcbiAgICpcbiAgICogLSB7c2Vzc2lvbklkfSAtIHRoZSB1c2VyIGlkZW50aWZpZXIgdG8gYmUgY3JlYXRlZCBpbiB0aGUgQ3JlYXRlRXZlbnQgQVBJXG4gICAqIC0ge21lbW9yeVN0cmF0ZWd5SWR9IC0gYW4gaWRlbnRpZmllciBmb3IgYW4gZXh0cmFjdGlvbiBzdHJhdGVneVxuICAgKiAtIHtzZXNzaW9uSWR9IC0gYW4gaWRlbnRpZmllciBmb3IgZWFjaCBzZXNzaW9uXG4gICAqXG4gICAqIEV4YW1wbGUgbmFtZXNwYWNlIHBhdGg6XG4gICAqIC9zdHJhdGVnaWVzL3ttZW1vcnlTdHJhdGVneUlkfS9hY3Rpb25zL3thY3Rpb25JZH0vc2Vzc2lvbnMve3Nlc3Npb25JZH1cbiAgICpcbiAgICogQWZ0ZXIgbWVtb3J5IGNyZWF0aW9uLCB0aGlzIG5hbWVzcGFjZSBtaWdodCBsb29rIGxpa2U6XG4gICAqIC9hY3Rvci9hY3Rvci0zYWZjNWFhOGZlZjkvc3RyYXRlZ3kvc3VtbWFyaXphdGlvbi1meTVjNWZ3Yzcvc2Vzc2lvbi9zZXNzaW9uLXFqN3RwZDFrdnI4XG4gICAqL1xuICByZWFkb25seSBuYW1lc3BhY2VzOiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBNYW5hZ2VkIG1lbW9yeSBzdHJhdGVneSB0aGF0IGhhbmRsZXMgYm90aCBidWlsdC1pbiBhbmQgb3ZlcnJpZGUgY29uZmlndXJhdGlvbnMuXG4gKiBUaGlzIHN0cmF0ZWd5IGNhbiBiZSB1c2VkIGZvciBxdWljayBzZXR1cCB3aXRoIGJ1aWx0LWluIGRlZmF1bHRzIG9yIGN1c3RvbWl6ZWRcbiAqIHdpdGggc3BlY2lmaWMgbW9kZWxzIGFuZCBwcm9tcHQgdGVtcGxhdGVzLlxuICovXG5leHBvcnQgY2xhc3MgTWFuYWdlZE1lbW9yeVN0cmF0ZWd5IGltcGxlbWVudHMgSU1lbW9yeVN0cmF0ZWd5IHtcbiAgcHVibGljIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIG5hbWVzcGFjZXMgZm9yIHRoZSBzdHJhdGVneVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG5hbWVzcGFjZXM6IHN0cmluZ1tdO1xuICAvKipcbiAgICogVGhlIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBjdXN0b20gY29uc29saWRhdGlvbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBjb25zb2xpZGF0aW9uT3ZlcnJpZGU/OiBPdmVycmlkZUNvbmZpZztcbiAgLyoqXG4gICAqIFRoZSBjb25maWd1cmF0aW9uIGZvciB0aGUgY3VzdG9tIGV4dHJhY3Rpb24uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZXh0cmFjdGlvbk92ZXJyaWRlPzogT3ZlcnJpZGVDb25maWc7XG4gIHB1YmxpYyByZWFkb25seSBzdHJhdGVneVR5cGU6IE1lbW9yeVN0cmF0ZWd5VHlwZTtcblxuICAvKipcbiAgICogQ29uc3RydWN0b3IgdG8gY3JlYXRlIGEgbmV3IG1hbmFnZWQgbWVtb3J5IHN0cmF0ZWd5XG4gICAqIEBwYXJhbSBzdHJhdGVneVR5cGUgdGhlIHN0cmF0ZWd5IHR5cGVcbiAgICogQHBhcmFtIHByb3BzIHRoZSBwcm9wZXJ0aWVzIGZvciB0aGUgc3RyYXRlZ3lcbiAgICovXG4gIGNvbnN0cnVjdG9yKHN0cmF0ZWd5VHlwZTogTWVtb3J5U3RyYXRlZ3lUeXBlLCBwcm9wczogTWFuYWdlZFN0cmF0ZWd5UHJvcHMpIHtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBTZXQgcHJvcGVydGllcyBhbmQgZGVmYXVsdHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICB0aGlzLm5hbWUgPSBwcm9wcy5uYW1lO1xuICAgIHRoaXMuZGVzY3JpcHRpb24gPSBwcm9wcy5kZXNjcmlwdGlvbjtcbiAgICB0aGlzLm5hbWVzcGFjZXMgPSBwcm9wcy5uYW1lc3BhY2VzO1xuICAgIHRoaXMuc3RyYXRlZ3lUeXBlID0gc3RyYXRlZ3lUeXBlO1xuICAgIHRoaXMuY29uc29saWRhdGlvbk92ZXJyaWRlID0gcHJvcHMuY3VzdG9tQ29uc29saWRhdGlvbjtcbiAgICB0aGlzLmV4dHJhY3Rpb25PdmVycmlkZSA9IHByb3BzLmN1c3RvbUV4dHJhY3Rpb247XG5cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBWYWxpZGF0aW9uc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIHRocm93SWZJbnZhbGlkKHRoaXMuX3ZhbGlkYXRlUHJvbXB0LCB0aGlzLmNvbnNvbGlkYXRpb25PdmVycmlkZT8uYXBwZW5kVG9Qcm9tcHQpO1xuICAgIHRocm93SWZJbnZhbGlkKHRoaXMuX3ZhbGlkYXRlUHJvbXB0LCB0aGlzLmV4dHJhY3Rpb25PdmVycmlkZT8uYXBwZW5kVG9Qcm9tcHQpO1xuICAgIHRocm93SWZJbnZhbGlkKHRoaXMuX3ZhbGlkYXRlTWVtb3J5U3RyYXRlZ3lOYW1lLCB0aGlzLm5hbWUpO1xuICAgIGlmICh0aGlzLm5hbWVzcGFjZXMpIHtcbiAgICAgIHRocm93SWZJbnZhbGlkKHRoaXMuX3ZhbGlkYXRlTWVtb3J5U3RyYXRlZ3lOYW1lc3BhY2VzLCB0aGlzLm5hbWVzcGFjZXMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIHRoZSBuZXR3b3JrIGNvbmZpZ3VyYXRpb24gYXMgYSBDbG91ZEZvcm1hdGlvbiBwcm9wZXJ0eS5cbiAgICogQHJldHVybnMgVGhlIENsb3VkRm9ybWF0aW9uIHByb3BlcnR5IGZvciB0aGUgbWVtb3J5IHN0cmF0ZWd5LlxuICAgKi9cbiAgcHVibGljIHJlbmRlcigpOiBiZWRyb2NrYWdlbnRjb3JlLkNmbk1lbW9yeS5NZW1vcnlTdHJhdGVneVByb3BlcnR5IHtcbiAgICAvLyBJZiBubyBvdmVycmlkZXMsIHVzZSBidWlsdC1pbiBzdHJhdGVneSBmb3JtYXRcbiAgICBpZiAoIXRoaXMuY29uc29saWRhdGlvbk92ZXJyaWRlICYmICF0aGlzLmV4dHJhY3Rpb25PdmVycmlkZSkge1xuICAgICAgY29uc3QgY2ZuU3RyYXRlZ3lNYXA6IFJlY29yZDxNZW1vcnlTdHJhdGVneVR5cGUsIHN0cmluZz4gPSB7XG4gICAgICAgIFtNZW1vcnlTdHJhdGVneVR5cGUuVVNFUl9QUkVGRVJFTkNFXTogJ3VzZXJQcmVmZXJlbmNlTWVtb3J5U3RyYXRlZ3knLFxuICAgICAgICBbTWVtb3J5U3RyYXRlZ3lUeXBlLlNFTUFOVElDXTogJ3NlbWFudGljTWVtb3J5U3RyYXRlZ3knLFxuICAgICAgICBbTWVtb3J5U3RyYXRlZ3lUeXBlLlNVTU1BUklaQVRJT05dOiAnc3VtbWFyeU1lbW9yeVN0cmF0ZWd5JyxcbiAgICAgICAgW01lbW9yeVN0cmF0ZWd5VHlwZS5DVVNUT01dOiAnY3VzdG9tTWVtb3J5U3RyYXRlZ3knLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHN0cmF0ZWd5S2V5ID0gY2ZuU3RyYXRlZ3lNYXBbdGhpcy5zdHJhdGVneVR5cGVdO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgW3N0cmF0ZWd5S2V5XToge1xuICAgICAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogdGhpcy5kZXNjcmlwdGlvbixcbiAgICAgICAgICBuYW1lc3BhY2VzOiB0aGlzLm5hbWVzcGFjZXMsXG4gICAgICAgICAgdHlwZTogdGhpcy5zdHJhdGVneVR5cGUsXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIElmIG92ZXJyaWRlcyBhcmUgcHJvdmlkZWQsIHVzZSBjdXN0b20gc3RyYXRlZ3kgZm9ybWF0XG4gICAgY29uc3QgY2ZuU3RyYXRlZ3lNYXA6IFJlY29yZDxNZW1vcnlTdHJhdGVneVR5cGUsIHN0cmluZz4gPSB7XG4gICAgICBbTWVtb3J5U3RyYXRlZ3lUeXBlLlVTRVJfUFJFRkVSRU5DRV06ICd1c2VyUHJlZmVyZW5jZU92ZXJyaWRlJyxcbiAgICAgIFtNZW1vcnlTdHJhdGVneVR5cGUuU0VNQU5USUNdOiAnc2VtYW50aWNPdmVycmlkZScsXG4gICAgICBbTWVtb3J5U3RyYXRlZ3lUeXBlLlNVTU1BUklaQVRJT05dOiAnc3VtbWFyeU92ZXJyaWRlJyxcbiAgICAgIFtNZW1vcnlTdHJhdGVneVR5cGUuQ1VTVE9NXTogJycsXG4gICAgfTtcblxuICAgIGNvbnN0IHN0cmF0ZWd5S2V5ID0gY2ZuU3RyYXRlZ3lNYXBbdGhpcy5zdHJhdGVneVR5cGVdO1xuICAgIHJldHVybiB7XG4gICAgICBjdXN0b21NZW1vcnlTdHJhdGVneToge1xuICAgICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmRlc2NyaXB0aW9uLFxuICAgICAgICBuYW1lc3BhY2VzOiB0aGlzLm5hbWVzcGFjZXMsXG4gICAgICAgIHR5cGU6IHRoaXMuc3RyYXRlZ3lUeXBlLFxuICAgICAgICBjb25maWd1cmF0aW9uOiB7XG4gICAgICAgICAgW3N0cmF0ZWd5S2V5XToge1xuICAgICAgICAgICAgLi4uKHRoaXMuY29uc29saWRhdGlvbk92ZXJyaWRlICYmIHtcbiAgICAgICAgICAgICAgY29uc29saWRhdGlvbjoge1xuICAgICAgICAgICAgICAgIG1vZGVsSWQ6IEFybi5zcGxpdCh0aGlzLmNvbnNvbGlkYXRpb25PdmVycmlkZS5tb2RlbC5pbnZva2FibGVBcm4sIEFybkZvcm1hdC5TTEFTSF9SRVNPVVJDRV9OQU1FKVxuICAgICAgICAgICAgICAgICAgLnJlc291cmNlTmFtZSxcbiAgICAgICAgICAgICAgICBhcHBlbmRUb1Byb21wdDogdGhpcy5jb25zb2xpZGF0aW9uT3ZlcnJpZGUuYXBwZW5kVG9Qcm9tcHQsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIC4uLih0aGlzLmV4dHJhY3Rpb25PdmVycmlkZSAmJiB7XG4gICAgICAgICAgICAgIGV4dHJhY3Rpb246IHtcbiAgICAgICAgICAgICAgICBtb2RlbElkOiBBcm4uc3BsaXQodGhpcy5leHRyYWN0aW9uT3ZlcnJpZGUubW9kZWwuaW52b2thYmxlQXJuLCBBcm5Gb3JtYXQuU0xBU0hfUkVTT1VSQ0VfTkFNRSlcbiAgICAgICAgICAgICAgICAgIC5yZXNvdXJjZU5hbWUsXG4gICAgICAgICAgICAgICAgYXBwZW5kVG9Qcm9tcHQ6IHRoaXMuZXh0cmFjdGlvbk92ZXJyaWRlLmFwcGVuZFRvUHJvbXB0LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgdGhlIG5lY2Vzc2FyeSBwZXJtaXNzaW9ucyB0byB0aGUgcm9sZVxuICAgKiBAcGFyYW0gZ3JhbnRlZSAtIFRoZSBncmFudGVlIHRvIGdyYW50IHBlcm1pc3Npb25zIHRvXG4gICAqIEByZXR1cm5zIFRoZSBHcmFudCBvYmplY3QgZm9yIGNoYWluaW5nXG4gICAqL1xuICBwdWJsaWMgZ3JhbnQoZ3JhbnRlZTogSUdyYW50YWJsZSk6IEdyYW50IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBncmFudDEgPSB0aGlzLmNvbnNvbGlkYXRpb25PdmVycmlkZT8ubW9kZWwuZ3JhbnRJbnZva2UoZ3JhbnRlZSk7XG4gICAgY29uc3QgZ3JhbnQyID0gdGhpcy5leHRyYWN0aW9uT3ZlcnJpZGU/Lm1vZGVsLmdyYW50SW52b2tlKGdyYW50ZWUpO1xuICAgIHJldHVybiBncmFudDEgJiYgZ3JhbnQyID8gZ3JhbnQxLmNvbWJpbmUoZ3JhbnQyKSA6IGdyYW50MSB8fCBncmFudDI7XG4gIH1cblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gVkFMSURBVE9SU1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyB0aGUgbWVtb3J5IHN0cmF0ZWd5IG5hbWVcbiAgICogQHBhcmFtIG5hbWUgLSBUaGUgbmFtZSB0byB2YWxpZGF0ZVxuICAgKiBAcmV0dXJucyBBcnJheSBvZiB2YWxpZGF0aW9uIGVycm9yIG1lc3NhZ2VzLCBlbXB0eSBpZiB2YWxpZFxuICAgKi9cbiAgcHJpdmF0ZSBfdmFsaWRhdGVNZW1vcnlTdHJhdGVneU5hbWUgPSAobmFtZTogc3RyaW5nLCBzY29wZT86IElDb25zdHJ1Y3QpOiBzdHJpbmdbXSA9PiB7XG4gICAgbGV0IGVycm9yczogc3RyaW5nW10gPSBbXTtcblxuICAgIGVycm9ycy5wdXNoKC4uLnZhbGlkYXRlU3RyaW5nRmllbGRMZW5ndGgoe1xuICAgICAgdmFsdWU6IG5hbWUsXG4gICAgICBmaWVsZE5hbWU6ICdNZW1vcnkgbmFtZScsXG4gICAgICBtaW5MZW5ndGg6IE1FTU9SWV9OQU1FX01JTl9MRU5HVEgsXG4gICAgICBtYXhMZW5ndGg6IE1FTU9SWV9OQU1FX01BWF9MRU5HVEgsXG4gICAgfSwgc2NvcGUpKTtcblxuICAgIC8vIENoZWNrIGlmIG5hbWUgbWF0Y2hlcyB0aGUgQVdTIEFQSSBwYXR0ZXJuOiBbYS16QS1aXVthLXpBLVowLTlfXXswLDQ3fVxuICAgIC8vIE11c3Qgc3RhcnQgd2l0aCBhIGxldHRlciwgZm9sbG93ZWQgYnkgdXAgdG8gNDcgbGV0dGVycywgbnVtYmVycywgb3IgdW5kZXJzY29yZXNcbiAgICBjb25zdCB2YWxpZE5hbWVQYXR0ZXJuID0gL15bYS16QS1aXVthLXpBLVowLTlfXXswLDQ3fSQvO1xuICAgIGVycm9ycy5wdXNoKC4uLnZhbGlkYXRlRmllbGRQYXR0ZXJuKG5hbWUsICdNZW1vcnkgbmFtZScsIHZhbGlkTmFtZVBhdHRlcm4sIHVuZGVmaW5lZCwgc2NvcGUpKTtcblxuICAgIHJldHVybiBlcnJvcnM7XG4gIH07XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyB0aGUgcHJvbXB0XG4gICAqIEBwYXJhbSBwcm9tcHQgLSBUaGUgcHJvbXB0IHRvIHZhbGlkYXRlXG4gICAqIEByZXR1cm5zIEFycmF5IG9mIHZhbGlkYXRpb24gZXJyb3IgbWVzc2FnZXMsIGVtcHR5IGlmIHZhbGlkXG4gICAqL1xuICBwcml2YXRlIF92YWxpZGF0ZVByb21wdCA9IChwcm9tcHQ/OiBzdHJpbmcsIHNjb3BlPzogSUNvbnN0cnVjdCk6IHN0cmluZ1tdID0+IHtcbiAgICBsZXQgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGlmICghcHJvbXB0KSB7XG4gICAgICByZXR1cm4gZXJyb3JzO1xuICAgIH1cbiAgICBlcnJvcnMucHVzaCguLi52YWxpZGF0ZVN0cmluZ0ZpZWxkTGVuZ3RoKHtcbiAgICAgIHZhbHVlOiBwcm9tcHQsXG4gICAgICBmaWVsZE5hbWU6ICdQcm9tcHQnLFxuICAgICAgbWluTGVuZ3RoOiBQUk9NUFRfTUlOX0xFTkdUSCxcbiAgICAgIG1heExlbmd0aDogUFJPTVBUX01BWF9MRU5HVEgsXG4gICAgfSwgc2NvcGUpKTtcbiAgICByZXR1cm4gZXJyb3JzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgdGhlIG1lbW9yeSBzdHJhdGVneSBuYW1lc3BhY2VzXG4gICAqIEBwYXJhbSBuYW1lc3BhY2VzIC0gVGhlIG5hbWVzcGFjZXMgdG8gdmFsaWRhdGVcbiAgICogQHJldHVybnMgQXJyYXkgb2YgdmFsaWRhdGlvbiBlcnJvciBtZXNzYWdlcywgZW1wdHkgaWYgdmFsaWRcbiAgICovXG4gIHByaXZhdGUgX3ZhbGlkYXRlTWVtb3J5U3RyYXRlZ3lOYW1lc3BhY2VzID0gKG5hbWVzcGFjZXM6IHN0cmluZ1tdKTogc3RyaW5nW10gPT4ge1xuICAgIGxldCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG5cbiAgICBpZiAobmFtZXNwYWNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBlcnJvcnM7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBuYW1lc3BhY2Ugb2YgbmFtZXNwYWNlcykge1xuICAgICAgLy8gT25seSBjaGVjayBmb3IgdGVtcGxhdGUgdmFyaWFibGVzIGluIG5hbWVzcGFjZSBkZWZpbml0aW9uXG4gICAgICBpZiAobmFtZXNwYWNlLmluY2x1ZGVzKCd7JykgJiYgIShcbiAgICAgICAgbmFtZXNwYWNlLmluY2x1ZGVzKCd7YWN0b3JJZH0nKSB8fFxuICAgICAgICAgICAgbmFtZXNwYWNlLmluY2x1ZGVzKCd7c2Vzc2lvbklkfScpIHx8XG4gICAgICAgICAgICBuYW1lc3BhY2UuaW5jbHVkZXMoJ3ttZW1vcnlTdHJhdGVneUlkfScpXG4gICAgICApKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKGBOYW1lc3BhY2Ugd2l0aCB0ZW1wbGF0ZXMgc2hvdWxkIGNvbnRhaW4gdmFsaWQgdmFyaWFibGVzOiAke25hbWVzcGFjZX1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZXJyb3JzO1xuICB9O1xufVxuIl19