UNPKG

@gammarers/aws-rds-database-running-schedule-stack

Version:
183 lines β€’ 28 kB
"use strict"; var _a; Object.defineProperty(exports, "__esModule", { value: true }); exports.RDSDatabaseRunningScheduleStack = exports.RDSDatabaseRunningScheduleStackResourceNamingType = void 0; const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); const aws_resource_naming_1 = require("@gammarers/aws-resource-naming"); Object.defineProperty(exports, "RDSDatabaseRunningScheduleStackResourceNamingType", { 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 cdk = require("aws-cdk-lib"); const aws_cdk_lib_1 = require("aws-cdk-lib"); const iam = require("aws-cdk-lib/aws-iam"); const scheduler = require("aws-cdk-lib/aws-scheduler"); const sns = require("aws-cdk-lib/aws-sns"); const running_control_state_machine_1 = require("./resources/running-control-state-machine"); class RDSDatabaseRunningScheduleStack 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(`${cdk.Names.uniqueId(scope)}-${cdk.Names.uniqueId(this)}`); // πŸ‘‡ Definition auto naming const autoNaming = { notificationTopicName: `rds-db-running-schedule-notification-${random}-topic`, notificationTopicDisplayName: 'RDS DB Running Schedule Notification Topic', stateMachineName: `rds-db-running-schedule-${random}-state-machine`, stateMachineRoleName: `rds-db-running-schedule-${random}-state-machine-role`, schedulerRoleName: `rds-db-running-scheduler-${random}-exec-role`, startScheduleName: `rds-database-running-stop-${random}-schedule`, stopScheduleName: `rds-database-running-start-${random}-schedule`, }; // πŸ‘‡γ€€final naming 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, }); // πŸ‘‡ Subscribe an email endpoint to the topic const emails = props.notifications?.emails ?? []; for (const [index, value] of emails.entries()) { new sns.Subscription(this, `SubscriptionEmail${index.toString().padStart(3, '0')}`, { topic, protocol: sns.SubscriptionProtocol.EMAIL, endpoint: value, }); } // πŸ‘‡ Subscription slack webhook if (props.notifications?.slack) { new aws_sns_slack_message_lambda_subscription_1.SNSSlackMessageLambdaSubscription(this, 'SNSSlackMessageLambdaSubscription', { topic, slackWebhookSecretName: props.notifications.slack.webhookSecretName, }); } // πŸ‘‡ StepFunctions State Machine const stateMachine = new running_control_state_machine_1.RunningControlStateMachine(this, 'StateMachine', { stateMachineName: names.stateMachineName, notificationTopic: topic, }); // πŸ‘‡ rename role name & description. if (names.stateMachineRoleName) { const role = stateMachine.node.findChild('Role'); const cfnRole = role.node.defaultChild; cfnRole.addPropertyOverride('RoleName', names.stateMachineRoleName); cfnRole.addPropertyOverride('Description', 'RDS DB Running machine role.'); const policy = role.node.findChild('DefaultPolicy'); const cfnPolicy = policy.node.defaultChild; cfnPolicy.addPropertyOverride('PolicyName', `rds-db-running-schedule-${random}-state-machine-policy`); } // πŸ‘‡ StateMachine Exec Role of Scheduler const schedulerExecRole = new iam.Role(this, 'SchedulerExecutionRole', { roleName: names.schedulerRoleName, description: 'RDS DB Running scheduler role', assumedBy: new iam.ServicePrincipal('scheduler.amazonaws.com'), inlinePolicies: { 'state-machine-exec-policy': new iam.PolicyDocument({ statements: [ new iam.PolicyStatement({ effect: iam.Effect.ALLOW, actions: [ 'states:StartExecution', ], resources: [ stateMachine.stateMachineArn, ], }), ], }), }, }); // πŸ‘‡ Schedule state const sheduleState = (() => { if (props.enableScheduling === undefined || props.enableScheduling) { return 'ENABLED'; } else { return 'DISABLED'; } })(); // πŸ‘‡ Stop Schedule expression const stopScheduleExpression = (() => { // default: weekday 21:10 const minute = props.stopSchedule?.minute ?? '10'; const hour = props.stopSchedule?.hour ?? '21'; const week = props.stopSchedule?.week ?? 'MON-FRI'; return `cron(${minute} ${hour} ? * ${week} *)`; })(); // πŸ‘‡ Start Schedule expression const startScheduleExpression = (() => { // default: weekday 07:50 const minute = props.startSchedule?.minute ?? '50'; const hour = props.startSchedule?.hour ?? '7'; const week = props.startSchedule?.week ?? 'MON-FRI'; return `cron(${minute} ${hour} ? * ${week} *)`; })(); // πŸ‘‡ Stop DB schedule new DBRuningSchedule(this, 'StopDatabaseRunningSchedule', { name: names.startScheduleName, description: 'stop database(instance/cluster) running stop schedule.', sheduleState, timezone: props.stopSchedule?.timezone ?? 'UTC', expression: stopScheduleExpression, target: { stateMachineArn: stateMachine.stateMachineArn, roleArn: schedulerExecRole.roleArn, resourceTag: { key: props.targetResource.tagKey, values: props.targetResource.tagValues, }, input: { mode: 'Stop' }, }, }); // πŸ‘‡ Start DB schedule new DBRuningSchedule(this, 'StartDatabaseRunningSchedule', { name: names.stopScheduleName, description: 'start db instance schedule.', sheduleState, timezone: props.startSchedule?.timezone ?? 'UTC', expression: startScheduleExpression, target: { stateMachineArn: stateMachine.stateMachineArn, roleArn: schedulerExecRole.roleArn, resourceTag: { key: props.targetResource.tagKey, values: props.targetResource.tagValues, }, input: { mode: 'Start' }, }, }); } } exports.RDSDatabaseRunningScheduleStack = RDSDatabaseRunningScheduleStack; _a = JSII_RTTI_SYMBOL_1; RDSDatabaseRunningScheduleStack[_a] = { fqn: "@gammarers/aws-rds-database-running-schedule-stack.RDSDatabaseRunningScheduleStack", version: "2.5.3" }; class DBRuningSchedule extends scheduler.CfnSchedule { constructor(scope, id, props) { super(scope, id, { name: props.name, description: props.description, state: props.sheduleState, //groupName: scheduleGroup.name, // default flexibleTimeWindow: { mode: 'OFF', }, scheduleExpressionTimezone: props.timezone, scheduleExpression: props.expression, target: { arn: props.target.stateMachineArn, roleArn: props.target.roleArn, input: JSON.stringify({ Params: { TagKey: props.target.resourceTag.key, TagValues: props.target.resourceTag.values, Mode: props.target.input.mode, }, }), retryPolicy: { maximumEventAgeInSeconds: 60, maximumRetryAttempts: 0, }, }, }); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSx3RUFNd0M7QUFVL0Isa0lBWmUsd0NBQWlELE9BWWY7QUFUMUQsb0hBQXlHO0FBQ3pHLG1DQUFtQztBQUNuQyw2Q0FBZ0Q7QUFDaEQsMkNBQTJDO0FBQzNDLHVEQUF1RDtBQUN2RCwyQ0FBMkM7QUFFM0MsNkZBQXVGO0FBK0N2RixNQUFhLCtCQUFnQyxTQUFRLG1CQUFLO0lBQ3hELFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBMkM7UUFDbkYsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFeEIsbUNBQW1DO1FBQ25DLE1BQU0sTUFBTSxHQUFHLG9DQUFjLENBQUMsa0JBQWtCLENBQUMsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDN0csNEJBQTRCO1FBQzVCLE1BQU0sVUFBVSxHQUFHO1lBQ2pCLHFCQUFxQixFQUFFLHdDQUF3QyxNQUFNLFFBQVE7WUFDN0UsNEJBQTRCLEVBQUUsNENBQTRDO1lBQzFFLGdCQUFnQixFQUFFLDJCQUEyQixNQUFNLGdCQUFnQjtZQUNuRSxvQkFBb0IsRUFBRSwyQkFBMkIsTUFBTSxxQkFBcUI7WUFDNUUsaUJBQWlCLEVBQUUsNEJBQTRCLE1BQU0sWUFBWTtZQUNqRSxpQkFBaUIsRUFBRSw2QkFBNkIsTUFBTSxXQUFXO1lBQ2pFLGdCQUFnQixFQUFFLDhCQUE4QixNQUFNLFdBQVc7U0FDbEUsQ0FBQztRQUNGLGtCQUFrQjtRQUNsQixNQUFNLEtBQUssR0FBRyxvQ0FBYyxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLG9CQUEyRCxDQUFDLENBQUM7UUFHbkgsaUNBQWlD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RCxNQUFNLGdCQUFpQixTQUFRLFNBQVMsQ0FBQyxXQUFXO0lBQ2xELFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBNEI7UUFDcEUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUU7WUFDZixJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUk7WUFDaEIsV0FBVyxFQUFFLEtBQUssQ0FBQyxXQUFXO1lBQzlCLEtBQUssRUFBRSxLQUFLLENBQUMsWUFBWTtZQUN6QiwyQ0FBMkM7WUFDM0Msa0JBQWtCLEVBQUU7Z0JBQ2xCLElBQUksRUFBRSxLQUFLO2FBQ1o7WUFDRCwwQkFBMEIsRUFBRSxLQUFLLENBQUMsUUFBUTtZQUMxQyxrQkFBa0IsRUFBRSxLQUFLLENBQUMsVUFBVTtZQUNwQyxNQUFNLEVBQUU7Z0JBQ04sR0FBRyxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsZUFBZTtnQkFDakMsT0FBTyxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBTztnQkFDN0IsS0FBSyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUM7b0JBQ3BCLE1BQU0sRUFBRTt3QkFDTixNQUFNLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsR0FBRzt3QkFDcEMsU0FBUyxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLE1BQU07d0JBQzFDLElBQUksRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJO3FCQUM5QjtpQkFDRixDQUFDO2dCQUNGLFdBQVcsRUFBRTtvQkFDWCx3QkFBd0IsRUFBRSxFQUFFO29CQUM1QixvQkFBb0IsRUFBRSxDQUFDO2lCQUN4QjthQUNGO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgUmVzb3VyY2VBdXRvTmFtaW5nLFxuICBSZXNvdXJjZURlZmF1bHROYW1pbmcsXG4gIFJlc291cmNlTmFtaW5nLFxuICBSZXNvdXJjZU5hbWluZ1R5cGUgYXMgUkRTRGF0YWJhc2VSdW5uaW5nU2NoZWR1bGVTdGFja1Jlc291cmNlTmFtaW5nVHlwZSxcbn1cbiAgZnJvbSAnQGdhbW1hcmVycy9hd3MtcmVzb3VyY2UtbmFtaW5nJztcbmltcG9ydCB7IFNOU1NsYWNrTWVzc2FnZUxhbWJkYVN1YnNjcmlwdGlvbiB9IGZyb20gJ0BnYW1tYXJlcnMvYXdzLXNucy1zbGFjay1tZXNzYWdlLWxhbWJkYS1zdWJzY3JpcHRpb24nO1xuaW1wb3J0ICogYXMgY2RrIGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IFN0YWNrLCBTdGFja1Byb3BzIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0ICogYXMgaWFtIGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuaW1wb3J0ICogYXMgc2NoZWR1bGVyIGZyb20gJ2F3cy1jZGstbGliL2F3cy1zY2hlZHVsZXInO1xuaW1wb3J0ICogYXMgc25zIGZyb20gJ2F3cy1jZGstbGliL2F3cy1zbnMnO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBSdW5uaW5nQ29udHJvbFN0YXRlTWFjaGluZSB9IGZyb20gJy4vcmVzb3VyY2VzL3J1bm5pbmctY29udHJvbC1zdGF0ZS1tYWNoaW5lJztcblxuZXhwb3J0IHsgUkRTRGF0YWJhc2VSdW5uaW5nU2NoZWR1bGVTdGFja1Jlc291cmNlTmFtaW5nVHlwZSB9O1xuXG5leHBvcnQgaW50ZXJmYWNlIFJlc291cmNlQ3VzdG9tTmFtaW5nIHtcbiAgcmVhZG9ubHkgdHlwZTogUkRTRGF0YWJhc2VSdW5uaW5nU2NoZWR1bGVTdGFja1Jlc291cmNlTmFtaW5nVHlwZS5DVVNUT007XG4gIHJlYWRvbmx5IG5vdGlmaWNhdGlvblRvcGljTmFtZTogc3RyaW5nO1xuICByZWFkb25seSBub3RpZmljYXRpb25Ub3BpY0Rpc3BsYXlOYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHN0YXRlTWFjaGluZU5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgc3RhdGVNYWNoaW5lUm9sZU5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgc2NoZWR1bGVyUm9sZU5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgc3RhcnRTY2hlZHVsZU5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgc3RvcFNjaGVkdWxlTmFtZTogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBSZXNvdXJjZU5hbWluZ09wdGlvbiA9IFJlc291cmNlRGVmYXVsdE5hbWluZyB8IFJlc291cmNlQXV0b05hbWluZyB8IFJlc291cmNlQ3VzdG9tTmFtaW5nO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNjaGVkdWxlIHtcbiAgcmVhZG9ubHkgdGltZXpvbmU6IHN0cmluZztcbiAgcmVhZG9ubHkgbWludXRlPzogc3RyaW5nO1xuICByZWFkb25seSBob3VyPzogc3RyaW5nO1xuICByZWFkb25seSB3ZWVrPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRhcmdldFJlc291cmNlIHtcbiAgcmVhZG9ubHkgdGFnS2V5OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHRhZ1ZhbHVlczogc3RyaW5nW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2xhY2sge1xuICByZWFkb25seSB3ZWJob29rU2VjcmV0TmFtZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5vdGlmaWNhdGlvbnMge1xuICByZWFkb25seSBlbWFpbHM/OiBzdHJpbmdbXTtcbiAgcmVhZG9ubHkgc2xhY2s/OiBTbGFjaztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSRFNEYXRhYmFzZVJ1bm5pbmdTY2hlZHVsZVN0YWNrUHJvcHMgZXh0ZW5kcyBTdGFja1Byb3BzIHtcbiAgcmVhZG9ubHkgdGFyZ2V0UmVzb3VyY2U6IFRhcmdldFJlc291cmNlO1xuICByZWFkb25seSBlbmFibGVTY2hlZHVsaW5nPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgc3RvcFNjaGVkdWxlPzogU2NoZWR1bGU7XG4gIHJlYWRvbmx5IHN0YXJ0U2NoZWR1bGU/OiBTY2hlZHVsZTtcbiAgcmVhZG9ubHkgbm90aWZpY2F0aW9ucz86IE5vdGlmaWNhdGlvbnM7XG4gIHJlYWRvbmx5IHJlc291cmNlTmFtaW5nT3B0aW9uPzogUmVzb3VyY2VOYW1pbmdPcHRpb247XG59XG5cbmV4cG9ydCBjbGFzcyBSRFNEYXRhYmFzZVJ1bm5pbmdTY2hlZHVsZVN0YWNrIGV4dGVuZHMgU3RhY2sge1xuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogUkRTRGF0YWJhc2VSdW5uaW5nU2NoZWR1bGVTdGFja1Byb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCBwcm9wcyk7XG5cbiAgICAvLyDwn5GHIENyZWF0ZSByYW5kb20gOCBsZW5ndGggc3RyaW5nXG4gICAgY29uc3QgcmFuZG9tID0gUmVzb3VyY2VOYW1pbmcuY3JlYXRlUmFuZG9tU3RyaW5nKGAke2Nkay5OYW1lcy51bmlxdWVJZChzY29wZSl9LSR7Y2RrLk5hbWVzLnVuaXF1ZUlkKHRoaXMpfWApO1xuICAgIC8vIPCfkYcgRGVmaW5pdGlvbiBhdXRvIG5hbWluZ1xuICAgIGNvbnN0IGF1dG9OYW1pbmcgPSB7XG4gICAgICBub3RpZmljYXRpb25Ub3BpY05hbWU6IGByZHMtZGItcnVubmluZy1zY2hlZHVsZS1ub3RpZmljYXRpb24tJHtyYW5kb219LXRvcGljYCxcbiAgICAgIG5vdGlmaWNhdGlvblRvcGljRGlzcGxheU5hbWU6ICdSRFMgREIgUnVubmluZyBTY2hlZHVsZSBOb3RpZmljYXRpb24gVG9waWMnLFxuICAgICAgc3RhdGVNYWNoaW5lTmFtZTogYHJkcy1kYi1ydW5uaW5nLXNjaGVkdWxlLSR7cmFuZG9tfS1zdGF0ZS1tYWNoaW5lYCxcbiAgICAgIHN0YXRlTWFjaGluZVJvbGVOYW1lOiBgcmRzLWRiLXJ1bm5pbmctc2NoZWR1bGUtJHtyYW5kb219LXN0YXRlLW1hY2hpbmUtcm9sZWAsXG4gICAgICBzY2hlZHVsZXJSb2xlTmFtZTogYHJkcy1kYi1ydW5uaW5nLXNjaGVkdWxlci0ke3JhbmRvbX0tZXhlYy1yb2xlYCxcbiAgICAgIHN0YXJ0U2NoZWR1bGVOYW1lOiBgcmRzLWRhdGFiYXNlLXJ1bm5pbmctc3RvcC0ke3JhbmRvbX0tc2NoZWR1bGVgLFxuICAgICAgc3RvcFNjaGVkdWxlTmFtZTogYHJkcy1kYXRhYmFzZS1ydW5uaW5nLXN0YXJ0LSR7cmFuZG9tfS1zY2hlZHVsZWAsXG4gICAgfTtcbiAgICAvLyDwn5GH44CAZmluYWwgbmFtaW5nXG4gICAgY29uc3QgbmFtZXMgPSBSZXNvdXJjZU5hbWluZy5uYW1pbmcoYXV0b05hbWluZywgcHJvcHMucmVzb3VyY2VOYW1pbmdPcHRpb24gYXMgUmVzb3VyY2VOYW1pbmcuUmVzb3VyY2VOYW1pbmdPcHRpb24pO1xuXG5cbiAgICAvLyDwn5GHIFNOUyBUb3BpYyBmb3Igbm90aWZpY2F0aW9uc1xuICAgIGNvbnN0IHRvcGljOiBzbnMuVG9waWMgPSBuZXcgc25zLlRvcGljKHRoaXMsICdOb3RpZmljYXRpb25Ub3BpYycsIHtcbiAgICAgIHRvcGljTmFtZTogbmFtZXMubm90aWZpY2F0aW9uVG9waWNOYW1lLFxuICAgICAgZGlzcGxheU5hbWU6IG5hbWVzLm5vdGlmaWNhdGlvblRvcGljRGlzcGxheU5hbWUsXG4gICAgfSk7XG5cbiAgICAvLyDwn5GHIFN1YnNjcmliZSBhbiBlbWFpbCBlbmRwb2ludCB0byB0aGUgdG9waWNcbiAgICBjb25zdCBlbWFpbHMgPSBwcm9wcy5ub3RpZmljYXRpb25zPy5lbWFpbHMgPz8gW107XG4gICAgZm9yIChjb25zdCBbaW5kZXgsIHZhbHVlXSBvZiBlbWFpbHMuZW50cmllcygpKSB7XG4gICAgICBuZXcgc25zLlN1YnNjcmlwdGlvbih0aGlzLCBgU3Vic2NyaXB0aW9uRW1haWwke2luZGV4LnRvU3RyaW5nKCkucGFkU3RhcnQoMywgJzAnKX1gLCB7XG4gICAgICAgIHRvcGljLFxuICAgICAgICBwcm90b2NvbDogc25zLlN1YnNjcmlwdGlvblByb3RvY29sLkVNQUlMLFxuICAgICAgICBlbmRwb2ludDogdmFsdWUsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyDwn5GHIFN1YnNjcmlwdGlvbiBzbGFjayB3ZWJob29rXG4gICAgaWYgKHByb3BzLm5vdGlmaWNhdGlvbnM/LnNsYWNrKSB7XG4gICAgICBuZXcgU05TU2xhY2tNZXNzYWdlTGFtYmRhU3Vic2NyaXB0aW9uKHRoaXMsICdTTlNTbGFja01lc3NhZ2VMYW1iZGFTdWJzY3JpcHRpb24nLCB7XG4gICAgICAgIHRvcGljLFxuICAgICAgICBzbGFja1dlYmhvb2tTZWNyZXROYW1lOiBwcm9wcy5ub3RpZmljYXRpb25zLnNsYWNrLndlYmhvb2tTZWNyZXROYW1lLFxuICAgICAgfSk7XG4gICAgfVxuXG5cbiAgICAvLyDwn5GHIFN0ZXBGdW5jdGlvbnMgU3RhdGUgTWFjaGluZVxuICAgIGNvbnN0IHN0YXRlTWFjaGluZSA9IG5ldyBSdW5uaW5nQ29udHJvbFN0YXRlTWFjaGluZSh0aGlzLCAnU3RhdGVNYWNoaW5lJywge1xuICAgICAgc3RhdGVNYWNoaW5lTmFtZTogbmFtZXMuc3RhdGVNYWNoaW5lTmFtZSxcbiAgICAgIG5vdGlmaWNhdGlvblRvcGljOiB0b3BpYyxcbiAgICB9KTtcblxuICAgIC8vIPCfkYcgcmVuYW1lIHJvbGUgbmFtZSAmIGRlc2NyaXB0aW9uLlxuICAgIGlmIChuYW1lcy5zdGF0ZU1hY2hpbmVSb2xlTmFtZSkge1xuICAgICAgY29uc3Qgcm9sZSA9IHN0YXRlTWFjaGluZS5ub2RlLmZpbmRDaGlsZCgnUm9sZScpIGFzIGlhbS5Sb2xlO1xuICAgICAgY29uc3QgY2ZuUm9sZSA9IHJvbGUubm9kZS5kZWZhdWx0Q2hpbGQgYXMgaWFtLkNmblJvbGU7XG4gICAgICBjZm5Sb2xlLmFkZFByb3BlcnR5T3ZlcnJpZGUoJ1JvbGVOYW1lJywgbmFtZXMuc3RhdGVNYWNoaW5lUm9sZU5hbWUpO1xuICAgICAgY2ZuUm9sZS5hZGRQcm9wZXJ0eU92ZXJyaWRlKCdEZXNjcmlwdGlvbicsICdSRFMgREIgUnVubmluZyBtYWNoaW5lIHJvbGUuJyk7XG4gICAgICBjb25zdCBwb2xpY3kgPSByb2xlLm5vZGUuZmluZENoaWxkKCdEZWZhdWx0UG9saWN5JykgYXMgaWFtLlBvbGljeTtcbiAgICAgIGNvbnN0IGNmblBvbGljeSA9IHBvbGljeS5ub2RlLmRlZmF1bHRDaGlsZCBhcyBpYW0uQ2ZuUG9saWN5O1xuICAgICAgY2ZuUG9saWN5LmFkZFByb3BlcnR5T3ZlcnJpZGUoJ1BvbGljeU5hbWUnLCBgcmRzLWRiLXJ1bm5pbmctc2NoZWR1bGUtJHtyYW5kb219LXN0YXRlLW1hY2hpbmUtcG9saWN5YCk7XG4gICAgfVxuXG4gICAgLy8g8J+RhyBTdGF0ZU1hY2hpbmUgRXhlYyBSb2xlIG9mIFNjaGVkdWxlclxuICAgIGNvbnN0IHNjaGVkdWxlckV4ZWNSb2xlID0gbmV3IGlhbS5Sb2xlKHRoaXMsICdTY2hlZHVsZXJFeGVjdXRpb25Sb2xlJywge1xuICAgICAgcm9sZU5hbWU6IG5hbWVzLnNjaGVkdWxlclJvbGVOYW1lLFxuICAgICAgZGVzY3JpcHRpb246ICdSRFMgREIgUnVubmluZyBzY2hlZHVsZXIgcm9sZScsXG4gICAgICBhc3N1bWVkQnk6IG5ldyBpYW0uU2VydmljZVByaW5jaXBhbCgnc2NoZWR1bGVyLmFtYXpvbmF3cy5jb20nKSxcbiAgICAgIGlubGluZVBvbGljaWVzOiB7XG4gICAgICAgICdzdGF0ZS1tYWNoaW5lLWV4ZWMtcG9saWN5JzogbmV3IGlhbS5Qb2xpY3lEb2N1bWVudCh7XG4gICAgICAgICAgc3RhdGVtZW50czogW1xuICAgICAgICAgICAgbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICAgICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICAgICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICAgICAgICAnc3RhdGVzOlN0YXJ0RXhlY3V0aW9uJyxcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgcmVzb3VyY2VzOiBbXG4gICAgICAgICAgICAgICAgc3RhdGVNYWNoaW5lLnN0YXRlTWFjaGluZUFybixcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIF0sXG4gICAgICAgIH0pLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8vIPCfkYcgU2NoZWR1bGUgc3RhdGVcbiAgICBjb25zdCBzaGVkdWxlU3RhdGU6IHN0cmluZyA9ICgoKSA9PiB7XG4gICAgICBpZiAocHJvcHMuZW5hYmxlU2NoZWR1bGluZyA9PT0gdW5kZWZpbmVkIHx8IHByb3BzLmVuYWJsZVNjaGVkdWxpbmcpIHtcbiAgICAgICAgcmV0dXJuICdFTkFCTEVEJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiAnRElTQUJMRUQnO1xuICAgICAgfVxuICAgIH0pKCk7XG5cbiAgICAvLyDwn5GHIFN0b3AgU2NoZWR1bGUgZXhwcmVzc2lvblxuICAgIGNvbnN0IHN0b3BTY2hlZHVsZUV4cHJlc3Npb246IHN0cmluZyA9ICgoKSA9PiB7XG4gICAgICAvLyBkZWZhdWx0OiB3ZWVrZGF5IDIxOjEwXG4gICAgICBjb25zdCBtaW51dGU6IHN0cmluZyA9IHByb3BzLnN0b3BTY2hlZHVsZT8ubWludXRlID8/ICcxMCc7XG4gICAgICBjb25zdCBob3VyOiBzdHJpbmcgPSBwcm9wcy5zdG9wU2NoZWR1bGU/LmhvdXIgPz8gJzIxJztcbiAgICAgIGNvbnN0IHdlZWs6IHN0cmluZyA9IHByb3BzLnN0b3BTY2hlZHVsZT8ud2VlayA/PyAnTU9OLUZSSSc7XG4gICAgICByZXR1cm4gYGNyb24oJHttaW51dGV9ICR7aG91cn0gPyAqICR7d2Vla30gKilgO1xuICAgIH0pKCk7XG5cbiAgICAvLyDwn5GHIFN0YXJ0IFNjaGVkdWxlIGV4cHJlc3Npb25cbiAgICBjb25zdCBzdGFydFNjaGVkdWxlRXhwcmVzc2lvbjogc3RyaW5nID0gKCgpID0+IHtcbiAgICAgIC8vIGRlZmF1bHQ6IHdlZWtkYXkgMDc6NTBcbiAgICAgIGNvbnN0IG1pbnV0ZTogc3RyaW5nID0gcHJvcHMuc3RhcnRTY2hlZHVsZT8ubWludXRlID8/ICc1MCc7XG4gICAgICBjb25zdCBob3VyOiBzdHJpbmcgPSBwcm9wcy5zdGFydFNjaGVkdWxlPy5ob3VyID8/ICc3JztcbiAgICAgIGNvbnN0IHdlZWs6IHN0cmluZyA9IHByb3BzLnN0YXJ0U2NoZWR1bGU/LndlZWsgPz8gJ01PTi1GUkknO1xuICAgICAgcmV0dXJuIGBjcm9uKCR7bWludXRlfSAke2hvdXJ9ID8gKiAke3dlZWt9ICopYDtcbiAgICB9KSgpO1xuXG4gICAgLy8g8J+RhyBTdG9wIERCIHNjaGVkdWxlXG4gICAgbmV3IERCUnVuaW5nU2NoZWR1bGUodGhpcywgJ1N0b3BEYXRhYmFzZVJ1bm5pbmdTY2hlZHVsZScsIHtcbiAgICAgIG5hbWU6IG5hbWVzLnN0YXJ0U2NoZWR1bGVOYW1lLFxuICAgICAgZGVzY3JpcHRpb246ICdzdG9wIGRhdGFiYXNlKGluc3RhbmNlL2NsdXN0ZXIpIHJ1bm5pbmcgc3RvcCBzY2hlZHVsZS4nLFxuICAgICAgc2hlZHVsZVN0YXRlLFxuICAgICAgdGltZXpvbmU6IHByb3BzLnN0b3BTY2hlZHVsZT8udGltZXpvbmUgPz8gJ1VUQycsXG4gICAgICBleHByZXNzaW9uOiBzdG9wU2NoZWR1bGVFeHByZXNzaW9uLFxuICAgICAgdGFyZ2V0OiB7XG4gICAgICAgIHN0YXRlTWFjaGluZUFybjogc3RhdGVNYWNoaW5lLnN0YXRlTWFjaGluZUFybixcbiAgICAgICAgcm9sZUFybjogc2NoZWR1bGVyRXhlY1JvbGUucm9sZUFybixcbiAgICAgICAgcmVzb3VyY2VUYWc6IHtcbiAgICAgICAgICBrZXk6IHByb3BzLnRhcmdldFJlc291cmNlLnRhZ0tleSxcbiAgICAgICAgICB2YWx1ZXM6IHByb3BzLnRhcmdldFJlc291cmNlLnRhZ1ZhbHVlcyxcbiAgICAgICAgfSxcbiAgICAgICAgaW5wdXQ6IHsgbW9kZTogJ1N0b3AnIH0sXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8g8J+RhyBTdGFydCBEQiBzY2hlZHVsZVxuICAgIG5ldyBEQlJ1bmluZ1NjaGVkdWxlKHRoaXMsICdTdGFydERhdGFiYXNlUnVubmluZ1NjaGVkdWxlJywge1xuICAgICAgbmFtZTogbmFtZXMuc3RvcFNjaGVkdWxlTmFtZSxcbiAgICAgIGRlc2NyaXB0aW9uOiAnc3RhcnQgZGIgaW5zdGFuY2Ugc2NoZWR1bGUuJyxcbiAgICAgIHNoZWR1bGVTdGF0ZSxcbiAgICAgIHRpbWV6b25lOiBwcm9wcy5zdGFydFNjaGVkdWxlPy50aW1lem9uZSA/PyAnVVRDJyxcbiAgICAgIGV4cHJlc3Npb246IHN0YXJ0U2NoZWR1bGVFeHByZXNzaW9uLFxuICAgICAgdGFyZ2V0OiB7XG4gICAgICAgIHN0YXRlTWFjaGluZUFybjogc3RhdGVNYWNoaW5lLnN0YXRlTWFjaGluZUFybixcbiAgICAgICAgcm9sZUFybjogc2NoZWR1bGVyRXhlY1JvbGUucm9sZUFybixcbiAgICAgICAgcmVzb3VyY2VUYWc6IHtcbiAgICAgICAgICBrZXk6IHByb3BzLnRhcmdldFJlc291cmNlLnRhZ0tleSxcbiAgICAgICAgICB2YWx1ZXM6IHByb3BzLnRhcmdldFJlc291cmNlLnRhZ1ZhbHVlcyxcbiAgICAgICAgfSxcbiAgICAgICAgaW5wdXQ6IHsgbW9kZTogJ1N0YXJ0JyB9LFxuICAgICAgfSxcbiAgICB9KTtcblxuICB9XG59XG5cbmludGVyZmFjZSBEQlJ1bmluZ1NjaGVkdWxlUHJvcHMge1xuICBuYW1lPzogc3RyaW5nO1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICBzaGVkdWxlU3RhdGU6IHN0cmluZztcbiAgdGltZXpvbmU6IHN0cmluZztcbiAgZXhwcmVzc2lvbjogc3RyaW5nO1xuICB0YXJnZXQ6IHtcbiAgICBzdGF0ZU1hY2hpbmVBcm46IHN0cmluZztcbiAgICByb2xlQXJuOiBzdHJpbmc7XG4gICAgcmVzb3VyY2VUYWc6IHtcbiAgICAgIGtleTogc3RyaW5nO1xuICAgICAgdmFsdWVzOiBzdHJpbmdbXTtcbiAgICB9O1xuICAgIGlucHV0OiB7XG4gICAgICBtb2RlOiBzdHJpbmc7XG4gICAgfTtcbiAgfTtcbn1cblxuY2xhc3MgREJSdW5pbmdTY2hlZHVsZSBleHRlbmRzIHNjaGVkdWxlci5DZm5TY2hlZHVsZSB7XG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBEQlJ1bmluZ1NjaGVkdWxlUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHtcbiAgICAgIG5hbWU6IHByb3BzLm5hbWUsXG4gICAgICBkZXNjcmlwdGlvbjogcHJvcHMuZGVzY3JpcHRpb24sXG4gICAgICBzdGF0ZTogcHJvcHMuc2hlZHVsZVN0YXRlLFxuICAgICAgLy9ncm91cE5hbWU6IHNjaGVkdWxlR3JvdXAubmFtZSwgLy8gZGVmYXVsdFxuICAgICAgZmxleGlibGVUaW1lV2luZG93OiB7XG4gICAgICAgIG1vZGU6ICdPRkYnLFxuICAgICAgfSxcbiAgICAgIHNjaGVkdWxlRXhwcmVzc2lvblRpbWV6b25lOiBwcm9wcy50aW1lem9uZSxcbiAgICAgIHNjaGVkdWxlRXhwcmVzc2lvbjogcHJvcHMuZXhwcmVzc2lvbixcbiAgICAgIHRhcmdldDoge1xuICAgICAgICBhcm46IHByb3BzLnRhcmdldC5zdGF0ZU1hY2hpbmVBcm4sXG4gICAgICAgIHJvbGVBcm46IHByb3BzLnRhcmdldC5yb2xlQXJuLFxuICAgICAgICBpbnB1dDogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgIFBhcmFtczoge1xuICAgICAgICAgICAgVGFnS2V5OiBwcm9wcy50YXJnZXQucmVzb3VyY2VUYWcua2V5LFxuICAgICAgICAgICAgVGFnVmFsdWVzOiBwcm9wcy50YXJnZXQucmVzb3VyY2VUYWcudmFsdWVzLFxuICAgICAgICAgICAgTW9kZTogcHJvcHMudGFyZ2V0LmlucHV0Lm1vZGUsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSksXG4gICAgICAgIHJldHJ5UG9saWN5OiB7XG4gICAgICAgICAgbWF4aW11bUV2ZW50QWdlSW5TZWNvbmRzOiA2MCxcbiAgICAgICAgICBtYXhpbXVtUmV0cnlBdHRlbXB0czogMCxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==