UNPKG

23.2 kBJavaScriptView Raw
1"use strict";
2var _a;
3Object.defineProperty(exports, "__esModule", { value: true });
4exports.FirelensLogRouter = exports.obtainDefaultFluentBitECRImage = exports.FirelensConfigFileType = exports.FirelensLogRouterType = void 0;
5const jsiiDeprecationWarnings = require("../.warnings.jsii.js");
6const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
7const iam = require("@aws-cdk/aws-iam");
8const ssm = require("@aws-cdk/aws-ssm");
9const cdk = require("@aws-cdk/core");
10const container_definition_1 = require("./container-definition");
11const container_image_1 = require("./container-image");
12/**
13 * Firelens log router type, fluentbit or fluentd.
14 * https://docs.aws.amazon.com/AmazonECS/latest/developerguide/using_firelens.html
15 */
16var FirelensLogRouterType;
17(function (FirelensLogRouterType) {
18 /**
19 * fluentbit
20 */
21 FirelensLogRouterType["FLUENTBIT"] = "fluentbit";
22 /**
23 * fluentd
24 */
25 FirelensLogRouterType["FLUENTD"] = "fluentd";
26})(FirelensLogRouterType = exports.FirelensLogRouterType || (exports.FirelensLogRouterType = {}));
27/**
28 * Firelens configuration file type, s3 or file path.
29 * https://docs.aws.amazon.com/AmazonECS/latest/developerguide/using_firelens.html#firelens-taskdef-customconfig
30 */
31var FirelensConfigFileType;
32(function (FirelensConfigFileType) {
33 /**
34 * s3
35 */
36 FirelensConfigFileType["S3"] = "s3";
37 /**
38 * fluentd
39 */
40 FirelensConfigFileType["FILE"] = "file";
41})(FirelensConfigFileType = exports.FirelensConfigFileType || (exports.FirelensConfigFileType = {}));
42/**
43 * Render to CfnTaskDefinition.FirelensConfigurationProperty from FirelensConfig
44 */
45function renderFirelensConfig(firelensConfig) {
46 if (!firelensConfig.options) {
47 return { type: firelensConfig.type };
48 }
49 else {
50 // firelensConfig.options.configFileType has been filled with s3 or file type in constructor.
51 return {
52 type: firelensConfig.type,
53 options: {
54 'enable-ecs-log-metadata': firelensConfig.options.enableECSLogMetadata ? 'true' : 'false',
55 'config-file-type': firelensConfig.options.configFileType,
56 'config-file-value': firelensConfig.options.configFileValue,
57 },
58 };
59 }
60}
61/**
62 * SSM parameters for latest fluent bit docker image in ECR
63 * https://github.com/aws/aws-for-fluent-bit#using-ssm-to-find-available-versions
64 */
65const fluentBitImageSSMPath = '/aws/service/aws-for-fluent-bit';
66/**
67 * Obtain Fluent Bit image in Amazon ECR and setup corresponding IAM permissions.
68 * ECR image pull permissions will be granted in task execution role.
69 * Cloudwatch logs, Kinesis data stream or firehose permissions will be grant by check options in logDriverConfig.
70 * https://docs.aws.amazon.com/AmazonECS/latest/developerguide/using_firelens.html#firelens-using-fluentbit
71 */
72function obtainDefaultFluentBitECRImage(task, logDriverConfig, imageTag) {
73 // grant ECR image pull permissions to executor role
74 task.addToExecutionRolePolicy(new iam.PolicyStatement({
75 actions: [
76 'ecr:GetAuthorizationToken',
77 'ecr:BatchCheckLayerAvailability',
78 'ecr:GetDownloadUrlForLayer',
79 'ecr:BatchGetImage',
80 ],
81 resources: ['*'],
82 }));
83 // grant cloudwatch or firehose permissions to task role
84 const logName = logDriverConfig && logDriverConfig.logDriver === 'awsfirelens'
85 && logDriverConfig.options && logDriverConfig.options.Name;
86 if (logName === 'cloudwatch') {
87 task.addToTaskRolePolicy(new iam.PolicyStatement({
88 actions: [
89 'logs:CreateLogGroup',
90 'logs:CreateLogStream',
91 'logs:DescribeLogStreams',
92 'logs:PutLogEvents',
93 ],
94 resources: ['*'],
95 }));
96 }
97 else if (logName === 'firehose') {
98 task.addToTaskRolePolicy(new iam.PolicyStatement({
99 actions: [
100 'firehose:PutRecordBatch',
101 ],
102 resources: ['*'],
103 }));
104 }
105 else if (logName === 'kinesis') {
106 task.addToTaskRolePolicy(new iam.PolicyStatement({
107 actions: [
108 'kinesis:PutRecords',
109 ],
110 resources: ['*'],
111 }));
112 }
113 const fluentBitImageTag = imageTag || 'latest';
114 const fluentBitImage = `${fluentBitImageSSMPath}/${fluentBitImageTag}`;
115 // Not use ContainerImage.fromEcrRepository since it's not support parsing ECR repo URI,
116 // use repo ARN might result in complex Fn:: functions in cloudformation template.
117 return container_image_1.ContainerImage.fromRegistry(ssm.StringParameter.valueForStringParameter(task, fluentBitImage));
118}
119exports.obtainDefaultFluentBitECRImage = obtainDefaultFluentBitECRImage;
120/**
121 * Firelens log router
122 */
123class FirelensLogRouter extends container_definition_1.ContainerDefinition {
124 /**
125 * Constructs a new instance of the FirelensLogRouter class.
126 */
127 constructor(scope, id, props) {
128 super(scope, id, props);
129 try {
130 jsiiDeprecationWarnings._aws_cdk_aws_ecs_FirelensLogRouterProps(props);
131 }
132 catch (error) {
133 if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
134 Error.captureStackTrace(error, this.constructor);
135 }
136 throw error;
137 }
138 const options = props.firelensConfig.options;
139 if (options) {
140 const enableECSLogMetadata = options.enableECSLogMetadata || options.enableECSLogMetadata === undefined;
141 const configFileType = (options.configFileType === undefined || options.configFileType === FirelensConfigFileType.S3) &&
142 (cdk.Token.isUnresolved(options.configFileValue) || /arn:aws[a-zA-Z-]*:s3:::.+/.test(options.configFileValue))
143 ? FirelensConfigFileType.S3 : FirelensConfigFileType.FILE;
144 this.firelensConfig = {
145 type: props.firelensConfig.type,
146 options: {
147 enableECSLogMetadata,
148 configFileType,
149 configFileValue: options.configFileValue,
150 },
151 };
152 // grant s3 access permissions
153 if (configFileType === FirelensConfigFileType.S3) {
154 props.taskDefinition.addToExecutionRolePolicy(new iam.PolicyStatement({
155 actions: [
156 's3:GetObject',
157 ],
158 resources: [options.configFileValue],
159 }));
160 props.taskDefinition.addToExecutionRolePolicy(new iam.PolicyStatement({
161 actions: [
162 's3:GetBucketLocation',
163 ],
164 resources: [options.configFileValue.split('/')[0]],
165 }));
166 }
167 }
168 else {
169 this.firelensConfig = props.firelensConfig;
170 }
171 }
172 /**
173 * Render this container definition to a CloudFormation object
174 */
175 renderContainerDefinition(_taskDefinition) {
176 try {
177 jsiiDeprecationWarnings._aws_cdk_aws_ecs_TaskDefinition(_taskDefinition);
178 }
179 catch (error) {
180 if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
181 Error.captureStackTrace(error, this.renderContainerDefinition);
182 }
183 throw error;
184 }
185 return {
186 ...(super.renderContainerDefinition()),
187 firelensConfiguration: this.firelensConfig && renderFirelensConfig(this.firelensConfig),
188 };
189 }
190}
191exports.FirelensLogRouter = FirelensLogRouter;
192_a = JSII_RTTI_SYMBOL_1;
193FirelensLogRouter[_a] = { fqn: "@aws-cdk/aws-ecs.FirelensLogRouter", version: "1.156.1" };
194//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlyZWxlbnMtbG9nLXJvdXRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImZpcmVsZW5zLWxvZy1yb3V0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsd0NBQXdDO0FBQ3hDLHdDQUF3QztBQUN4QyxxQ0FBcUM7QUFHckMsaUVBQW1IO0FBQ25ILHVEQUFtRDtBQUluRDs7O0dBR0c7QUFDSCxJQUFZLHFCQVVYO0FBVkQsV0FBWSxxQkFBcUI7SUFDL0I7O09BRUc7SUFDSCxnREFBdUIsQ0FBQTtJQUV2Qjs7T0FFRztJQUNILDRDQUFtQixDQUFBO0FBQ3JCLENBQUMsRUFWVyxxQkFBcUIsR0FBckIsNkJBQXFCLEtBQXJCLDZCQUFxQixRQVVoQztBQUVEOzs7R0FHRztBQUNILElBQVksc0JBVVg7QUFWRCxXQUFZLHNCQUFzQjtJQUNoQzs7T0FFRztJQUNILG1DQUFTLENBQUE7SUFFVDs7T0FFRztJQUNILHVDQUFhLENBQUE7QUFDZixDQUFDLEVBVlcsc0JBQXNCLEdBQXRCLDhCQUFzQixLQUF0Qiw4QkFBc0IsUUFVakM7QUFpRUQ7O0dBRUc7QUFDSCxTQUFTLG9CQUFvQixDQUFDLGNBQThCO0lBQzFELElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFO1FBQzNCLE9BQU8sRUFBRSxJQUFJLEVBQUUsY0FBYyxDQUFDLElBQUksRUFBRSxDQUFDO0tBQ3RDO1NBQU07UUFDTCw2RkFBNkY7UUFDN0YsT0FBTztZQUNMLElBQUksRUFBRSxjQUFjLENBQUMsSUFBSTtZQUN6QixPQUFPLEVBQUU7Z0JBQ1AseUJBQXlCLEVBQUUsY0FBYyxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPO2dCQUN6RixrQkFBa0IsRUFBRSxjQUFjLENBQUMsT0FBTyxDQUFDLGNBQWU7Z0JBQzFELG1CQUFtQixFQUFFLGNBQWMsQ0FBQyxPQUFPLENBQUMsZUFBZTthQUM1RDtTQUNGLENBQUM7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YXMgaWFtIGZyb20gJ0Bhd3MtY2RrL2F3cy1pYW0nO1xuaW1wb3J0ICogYXMgc3NtIGZyb20gJ0Bhd3MtY2RrL2F3cy1zc20nO1xuaW1wb3J0ICogYXMgY2RrIGZyb20gJ0Bhd3MtY2RrL2NvcmUnO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBUYXNrRGVmaW5pdGlvbiB9IGZyb20gJy4vYmFzZS90YXNrLWRlZmluaXRpb24nO1xuaW1wb3J0IHsgQ29udGFpbmVyRGVmaW5pdGlvbiwgQ29udGFpbmVyRGVmaW5pdGlvbk9wdGlvbnMsIENvbnRhaW5lckRlZmluaXRpb25Qcm9wcyB9IGZyb20gJy4vY29udGFpbmVyLWRlZmluaXRpb24nO1xuaW1wb3J0IHsgQ29udGFpbmVySW1hZ2UgfSBmcm9tICcuL2NvbnRhaW5lci1pbWFnZSc7XG5pbXBvcnQgeyBDZm5UYXNrRGVmaW5pdGlvbiB9IGZyb20gJy4vZWNzLmdlbmVyYXRlZCc7XG5pbXBvcnQgeyBMb2dEcml2ZXJDb25maWcgfSBmcm9tICcuL2xvZy1kcml2ZXJzL2xvZy1kcml2ZXInO1xuXG4vKipcbiAqIEZpcmVsZW5zIGxvZyByb3V0ZXIgdHlwZSwgZmx1ZW50Yml0IG9yIGZsdWVudGQuXG4gKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS91c2luZ19maXJlbGVucy5odG1sXG4gKi9cbmV4cG9ydCBlbnVtIEZpcmVsZW5zTG9nUm91dGVyVHlwZSB7XG4gIC8qKlxuICAgKiBmbHVlbnRiaXRcbiAgICovXG4gIEZMVUVOVEJJVCA9ICdmbHVlbnRiaXQnLFxuXG4gIC8qKlxuICAgKiBmbHVlbnRkXG4gICAqL1xuICBGTFVFTlREID0gJ2ZsdWVudGQnLFxufVxuXG4vKipcbiAqIEZpcmVsZW5zIGNvbmZpZ3VyYXRpb24gZmlsZSB0eXBlLCBzMyBvciBmaWxlIHBhdGguXG4gKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS91c2luZ19maXJlbGVucy5odG1sI2ZpcmVsZW5zLXRhc2tkZWYtY3VzdG9tY29uZmlnXG4gKi9cbmV4cG9ydCBlbnVtIEZpcmVsZW5zQ29uZmlnRmlsZVR5cGUge1xuICAvKipcbiAgICogczNcbiAgICovXG4gIFMzID0gJ3MzJyxcblxuICAvKipcbiAgICogZmx1ZW50ZFxuICAgKi9cbiAgRklMRSA9ICdmaWxlJyxcbn1cblxuLyoqXG4gKiBUaGUgb3B0aW9ucyBmb3IgZmlyZWxlbnMgbG9nIHJvdXRlclxuICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvdXNpbmdfZmlyZWxlbnMuaHRtbCNmaXJlbGVucy10YXNrZGVmLWN1c3RvbWNvbmZpZ1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEZpcmVsZW5zT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBCeSBkZWZhdWx0LCBBbWF6b24gRUNTIGFkZHMgYWRkaXRpb25hbCBmaWVsZHMgaW4geW91ciBsb2cgZW50cmllcyB0aGF0IGhlbHAgaWRlbnRpZnkgdGhlIHNvdXJjZSBvZiB0aGUgbG9ncy5cbiAgICogWW91IGNhbiBkaXNhYmxlIHRoaXMgYWN0aW9uIGJ5IHNldHRpbmcgZW5hYmxlLWVjcy1sb2ctbWV0YWRhdGEgdG8gZmFsc2UuXG4gICAqIEBkZWZhdWx0IC0gdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlRUNTTG9nTWV0YWRhdGE/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBDdXN0b20gY29uZmlndXJhdGlvbiBmaWxlLCBzMyBvciBmaWxlXG4gICAqIEBkZWZhdWx0IC0gZGV0ZXJtaW5lZCBieSBjaGVja2luZyBjb25maWdGaWxlVmFsdWUgd2l0aCBTMyBBUk4uXG4gICAqL1xuICByZWFkb25seSBjb25maWdGaWxlVHlwZT86IEZpcmVsZW5zQ29uZmlnRmlsZVR5cGU7XG5cbiAgLyoqXG4gICAqIEN1c3RvbSBjb25maWd1cmF0aW9uIGZpbGUsIFMzIEFSTiBvciBhIGZpbGUgcGF0aFxuICAgKi9cbiAgcmVhZG9ubHkgY29uZmlnRmlsZVZhbHVlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogRmlyZWxlbnMgQ29uZmlndXJhdGlvblxuICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvdXNpbmdfZmlyZWxlbnMuaHRtbCNmaXJlbGVucy10YXNrZGVmXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmlyZWxlbnNDb25maWcge1xuXG4gIC8qKlxuICAgKiBUaGUgbG9nIHJvdXRlciB0byB1c2VcbiAgICogQGRlZmF1bHQgLSBmbHVlbnRiaXRcbiAgICovXG4gIHJlYWRvbmx5IHR5cGU6IEZpcmVsZW5zTG9nUm91dGVyVHlwZTtcblxuICAvKipcbiAgICogRmlyZWxlbnMgb3B0aW9uc1xuICAgKiBAZGVmYXVsdCAtIG5vIGFkZGl0aW9uYWwgb3B0aW9uc1xuICAgKi9cbiAgcmVhZG9ubHkgb3B0aW9ucz86IEZpcmVsZW5zT3B0aW9ucztcbn1cblxuLyoqXG4gKiBUaGUgcHJvcGVydGllcyBpbiBhIGZpcmVsZW5zIGxvZyByb3V0ZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmlyZWxlbnNMb2dSb3V0ZXJQcm9wcyBleHRlbmRzIENvbnRhaW5lckRlZmluaXRpb25Qcm9wcyB7XG4gIC8qKlxuICAgKiBGaXJlbGVucyBjb25maWd1cmF0aW9uXG4gICAqL1xuICByZWFkb25seSBmaXJlbGVuc0NvbmZpZzogRmlyZWxlbnNDb25maWc7XG59XG5cbi8qKlxuICogVGhlIG9wdGlvbnMgZm9yIGNyZWF0aW5nIGEgZmlyZWxlbnMgbG9nIHJvdXRlci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGaXJlbGVuc0xvZ1JvdXRlckRlZmluaXRpb25PcHRpb25zIGV4dGVuZHMgQ29udGFpbmVyRGVmaW5pdGlvbk9wdGlvbnMge1xuICAvKipcbiAgICogRmlyZWxlbnMgY29uZmlndXJhdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgZmlyZWxlbnNDb25maWc6IEZpcmVsZW5zQ29uZmlnO1xufVxuXG4vKipcbiAqIFJlbmRlciB0byBDZm5UYXNrRGVmaW5pdGlvbi5GaXJlbGVuc0NvbmZpZ3VyYXRpb25Qcm9wZXJ0eSBmcm9tIEZpcmVsZW5zQ29uZmlnXG4gKi9cbmZ1bmN0aW9uIHJlbmRlckZpcmVsZW5zQ29uZmlnKGZpcmVsZW5zQ29uZmlnOiBGaXJlbGVuc0NvbmZpZyk6IENmblRhc2tEZWZpbml0aW9uLkZpcmVsZW5zQ29uZmlndXJhdGlvblByb3BlcnR5IHtcbiAgaWYgKCFmaXJlbGVuc0NvbmZpZy5vcHRpb25zKSB7XG4gICAgcmV0dXJuIHsgdHlwZTogZmlyZWxlbnNDb25maWcudHlwZSB9O1xuICB9IGVsc2Uge1xuICAgIC8vIGZpcmVsZW5zQ29uZmlnLm9wdGlvbnMuY29uZmlnRmlsZVR5cGUgaGFzIGJlZW4gZmlsbGVkIHdpdGggczMgb3IgZmlsZSB0eXBlIGluIGNvbnN0cnVjdG9yLlxuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBmaXJlbGVuc0NvbmZpZy50eXBlLFxuICAgICAgb3B0aW9uczoge1xuICAgICAgICAnZW5hYmxlLWVjcy1sb2ctbWV0YWRhdGEnOiBmaXJlbGVuc0NvbmZpZy5vcHRpb25zLmVuYWJsZUVDU0xvZ01ldGFkYXRhID8gJ3RydWUnIDogJ2ZhbHNlJyxcbiAgICAgICAgJ2NvbmZpZy1maWxlLXR5cGUnOiBmaXJlbGVuc0NvbmZpZy5vcHRpb25zLmNvbmZpZ0ZpbGVUeXBlISxcbiAgICAgICAgJ2NvbmZpZy1maWxlLXZhbHVlJzogZmlyZWxlbnNDb25maWcub3B0aW9ucy5jb25maWdGaWxlVmFsdWUsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxufVxuXG4vKipcbiAqIFNTTSBwYXJhbWV0ZXJzIGZvciBsYXRlc3QgZmx1ZW50IGJpdCBkb2NrZXIgaW1hZ2UgaW4gRUNSXG4gKiBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1mb3ItZmx1ZW50LWJpdCN1c2luZy1zc20tdG8tZmluZC1hdmFpbGFibGUtdmVyc2lvbnNcbiAqL1xuY29uc3QgZmx1ZW50Qml0SW1hZ2VTU01QYXRoID0gJy9hd3Mvc2VydmljZS9hd3MtZm9yLWZsdWVudC1iaXQnO1xuXG4vKipcbiAqIE9idGFpbiBGbHVlbnQgQml0IGltYWdlIGluIEFtYXpvbiBFQ1IgYW5kIHNldHVwIGNvcnJlc3BvbmRpbmcgSUFNIHBlcm1pc3Npb25zLlxuICogRUNSIGltYWdlIHB1bGwgcGVybWlzc2lvbnMgd2lsbCBiZSBncmFudGVkIGluIHRhc2sgZXhlY3V0aW9uIHJvbGUuXG4gKiBDbG91ZHdhdGNoIGxvZ3MsIEtpbmVzaXMgZGF0YSBzdHJlYW0gb3IgZmlyZWhvc2UgcGVybWlzc2lvbnMgd2lsbCBiZSBncmFudCBieSBjaGVjayBvcHRpb25zIGluIGxvZ0RyaXZlckNvbmZpZy5cbiAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL3VzaW5nX2ZpcmVsZW5zLmh0bWwjZmlyZWxlbnMtdXNpbmctZmx1ZW50Yml0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvYnRhaW5EZWZhdWx0Rmx1ZW50Qml0RUNSSW1hZ2UodGFzazogVGFza0RlZmluaXRpb24sIGxvZ0RyaXZlckNvbmZpZz86IExvZ0RyaXZlckNvbmZpZywgaW1hZ2VUYWc/OiBzdHJpbmcpOiBDb250YWluZXJJbWFnZSB7XG4gIC8vIGdyYW50IEVDUiBpbWFnZSBwdWxsIHBlcm1pc3Npb25zIHRvIGV4ZWN1dG9yIHJvbGVcbiAgdGFzay5hZGRUb0V4ZWN1dGlvblJvbGVQb2xpY3kobmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgIGFjdGlvbnM6IFtcbiAgICAgICdlY3I6R2V0QXV0aG9yaXphdGlvblRva2VuJyxcbiAgICAgICdlY3I6QmF0Y2hDaGVja0xheWVyQXZhaWxhYmlsaXR5JyxcbiAgICAgICdlY3I6R2V0RG93bmxvYWRVcmxGb3JMYXllcicsXG4gICAgICAnZWNyOkJhdGNoR2V0SW1hZ2UnLFxuICAgIF0sXG4gICAgcmVzb3VyY2VzOiBbJyonXSxcbiAgfSkpO1xuXG4gIC8vIGdyYW50IGNsb3Vkd2F0Y2ggb3IgZmlyZWhvc2UgcGVybWlzc2lvbnMgdG8gdGFzayByb2xlXG4gIGNvbnN0IGxvZ05hbWUgPSBsb2dEcml2ZXJDb25maWcgJiYgbG9nRHJpdmVyQ29uZmlnLmxvZ0RyaXZlciA9PT0gJ2F3c2ZpcmVsZW5zJ1xuICAgICYmIGxvZ0RyaXZlckNvbmZpZy5vcHRpb25zICYmIGxvZ0RyaXZlckNvbmZpZy5vcHRpb25zLk5hbWU7XG4gIGlmIChsb2dOYW1lID09PSAnY2xvdWR3YXRjaCcpIHtcbiAgICB0YXNrLmFkZFRvVGFza1JvbGVQb2xpY3kobmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgYWN0aW9uczogW1xuICAgICAgICAnbG9nczpDcmVhdGVMb2dHcm91cCcsXG4gICAgICAgICdsb2dzOkNyZWF0ZUxvZ1N0cmVhbScsXG4gICAgICAgICdsb2dzOkRlc2NyaWJlTG9nU3RyZWFtcycsXG4gICAgICAgICdsb2dzOlB1dExvZ0V2ZW50cycsXG4gICAgICBdLFxuICAgICAgcmVzb3VyY2VzOiBbJyonXSxcbiAgICB9KSk7XG4gIH0gZWxzZSBpZiAobG9nTmFtZSA9PT0gJ2ZpcmVob3NlJykge1xuICAgIHRhc2suYWRkVG9UYXNrUm9sZVBvbGljeShuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICBhY3Rpb25zOiBbXG4gICAgICAgICdmaXJlaG9zZTpQdXRSZWNvcmRCYXRjaCcsXG4gICAgICBdLFxuICAgICAgcmVzb3VyY2VzOiBbJyonXSxcbiAgICB9KSk7XG4gIH0gZWxzZSBpZiAobG9nTmFtZSA9PT0gJ2tpbmVzaXMnKSB7XG4gICAgdGFzay5hZGRUb1Rhc2tSb2xlUG9saWN5KG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgJ2tpbmVzaXM6UHV0UmVjb3JkcycsXG4gICAgICBdLFxuICAgICAgcmVzb3VyY2VzOiBbJyonXSxcbiAgICB9KSk7XG4gIH1cblxuICBjb25zdCBmbHVlbnRCaXRJbWFnZVRhZyA9IGltYWdlVGFnIHx8ICdsYXRlc3QnO1xuICBjb25zdCBmbHVlbnRCaXRJbWFnZSA9IGAke2ZsdWVudEJpdEltYWdlU1NNUGF0aH0vJHtmbHVlbnRCaXRJbWFnZVRhZ31gO1xuXG4gIC8vIE5vdCB1c2UgQ29udGFpbmVySW1hZ2UuZnJvbUVjclJlcG9zaXRvcnkgc2luY2UgaXQncyBub3Qgc3VwcG9ydCBwYXJzaW5nIEVDUiByZXBvIFVSSSxcbiAgLy8gdXNlIHJlcG8gQVJOIG1pZ2h0IHJlc3VsdCBpbiBjb21wbGV4IEZuOjogZnVuY3Rpb25zIGluIGNsb3VkZm9ybWF0aW9uIHRlbXBsYXRlLlxuICByZXR1cm4gQ29udGFpbmVySW1hZ2UuZnJvbVJlZ2lzdHJ5KHNzbS5TdHJpbmdQYXJhbWV0ZXIudmFsdWVGb3JTdHJpbmdQYXJhbWV0ZXIodGFzaywgZmx1ZW50Qml0SW1hZ2UpKTtcbn1cblxuLyoqXG4gKiBGaXJlbGVucyBsb2cgcm91dGVyXG4gKi9cbmV4cG9ydCBjbGFzcyBGaXJlbGVuc0xvZ1JvdXRlciBleHRlbmRzIENvbnRhaW5lckRlZmluaXRpb24ge1xuXG4gIC8qKlxuICAgKiBGaXJlbGVucyBjb25maWd1cmF0aW9uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZmlyZWxlbnNDb25maWc6IEZpcmVsZW5zQ29uZmlnO1xuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBGaXJlbGVuc0xvZ1JvdXRlciBjbGFzcy5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBGaXJlbGVuc0xvZ1JvdXRlclByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCBwcm9wcyk7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHByb3BzLmZpcmVsZW5zQ29uZmlnLm9wdGlvbnM7XG4gICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IGVuYWJsZUVDU0xvZ01ldGFkYXRhID0gb3B0aW9ucy5lbmFibGVFQ1NMb2dNZXRhZGF0YSB8fCBvcHRpb25zLmVuYWJsZUVDU0xvZ01ldGFkYXRhID09PSB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBjb25maWdGaWxlVHlwZSA9IChvcHRpb25zLmNvbmZpZ0ZpbGVUeXBlID09PSB1bmRlZmluZWQgfHwgb3B0aW9ucy5jb25maWdGaWxlVHlwZSA9PT0gRmlyZWxlbnNDb25maWdGaWxlVHlwZS5TMykgJiZcbiAgICAgICAgKGNkay5Ub2tlbi5pc1VucmVzb2x2ZWQob3B0aW9ucy5jb25maWdGaWxlVmFsdWUpIHx8IC9hcm46YXdzW2EtekEtWi1dKjpzMzo6Oi4rLy50ZXN0KG9wdGlvbnMuY29uZmlnRmlsZVZhbHVlKSlcbiAgICAgICAgPyBGaXJlbGVuc0NvbmZpZ0ZpbGVUeXBlLlMzIDogRmlyZWxlbnNDb25maWdGaWxlVHlwZS5GSUxFO1xuICAgICAgdGhpcy5maXJlbGVuc0NvbmZpZyA9IHtcbiAgICAgICAgdHlwZTogcHJvcHMuZmlyZWxlbnNDb25maWcudHlwZSxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIGVuYWJsZUVDU0xvZ01ldGFkYXRhLFxuICAgICAgICAgIGNvbmZpZ0ZpbGVUeXBlLFxuICAgICAgICAgIGNvbmZpZ0ZpbGVWYWx1ZTogb3B0aW9ucy5jb25maWdGaWxlVmFsdWUsXG4gICAgICAgIH0sXG4gICAgICB9O1xuXG4gICAgICAvLyBncmFudCBzMyBhY2Nlc3MgcGVybWlzc2lvbnNcbiAgICAgIGlmIChjb25maWdGaWxlVHlwZSA9PT0gRmlyZWxlbnNDb25maWdGaWxlVHlwZS5TMykge1xuICAgICAgICBwcm9wcy50YXNrRGVmaW5pdGlvbi5hZGRUb0V4ZWN1dGlvblJvbGVQb2xpY3kobmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICAgICdzMzpHZXRPYmplY3QnLFxuICAgICAgICAgIF0sXG4gICAgICAgICAgcmVzb3VyY2VzOiBbb3B0aW9ucy5jb25maWdGaWxlVmFsdWVdLFxuICAgICAgICB9KSk7XG4gICAgICAgIHByb3BzLnRhc2tEZWZpbml0aW9uLmFkZFRvRXhlY3V0aW9uUm9sZVBvbGljeShuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgYWN0aW9uczogW1xuICAgICAgICAgICAgJ3MzOkdldEJ1Y2tldExvY2F0aW9uJyxcbiAgICAgICAgICBdLFxuICAgICAgICAgIHJlc291cmNlczogW29wdGlvbnMuY29uZmlnRmlsZVZhbHVlLnNwbGl0KCcvJylbMF1dLFxuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZmlyZWxlbnNDb25maWcgPSBwcm9wcy5maXJlbGVuc0NvbmZpZztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVyIHRoaXMgY29udGFpbmVyIGRlZmluaXRpb24gdG8gYSBDbG91ZEZvcm1hdGlvbiBvYmplY3RcbiAgICovXG4gIHB1YmxpYyByZW5kZXJDb250YWluZXJEZWZpbml0aW9uKF90YXNrRGVmaW5pdGlvbj86IFRhc2tEZWZpbml0aW9uKTogQ2ZuVGFza0RlZmluaXRpb24uQ29udGFpbmVyRGVmaW5pdGlvblByb3BlcnR5IHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uKHN1cGVyLnJlbmRlckNvbnRhaW5lckRlZmluaXRpb24oKSksXG4gICAgICBmaXJlbGVuc0NvbmZpZ3VyYXRpb246IHRoaXMuZmlyZWxlbnNDb25maWcgJiYgcmVuZGVyRmlyZWxlbnNDb25maWcodGhpcy5maXJlbGVuc0NvbmZpZyksXG4gICAgfTtcbiAgfVxufVxuIl19
\No newline at end of file