@cdkx/web-application
Version:
Static web application hosting related constructs
137 lines • 18.4 kB
JavaScript
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
(function (factory) {
if (typeof module === "object" && typeof module.exports === "object") {
var v = factory(require, exports);
if (v !== undefined) module.exports = v;
}
else if (typeof define === "function" && define.amd) {
define("@cdkx/web-application/facades/add-assets-server-api-resource", ["require", "exports", "@aws-cdk/aws-apigateway", "@aws-cdk/aws-lambda-nodejs", "path", "@aws-cdk/core", "@aws-cdk/aws-lambda"], factory);
}
})(function (require, exports) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.addAssetsServerApiResource = void 0;
const aws_apigateway_1 = require("@aws-cdk/aws-apigateway");
const aws_lambda_nodejs_1 = require("@aws-cdk/aws-lambda-nodejs");
const path_1 = __importDefault(require("path"));
const core_1 = require("@aws-cdk/core");
const aws_lambda_1 = require("@aws-cdk/aws-lambda");
function addAssetsServerApiResource(scope, { restApiResource }, { s3Bucket, assetsPublicHost, }) {
// assets uploader handler
const uploadHandler = new aws_lambda_nodejs_1.NodejsFunction(scope, 'UploadHandler', {
entry: path_1.default.resolve(__dirname, '../handlers/entries/assets-uploader-handler.ts'),
environment: {
BUCKET_NAME: s3Bucket.bucketName,
},
timeout: core_1.Duration.minutes(5),
runtime: aws_lambda_1.Runtime.NODEJS_12_X,
});
s3Bucket.grantWrite(uploadHandler);
const uploadRequestModel = new aws_apigateway_1.Model(scope, 'UploadAssets', {
restApi: restApiResource.api,
description: 'Upload files',
contentType: 'multipart/form-data',
modelName: 'UploadAssets',
schema: {
schema: aws_apigateway_1.JsonSchemaVersion.DRAFT7,
title: 'Upload assets',
type: aws_apigateway_1.JsonSchemaType.OBJECT,
additionalProperties: true,
required: ['s3Prefix'],
properties: {
s3Prefix: {
title: 'Directory to upload files under',
type: aws_apigateway_1.JsonSchemaType.STRING,
},
},
},
});
const uploadResource = restApiResource.addResource('upload');
const uploadBodyValidator = new aws_apigateway_1.RequestValidator(scope, 'UploadBodyValidator', {
requestValidatorName: 'Upload Body validator',
validateRequestBody: true,
restApi: restApiResource.api,
});
uploadResource.addMethod('POST', new aws_apigateway_1.LambdaIntegration(uploadHandler, {
// only supports uploading images with form-data at the moment
passthroughBehavior: aws_apigateway_1.PassthroughBehavior.NEVER,
}), {
requestValidator: uploadBodyValidator,
requestModels: {
'multipart/form-data': uploadRequestModel,
},
});
// download image
const downloadHandler = new aws_lambda_nodejs_1.NodejsFunction(scope, 'DownloadHandler', {
entry: path_1.default.resolve(__dirname, '../handlers/entries/assets-downloader-handler.ts'),
environment: {
BUCKET_NAME: s3Bucket.bucketName,
ASSETS_PUBLIC_HOST: assetsPublicHost,
},
timeout: core_1.Duration.minutes(5),
runtime: aws_lambda_1.Runtime.NODEJS_12_X,
// sharp will need to load image in memory to be able to quickly manipulate it
memorySize: 1024,
bundling: Object.assign({}, getEnvSpecificHandlerConfig()),
});
// this handler also takes care of creating missing resolution asset, thus it needs read + write permissions
s3Bucket.grantReadWrite(downloadHandler);
const downloadResource = restApiResource.addResource('download');
const downloadValidator = new aws_apigateway_1.RequestValidator(scope, 'DownloadParamsValidator', {
restApi: restApiResource.api,
requestValidatorName: 'Download Params Validator',
validateRequestParameters: true,
});
downloadResource.addMethod('GET', new aws_apigateway_1.LambdaIntegration(downloadHandler), {
requestValidator: downloadValidator,
requestParameters: {
'method.request.querystring.key': true,
'method.request.querystring.resolution': false,
'method.request.querystring.size': false,
'method.request.querystring.position': false,
},
});
// get pre-signedPost url
const preSignedPostUrlHandler = new aws_lambda_nodejs_1.NodejsFunction(scope, 'PreSignedPostUrlHandler', {
entry: path_1.default.resolve(__dirname, '../handlers/entries/get-pre-signed-post-url.ts'),
environment: {
BUCKET_NAME: s3Bucket.bucketName,
},
runtime: aws_lambda_1.Runtime.NODEJS_12_X,
});
s3Bucket.grantWrite(preSignedPostUrlHandler);
const preSignedPostUrlResource = restApiResource.addResource('uploadUrl');
const UploadUrlValidator = new aws_apigateway_1.RequestValidator(scope, 'UploadUrlRequestValidator', {
restApi: restApiResource.api,
requestValidatorName: 'UploadUrl Request validator ',
validateRequestParameters: true,
});
preSignedPostUrlResource.addMethod('GET', new aws_apigateway_1.LambdaIntegration(preSignedPostUrlHandler), {
requestValidator: UploadUrlValidator,
requestParameters: {
'method.request.querystring.key': true,
'method.request.querystring.expires': false,
'method.request.querystring.max-size': false,
},
});
}
exports.addAssetsServerApiResource = addAssetsServerApiResource;
function getEnvSpecificHandlerConfig() {
if (process.env.NODE_ENV === 'test') {
return {
loader: { '.node': 'binary' },
forceDockerBundling: false,
};
}
else {
return {
// native binaries used by sharp are platform specific, when building for production env, always install it in docker
nodeModules: ['sharp'],
forceDockerBundling: true,
};
}
}
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkLWFzc2V0cy1zZXJ2ZXItYXBpLXJlc291cmNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvd2ViLWFwcGxpY2F0aW9uL2ZhY2FkZXMvYWRkLWFzc2V0cy1zZXJ2ZXItYXBpLXJlc291cmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OztJQUFBLDREQU9pQztJQUNqQyxrRUFBNkU7SUFNN0UsZ0RBQXdCO0lBQ3hCLHdDQUF5QztJQUN6QyxvREFBOEM7SUFFOUMsU0FBZ0IsMEJBQTBCLENBQ3hDLEtBQW1CLEVBQ25CLEVBQUUsZUFBZSxFQUFzQixFQUN2QyxFQUNFLFFBQVEsRUFDUixnQkFBZ0IsR0FDeUM7UUFFM0QsMEJBQTBCO1FBQzFCLE1BQU0sYUFBYSxHQUFHLElBQUksa0NBQWMsQ0FBQyxLQUFLLEVBQUUsZUFBZSxFQUFFO1lBQy9ELEtBQUssRUFBRSxjQUFJLENBQUMsT0FBTyxDQUNqQixTQUFTLEVBQ1QsZ0RBQWdELENBQ2pEO1lBQ0QsV0FBVyxFQUFFO2dCQUNYLFdBQVcsRUFBRSxRQUFRLENBQUMsVUFBVTthQUNqQztZQUNELE9BQU8sRUFBRSxlQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUM1QixPQUFPLEVBQUUsb0JBQU8sQ0FBQyxXQUFXO1NBQzdCLENBQUMsQ0FBQztRQUNILFFBQVEsQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLENBQUM7UUFFbkMsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLHNCQUFLLENBQUMsS0FBSyxFQUFFLGNBQWMsRUFBRTtZQUMxRCxPQUFPLEVBQUUsZUFBZSxDQUFDLEdBQUc7WUFDNUIsV0FBVyxFQUFFLGNBQWM7WUFDM0IsV0FBVyxFQUFFLHFCQUFxQjtZQUNsQyxTQUFTLEVBQUUsY0FBYztZQUN6QixNQUFNLEVBQUU7Z0JBQ04sTUFBTSxFQUFFLGtDQUFpQixDQUFDLE1BQU07Z0JBQ2hDLEtBQUssRUFBRSxlQUFl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QUFHLGVBQWUsQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFMUUsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLGlDQUFnQixDQUM3QyxLQUFLLEVBQ0wsMkJBQTJCLEVBQzNCO1lBQ0UsT0FBTyxFQUFFLGVBQWUsQ0FBQyxHQUFHO1lBQzVCLG9CQUFvQixFQUFFLCtCQUErQjtZQUNyRCx5QkFBeUIsRUFBRSxJQUFJO1NBQ2hDLENBQ0YsQ0FBQztRQUNGLHdCQUF3QixDQUFDLFNBQVMsQ0FDaEMsS0FBSyxFQUNMLElBQUksa0NBQWlCLENBQUMsdUJBQXVCLENBQUMsRUFDOUM7WUFDRSxnQkFBZ0IsRUFBRSxrQkFBa0I7WUFDcEMsaUJBQWlCLEVBQUU7Z0JBQ2pCLGdDQUFnQyxFQUFFLElBQUk7Z0JBQ3RDLG9DQUFvQyxFQUFFLEtBQUs7Z0JBQzNDLHFDQUFxQyxFQUFFLEtBQUs7YUFDN0M7U0FDRixDQUNGLENBQUM7SUFDSixDQUFDO0lBakpELGdFQWlKQztJQUVELFNBQVMsMkJBQTJCO1FBQ2xDLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEtBQUssTUFBTSxFQUFFO1lBQ25DLE9BQU87Z0JBQ0wsTUFBTSxFQUFFLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRTtnQkFDN0IsbUJBQW1CLEVBQUUsS0FBSzthQUMzQixDQUFDO1NBQ0g7YUFBTTtZQUNMLE9BQU87Z0JBQ0wscUhBQXFIO2dCQUNySCxXQUFXLEVBQUUsQ0FBQyxPQUFPLENBQUM7Z0JBQ3RCLG1CQUFtQixFQUFFLElBQUk7YUFDMUIsQ0FBQztTQUNIO0lBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEpzb25TY2hlbWFUeXBlLFxuICBKc29uU2NoZW1hVmVyc2lvbixcbiAgTGFtYmRhSW50ZWdyYXRpb24sXG4gIE1vZGVsLFxuICBQYXNzdGhyb3VnaEJlaGF2aW9yLFxuICBSZXF1ZXN0VmFsaWRhdG9yLFxufSBmcm9tICdAYXdzLWNkay9hd3MtYXBpZ2F0ZXdheSc7XG5pbXBvcnQgeyBCdW5kbGluZ09wdGlvbnMsIE5vZGVqc0Z1bmN0aW9uIH0gZnJvbSAnQGF3cy1jZGsvYXdzLWxhbWJkYS1ub2RlanMnO1xuaW1wb3J0IHtcbiAgQXNzZXRzU2VydmVyLFxuICBJQXNzZXRzU2VydmVyUHJvcHMsXG59IGZyb20gJy4uL2NvbnN0cnVjdHMvYXNzZXRzLXNlcnZlci5jb25zdHJ1Y3QnO1xuaW1wb3J0IHsgQnVja2V0LCBJQnVja2V0IH0gZnJvbSAnQGF3cy1jZGsvYXdzLXMzJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgRHVyYXRpb24gfSBmcm9tICdAYXdzLWNkay9jb3JlJztcbmltcG9ydCB7IFJ1bnRpbWUgfSBmcm9tICdAYXdzLWNkay9hd3MtbGFtYmRhJztcblxuZXhwb3J0IGZ1bmN0aW9uIGFkZEFzc2V0c1NlcnZlckFwaVJlc291cmNlKFxuICBzY29wZTogQXNzZXRzU2VydmVyLFxuICB7IHJlc3RBcGlSZXNvdXJjZSB9OiBJQXNzZXRzU2VydmVyUHJvcHMsXG4gIHtcbiAgICBzM0J1Y2tldCxcbiAgICBhc3NldHNQdWJsaWNIb3N0LFxuICB9OiB7IHMzQnVja2V0OiBCdWNrZXQgfCBJQnVja2V0OyBhc3NldHNQdWJsaWNIb3N0OiBzdHJpbmcgfVxuKTogdm9pZCB7XG4gIC8vIGFzc2V0cyB1cGxvYWRlciBoYW5kbGVyXG4gIGNvbnN0IHVwbG9hZEhhbmRsZXIgPSBuZXcgTm9kZWpzRnVuY3Rpb24oc2NvcGUsICdVcGxvYWRIYW5kbGVyJywge1xuICAgIGVudHJ5OiBwYXRoLnJlc29sdmUoXG4gICAgICBfX2Rpcm5hbWUsXG4gICAgICAnLi4vaGFuZGxlcnMvZW50cmllcy9hc3NldHMtdXBsb2FkZXItaGFuZGxlci50cydcbiAgICApLFxuICAgIGVudmlyb25tZW50OiB7XG4gICAgICBCVUNLRVRfTkFNRTogczNCdWNrZXQuYnVja2V0TmFtZSxcbiAgICB9LFxuICAgIHRpbWVvdXQ6IER1cmF0aW9uLm1pbnV0ZXMoNSksXG4gICAgcnVudGltZTogUnVudGltZS5OT0RFSlNfMTJfWCxcbiAgfSk7XG4gIHMzQnVja2V0LmdyYW50V3JpdGUodXBsb2FkSGFuZGxlcik7XG5cbiAgY29uc3QgdXBsb2FkUmVxdWVzdE1vZGVsID0gbmV3IE1vZGVsKHNjb3BlLCAnVXBsb2FkQXNzZXRzJywge1xuICAgIHJlc3RBcGk6IHJlc3RBcGlSZXNvdXJjZS5hcGksXG4gICAgZGVzY3JpcHRpb246ICdVcGxvYWQgZmlsZXMnLFxuICAgIGNvbnRlbnRUeXBlOiAnbXVsdGlwYXJ0L2Zvcm0tZGF0YScsXG4gICAgbW9kZWxOYW1lOiAnVXBsb2FkQXNzZXRzJyxcbiAgICBzY2hlbWE6IHtcbiAgICAgIHNjaGVtYTogSnNvblNjaGVtYVZlcnNpb24uRFJBRlQ3LFxuICAgICAgdGl0bGU6ICdVcGxvYWQgYXNzZXRzJyxcbiAgICAgIHR5cGU6IEpzb25TY2hlbWFUeXBlLk9CSkVDVCxcbiAgICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiB0cnVlLFxuICAgICAgcmVxdWlyZWQ6IFsnczNQcmVmaXgnXSxcbiAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgczNQcmVmaXg6IHtcbiAgICAgICAgICB0aXRsZTogJ0RpcmVjdG9yeSB0byB1cGxvYWQgZmlsZXMgdW5kZXInLFxuICAgICAgICAgIHR5cGU6IEpzb25TY2hlbWFUeXBlLlNUUklORyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSk7XG4gIGNvbnN0IHVwbG9hZFJlc291cmNlID0gcmVzdEFwaVJlc291cmNlLmFkZFJlc291cmNlKCd1cGxvYWQnKTtcbiAgY29uc3QgdXBsb2FkQm9keVZhbGlkYXRvciA9IG5ldyBSZXF1ZXN0VmFsaWRhdG9yKFxuICAgIHNjb3BlLFxuICAgICdVcGxvYWRCb2R5VmFsaWRhdG9yJyxcbiAgICB7XG4gICAgICByZXF1ZXN0VmFsaWRhdG9yTmFtZTogJ1VwbG9hZCBCb2R5IHZhbGlkYXRvcicsXG4gICAgICB2YWxpZGF0ZVJlcXVlc3RCb2R5OiB0cnVlLFxuICAgICAgcmVzdEFwaTogcmVzdEFwaVJlc291cmNlLmFwaSxcbiAgICB9XG4gICk7XG4gIHVwbG9hZFJlc291cmNlLmFkZE1ldGhvZChcbiAgICAnUE9TVCcsXG4gICAgbmV3IExhbWJkYUludGVncmF0aW9uKHVwbG9hZEhhbmRsZXIsIHtcbiAgICAgIC8vIG9ubHkgc3VwcG9ydHMgdXBsb2FkaW5nIGltYWdlcyB3aXRoIGZvcm0tZGF0YSBhdCB0aGUgbW9tZW50XG4gICAgICBwYXNzdGhyb3VnaEJlaGF2aW9yOiBQYXNzdGhyb3VnaEJlaGF2aW9yLk5FVkVSLFxuICAgIH0pLFxuICAgIHtcbiAgICAgIHJlcXVlc3RWYWxpZGF0b3I6IHVwbG9hZEJvZHlWYWxpZGF0b3IsXG4gICAgICByZXF1ZXN0TW9kZWxzOiB7XG4gICAgICAgICdtdWx0aXBhcnQvZm9ybS1kYXRhJzogdXBsb2FkUmVxdWVzdE1vZGVsLFxuICAgICAgfSxcbiAgICB9XG4gICk7XG5cbiAgLy8gZG93bmxvYWQgaW1hZ2VcbiAgY29uc3QgZG93bmxvYWRIYW5kbGVyID0gbmV3IE5vZGVqc0Z1bmN0aW9uKHNjb3BlLCAnRG93bmxvYWRIYW5kbGVyJywge1xuICAgIGVudHJ5OiBwYXRoLnJlc29sdmUoXG4gICAgICBfX2Rpcm5hbWUsXG4gICAgICAnLi4vaGFuZGxlcnMvZW50cmllcy9hc3NldHMtZG93bmxvYWRlci1oYW5kbGVyLnRzJ1xuICAgICksXG4gICAgZW52aXJvbm1lbnQ6IHtcbiAgICAgIEJVQ0tFVF9OQU1FOiBzM0J1Y2tldC5idWNrZXROYW1lLFxuICAgICAgQVNTRVRTX1BVQkxJQ19IT1NUOiBhc3NldHNQdWJsaWNIb3N0LFxuICAgIH0sXG4gICAgdGltZW91dDogRHVyYXRpb24ubWludXRlcyg1KSxcbiAgICBydW50aW1lOiBSdW50aW1lLk5PREVKU18xMl9YLFxuICAgIC8vIHNoYXJwIHdpbGwgbmVlZCB0byBsb2FkIGltYWdlIGluIG1lbW9yeSB0byBiZSBhYmxlIHRvIHF1aWNrbHkgbWFuaXB1bGF0ZSBpdFxuICAgIG1lbW9yeVNpemU6IDEwMjQsXG4gICAgYnVuZGxpbmc6IHtcbiAgICAgIC4uLmdldEVudlNwZWNpZmljSGFuZGxlckNvbmZpZygpLFxuICAgIH0sXG4gIH0pO1xuICAvLyB0aGlzIGhhbmRsZXIgYWxzbyB0YWtlcyBjYXJlIG9mIGNyZWF0aW5nIG1pc3NpbmcgcmVzb2x1dGlvbiBhc3NldCwgdGh1cyBpdCBuZWVkcyByZWFkICsgd3JpdGUgcGVybWlzc2lvbnNcbiAgczNCdWNrZXQuZ3JhbnRSZWFkV3JpdGUoZG93bmxvYWRIYW5kbGVyKTtcbiAgY29uc3QgZG93bmxvYWRSZXNvdXJjZSA9IHJlc3RBcGlSZXNvdXJjZS5hZGRSZXNvdXJjZSgnZG93bmxvYWQnKTtcbiAgY29uc3QgZG93bmxvYWRWYWxpZGF0b3IgPSBuZXcgUmVxdWVzdFZhbGlkYXRvcihcbiAgICBzY29wZSxcbiAgICAnRG93bmxvYWRQYXJhbXNWYWxpZGF0b3InLFxuICAgIHtcbiAgICAgIHJlc3RBcGk6IHJlc3RBcGlSZXNvdXJjZS5hcGksXG4gICAgICByZXF1ZXN0VmFsaWRhdG9yTmFtZTogJ0Rvd25sb2FkIFBhcmFtcyBWYWxpZGF0b3InLFxuICAgICAgdmFsaWRhdGVSZXF1ZXN0UGFyYW1ldGVyczogdHJ1ZSxcbiAgICB9XG4gICk7XG5cbiAgZG93bmxvYWRSZXNvdXJjZS5hZGRNZXRob2QoJ0dFVCcsIG5ldyBMYW1iZGFJbnRlZ3JhdGlvbihkb3dubG9hZEhhbmRsZXIpLCB7XG4gICAgcmVxdWVzdFZhbGlkYXRvcjogZG93bmxvYWRWYWxpZGF0b3IsXG4gICAgcmVxdWVzdFBhcmFtZXRlcnM6IHtcbiAgICAgICdtZXRob2QucmVxdWVzdC5xdWVyeXN0cmluZy5rZXknOiB0cnVlLFxuICAgICAgJ21ldGhvZC5yZXF1ZXN0LnF1ZXJ5c3RyaW5nLnJlc29sdXRpb24nOiBmYWxzZSxcbiAgICAgICdtZXRob2QucmVxdWVzdC5xdWVyeXN0cmluZy5zaXplJzogZmFsc2UsXG4gICAgICAnbWV0aG9kLnJlcXVlc3QucXVlcnlzdHJpbmcucG9zaXRpb24nOiBmYWxzZSxcbiAgICB9LFxuICB9KTtcblxuICAvLyBnZXQgcHJlLXNpZ25lZFBvc3QgdXJsXG4gIGNvbnN0IHByZVNpZ25lZFBvc3RVcmxIYW5kbGVyID0gbmV3IE5vZGVqc0Z1bmN0aW9uKFxuICAgIHNjb3BlLFxuICAgICdQcmVTaWduZWRQb3N0VXJsSGFuZGxlcicsXG4gICAge1xuICAgICAgZW50cnk6IHBhdGgucmVzb2x2ZShcbiAgICAgICAgX19kaXJuYW1lLFxuICAgICAgICAnLi4vaGFuZGxlcnMvZW50cmllcy9nZXQtcHJlLXNpZ25lZC1wb3N0LXVybC50cydcbiAgICAgICksXG4gICAgICBlbnZpcm9ubWVudDoge1xuICAgICAgICBCVUNLRVRfTkFNRTogczNCdWNrZXQuYnVja2V0TmFtZSxcbiAgICAgIH0sXG4gICAgICBydW50aW1lOiBSdW50aW1lLk5PREVKU18xMl9YLFxuICAgIH1cbiAgKTtcbiAgczNCdWNrZXQuZ3JhbnRXcml0ZShwcmVTaWduZWRQb3N0VXJsSGFuZGxlcik7XG4gIGNvbnN0IHByZVNpZ25lZFBvc3RVcmxSZXNvdXJjZSA9IHJlc3RBcGlSZXNvdXJjZS5hZGRSZXNvdXJjZSgndXBsb2FkVXJsJyk7XG5cbiAgY29uc3QgVXBsb2FkVXJsVmFsaWRhdG9yID0gbmV3IFJlcXVlc3RWYWxpZGF0b3IoXG4gICAgc2NvcGUsXG4gICAgJ1VwbG9hZFVybFJlcXVlc3RWYWxpZGF0b3InLFxuICAgIHtcbiAgICAgIHJlc3RBcGk6IHJlc3RBcGlSZXNvdXJjZS5hcGksXG4gICAgICByZXF1ZXN0VmFsaWRhdG9yTmFtZTogJ1VwbG9hZFVybCBSZXF1ZXN0IHZhbGlkYXRvciAgJyxcbiAgICAgIHZhbGlkYXRlUmVxdWVzdFBhcmFtZXRlcnM6IHRydWUsXG4gICAgfVxuICApO1xuICBwcmVTaWduZWRQb3N0VXJsUmVzb3VyY2UuYWRkTWV0aG9kKFxuICAgICdHRVQnLFxuICAgIG5ldyBMYW1iZGFJbnRlZ3JhdGlvbihwcmVTaWduZWRQb3N0VXJsSGFuZGxlciksXG4gICAge1xuICAgICAgcmVxdWVzdFZhbGlkYXRvcjogVXBsb2FkVXJsVmFsaWRhdG9yLFxuICAgICAgcmVxdWVzdFBhcmFtZXRlcnM6IHtcbiAgICAgICAgJ21ldGhvZC5yZXF1ZXN0LnF1ZXJ5c3RyaW5nLmtleSc6IHRydWUsXG4gICAgICAgICdtZXRob2QucmVxdWVzdC5xdWVyeXN0cmluZy5leHBpcmVzJzogZmFsc2UsXG4gICAgICAgICdtZXRob2QucmVxdWVzdC5xdWVyeXN0cmluZy5tYXgtc2l6ZSc6IGZhbHNlLFxuICAgICAgfSxcbiAgICB9XG4gICk7XG59XG5cbmZ1bmN0aW9uIGdldEVudlNwZWNpZmljSGFuZGxlckNvbmZpZygpOiBCdW5kbGluZ09wdGlvbnMge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICd0ZXN0Jykge1xuICAgIHJldHVybiB7XG4gICAgICBsb2FkZXI6IHsgJy5ub2RlJzogJ2JpbmFyeScgfSxcbiAgICAgIGZvcmNlRG9ja2VyQnVuZGxpbmc6IGZhbHNlLFxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC8vIG5hdGl2ZSBiaW5hcmllcyB1c2VkIGJ5IHNoYXJwIGFyZSBwbGF0Zm9ybSBzcGVjaWZpYywgd2hlbiBidWlsZGluZyBmb3IgcHJvZHVjdGlvbiBlbnYsIGFsd2F5cyBpbnN0YWxsIGl0IGluIGRvY2tlclxuICAgICAgbm9kZU1vZHVsZXM6IFsnc2hhcnAnXSxcbiAgICAgIGZvcmNlRG9ja2VyQnVuZGxpbmc6IHRydWUsXG4gICAgfTtcbiAgfVxufVxuIl19