UNPKG

aws-ddk-core

Version:

The AWS DataOps Development Kit is an open source development framework for customers that build data workflows and modern data architecture on AWS.

99 lines 17.1 kB
"use strict"; var _a; Object.defineProperty(exports, "__esModule", { value: true }); exports.SqsToLambdaStage = void 0; const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); const cdk = require("aws-cdk-lib"); const cloudwatch = require("aws-cdk-lib/aws-cloudwatch"); const events_targets = require("aws-cdk-lib/aws-events-targets"); const iam = require("aws-cdk-lib/aws-iam"); const lambda = require("aws-cdk-lib/aws-lambda"); const lambda_event_sources = require("aws-cdk-lib/aws-lambda-event-sources"); const sqs = require("aws-cdk-lib/aws-sqs"); const stage_1 = require("../pipelines/stage"); /** * Stage implements an Amazon SQS queue connected to an AWS Lambda function, with an optional DLQ. */ class SqsToLambdaStage extends stage_1.DataStage { /** * Constructs `SqsToLambdaStage`. * @param scope Scope within which this construct is defined. * @param id Identifier of the stage. * @param props Properties for the stage. */ constructor(scope, id, props) { super(scope, id, props); const eventSource = `${id}-event-source`; const eventDetailType = `${id}-event-type`; if (props.lambdaFunction) { this.function = props.lambdaFunction; } else if (props.lambdaFunctionProps) { const functionProps = props.lambdaFunctionProps; this.function = new lambda.Function(this, "Process Function", { timeout: functionProps.timeout ?? cdk.Duration.seconds(120), memorySize: functionProps.memorySize ?? 256, environment: { EVENT_SOURCE: eventSource, EVENT_DETAIL_TYPE: eventDetailType, ...(functionProps.environment ?? {}), }, ...functionProps, }); } else { throw TypeError("'lambdaFunction' or 'lambdaFunctionProps' must be set to instantiate this stage"); } // Enable the function to publish events to the default EventBus this.function.addToRolePolicy(new iam.PolicyStatement({ actions: ["events:PutEvents"], resources: ["*"], })); const dlqEnabled = props.dlqEnabled ?? false; if (dlqEnabled == true) { this.deadLetterQueue = new sqs.Queue(this, "Dead Letter Queue", { fifo: props.sqsQueueProps?.fifo ? props.sqsQueueProps?.fifo : undefined, }); } if (props.sqsQueue) { this.queue = props.sqsQueue; } else { this.queue = new sqs.Queue(this, "Queue", { visibilityTimeout: props.sqsQueueProps?.visibilityTimeout ?? cdk.Duration.minutes(2), deadLetterQueue: this.deadLetterQueue ? { queue: this.deadLetterQueue, maxReceiveCount: props.maxReceiveCount ?? 1, } : undefined, fifo: props.sqsQueueProps?.fifo ? props.sqsQueueProps?.fifo : undefined, ...props.sqsQueueProps, }); } this.function.addEventSource(new lambda_event_sources.SqsEventSource(this.queue, { batchSize: props.batchSize, maxBatchingWindow: props.maxBatchingWindow, })); this.addAlarm("Process Function Errors", { metric: this.function.metricErrors(), threshold: props.lambdaFunctionProps?.errorsAlarmThreshold ?? 5, evaluationPeriods: props.lambdaFunctionProps?.errorsEvaluationPeriods ?? 1, comparisonOperator: props.lambdaFunctionProps?.errorsComparisonOperator ?? cloudwatch.ComparisonOperator.GREATER_THAN_THRESHOLD, }); this.eventPattern = { source: [eventSource], detailType: [eventDetailType], }; if (this.queue.fifo && !props.messageGroupId) { throw TypeError("'messageGroupId' must be set to when target is a fifo queue"); } this.targets = this.queue.fifo ? [new events_targets.SqsQueue(this.queue, { messageGroupId: props.messageGroupId })] : [new events_targets.SqsQueue(this.queue)]; } } exports.SqsToLambdaStage = SqsToLambdaStage; _a = JSII_RTTI_SYMBOL_1; SqsToLambdaStage[_a] = { fqn: "aws-ddk-core.SqsToLambdaStage", version: "1.4.1" }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3FzLWxhbWJkYS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdGFnZXMvc3FzLWxhbWJkYS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLG1DQUFtQztBQUNuQyx5REFBeUQ7QUFFekQsaUVBQWlFO0FBQ2pFLDJDQUEyQztBQUMzQyxpREFBaUQ7QUFDakQsNkVBQTZFO0FBQzdFLDJDQUEyQztBQUUzQyw4Q0FBK0Q7QUE2RS9EOztHQUVHO0FBQ0gsTUFBYSxnQkFBaUIsU0FBUSxpQkFBUztJQVE3Qzs7Ozs7T0FLRztJQUNILFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBNEI7UUFDcEUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFeEIsTUFBTSxXQUFXLEdBQUcsR0FBRyxFQUFFLGVBQWUsQ0FBQztRQUN6QyxNQUFNLGVBQWUsR0FBRyxHQUFHLEVBQUUsYUFBYSxDQUFDO1FBRTNDLElBQUksS0FBSyxDQUFDLGNBQWMsRUFBRTtZQUN4QixJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxjQUFjLENBQUM7U0FDdEM7YUFBTSxJQUFJLEtBQUssQ0FBQyxtQkFBbUIsRUFBRTtZQUNwQyxNQUFNLGFBQWEsR0FBa0MsS0FBSyxDQUFDLG1CQUFtQixDQUFDO1lBRS9FLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxrQkFBa0IsRUFBRTtnQkFDNUQsT0FBTyxFQUFFLGFBQWEsQ0FBQyxPQUFPLElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDO2dCQUMzRCxVQUFVLEVBQUUsYUFBYSxDQUFDLFVBQVUsSUFBSSxHQUFHO2dCQUMzQyxXQUFXLEVBQUU7b0JBQ1gsWUFBWSxFQUFFLFdBQVc7b0JBQ3pCLGlCQUFpQixFQUFFLGVBQWU7b0JBQ2xDLEdBQUcsQ0FBQyxhQUFhLENBQUMsV0FBVyxJ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QUFDLElBQUk7WUFDNUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxjQUFjLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxjQUFjLEVBQUUsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUM7WUFDckYsQ0FBQyxDQUFDLENBQUMsSUFBSSxjQUFjLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ2hELENBQUM7O0FBakdILDRDQWtHQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGNkayBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCAqIGFzIGNsb3Vkd2F0Y2ggZnJvbSBcImF3cy1jZGstbGliL2F3cy1jbG91ZHdhdGNoXCI7XG5pbXBvcnQgKiBhcyBldmVudHMgZnJvbSBcImF3cy1jZGstbGliL2F3cy1ldmVudHNcIjtcbmltcG9ydCAqIGFzIGV2ZW50c190YXJnZXRzIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZXZlbnRzLXRhcmdldHNcIjtcbmltcG9ydCAqIGFzIGlhbSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWlhbVwiO1xuaW1wb3J0ICogYXMgbGFtYmRhIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbGFtYmRhXCI7XG5pbXBvcnQgKiBhcyBsYW1iZGFfZXZlbnRfc291cmNlcyBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxhbWJkYS1ldmVudC1zb3VyY2VzXCI7XG5pbXBvcnQgKiBhcyBzcXMgZnJvbSBcImF3cy1jZGstbGliL2F3cy1zcXNcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgeyBEYXRhU3RhZ2UsIERhdGFTdGFnZVByb3BzIH0gZnJvbSBcIi4uL3BpcGVsaW5lcy9zdGFnZVwiO1xuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIHRoZSBMYW1iZGEgRnVuY3Rpb24gY3JlYXRlZCBieSBgU3FzVG9MYW1iZGFTdGFnZWAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3FzVG9MYW1iZGFTdGFnZUZ1bmN0aW9uUHJvcHMgZXh0ZW5kcyBsYW1iZGEuRnVuY3Rpb25Qcm9wcyB7XG4gIC8qKlxuICAgKiBBbW91bnQgb2YgZXJyb3JlZCBmdW5jdGlvbiBpbnZvY2F0aW9ucyBiZWZvcmUgdHJpZ2dlcmluZyBDbG91ZFdhdGNoIGFsYXJtLlxuICAgKiBAZGVmYXVsdCA1XG4gICAqL1xuICByZWFkb25seSBlcnJvcnNBbGFybVRocmVzaG9sZD86IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSBudW1iZXIgb2YgcGVyaW9kcyBvdmVyIHdoaWNoIGRhdGEgaXMgY29tcGFyZWQgdG8gdGhlIHNwZWNpZmllZCB0aHJlc2hvbGQuXG4gICAqIEBkZWZhdWx0IDFcbiAgICovXG4gIHJlYWRvbmx5IGVycm9yc0V2YWx1YXRpb25QZXJpb2RzPzogbnVtYmVyO1xuICAvKipcbiAgICogQ29tcGFyaXNvbiBvcGVyYXRvciBmb3IgZXZhbHVhdGluZyBhbGFybXMuXG4gICAqIEBkZWZhdWx0IGNsb3Vkd2F0Y2guQ29tcGFyaXNvbk9wZXJhdG9yLkdSRUFURVJfVEhBTl9USFJFU0hPTERcbiAgICovXG4gIHJlYWRvbmx5IGVycm9yc0NvbXBhcmlzb25PcGVyYXRvcj86IGNsb3Vkd2F0Y2guQ29tcGFyaXNvbk9wZXJhdG9yO1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIGBTcXNUb0xhbWJkYVN0YWdlYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTcXNUb0xhbWJkYVN0YWdlUHJvcHMgZXh0ZW5kcyBEYXRhU3RhZ2VQcm9wcyB7XG4gIC8qKlxuICAgKiBQcmVleGlzdGluZyBMYW1iZGEgRnVuY3Rpb24gdG8gdXNlIGluIHN0YWdlLlxuICAgKiBJZiBub3QgcHJvdmlkZWQsIGEgbmV3IGZ1bmN0aW9uIHdpbGwgYmUgY3JlYXRlZC5cbiAgICovXG4gIHJlYWRvbmx5IGxhbWJkYUZ1bmN0aW9uPzogbGFtYmRhLklGdW5jdGlvbjtcbiAgLyoqXG4gICAqIFByb3BlcnRpZXMgZm9yIHRoZSBMYW1iZGEgRnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNyZWF0ZWQgYnkgdGhpcyBjb25zdHJ1Y3RcbiAgICogKGlmIGBsYW1iZGFGdW5jdGlvbmAgaXMgbm90IHByb3ZpZGVkKS5cbiAgICovXG4gIHJlYWRvbmx5IGxhbWJkYUZ1bmN0aW9uUHJvcHM/OiBTcXNUb0xhbWJkYVN0YWdlRnVuY3Rpb25Qcm9wcztcbiAgLyoqXG4gICAqIFByZWV4aXN0aW5nIFNRUyBRdWV1ZSB0byB1c2UgaW4gc3RhZ2UuXG4gICAqIElmIG5vdCBwcm92aWRlZCwgYSBuZXcgcXVldWUgd2lsbCBiZSBjcmVhdGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgc3FzUXVldWU/OiBzcXMuSVF1ZXVlO1xuICAvKipcbiAgICogUHJvcGVydGllcyBmb3IgdGhlIFNRUyBRdWV1ZSB0aGF0IHdpbGwgYmUgY3JlYXRlZCBieSB0aGlzIGNvbnN0cnVjdFxuICAgKiAoaWYgYHNxc1F1ZXVlYCBpcyBub3QgcHJvdmlkZWQpLlxuICAgKi9cbiAgcmVhZG9ubHkgc3FzUXVldWVQcm9wcz86IHNxcy5RdWV1ZVByb3BzO1xuXG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgcmVjb3JkcyByZXRyaWV2ZWQgZnJvbSB0aGUgZXZlbnQgc291cmNlIGF0IHRoZSBmdW5jdGlvbiBpbnZvY2F0aW9uIHRpbWUuXG4gICAqIEBkZWZhdWx0IDEwXG4gICAqL1xuICByZWFkb25seSBiYXRjaFNpemU/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSBhbW91bnQgb2YgdGltZSB0byBnYXRoZXIgcmVjb3JkcyBiZWZvcmUgaW52b2tpbmcgdGhlIGZ1bmN0aW9uLlxuICAgKiBWYWxpZCBSYW5nZTogTWluaW11bSB2YWx1ZSBvZiAwIG1pbnV0ZXMsIG1heGltdW0gdmFsdWUgb2YgNSBtaW51dGVzLlxuICAgKiBEZWZhdWx0OiAtIG5vIGJhdGNoaW5nIHdpbmRvdy5cbiAgICovXG4gIHJlYWRvbmx5IG1heEJhdGNoaW5nV2luZG93PzogY2RrLkR1cmF0aW9uO1xuICAvKipcbiAgICogRGV0ZXJtaW5lcyBpZiBETFEgaXMgZW5hYmxlZC5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGRscUVuYWJsZWQ/OiBib29sZWFuO1xuICAvKipcbiAgICogVGhlIG51bWJlciBvZiB0aW1lcyBhIG1lc3NhZ2UgY2FuIGJlIHVuc3VjY2Vzc2Z1bGx5IGRlcXVldWVkIGJlZm9yZVxuICAgKiBiZWluZyBtb3ZlZCB0byB0aGUgZGVhZC1sZXR0ZXIgcXVldWUuXG4gICAqIEBkZWZhdWx0IDFcbiAgICovXG4gIHJlYWRvbmx5IG1heFJlY2VpdmVDb3VudD86IG51bWJlcjtcbiAgLyoqXG4gICAqIE1lc3NhZ2UgR3JvdXAgSUQgZm9yIG1lc3NhZ2VzIHNlbnQgdG8gdGhpcyBxdWV1ZS5cbiAgICogUmVxdWlyZWQgZm9yIEZJRk8gcXVldWVzLlxuICAgKi9cbiAgcmVhZG9ubHkgbWVzc2FnZUdyb3VwSWQ/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogU3RhZ2UgaW1wbGVtZW50cyBhbiBBbWF6b24gU1FTIHF1ZXVlIGNvbm5lY3RlZCB0byBhbiBBV1MgTGFtYmRhIGZ1bmN0aW9uLCB3aXRoIGFuIG9wdGlvbmFsIERMUS5cbiAqL1xuZXhwb3J0IGNsYXNzIFNxc1RvTGFtYmRhU3RhZ2UgZXh0ZW5kcyBEYXRhU3RhZ2Uge1xuICByZWFkb25seSB0YXJnZXRzPzogZXZlbnRzLklSdWxlVGFyZ2V0W107XG4gIHJlYWRvbmx5IGV2ZW50UGF0dGVybj86IGV2ZW50cy5FdmVudFBhdHRlcm47XG5cbiAgcmVhZG9ubHkgZnVuY3Rpb246IGxhbWJkYS5JRnVuY3Rpb247XG4gIHJlYWRvbmx5IHF1ZXVlOiBzcXMuSVF1ZXVlO1xuICByZWFkb25seSBkZWFkTGV0dGVyUXVldWU/OiBzcXMuUXVldWU7XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdHMgYFNxc1RvTGFtYmRhU3RhZ2VgLlxuICAgKiBAcGFyYW0gc2NvcGUgU2NvcGUgd2l0aGluIHdoaWNoIHRoaXMgY29uc3RydWN0IGlzIGRlZmluZWQuXG4gICAqIEBwYXJhbSBpZCBJZGVudGlmaWVyIG9mIHRoZSBzdGFnZS5cbiAgICogQHBhcmFtIHByb3BzIFByb3BlcnRpZXMgZm9yIHRoZSBzdGFnZS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBTcXNUb0xhbWJkYVN0YWdlUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHByb3BzKTtcblxuICAgIGNvbnN0IGV2ZW50U291cmNlID0gYCR7aWR9LWV2ZW50LXNvdXJjZWA7XG4gICAgY29uc3QgZXZlbnREZXRhaWxUeXBlID0gYCR7aWR9LWV2ZW50LXR5cGVgO1xuXG4gICAgaWYgKHByb3BzLmxhbWJkYUZ1bmN0aW9uKSB7XG4gICAgICB0aGlzLmZ1bmN0aW9uID0gcHJvcHMubGFtYmRhRnVuY3Rpb247XG4gICAgfSBlbHNlIGlmIChwcm9wcy5sYW1iZGFGdW5jdGlvblByb3BzKSB7XG4gICAgICBjb25zdCBmdW5jdGlvblByb3BzOiBTcXNUb0xhbWJkYVN0YWdlRnVuY3Rpb25Qcm9wcyA9IHByb3BzLmxhbWJkYUZ1bmN0aW9uUHJvcHM7XG5cbiAgICAgIHRoaXMuZnVuY3Rpb24gPSBuZXcgbGFtYmRhLkZ1bmN0aW9uKHRoaXMsIFwiUHJvY2VzcyBGdW5jdGlvblwiLCB7XG4gICAgICAgIHRpbWVvdXQ6IGZ1bmN0aW9uUHJvcHMudGltZW91dCA/PyBjZGsuRHVyYXRpb24uc2Vjb25kcygxMjApLFxuICAgICAgICBtZW1vcnlTaXplOiBmdW5jdGlvblByb3BzLm1lbW9yeVNpemUgPz8gMjU2LFxuICAgICAgICBlbnZpcm9ubWVudDoge1xuICAgICAgICAgIEVWRU5UX1NPVVJDRTogZXZlbnRTb3VyY2UsXG4gICAgICAgICAgRVZFTlRfREVUQUlMX1RZUEU6IGV2ZW50RGV0YWlsVHlwZSxcbiAgICAgICAgICAuLi4oZnVuY3Rpb25Qcm9wcy5lbnZpcm9ubWVudCA/PyB7fSksXG4gICAgICAgIH0sXG4gICAgICAgIC4uLmZ1bmN0aW9uUHJvcHMsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgVHlwZUVycm9yKFwiJ2xhbWJkYUZ1bmN0aW9uJyBvciAnbGFtYmRhRnVuY3Rpb25Qcm9wcycgbXVzdCBiZSBzZXQgdG8gaW5zdGFudGlhdGUgdGhpcyBzdGFnZVwiKTtcbiAgICB9XG5cbiAgICAvLyBFbmFibGUgdGhlIGZ1bmN0aW9uIHRvIHB1Ymxpc2ggZXZlbnRzIHRvIHRoZSBkZWZhdWx0IEV2ZW50QnVzXG4gICAgdGhpcy5mdW5jdGlvbi5hZGRUb1JvbGVQb2xpY3koXG4gICAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGFjdGlvbnM6IFtcImV2ZW50czpQdXRFdmVudHNcIl0sXG4gICAgICAgIHJlc291cmNlczogW1wiKlwiXSxcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICBjb25zdCBkbHFFbmFibGVkID0gcHJvcHMuZGxxRW5hYmxlZCA/PyBmYWxzZTtcbiAgICBpZiAoZGxxRW5hYmxlZCA9PSB0cnVlKSB7XG4gICAgICB0aGlzLmRlYWRMZXR0ZXJRdWV1ZSA9IG5ldyBzcXMuUXVldWUodGhpcywgXCJEZWFkIExldHRlciBRdWV1ZVwiLCB7XG4gICAgICAgIGZpZm86IHByb3BzLnNxc1F1ZXVlUHJvcHM/LmZpZm8gPyBwcm9wcy5zcXNRdWV1ZVByb3BzPy5maWZvIDogdW5kZWZpbmVkLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHByb3BzLnNxc1F1ZXVlKSB7XG4gICAgICB0aGlzLnF1ZXVlID0gcHJvcHMuc3FzUXVldWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucXVldWUgPSBuZXcgc3FzLlF1ZXVlKHRoaXMsIFwiUXVldWVcIiwge1xuICAgICAgICB2aXNpYmlsaXR5VGltZW91dDogcHJvcHMuc3FzUXVldWVQcm9wcz8udmlzaWJpbGl0eVRpbWVvdXQgPz8gY2RrLkR1cmF0aW9uLm1pbnV0ZXMoMiksXG4gICAgICAgIGRlYWRMZXR0ZXJRdWV1ZTogdGhpcy5kZWFkTGV0dGVyUXVldWVcbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgcXVldWU6IHRoaXMuZGVhZExldHRlclF1ZXVlLFxuICAgICAgICAgICAgICBtYXhSZWNlaXZlQ291bnQ6IHByb3BzLm1heFJlY2VpdmVDb3VudCA/PyAxLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICBmaWZvOiBwcm9wcy5zcXNRdWV1ZVByb3BzPy5maWZvID8gcHJvcHMuc3FzUXVldWVQcm9wcz8uZmlmbyA6IHVuZGVmaW5lZCxcbiAgICAgICAgLi4ucHJvcHMuc3FzUXVldWVQcm9wcyxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuZnVuY3Rpb24uYWRkRXZlbnRTb3VyY2UoXG4gICAgICBuZXcgbGFtYmRhX2V2ZW50X3NvdXJjZXMuU3FzRXZlbnRTb3VyY2UodGhpcy5xdWV1ZSwge1xuICAgICAgICBiYXRjaFNpemU6IHByb3BzLmJhdGNoU2l6ZSxcbiAgICAgICAgbWF4QmF0Y2hpbmdXaW5kb3c6IHByb3BzLm1heEJhdGNoaW5nV2luZG93LFxuICAgICAgfSksXG4gICAgKTtcblxuICAgIHRoaXMuYWRkQWxhcm0oXCJQcm9jZXNzIEZ1bmN0aW9uIEVycm9yc1wiLCB7XG4gICAgICBtZXRyaWM6IHRoaXMuZnVuY3Rpb24ubWV0cmljRXJyb3JzKCksXG4gICAgICB0aHJlc2hvbGQ6IHByb3BzLmxhbWJkYUZ1bmN0aW9uUHJvcHM/LmVycm9yc0FsYXJtVGhyZXNob2xkID8/IDUsXG4gICAgICBldmFsdWF0aW9uUGVyaW9kczogcHJvcHMubGFtYmRhRnVuY3Rpb25Qcm9wcz8uZXJyb3JzRXZhbHVhdGlvblBlcmlvZHMgPz8gMSxcbiAgICAgIGNvbXBhcmlzb25PcGVyYXRvcjpcbiAgICAgICAgcHJvcHMubGFtYmRhRnVuY3Rpb25Qcm9wcz8uZXJyb3JzQ29tcGFyaXNvbk9wZXJhdG9yID8/IGNsb3Vkd2F0Y2guQ29tcGFyaXNvbk9wZXJhdG9yLkdSRUFURVJfVEhBTl9USFJFU0hPTEQsXG4gICAgfSk7XG5cbiAgICB0aGlzLmV2ZW50UGF0dGVybiA9IHtcbiAgICAgIHNvdXJjZTogW2V2ZW50U291cmNlXSxcbiAgICAgIGRldGFpbFR5cGU6IFtldmVudERldGFpbFR5cGVdLFxuICAgIH07XG5cbiAgICBpZiAodGhpcy5xdWV1ZS5maWZvICYmICFwcm9wcy5tZXNzYWdlR3JvdXBJZCkge1xuICAgICAgdGhyb3cgVHlwZUVycm9yKFwiJ21lc3NhZ2VHcm91cElkJyBtdXN0IGJlIHNldCB0byB3aGVuIHRhcmdldCBpcyBhIGZpZm8gcXVldWVcIik7XG4gICAgfVxuXG4gICAgdGhpcy50YXJnZXRzID0gdGhpcy5xdWV1ZS5maWZvXG4gICAgICA/IFtuZXcgZXZlbnRzX3RhcmdldHMuU3FzUXVldWUodGhpcy5xdWV1ZSwgeyBtZXNzYWdlR3JvdXBJZDogcHJvcHMubWVzc2FnZUdyb3VwSWQgfSldXG4gICAgICA6IFtuZXcgZXZlbnRzX3RhcmdldHMuU3FzUXVldWUodGhpcy5xdWV1ZSldO1xuICB9XG59XG4iXX0=