UNPKG

@gammarers/aws-codepipeline-execution-state-change-notification-stack

Version:

This AWS CDK Construct Stack receives all state changes of CodePipeline and sends a message to the specified notification destination when the CodePipeline is tagged with a specified tag. Therefore, you can send messages simply by adding tags without need

83 lines 14.5 kB
"use strict"; var _a; Object.defineProperty(exports, "__esModule", { value: true }); exports.CodePipelineExecutionStateChangeNotificationStack = exports.CodePipelineExecutionStateChangeNotificationStackResourceNamingType = void 0; const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); const aws_codesuite_state_change_detection_event_rules_1 = require("@gammarers/aws-codesuite-state-change-detection-event-rules"); const aws_resource_naming_1 = require("@gammarers/aws-resource-naming"); Object.defineProperty(exports, "CodePipelineExecutionStateChangeNotificationStackResourceNamingType", { enumerable: true, get: function () { return aws_resource_naming_1.ResourceNamingType; } }); const aws_sns_slack_message_lambda_subscription_1 = require("@gammarers/aws-sns-slack-message-lambda-subscription"); const aws_cdk_lib_1 = require("aws-cdk-lib"); const events = require("aws-cdk-lib/aws-events"); const targets = require("aws-cdk-lib/aws-events-targets"); const sns = require("aws-cdk-lib/aws-sns"); const subscriptions = require("aws-cdk-lib/aws-sns-subscriptions"); const notification_state_machine_1 = require("./resources/notification-state-machine"); class CodePipelineExecutionStateChangeNotificationStack extends aws_cdk_lib_1.Stack { constructor(scope, id, props) { super(scope, id, props); // 👇 Create random 8 length string const random = aws_resource_naming_1.ResourceNaming.createRandomString(`${aws_cdk_lib_1.Names.uniqueId(scope)}.${aws_cdk_lib_1.Names.uniqueId(this)}`); // 👇 Auto naeming const autoNaming = { stateMachineName: `codepipeline-exec-state-change-notification-${random}-machine`, notificationTopicName: `codepipeline-execution-state-change-notification-${random}-topic`, notificationTopicDisplayName: 'CodePipeline Execution state change Notification Topic', pipelineEventDetectionRuleName: `codepipeline-exe-state-change-${random}-detection-event-rule`, }; // 👇 Resource Names const names = aws_resource_naming_1.ResourceNaming.naming(autoNaming, props.resourceNamingOption); // 👇 SNS Topic for notifications const topic = new sns.Topic(this, 'NotificationTopic', { topicName: names.notificationTopicName, displayName: names.notificationTopicDisplayName, }); // const secret = cdk.SecretValue.secretsManager('my-email-array-secret'); // const emails = JSON.parse(secret.unsafeUnwrap()) as string[]; // Subscribe an email endpoint to the topic const emails = props.notifications.emails ?? []; for (const email of emails) { topic.addSubscription(new subscriptions.EmailSubscription(email)); } // 👇 Subscription slack webhook if (props.notifications?.slack) { new aws_sns_slack_message_lambda_subscription_1.SNSSlackMessageLambdaSubscription(this, 'SNSSlackMessageLambdaSubscription', { topic, slackWebhookSecretName: props.notifications.slack.webhookSecretName, }); } // Subscribe a HTTP endpoint (Slack Webhook) to the topic // topic.addSubscription(new subs.UrlSubscription('https://hooks.slack.com/services/YOUR/SLACK/WEBHOOK')); // 👇 Create State Machine const stateMachine = new notification_state_machine_1.NotificationStateMachine(this, 'StateMachine', { stateMachineName: names.stateMachineName, timeout: aws_cdk_lib_1.Duration.minutes(5), notificationTopic: topic, }); // 👇 Rule state //enabled const enableRule = (() => { return props?.enabled === undefined || props.enabled; })(); // 👇 Create EventBridge Rule new aws_codesuite_state_change_detection_event_rules_1.CodePipelinePipelineExecutionStateChangeDetectionEventRule(this, 'EventRule', { ruleName: names.pipelineEventDetectionRuleName, enabled: enableRule, targets: [ new targets.SfnStateMachine(stateMachine, { input: events.RuleTargetInput.fromObject({ event: events.EventField.fromPath('$'), params: { tagKey: props.targetResource.tagKey, tagValues: props.targetResource.tagValues, }, }), }), ], }); } } exports.CodePipelineExecutionStateChangeNotificationStack = CodePipelineExecutionStateChangeNotificationStack; _a = JSII_RTTI_SYMBOL_1; CodePipelineExecutionStateChangeNotificationStack[_a] = { fqn: "@gammarers/aws-codepipeline-execution-state-change-notification-stack.CodePipelineExecutionStateChangeNotificationStack", version: "2.4.2" }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxrSUFBeUk7QUFDekksd0VBQXNNO0FBVTdMLG9KQVZpRix3Q0FBbUUsT0FVakY7QUFUNUUsb0hBQXlHO0FBQ3pHLDZDQUFpRTtBQUNqRSxpREFBaUQ7QUFDakQsMERBQTBEO0FBQzFELDJDQUEyQztBQUMzQyxtRUFBbUU7QUFFbkUsdUZBQWtGO0FBbUNsRixNQUFhLGlEQUFrRCxTQUFRLG1CQUFLO0lBQzFFLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBNkQ7UUFDckcsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFeEIsbUNBQW1DO1FBQ25DLE1BQU0sTUFBTSxHQUFHLG9DQUFjLENBQUMsa0JBQWtCLENBQUMsR0FBRyxtQkFBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxtQkFBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDckcsa0JBQWtCO1FBQ2xCLE1BQU0sVUFBVSxHQUFHO1lBQ2pCLGdCQUFnQixFQUFFLCtDQUErQyxNQUFNLFVBQVU7WUFDakYscUJBQXFCLEVBQUUsb0RBQW9ELE1BQU0sUUFBUTtZQUN6Riw0QkFBNEIsRUFBRSx3REFBd0Q7WUFDdEYsOEJBQThCLEVBQUUsaUNBQWlDLE1BQU0sdUJBQXVCO1NBQy9GLENBQUM7UUFDRixvQkFBb0I7UUFDcEIsTUFBTSxLQUFLLEdBQUcsb0NBQWMsQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxvQkFBMkQsQ0FBQyxDQUFDO1FBRW5ILGlDQUFpQztRQUNqQyxNQUFNLEtBQUssR0FBYyxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLG1CQUFtQixFQUFFO1lBQ2hFLFNBQVMsRUFBRSxLQUFLLENBQUMscUJBQXFCO1lBQ3RDLFdBQVcsRUFBRSxLQUFLLENBQUMsNEJBQTRCO1NBQ2hELENBQUMsQ0FBQztRQUVILDZFQUE2RTtRQUM3RSxtRUFBbUU7UUFFbkUsMkNBQTJDO1FBQzNDLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxhQUFhLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQztRQUNoRCxLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQzNCLEtBQUssQ0FBQyxlQUFlLENBQUMsSUFBSSxhQUFhLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNwRSxDQUFDO1FBRUQsZ0NBQWdDO1FBQ2hDLElBQUksS0FBSyxDQUFDLGFBQWEsRUFBRSxLQUFLLEVBQUUsQ0FBQztZQUMvQixJQUFJLDZFQUFpQyxDQUFDLElBQUksRUFBRSxtQ0FBbUMsRUFBRTtnQkFDL0UsS0FBSztnQkFDTCxzQkFBc0IsRUFBRSxLQUFLLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxpQkFBaUI7YUFDcEUsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVELHlEQUF5RDtRQUN6RCwwR0FBMEc7UUFFMUcsMEJBQTBCO1FBQzFCLE1BQU0sWUFBWSxHQUFHLElBQUkscURBQXdCLENBQUMsSUFBSSxFQUFFLGNBQWMsRUFBRTtZQUN0RSxnQkFBZ0IsRUFBRSxLQUFLLENBQUMsZ0JBQWdCO1lBQ3hDLE9BQU8sRUFBRSxzQkFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDNUIsaUJBQWlCLEVBQUUsS0FBSztTQUN6QixDQUFDLENBQUM7UUFFSCxnQkFBZ0I7UUFDaEIsU0FBUztRQUNULE1BQU0sVUFBVSxHQUFZLENBQUMsR0FBRyxFQUFFO1lBQ2hDLE9BQU8sS0FBSyxFQUFFLE9BQU8sS0FBSyxTQUFTLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQztRQUN2RCxDQUFDLENBQUMsRUFBRSxDQUFDO1FBRUwsNkJBQTZCO1FBQzdCLElBQUksNkdBQTBELENBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRTtZQUNoRixRQUFRLEVBQUUsS0FBSyxDQUFDLDhCQUE4QjtZQUM5QyxPQUFPLEVBQUUsVUFBVTtZQUNuQixPQUFPLEVBQUU7Z0JBQ1AsSUFBSSxPQUFPLENBQUMsZUFBZSxDQUFDLFlBQVksRUFBRTtvQkFDeEMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDO3dCQUN2QyxLQUFLLEVBQUUsTUFBTSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDO3dCQUN0QyxNQUFNLEVBQUU7NEJBQ04sTUFBTSxFQUFFLEtBQUssQ0FBQyxjQUFjLENBQUMsTUFBTTs0QkFDbkMsU0FBUyxFQUFFLEtBQUssQ0FBQyxjQUFjLENBQUMsU0FBUzt5QkFDMUM7cUJBQ0YsQ0FBQztpQkFDSCxDQUFDO2FBQ0g7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDOztBQXZFSCw4R0F3RUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb2RlUGlwZWxpbmVQaXBlbGluZUV4ZWN1dGlvblN0YXRlQ2hhbmdlRGV0ZWN0aW9uRXZlbnRSdWxlIH0gZnJvbSAnQGdhbW1hcmVycy9hd3MtY29kZXN1aXRlLXN0YXRlLWNoYW5nZS1kZXRlY3Rpb24tZXZlbnQtcnVsZXMnO1xuaW1wb3J0IHsgUmVzb3VyY2VBdXRvTmFtaW5nLCBSZXNvdXJjZURlZmF1bHROYW1pbmcsIFJlc291cmNlTmFtaW5nLCBSZXNvdXJjZU5hbWluZ1R5cGUgYXMgQ29kZVBpcGVsaW5lRXhlY3V0aW9uU3RhdGVDaGFuZ2VOb3RpZmljYXRpb25TdGFja1Jlc291cmNlTmFtaW5nVHlwZSB9IGZyb20gJ0BnYW1tYXJlcnMvYXdzLXJlc291cmNlLW5hbWluZyc7XG5pbXBvcnQgeyBTTlNTbGFja01lc3NhZ2VMYW1iZGFTdWJzY3JpcHRpb24gfSBmcm9tICdAZ2FtbWFyZXJzL2F3cy1zbnMtc2xhY2stbWVzc2FnZS1sYW1iZGEtc3Vic2NyaXB0aW9uJztcbmltcG9ydCB7IER1cmF0aW9uLCBOYW1lcywgU3RhY2ssIFN0YWNrUHJvcHMgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgKiBhcyBldmVudHMgZnJvbSAnYXdzLWNkay1saWIvYXdzLWV2ZW50cyc7XG5pbXBvcnQgKiBhcyB0YXJnZXRzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1ldmVudHMtdGFyZ2V0cyc7XG5pbXBvcnQgKiBhcyBzbnMgZnJvbSAnYXdzLWNkay1saWIvYXdzLXNucyc7XG5pbXBvcnQgKiBhcyBzdWJzY3JpcHRpb25zIGZyb20gJ2F3cy1jZGstbGliL2F3cy1zbnMtc3Vic2NyaXB0aW9ucyc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7IE5vdGlmaWNhdGlvblN0YXRlTWFjaGluZSB9IGZyb20gJy4vcmVzb3VyY2VzL25vdGlmaWNhdGlvbi1zdGF0ZS1tYWNoaW5lJztcblxuZXhwb3J0IHsgQ29kZVBpcGVsaW5lRXhlY3V0aW9uU3RhdGVDaGFuZ2VOb3RpZmljYXRpb25TdGFja1Jlc291cmNlTmFtaW5nVHlwZSB9O1xuXG5leHBvcnQgaW50ZXJmYWNlIFRhcmdldFJlc291cmNlUHJvcGVydHkge1xuICByZWFkb25seSB0YWdLZXk6IHN0cmluZztcbiAgcmVhZG9ubHkgdGFnVmFsdWVzOiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTbGFjayB7XG4gIHJlYWRvbmx5IHdlYmhvb2tTZWNyZXROYW1lOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTm90aWZpY2F0aW9uc1Byb3BlcnR5IHtcbiAgcmVhZG9ubHkgZW1haWxzPzogc3RyaW5nW107XG4gIHJlYWRvbmx5IHNsYWNrPzogU2xhY2s7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29kZVBpcGVsaW5lRXhlY3V0aW9uU3RhdGVDaGFuZ2VOb3RpZmljYXRpb25TdGFja1Byb3BzIGV4dGVuZHMgU3RhY2tQcm9wcyB7XG4gIHJlYWRvbmx5IHRhcmdldFJlc291cmNlOiBUYXJnZXRSZXNvdXJjZVByb3BlcnR5O1xuICByZWFkb25seSBlbmFibGVkPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgbm90aWZpY2F0aW9uczogTm90aWZpY2F0aW9uc1Byb3BlcnR5O1xuICByZWFkb25seSByZXNvdXJjZU5hbWluZ09wdGlvbj86IFJlc291cmNlTmFtaW5nT3B0aW9uO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEN1c3RvbU5hbWluZyB7XG4gIHJlYWRvbmx5IHR5cGU6IENvZGVQaXBlbGluZUV4ZWN1dGlvblN0YXRlQ2hhbmdlTm90aWZpY2F0aW9uU3RhY2tSZXNvdXJjZU5hbWluZ1R5cGUuQ1VTVE9NO1xuICByZWFkb25seSBzdGF0ZU1hY2hpbmVOYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IG5vdGlmaWNhdGlvblRvcGljTmFtZTogc3RyaW5nO1xuICByZWFkb25seSBub3RpZmljYXRpb25Ub3BpY0Rpc3BsYXlOYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBpcGVsaW5lRXZlbnREZXRlY3Rpb25SdWxlTmFtZTogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBSZXNvdXJjZU5hbWluZ09wdGlvbiA9IFJlc291cmNlRGVmYXVsdE5hbWluZyB8IFJlc291cmNlQXV0b05hbWluZyB8IEN1c3RvbU5hbWluZztcblxuZXhwb3J0IGNsYXNzIENvZGVQaXBlbGluZUV4ZWN1dGlvblN0YXRlQ2hhbmdlTm90aWZpY2F0aW9uU3RhY2sgZXh0ZW5kcyBTdGFjayB7XG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBDb2RlUGlwZWxpbmVFeGVjdXRpb25TdGF0ZUNoYW5nZU5vdGlmaWNhdGlvblN0YWNrUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHByb3BzKTtcblxuICAgIC8vIPCfkYcgQ3JlYXRlIHJhbmRvbSA4IGxlbmd0aCBzdHJpbmdcbiAgICBjb25zdCByYW5kb20gPSBSZXNvdXJjZU5hbWluZy5jcmVhdGVSYW5kb21TdHJpbmcoYCR7TmFtZXMudW5pcXVlSWQoc2NvcGUpfS4ke05hbWVzLnVuaXF1ZUlkKHRoaXMpfWApO1xuICAgIC8vIPCfkYcgQXV0byBuYWVtaW5nXG4gICAgY29uc3QgYXV0b05hbWluZyA9IHtcbiAgICAgIHN0YXRlTWFjaGluZU5hbWU6IGBjb2RlcGlwZWxpbmUtZXhlYy1zdGF0ZS1jaGFuZ2Utbm90aWZpY2F0aW9uLSR7cmFuZG9tfS1tYWNoaW5lYCxcbiAgICAgIG5vdGlmaWNhdGlvblRvcGljTmFtZTogYGNvZGVwaXBlbGluZS1leGVjdXRpb24tc3RhdGUtY2hhbmdlLW5vdGlmaWNhdGlvbi0ke3JhbmRvbX0tdG9waWNgLFxuICAgICAgbm90aWZpY2F0aW9uVG9waWNEaXNwbGF5TmFtZTogJ0NvZGVQaXBlbGluZSBFeGVjdXRpb24gc3RhdGUgY2hhbmdlIE5vdGlmaWNhdGlvbiBUb3BpYycsXG4gICAgICBwaXBlbGluZUV2ZW50RGV0ZWN0aW9uUnVsZU5hbWU6IGBjb2RlcGlwZWxpbmUtZXhlLXN0YXRlLWNoYW5nZS0ke3JhbmRvbX0tZGV0ZWN0aW9uLWV2ZW50LXJ1bGVgLFxuICAgIH07XG4gICAgLy8g8J+RhyBSZXNvdXJjZSBOYW1lc1xuICAgIGNvbnN0IG5hbWVzID0gUmVzb3VyY2VOYW1pbmcubmFtaW5nKGF1dG9OYW1pbmcsIHByb3BzLnJlc291cmNlTmFtaW5nT3B0aW9uIGFzIFJlc291cmNlTmFtaW5nLlJlc291cmNlTmFtaW5nT3B0aW9uKTtcblxuICAgIC8vIPCfkYcgU05TIFRvcGljIGZvciBub3RpZmljYXRpb25zXG4gICAgY29uc3QgdG9waWM6IHNucy5Ub3BpYyA9IG5ldyBzbnMuVG9waWModGhpcywgJ05vdGlmaWNhdGlvblRvcGljJywge1xuICAgICAgdG9waWNOYW1lOiBuYW1lcy5ub3RpZmljYXRpb25Ub3BpY05hbWUsXG4gICAgICBkaXNwbGF5TmFtZTogbmFtZXMubm90aWZpY2F0aW9uVG9waWNEaXNwbGF5TmFtZSxcbiAgICB9KTtcblxuICAgIC8vICAgIGNvbnN0IHNlY3JldCA9IGNkay5TZWNyZXRWYWx1ZS5zZWNyZXRzTWFuYWdlcignbXktZW1haWwtYXJyYXktc2VjcmV0Jyk7XG4gICAgLy8gICAgY29uc3QgZW1haWxzID0gSlNPTi5wYXJzZShzZWNyZXQudW5zYWZlVW53cmFwKCkpIGFzIHN0cmluZ1tdO1xuXG4gICAgLy8gU3Vic2NyaWJlIGFuIGVtYWlsIGVuZHBvaW50IHRvIHRoZSB0b3BpY1xuICAgIGNvbnN0IGVtYWlscyA9IHByb3BzLm5vdGlmaWNhdGlvbnMuZW1haWxzID8/IFtdO1xuICAgIGZvciAoY29uc3QgZW1haWwgb2YgZW1haWxzKSB7XG4gICAgICB0b3BpYy5hZGRTdWJzY3JpcHRpb24obmV3IHN1YnNjcmlwdGlvbnMuRW1haWxTdWJzY3JpcHRpb24oZW1haWwpKTtcbiAgICB9XG5cbiAgICAvLyDwn5GHIFN1YnNjcmlwdGlvbiBzbGFjayB3ZWJob29rXG4gICAgaWYgKHByb3BzLm5vdGlmaWNhdGlvbnM/LnNsYWNrKSB7XG4gICAgICBuZXcgU05TU2xhY2tNZXNzYWdlTGFtYmRhU3Vic2NyaXB0aW9uKHRoaXMsICdTTlNTbGFja01lc3NhZ2VMYW1iZGFTdWJzY3JpcHRpb24nLCB7XG4gICAgICAgIHRvcGljLFxuICAgICAgICBzbGFja1dlYmhvb2tTZWNyZXROYW1lOiBwcm9wcy5ub3RpZmljYXRpb25zLnNsYWNrLndlYmhvb2tTZWNyZXROYW1lLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gU3Vic2NyaWJlIGEgSFRUUCBlbmRwb2ludCAoU2xhY2sgV2ViaG9vaykgdG8gdGhlIHRvcGljXG4gICAgLy8gdG9waWMuYWRkU3Vic2NyaXB0aW9uKG5ldyBzdWJzLlVybFN1YnNjcmlwdGlvbignaHR0cHM6Ly9ob29rcy5zbGFjay5jb20vc2VydmljZXMvWU9VUi9TTEFDSy9XRUJIT09LJykpO1xuXG4gICAgLy8g8J+RhyBDcmVhdGUgU3RhdGUgTWFjaGluZVxuICAgIGNvbnN0IHN0YXRlTWFjaGluZSA9IG5ldyBOb3RpZmljYXRpb25TdGF0ZU1hY2hpbmUodGhpcywgJ1N0YXRlTWFjaGluZScsIHtcbiAgICAgIHN0YXRlTWFjaGluZU5hbWU6IG5hbWVzLnN0YXRlTWFjaGluZU5hbWUsXG4gICAgICB0aW1lb3V0OiBEdXJhdGlvbi5taW51dGVzKDUpLFxuICAgICAgbm90aWZpY2F0aW9uVG9waWM6IHRvcGljLFxuICAgIH0pO1xuXG4gICAgLy8g8J+RhyBSdWxlIHN0YXRlXG4gICAgLy9lbmFibGVkXG4gICAgY29uc3QgZW5hYmxlUnVsZTogYm9vbGVhbiA9ICgoKSA9PiB7XG4gICAgICByZXR1cm4gcHJvcHM/LmVuYWJsZWQgPT09IHVuZGVmaW5lZCB8fCBwcm9wcy5lbmFibGVkO1xuICAgIH0pKCk7XG5cbiAgICAvLyDwn5GHIENyZWF0ZSBFdmVudEJyaWRnZSBSdWxlXG4gICAgbmV3IENvZGVQaXBlbGluZVBpcGVsaW5lRXhlY3V0aW9uU3RhdGVDaGFuZ2VEZXRlY3Rpb25FdmVudFJ1bGUodGhpcywgJ0V2ZW50UnVsZScsIHtcbiAgICAgIHJ1bGVOYW1lOiBuYW1lcy5waXBlbGluZUV2ZW50RGV0ZWN0aW9uUnVsZU5hbWUsXG4gICAgICBlbmFibGVkOiBlbmFibGVSdWxlLFxuICAgICAgdGFyZ2V0czogW1xuICAgICAgICBuZXcgdGFyZ2V0cy5TZm5TdGF0ZU1hY2hpbmUoc3RhdGVNYWNoaW5lLCB7XG4gICAgICAgICAgaW5wdXQ6IGV2ZW50cy5SdWxlVGFyZ2V0SW5wdXQuZnJvbU9iamVjdCh7XG4gICAgICAgICAgICBldmVudDogZXZlbnRzLkV2ZW50RmllbGQuZnJvbVBhdGgoJyQnKSxcbiAgICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgICB0YWdLZXk6IHByb3BzLnRhcmdldFJlc291cmNlLnRhZ0tleSxcbiAgICAgICAgICAgICAgdGFnVmFsdWVzOiBwcm9wcy50YXJnZXRSZXNvdXJjZS50YWdWYWx1ZXMsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pLFxuICAgICAgICB9KSxcbiAgICAgIF0sXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==