cdk-certbot-dns-route53
Version:
Create Cron Job Via Lambda, to update certificate and put it to S3 Bucket.
144 lines • 19.5 kB
JavaScript
;
var _a, _b;
Object.defineProperty(exports, "__esModule", { value: true });
exports.CertbotDnsRoute53JobPython = exports.CertbotDnsRoute53Job = void 0;
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
const path = require("path");
const cdk = require("aws-cdk-lib");
const events = require("aws-cdk-lib/aws-events");
const target = require("aws-cdk-lib/aws-events-targets");
const iam = require("aws-cdk-lib/aws-iam");
const lambda = require("aws-cdk-lib/aws-lambda");
const constructs_1 = require("constructs");
const lambda_bash_1 = require("./lambda-bash");
const lambda_python_1 = require("./lambda-python");
class CertbotDnsRoute53Job extends constructs_1.Construct {
constructor(scope, id, props) {
super(scope, id);
const certOptions = {
BUCKET_NAME: props.destinationBucket.bucketName,
EMAIL: props.certbotOptions.email,
DOMAIN_NAME: props.certbotOptions.domainName,
CUSTOM_PREFIX_DIRECTORY: props.certbotOptions.customPrefixDirectory,
};
const lambdaFun = new lambda_bash_1.BashExecFunction(this, 'certbotDnsRoute53JobLambda', {
script: path.join(__dirname, '../docker.d/entrypoint.sh'),
timeout: cdk.Duration.minutes(5),
architecture: props.architecture ?? lambda.Architecture.X86_64,
environment: {
...certOptions,
},
});
props.destinationBucket.grantReadWrite(lambdaFun.handler.role);
const route53PolicyJsonList = [{
Effect: 'Allow',
Action: [
'route53:ListHostedZones',
'route53:GetChange',
],
Resource: [
'*',
],
},
{
Effect: 'Allow',
Action: [
'route53:ChangeResourceRecordSets',
],
Resource: [
`arn:${new cdk.ScopedAws(this).partition}:route53:::hostedzone/${props.zone.hostedZoneId}`,
],
}];
route53PolicyJsonList.forEach(e => {
lambdaFun.handler.role.addToPrincipalPolicy(iam.PolicyStatement.fromJson(e));
});
if (props.schedule) {
new events.Rule(this, 'ScheduleRule', {
schedule: props.schedule,
targets: [
new target.LambdaFunction(lambdaFun.handler),
],
});
}
;
if (props.enabledLambdaFunctionUrl) {
const url = new lambda.FunctionUrl(this, 'LambdaFunctionUrl', {
function: lambdaFun.handler,
authType: lambda.FunctionUrlAuthType.NONE,
...props.functionUrlOptions,
});
new cdk.CfnOutput(this, 'lambdaFunctionUrl', {
value: url.url,
});
}
;
}
}
exports.CertbotDnsRoute53Job = CertbotDnsRoute53Job;
_a = JSII_RTTI_SYMBOL_1;
CertbotDnsRoute53Job[_a] = { fqn: "cdk-certbot-dns-route53.CertbotDnsRoute53Job", version: "2.4.445" };
class CertbotDnsRoute53JobPython extends constructs_1.Construct {
constructor(scope, id, props) {
super(scope, id);
const certOptions = {
BUCKET_NAME: props.destinationBucket.bucketName,
EMAIL: props.certbotOptions.email,
DOMAIN_NAME: props.certbotOptions.domainName,
CUSTOM_PREFIX_DIRECTORY: props.certbotOptions.customPrefixDirectory,
};
const lambdaFun = new lambda_python_1.LambdaPythonFunction(this, 'certbotDnsRoute53JobPythonLambda', {
timeout: cdk.Duration.minutes(5),
architecture: lambda.Architecture.X86_64,
environment: {
...certOptions,
},
});
props.destinationBucket.grantReadWrite(lambdaFun.handler.role);
const route53PolicyJsonList = [{
Effect: 'Allow',
Action: [
'route53:ListHostedZones',
'route53:GetChange',
],
Resource: [
'*',
],
},
{
Effect: 'Allow',
Action: [
'route53:ChangeResourceRecordSets',
],
Resource: [
`arn:${new cdk.ScopedAws(this).partition}:route53:::hostedzone/${props.zone.hostedZoneId}`,
],
}];
route53PolicyJsonList.forEach(e => {
lambdaFun.handler.role.addToPrincipalPolicy(iam.PolicyStatement.fromJson(e));
});
if (props.schedule) {
new events.Rule(this, 'ScheduleRule', {
schedule: props.schedule,
targets: [
new target.LambdaFunction(lambdaFun.handler),
],
});
}
;
if (props.enabledLambdaFunctionUrl) {
const url = new lambda.FunctionUrl(this, 'LambdaFunctionUrl', {
function: lambdaFun.handler,
authType: lambda.FunctionUrlAuthType.NONE,
...props.functionUrlOptions,
});
new cdk.CfnOutput(this, 'lambdaFunctionUrl', {
value: url.url,
});
}
;
}
}
exports.CertbotDnsRoute53JobPython = CertbotDnsRoute53JobPython;
_b = JSII_RTTI_SYMBOL_1;
CertbotDnsRoute53JobPython[_b] = { fqn: "cdk-certbot-dns-route53.CertbotDnsRoute53JobPython", version: "2.4.445" };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9tYWluLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsNkJBQTZCO0FBQzdCLG1DQUFtQztBQUNuQyxpREFBaUQ7QUFDakQseURBQXlEO0FBQ3pELDJDQUEyQztBQUMzQyxpREFBaUQ7QUFHakQsMkNBQXVDO0FBQ3ZDLCtDQUFpRDtBQUNqRCxtREFBdUQ7QUFvRXZELE1BQWEsb0JBQXFCLFNBQVEsc0JBQVM7SUFDakQsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUFnQztRQUN4RSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2pCLE1BQU0sV0FBVyxHQUFHO1lBQ2xCLFdBQVcsRUFBRSxLQUFLLENBQUMsaUJBQWlCLENBQUMsVUFBVTtZQUMvQyxLQUFLLEVBQUUsS0FBSyxDQUFDLGNBQWMsQ0FBQyxLQUFLO1lBQ2pDLFdBQVcsRUFBRSxLQUFLLENBQUMsY0FBYyxDQUFDLFVBQVU7WUFDNUMsdUJBQXVCLEVBQUUsS0FBSyxDQUFDLGNBQWMsQ0FBQyxxQkFBc0I7U0FDckUsQ0FBQztRQUVGLE1BQU0sU0FBUyxHQUFHLElBQUksOEJBQWdCLENBQUMsSUFBSSxFQUFFLDRCQUE0QixFQUFFO1lBQ3pFLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSwyQkFBMkIsQ0FBQztZQUN6RCxPQUFPLEVBQUUsR0FBRyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQ2hDLFlBQVksRUFBRSxLQUFLLENBQUMsWUFBWSxJQUFJLE1BQU0sQ0FBQyxZQUFZLENBQUMsTUFBTTtZQUM5RCxXQUFXLEVBQUU7Z0JBQ1gsR0FBRyxXQUFXO2FBQ2Y7U0FDRixDQUFDLENBQUM7UUFFSCxLQUFLLENBQUMsaUJBQWlCLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsSUFBSyxDQUFDLENBQUM7UUFDaEUsTUFBTSxx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QUNmLENBQUMsQ0FBQztRQUNMLENBQUM7UUFBQSxDQUFDO0lBQ0osQ0FBQzs7QUFqRUgsZ0VBa0VDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIGNkayBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgKiBhcyBldmVudHMgZnJvbSAnYXdzLWNkay1saWIvYXdzLWV2ZW50cyc7XG5pbXBvcnQgKiBhcyB0YXJnZXQgZnJvbSAnYXdzLWNkay1saWIvYXdzLWV2ZW50cy10YXJnZXRzJztcbmltcG9ydCAqIGFzIGlhbSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCAqIGFzIGxhbWJkYSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbGFtYmRhJztcbmltcG9ydCAqIGFzIHI1MyBmcm9tICdhd3MtY2RrLWxpYi9hd3Mtcm91dGU1Myc7XG5pbXBvcnQgKiBhcyBzMyBmcm9tICdhd3MtY2RrLWxpYi9hd3MtczMnO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBCYXNoRXhlY0Z1bmN0aW9uIH0gZnJvbSAnLi9sYW1iZGEtYmFzaCc7XG5pbXBvcnQgeyBMYW1iZGFQeXRob25GdW5jdGlvbiB9IGZyb20gJy4vbGFtYmRhLXB5dGhvbic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2VydGJvdE9wdGlvbnMge1xuICAvKipcbiAgICogdGhlIGRvbWFpbiBtdXN0IGhvc3Qgb24gcm91dGU1MyBsaWtlIGV4YW1wbGUuY29tLlxuICAgKlxuICAgKiBAZXhhbXBsZSAtIGAqLmV4YW1wbGUuY29tYCBvciBgYS5leGFtcGxlLmNvbWAgLlxuICAgKi9cbiAgcmVhZG9ubHkgZG9tYWluTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBFbWFpbCBhZGRyZXNzIGZvciBpbXBvcnRhbnQgYWNjb3VudCBub3RpZmljYXRpb25zLlxuICAgKi9cbiAgcmVhZG9ubHkgZW1haWw6IHN0cmluZztcblxuICAvKipcbiAgICogQ3VzdG9tIHByZWZpeCBkaXJlY3Rvcnkgb24gczMgYnVja2V0IG9iamVjdCBwYXRoLlxuICAgKiBAZGVmYXVsdCAtIGBzMzovL1lPVVJfQlVDS0VUX05BTUUvMjAyMS0wMS0wMS95b3VyLmRvbWFpbi5uYW1lL2BcbiAgICpcbiAgICogQGV4YW1wbGUgLSBjdXN0b21QcmVmaXhEaXJlY3Rvcnk6ICcvJyAtPiBgczM6Ly9ZT1VSX0JVQ0tFVF9OQU1FL3lvdXIuZG9tYWluLm5hbWUvYFxuICAgKlxuICAgKiBAZXhhbXBsZSAtIGN1c3RvbVByZWZpeERpcmVjdG9yeTogJ2FiYycgLT4gYHMzOi8vWU9VUl9CVUNLRVRfTkFNRS9hYmMveW91ci5kb21haW4ubmFtZS9gXG4gICAqL1xuICByZWFkb25seSBjdXN0b21QcmVmaXhEaXJlY3Rvcnk/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2VydGJvdERuc1JvdXRlNTNKb2JQcm9wcyB7XG4gIC8qKlxuICAgKiBydW4gdGhlIEpvYiB3aXRoIGRlZmluZWQgc2NoZWR1bGVcbiAgICogQGRlZmF1bHQgLSBubyBzY2hlZHVsZVxuICAgKi9cbiAgcmVhZG9ubHkgc2NoZWR1bGU/OiBldmVudHMuU2NoZWR1bGU7XG5cbiAgLyoqXG4gICAqIFRoZSBTMyBidWNrZXQgdG8gc3RvcmUgY2VydGlmaWNhdGUuXG4gICAqL1xuICByZWFkb25seSBkZXN0aW5hdGlvbkJ1Y2tldDogczMuSUJ1Y2tldDtcblxuICAvKipcbiAgICogVGhlIEhvc3Rab25lIG9uIHJvdXRlNTMgdG8gZG5zLTAxIGNoYWxsZW5nZS5cbiAgICovXG4gIHJlYWRvbmx5IHpvbmU6IHI1My5JSG9zdGVkWm9uZTtcblxuICAvKipcbiAgICogY2VydGJvdCBjbWQgb3B0aW9ucy5cbiAgICovXG4gIHJlYWRvbmx5IGNlcnRib3RPcHRpb25zOiBDZXJ0Ym90T3B0aW9ucztcblxuICAvKipcbiAgICogQ3VzdG9tIGxhbWJkYSBJbWFnZSBBcmNoaXRlY3R1cmUuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbGFtYmRhLkFyY2hpdGVjdHVyZS5YODZfNjRcbiAgICovXG4gIHJlYWRvbmx5IGFyY2hpdGVjdHVyZT86IGxhbWJkYS5BcmNoaXRlY3R1cmU7XG5cbiAgLyoqXG4gICAqIEVuYWJsZWQgTGFtYmRhIEZ1bmN0aW9uIFVSTFxuICAgKiBAZGVmYXVsdCAtIGZhbHNlXG4gICAqL1xuICByZWFkb25seSBlbmFibGVkTGFtYmRhRnVuY3Rpb25Vcmw/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBPcHRpb25zIHRvIGFkZCBhIHVybCB0byBhIExhbWJkYSBmdW5jdGlvblxuICAgKiBAZGVmYXVsdCAtIGF1dGhUeXBlOiBsYW1iZGEuRnVuY3Rpb25VcmxBdXRoVHlwZS5OT05FXG4gICAqL1xuICByZWFkb25seSBmdW5jdGlvblVybE9wdGlvbnM/OiBsYW1iZGEuRnVuY3Rpb25VcmxPcHRpb25zO1xufVxuXG5leHBvcnQgY2xhc3MgQ2VydGJvdERuc1JvdXRlNTNKb2IgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogQ2VydGJvdERuc1JvdXRlNTNKb2JQcm9wcyApIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuICAgIGNvbnN0IGNlcnRPcHRpb25zID0ge1xuICAgICAgQlVDS0VUX05BTUU6IHByb3BzLmRlc3RpbmF0aW9uQnVja2V0LmJ1Y2tldE5hbWUsXG4gICAgICBFTUFJTDogcHJvcHMuY2VydGJvdE9wdGlvbnMuZW1haWwsXG4gICAgICBET01BSU5fTkFNRTogcHJvcHMuY2VydGJvdE9wdGlvbnMuZG9tYWluTmFtZSxcbiAgICAgIENVU1RPTV9QUkVGSVhfRElSRUNUT1JZOiBwcm9wcy5jZXJ0Ym90T3B0aW9ucy5jdXN0b21QcmVmaXhEaXJlY3RvcnkhLFxuICAgIH07XG5cbiAgICBjb25zdCBsYW1iZGFGdW4gPSBuZXcgQmFzaEV4ZWNGdW5jdGlvbih0aGlzLCAnY2VydGJvdERuc1JvdXRlNTNKb2JMYW1iZGEnLCB7XG4gICAgICBzY3JpcHQ6IHBhdGguam9pbihfX2Rpcm5hbWUsICcuLi9kb2NrZXIuZC9lbnRyeXBvaW50LnNoJyksXG4gICAgICB0aW1lb3V0OiBjZGsuRHVyYXRpb24ubWludXRlcyg1KSxcbiAgICAgIGFyY2hpdGVjdHVyZTogcHJvcHMuYXJjaGl0ZWN0dXJlID8/IGxhbWJkYS5BcmNoaXRlY3R1cmUuWDg2XzY0LFxuICAgICAgZW52aXJvbm1lbnQ6IHtcbiAgICAgICAgLi4uY2VydE9wdGlvbnMsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgcHJvcHMuZGVzdGluYXRpb25CdWNrZXQuZ3JhbnRSZWFkV3JpdGUobGFtYmRhRnVuLmhhbmRsZXIucm9sZSEpO1xuICAgIGNvbnN0IHJvdXRlNTNQb2xpY3lKc29uTGlzdCA9IFt7XG4gICAgICBFZmZlY3Q6ICdBbGxvdycsXG4gICAgICBBY3Rpb246IFtcbiAgICAgICAgJ3JvdXRlNTM6TGlzdEhvc3RlZFpvbmVzJyxcbiAgICAgICAgJ3JvdXRlNTM6R2V0Q2hhbmdlJyxcbiAgICAgIF0sXG4gICAgICBSZXNvdXJjZTogW1xuICAgICAgICAnKicsXG4gICAgICBdLFxuICAgIH0sXG4gICAge1xuICAgICAgRWZmZWN0OiAnQWxsb3cnLFxuICAgICAgQWN0aW9uOiBbXG4gICAgICAgICdyb3V0ZTUzOkNoYW5nZVJlc291cmNlUmVjb3JkU2V0cycsXG4gICAgICBdLFxuICAgICAgUmVzb3VyY2U6IFtcbiAgICAgICAgYGFybjoke25ldyBjZGsuU2NvcGVkQXdzKHRoaXMpLnBhcnRpdGlvbn06cm91dGU1Mzo6Omhvc3RlZHpvbmUvJHtwcm9wcy56b25lLmhvc3RlZFpvbmVJZH1gLFxuICAgICAgXSxcbiAgICB9XTtcbiAgICByb3V0ZTUzUG9saWN5SnNvbkxpc3QuZm9yRWFjaChcbiAgICAgIGUgPT4ge1xuICAgICAgICBsYW1iZGFGdW4uaGFuZGxlci5yb2xlIS5hZGRUb1ByaW5jaXBhbFBvbGljeShpYW0uUG9saWN5U3RhdGVtZW50LmZyb21Kc29uKGUpKTtcbiAgICAgIH0sXG4gICAgKTtcblxuXG4gICAgaWYgKHByb3BzLnNjaGVkdWxlKSB7XG4gICAgICBuZXcgZXZlbnRzLlJ1bGUodGhpcywgJ1NjaGVkdWxlUnVsZScsIHtcbiAgICAgICAgc2NoZWR1bGU6IHByb3BzLnNjaGVkdWxlLFxuICAgICAgICB0YXJnZXRzOiBbXG4gICAgICAgICAgbmV3IHRhcmdldC5MYW1iZGFGdW5jdGlvbihsYW1iZGFGdW4uaGFuZGxlciksXG4gICAgICAgIF0sXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgaWYgKHByb3BzLmVuYWJsZWRMYW1iZGFGdW5jdGlvblVybCkge1xuICAgICAgY29uc3QgdXJsID0gbmV3IGxhbWJkYS5GdW5jdGlvblVybCh0aGlzLCAnTGFtYmRhRnVuY3Rpb25VcmwnLCB7XG4gICAgICAgIGZ1bmN0aW9uOiBsYW1iZGFGdW4uaGFuZGxlcixcbiAgICAgICAgYXV0aFR5cGU6IGxhbWJkYS5GdW5jdGlvblVybEF1dGhUeXBlLk5PTkUsXG4gICAgICAgIC4uLnByb3BzLmZ1bmN0aW9uVXJsT3B0aW9ucyxcbiAgICAgIH0pO1xuXG4gICAgICBuZXcgY2RrLkNmbk91dHB1dCh0aGlzLCAnbGFtYmRhRnVuY3Rpb25VcmwnLCB7XG4gICAgICAgIHZhbHVlOiB1cmwudXJsLFxuICAgICAgfSk7XG4gICAgfTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIENlcnRib3RPcHRpb25zIHtcbiAgLyoqXG4gICAqIHRoZSBkb21haW4gbXVzdCBob3N0IG9uIHJvdXRlNTMgbGlrZSBleGFtcGxlLmNvbS5cbiAgICpcbiAgICogQGV4YW1wbGUgLSBgKi5leGFtcGxlLmNvbWAgb3IgYGEuZXhhbXBsZS5jb21gIC5cbiAgICovXG4gIHJlYWRvbmx5IGRvbWFpbk5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogRW1haWwgYWRkcmVzcyBmb3IgaW1wb3J0YW50IGFjY291bnQgbm90aWZpY2F0aW9ucy5cbiAgICovXG4gIHJlYWRvbmx5IGVtYWlsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEN1c3RvbSBwcmVmaXggZGlyZWN0b3J5IG9uIHMzIGJ1Y2tldCBvYmplY3QgcGF0aC5cbiAgICogQGRlZmF1bHQgLSBgczM6Ly9ZT1VSX0JVQ0tFVF9OQU1FLzIwMjEtMDEtMDEveW91ci5kb21haW4ubmFtZS9gXG4gICAqXG4gICAqIEBleGFtcGxlIC0gY3VzdG9tUHJlZml4RGlyZWN0b3J5OiAnLycgLT4gYHMzOi8vWU9VUl9CVUNLRVRfTkFNRS95b3VyLmRvbWFpbi5uYW1lL2BcbiAgICpcbiAgICogQGV4YW1wbGUgLSBjdXN0b21QcmVmaXhEaXJlY3Rvcnk6ICdhYmMnIC0+IGBzMzovL1lPVVJfQlVDS0VUX05BTUUvYWJjL3lvdXIuZG9tYWluLm5hbWUvYFxuICAgKi9cbiAgcmVhZG9ubHkgY3VzdG9tUHJlZml4RGlyZWN0b3J5Pzogc3RyaW5nO1xufVxuXG5cbmV4cG9ydCBjbGFzcyBDZXJ0Ym90RG5zUm91dGU1M0pvYlB5dGhvbiBleHRlbmRzIENvbnN0cnVjdCB7XG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBDZXJ0Ym90RG5zUm91dGU1M0pvYlByb3BzICkge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG4gICAgY29uc3QgY2VydE9wdGlvbnMgPSB7XG4gICAgICBCVUNLRVRfTkFNRTogcHJvcHMuZGVzdGluYXRpb25CdWNrZXQuYnVja2V0TmFtZSxcbiAgICAgIEVNQUlMOiBwcm9wcy5jZXJ0Ym90T3B0aW9ucy5lbWFpbCxcbiAgICAgIERPTUFJTl9OQU1FOiBwcm9wcy5jZXJ0Ym90T3B0aW9ucy5kb21haW5OYW1lLFxuICAgICAgQ1VTVE9NX1BSRUZJWF9ESVJFQ1RPUlk6IHByb3BzLmNlcnRib3RPcHRpb25zLmN1c3RvbVByZWZpeERpcmVjdG9yeSEsXG4gICAgfTtcblxuICAgIGNvbnN0IGxhbWJkYUZ1biA9IG5ldyBMYW1iZGFQeXRob25GdW5jdGlvbih0aGlzLCAnY2VydGJvdERuc1JvdXRlNTNKb2JQeXRob25MYW1iZGEnLCB7XG4gICAgICB0aW1lb3V0OiBjZGsuRHVyYXRpb24ubWludXRlcyg1KSxcbiAgICAgIGFyY2hpdGVjdHVyZTogbGFtYmRhLkFyY2hpdGVjdHVyZS5YODZfNjQsXG4gICAgICBlbnZpcm9ubWVudDoge1xuICAgICAgICAuLi5jZXJ0T3B0aW9ucyxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBwcm9wcy5kZXN0aW5hdGlvbkJ1Y2tldC5ncmFudFJlYWRXcml0ZShsYW1iZGFGdW4uaGFuZGxlci5yb2xlISk7XG4gICAgY29uc3Qgcm91dGU1M1BvbGljeUpzb25MaXN0ID0gW3tcbiAgICAgIEVmZmVjdDogJ0FsbG93JyxcbiAgICAgIEFjdGlvbjogW1xuICAgICAgICAncm91dGU1MzpMaXN0SG9zdGVkWm9uZXMnLFxuICAgICAgICAncm91dGU1MzpHZXRDaGFuZ2UnLFxuICAgICAgXSxcbiAgICAgIFJlc291cmNlOiBbXG4gICAgICAgICcqJyxcbiAgICAgIF0sXG4gICAgfSxcbiAgICB7XG4gICAgICBFZmZlY3Q6ICdBbGxvdycsXG4gICAgICBBY3Rpb246IFtcbiAgICAgICAgJ3JvdXRlNTM6Q2hhbmdlUmVzb3VyY2VSZWNvcmRTZXRzJyxcbiAgICAgIF0sXG4gICAgICBSZXNvdXJjZTogW1xuICAgICAgICBgYXJuOiR7bmV3IGNkay5TY29wZWRBd3ModGhpcykucGFydGl0aW9ufTpyb3V0ZTUzOjo6aG9zdGVkem9uZS8ke3Byb3BzLnpvbmUuaG9zdGVkWm9uZUlkfWAsXG4gICAgICBdLFxuICAgIH1dO1xuICAgIHJvdXRlNTNQb2xpY3lKc29uTGlzdC5mb3JFYWNoKFxuICAgICAgZSA9PiB7XG4gICAgICAgIGxhbWJkYUZ1bi5oYW5kbGVyLnJvbGUhLmFkZFRvUHJpbmNpcGFsUG9saWN5KGlhbS5Qb2xpY3lTdGF0ZW1lbnQuZnJvbUpzb24oZSkpO1xuICAgICAgfSxcbiAgICApO1xuXG5cbiAgICBpZiAocHJvcHMuc2NoZWR1bGUpIHtcbiAgICAgIG5ldyBldmVudHMuUnVsZSh0aGlzLCAnU2NoZWR1bGVSdWxlJywge1xuICAgICAgICBzY2hlZHVsZTogcHJvcHMuc2NoZWR1bGUsXG4gICAgICAgIHRhcmdldHM6IFtcbiAgICAgICAgICBuZXcgdGFyZ2V0LkxhbWJkYUZ1bmN0aW9uKGxhbWJkYUZ1bi5oYW5kbGVyKSxcbiAgICAgICAgXSxcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBpZiAocHJvcHMuZW5hYmxlZExhbWJkYUZ1bmN0aW9uVXJsKSB7XG4gICAgICBjb25zdCB1cmwgPSBuZXcgbGFtYmRhLkZ1bmN0aW9uVXJsKHRoaXMsICdMYW1iZGFGdW5jdGlvblVybCcsIHtcbiAgICAgICAgZnVuY3Rpb246IGxhbWJkYUZ1bi5oYW5kbGVyLFxuICAgICAgICBhdXRoVHlwZTogbGFtYmRhLkZ1bmN0aW9uVXJsQXV0aFR5cGUuTk9ORSxcbiAgICAgICAgLi4ucHJvcHMuZnVuY3Rpb25VcmxPcHRpb25zLFxuICAgICAgfSk7XG5cbiAgICAgIG5ldyBjZGsuQ2ZuT3V0cHV0KHRoaXMsICdsYW1iZGFGdW5jdGlvblVybCcsIHtcbiAgICAgICAgdmFsdWU6IHVybC51cmwsXG4gICAgICB9KTtcbiAgICB9O1xuICB9XG59Il19