cdk-cost-analyzer 0.1.10 → 0.1.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.cdk-cost-analyzer-cache/metadata.json +26 -2
- package/.kiro/specs/single-template-analysis/tasks.md +67 -54
- package/README.md +31 -1
- package/dist/analysis/SingleTemplateAnalyzer.d.ts +23 -0
- package/dist/analysis/SingleTemplateAnalyzer.js +168 -0
- package/dist/analysis/index.d.ts +1 -0
- package/dist/analysis/index.js +6 -0
- package/dist/api/index.d.ts +24 -0
- package/dist/api/index.js +56 -1
- package/dist/api/single-template-types.d.ts +83 -0
- package/dist/api/single-template-types.js +3 -0
- package/dist/cli/index.js +43 -54
- package/dist/pricing/calculators/ECSCalculator.d.ts +1 -0
- package/dist/pricing/calculators/ECSCalculator.js +63 -4
- package/dist/pricing/calculators/LambdaCalculator.d.ts +2 -0
- package/dist/pricing/calculators/LambdaCalculator.js +48 -1
- package/dist/releasetag.txt +1 -1
- package/dist/reporter/SingleTemplateReporter.d.ts +31 -0
- package/dist/reporter/SingleTemplateReporter.js +186 -0
- package/dist/reporter/index.d.ts +1 -0
- package/dist/reporter/index.js +4 -2
- package/docs/SINGLE-TEMPLATE-ANALYSIS.md +372 -0
- package/examples/single-template-usage.js +208 -0
- package/package.json +7 -1
- package/tools/discover-ecs-fargate-pricing.ts +179 -0
- package/test-cdk-project/README-COMPUTE.md +0 -141
- package/test-cdk-project/README.md +0 -95
- package/test-cdk-project/app-with-compute.js +0 -102
- package/test-cdk-project/app.js +0 -81
- package/test-cdk-project/cdk-compute.json +0 -3
- package/test-cdk-project/cdk.context.json +0 -7
- package/test-cdk-project/cdk.json +0 -3
- package/test-cdk-project/cdk.out/TestStack.assets.json +0 -21
- package/test-cdk-project/cdk.out/TestStack.template.json +0 -115
- package/test-cdk-project/cdk.out/cdk.out +0 -1
- package/test-cdk-project/cdk.out/manifest.json +0 -503
- package/test-cdk-project/cdk.out/tree.json +0 -1
- package/test-cdk-project/cdk.out.base/TestStack.assets.json +0 -21
- package/test-cdk-project/cdk.out.base/TestStack.template.json +0 -115
- package/test-cdk-project/cdk.out.base/cdk.out +0 -1
- package/test-cdk-project/cdk.out.base/manifest.json +0 -503
- package/test-cdk-project/cdk.out.base/tree.json +0 -1
- package/test-cdk-project/cdk.out.target/TestStack.assets.json +0 -21
- package/test-cdk-project/cdk.out.target/TestStack.template.json +0 -183
- package/test-cdk-project/cdk.out.target/cdk.out +0 -1
- package/test-cdk-project/cdk.out.target/manifest.json +0 -521
- package/test-cdk-project/cdk.out.target/tree.json +0 -1
- package/test-cdk-project/package-lock.json +0 -422
- package/test-cdk-project/package.json +0 -17
package/dist/api/index.d.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { AnalyzeOptions, CostAnalysisResult } from './types';
|
|
2
|
+
import { AnalyzeSingleTemplateOptions, SingleTemplateCostResult } from './single-template-types';
|
|
2
3
|
export * from './types';
|
|
4
|
+
export * from './single-template-types';
|
|
3
5
|
export { TemplateParseError } from '../parser/TemplateParser';
|
|
4
6
|
export { PricingAPIError, UnsupportedResourceError } from '../pricing/types';
|
|
5
7
|
export * from '../integrations';
|
|
@@ -9,3 +11,25 @@ export * from '../synthesis';
|
|
|
9
11
|
export * from '../threshold';
|
|
10
12
|
export * from '../pipeline';
|
|
11
13
|
export declare function analyzeCosts(options: AnalyzeOptions): Promise<CostAnalysisResult>;
|
|
14
|
+
/**
|
|
15
|
+
* Analyze a single CloudFormation template for estimated monthly costs
|
|
16
|
+
*
|
|
17
|
+
* @param options - Configuration options including template content, region, format, and analysis config
|
|
18
|
+
* @returns Promise resolving to detailed cost analysis result
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```typescript
|
|
22
|
+
* const result = await analyzeSingleTemplate({
|
|
23
|
+
* template: fs.readFileSync('template.json', 'utf-8'),
|
|
24
|
+
* region: 'us-east-1',
|
|
25
|
+
* format: 'text',
|
|
26
|
+
* config: {
|
|
27
|
+
* usageAssumptions: {
|
|
28
|
+
* lambda: { invocationsPerMonth: 1000000 }
|
|
29
|
+
* }
|
|
30
|
+
* }
|
|
31
|
+
* });
|
|
32
|
+
* console.log(result.summary);
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
export declare function analyzeSingleTemplate(options: AnalyzeSingleTemplateOptions): Promise<SingleTemplateCostResult>;
|
package/dist/api/index.js
CHANGED
|
@@ -16,11 +16,15 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
17
|
exports.UnsupportedResourceError = exports.PricingAPIError = exports.TemplateParseError = void 0;
|
|
18
18
|
exports.analyzeCosts = analyzeCosts;
|
|
19
|
+
exports.analyzeSingleTemplate = analyzeSingleTemplate;
|
|
19
20
|
const DiffEngine_1 = require("../diff/DiffEngine");
|
|
20
21
|
const TemplateParser_1 = require("../parser/TemplateParser");
|
|
21
22
|
const PricingService_1 = require("../pricing/PricingService");
|
|
22
23
|
const Reporter_1 = require("../reporter/Reporter");
|
|
24
|
+
const SingleTemplateReporter_1 = require("../reporter/SingleTemplateReporter");
|
|
25
|
+
const SingleTemplateAnalyzer_1 = require("../analysis/SingleTemplateAnalyzer");
|
|
23
26
|
__exportStar(require("./types"), exports);
|
|
27
|
+
__exportStar(require("./single-template-types"), exports);
|
|
24
28
|
var TemplateParser_2 = require("../parser/TemplateParser");
|
|
25
29
|
Object.defineProperty(exports, "TemplateParseError", { enumerable: true, get: function () { return TemplateParser_2.TemplateParseError; } });
|
|
26
30
|
var types_1 = require("../pricing/types");
|
|
@@ -62,4 +66,55 @@ async function analyzeCosts(options) {
|
|
|
62
66
|
pricingService.destroy();
|
|
63
67
|
}
|
|
64
68
|
}
|
|
65
|
-
|
|
69
|
+
/**
|
|
70
|
+
* Analyze a single CloudFormation template for estimated monthly costs
|
|
71
|
+
*
|
|
72
|
+
* @param options - Configuration options including template content, region, format, and analysis config
|
|
73
|
+
* @returns Promise resolving to detailed cost analysis result
|
|
74
|
+
*
|
|
75
|
+
* @example
|
|
76
|
+
* ```typescript
|
|
77
|
+
* const result = await analyzeSingleTemplate({
|
|
78
|
+
* template: fs.readFileSync('template.json', 'utf-8'),
|
|
79
|
+
* region: 'us-east-1',
|
|
80
|
+
* format: 'text',
|
|
81
|
+
* config: {
|
|
82
|
+
* usageAssumptions: {
|
|
83
|
+
* lambda: { invocationsPerMonth: 1000000 }
|
|
84
|
+
* }
|
|
85
|
+
* }
|
|
86
|
+
* });
|
|
87
|
+
* console.log(result.summary);
|
|
88
|
+
* ```
|
|
89
|
+
*/
|
|
90
|
+
async function analyzeSingleTemplate(options) {
|
|
91
|
+
const region = options.region || 'eu-central-1';
|
|
92
|
+
const format = options.format || 'text';
|
|
93
|
+
if (!options.template) {
|
|
94
|
+
throw new Error('Template content is required');
|
|
95
|
+
}
|
|
96
|
+
const analyzer = new SingleTemplateAnalyzer_1.SingleTemplateAnalyzer();
|
|
97
|
+
const reporter = new SingleTemplateReporter_1.SingleTemplateReporter();
|
|
98
|
+
try {
|
|
99
|
+
// Analyze the template
|
|
100
|
+
const result = await analyzer.analyzeCosts(options.template, region, options.config);
|
|
101
|
+
// Generate formatted summary using the reporter
|
|
102
|
+
const summary = reporter.generateReport(result, format);
|
|
103
|
+
return {
|
|
104
|
+
...result,
|
|
105
|
+
summary,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
// Handle AWS credentials errors
|
|
110
|
+
if (error instanceof Error && error.message.includes('Could not load credentials')) {
|
|
111
|
+
throw new Error('AWS credentials not configured. Please set AWS credentials using one of:\n' +
|
|
112
|
+
' - AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY environment variables\n' +
|
|
113
|
+
' - AWS_PROFILE environment variable\n' +
|
|
114
|
+
' - AWS credentials file (~/.aws/credentials)\n' +
|
|
115
|
+
' - For CI/CD, configure AWS credentials in your pipeline');
|
|
116
|
+
}
|
|
117
|
+
throw error;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXBpL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBb0JBLG9DQW1DQztBQXVCRCxzREFxQ0M7QUFqSEQsbURBQWdEO0FBQ2hELDZEQUEwRDtBQUMxRCw4REFBMkQ7QUFDM0QsbURBQWdEO0FBQ2hELCtFQUE0RTtBQUM1RSwrRUFBNEU7QUFFNUUsMENBQXdCO0FBQ3hCLDBEQUF3QztBQUN4QywyREFBOEQ7QUFBckQsb0hBQUEsa0JBQWtCLE9BQUE7QUFDM0IsMENBQTZFO0FBQXBFLHdHQUFBLGVBQWUsT0FBQTtBQUFFLGlIQUFBLHdCQUF3QixPQUFBO0FBQ2xELGtEQUFnQztBQUNoQyxvREFBa0M7QUFDbEMsNENBQTBCO0FBQzFCLCtDQUE2QjtBQUM3QiwrQ0FBNkI7QUFDN0IsOENBQTRCO0FBRXJCLEtBQUssVUFBVSxZQUFZLENBQUMsT0FBdUI7SUFDeEQsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU0sSUFBSSxjQUFjLENBQUM7SUFDaEQsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUM7SUFFeEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDckQsTUFBTSxJQUFJLEtBQUssQ0FBQyxtREFBbUQsQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7SUFFRCxNQUFNLE1BQU0sR0FBRyxJQUFJLCtCQUFjLEVBQUUsQ0FBQztJQUNwQyxNQUFNLFVBQVUsR0FBRyxJQUFJLHVCQUFVLEVBQUUsQ0FBQztJQUNwQyxNQUFNLGNBQWMsR0FBRyxJQUFJLCtCQUFjLEVBQUUsQ0FBQztJQUM1QyxNQUFNLFFBQVEsR0FBRyxJQUFJLG1CQUFRLEVBQUUsQ0FBQztJQUVoQyxJQUFJLENBQUM7UUFDSCxNQUFNLGVBQWUsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUMzRCxNQUFNLGlCQUFpQixHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBRS9ELE1BQU0sSUFBSSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLGlCQUFpQixDQUFDLENBQUM7UUFFakUsTUFBTSxTQUFTLEdBQUcsTUFBTSxjQUFjLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztRQUVsRSxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUUzRCxPQUFPO1lBQ0wsVUFBVSxFQUFFLFNBQVMsQ0FBQyxVQUFVO1lBQ2hDLFFBQVEsRUFBRSxTQUFTLENBQUMsUUFBUTtZQUM1QixjQUFjLEVBQUUsU0FBUyxDQUFDLFVBQVU7WUFDcEMsZ0JBQWdCLEVBQUUsU0FBUyxDQUFDLFlBQVk7WUFDeEMsaUJBQWlCLEVBQUUsU0FBUyxDQUFDLGFBQWE7WUFDMUMsT0FBTztTQUNSLENBQUM7SUFDSixDQUFDO1lBQVMsQ0FBQztRQUNULG9EQUFvRDtRQUNwRCxjQUFjLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDM0IsQ0FBQztBQUNILENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFDSSxLQUFLLFVBQVUscUJBQXFCLENBQ3pDLE9BQXFDO0lBRXJDLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLElBQUksY0FBYyxDQUFDO0lBQ2hELE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDO0lBRXhDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDdEIsTUFBTSxJQUFJLEtBQUssQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRCxNQUFNLFFBQVEsR0FBRyxJQUFJLCtDQUFzQixFQUFFLENBQUM7SUFDOUMsTUFBTSxRQUFRLEdBQUcsSUFBSSwrQ0FBc0IsRUFBRSxDQUFDO0lBRTlDLElBQUksQ0FBQztRQUNILHVCQUF1QjtRQUN2QixNQUFNLE1BQU0sR0FBRyxNQUFNLFFBQVEsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRXJGLGdEQUFnRDtRQUNoRCxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztRQUV4RCxPQUFPO1lBQ0wsR0FBRyxNQUFNO1lBQ1QsT0FBTztTQUNSLENBQUM7SUFDSixDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLGdDQUFnQztRQUNoQyxJQUFJLEtBQUssWUFBWSxLQUFLLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsNEJBQTRCLENBQUMsRUFBRSxDQUFDO1lBQ25GLE1BQU0sSUFBSSxLQUFLLENBQ2IsNEVBQTRFO2dCQUM1RSx5RUFBeUU7Z0JBQ3pFLHdDQUF3QztnQkFDeEMsaURBQWlEO2dCQUNqRCwyREFBMkQsQ0FDNUQsQ0FBQztRQUNKLENBQUM7UUFDRCxNQUFNLEtBQUssQ0FBQztJQUNkLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQW5hbHl6ZU9wdGlvbnMsIENvc3RBbmFseXNpc1Jlc3VsdCB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgQW5hbHl6ZVNpbmdsZVRlbXBsYXRlT3B0aW9ucywgU2luZ2xlVGVtcGxhdGVDb3N0UmVzdWx0IH0gZnJvbSAnLi9zaW5nbGUtdGVtcGxhdGUtdHlwZXMnO1xuaW1wb3J0IHsgRGlmZkVuZ2luZSB9IGZyb20gJy4uL2RpZmYvRGlmZkVuZ2luZSc7XG5pbXBvcnQgeyBUZW1wbGF0ZVBhcnNlciB9IGZyb20gJy4uL3BhcnNlci9UZW1wbGF0ZVBhcnNlcic7XG5pbXBvcnQgeyBQcmljaW5nU2VydmljZSB9IGZyb20gJy4uL3ByaWNpbmcvUHJpY2luZ1NlcnZpY2UnO1xuaW1wb3J0IHsgUmVwb3J0ZXIgfSBmcm9tICcuLi9yZXBvcnRlci9SZXBvcnRlcic7XG5pbXBvcnQgeyBTaW5nbGVUZW1wbGF0ZVJlcG9ydGVyIH0gZnJvbSAnLi4vcmVwb3J0ZXIvU2luZ2xlVGVtcGxhdGVSZXBvcnRlcic7XG5pbXBvcnQgeyBTaW5nbGVUZW1wbGF0ZUFuYWx5emVyIH0gZnJvbSAnLi4vYW5hbHlzaXMvU2luZ2xlVGVtcGxhdGVBbmFseXplcic7XG5cbmV4cG9ydCAqIGZyb20gJy4vdHlwZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9zaW5nbGUtdGVtcGxhdGUtdHlwZXMnO1xuZXhwb3J0IHsgVGVtcGxhdGVQYXJzZUVycm9yIH0gZnJvbSAnLi4vcGFyc2VyL1RlbXBsYXRlUGFyc2VyJztcbmV4cG9ydCB7IFByaWNpbmdBUElFcnJvciwgVW5zdXBwb3J0ZWRSZXNvdXJjZUVycm9yIH0gZnJvbSAnLi4vcHJpY2luZy90eXBlcyc7XG5leHBvcnQgKiBmcm9tICcuLi9pbnRlZ3JhdGlvbnMnO1xuZXhwb3J0ICogZnJvbSAnLi4vcmVwb3J0ZXIvdHlwZXMnO1xuZXhwb3J0ICogZnJvbSAnLi4vY29uZmlnJztcbmV4cG9ydCAqIGZyb20gJy4uL3N5bnRoZXNpcyc7XG5leHBvcnQgKiBmcm9tICcuLi90aHJlc2hvbGQnO1xuZXhwb3J0ICogZnJvbSAnLi4vcGlwZWxpbmUnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYW5hbHl6ZUNvc3RzKG9wdGlvbnM6IEFuYWx5emVPcHRpb25zKTogUHJvbWlzZTxDb3N0QW5hbHlzaXNSZXN1bHQ+IHtcbiAgY29uc3QgcmVnaW9uID0gb3B0aW9ucy5yZWdpb24gfHwgJ2V1LWNlbnRyYWwtMSc7XG4gIGNvbnN0IGZvcm1hdCA9IG9wdGlvbnMuZm9ybWF0IHx8ICd0ZXh0JztcblxuICBpZiAoIW9wdGlvbnMuYmFzZVRlbXBsYXRlIHx8ICFvcHRpb25zLnRhcmdldFRlbXBsYXRlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdCb3RoIGJhc2VUZW1wbGF0ZSBhbmQgdGFyZ2V0VGVtcGxhdGUgYXJlIHJlcXVpcmVkJyk7XG4gIH1cblxuICBjb25zdCBwYXJzZXIgPSBuZXcgVGVtcGxhdGVQYXJzZXIoKTtcbiAgY29uc3QgZGlmZkVuZ2luZSA9IG5ldyBEaWZmRW5naW5lKCk7XG4gIGNvbnN0IHByaWNpbmdTZXJ2aWNlID0gbmV3IFByaWNpbmdTZXJ2aWNlKCk7XG4gIGNvbnN0IHJlcG9ydGVyID0gbmV3IFJlcG9ydGVyKCk7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBiYXNlVGVtcGxhdGVPYmogPSBwYXJzZXIucGFyc2Uob3B0aW9ucy5iYXNlVGVtcGxhdGUpO1xuICAgIGNvbnN0IHRhcmdldFRlbXBsYXRlT2JqID0gcGFyc2VyLnBhcnNlKG9wdGlvbnMudGFyZ2V0VGVtcGxhdGUpO1xuXG4gICAgY29uc3QgZGlmZiA9IGRpZmZFbmdpbmUuZGlmZihiYXNlVGVtcGxhdGVPYmosIHRhcmdldFRlbXBsYXRlT2JqKTtcblxuICAgIGNvbnN0IGNvc3REZWx0YSA9IGF3YWl0IHByaWNpbmdTZXJ2aWNlLmdldENvc3REZWx0YShkaWZmLCByZWdpb24pO1xuXG4gICAgY29uc3Qgc3VtbWFyeSA9IHJlcG9ydGVyLmdlbmVyYXRlUmVwb3J0KGNvc3REZWx0YSwgZm9ybWF0KTtcblxuICAgIHJldHVybiB7XG4gICAgICB0b3RhbERlbHRhOiBjb3N0RGVsdGEudG90YWxEZWx0YSxcbiAgICAgIGN1cnJlbmN5OiBjb3N0RGVsdGEuY3VycmVuY3ksXG4gICAgICBhZGRlZFJlc291cmNlczogY29zdERlbHRhLmFkZGVkQ29zdHMsXG4gICAgICByZW1vdmVkUmVzb3VyY2VzOiBjb3N0RGVsdGEucmVtb3ZlZENvc3RzLFxuICAgICAgbW9kaWZpZWRSZXNvdXJjZXM6IGNvc3REZWx0YS5tb2RpZmllZENvc3RzLFxuICAgICAgc3VtbWFyeSxcbiAgICB9O1xuICB9IGZpbmFsbHkge1xuICAgIC8vIENsZWFuIHVwIHJlc291cmNlcyB0byBwcmV2ZW50IGhhbmdpbmcgY29ubmVjdGlvbnNcbiAgICBwcmljaW5nU2VydmljZS5kZXN0cm95KCk7XG4gIH1cbn1cblxuLyoqXG4gKiBBbmFseXplIGEgc2luZ2xlIENsb3VkRm9ybWF0aW9uIHRlbXBsYXRlIGZvciBlc3RpbWF0ZWQgbW9udGhseSBjb3N0c1xuICogXG4gKiBAcGFyYW0gb3B0aW9ucyAtIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBpbmNsdWRpbmcgdGVtcGxhdGUgY29udGVudCwgcmVnaW9uLCBmb3JtYXQsIGFuZCBhbmFseXNpcyBjb25maWdcbiAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIGRldGFpbGVkIGNvc3QgYW5hbHlzaXMgcmVzdWx0XG4gKiBcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCByZXN1bHQgPSBhd2FpdCBhbmFseXplU2luZ2xlVGVtcGxhdGUoe1xuICogICB0ZW1wbGF0ZTogZnMucmVhZEZpbGVTeW5jKCd0ZW1wbGF0ZS5qc29uJywgJ3V0Zi04JyksXG4gKiAgIHJlZ2lvbjogJ3VzLWVhc3QtMScsXG4gKiAgIGZvcm1hdDogJ3RleHQnLFxuICogICBjb25maWc6IHtcbiAqICAgICB1c2FnZUFzc3VtcHRpb25zOiB7XG4gKiAgICAgICBsYW1iZGE6IHsgaW52b2NhdGlvbnNQZXJNb250aDogMTAwMDAwMCB9XG4gKiAgICAgfVxuICogICB9XG4gKiB9KTtcbiAqIGNvbnNvbGUubG9nKHJlc3VsdC5zdW1tYXJ5KTtcbiAqIGBgYFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYW5hbHl6ZVNpbmdsZVRlbXBsYXRlKFxuICBvcHRpb25zOiBBbmFseXplU2luZ2xlVGVtcGxhdGVPcHRpb25zLFxuKTogUHJvbWlzZTxTaW5nbGVUZW1wbGF0ZUNvc3RSZXN1bHQ+IHtcbiAgY29uc3QgcmVnaW9uID0gb3B0aW9ucy5yZWdpb24gfHwgJ2V1LWNlbnRyYWwtMSc7XG4gIGNvbnN0IGZvcm1hdCA9IG9wdGlvbnMuZm9ybWF0IHx8ICd0ZXh0JztcblxuICBpZiAoIW9wdGlvbnMudGVtcGxhdGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RlbXBsYXRlIGNvbnRlbnQgaXMgcmVxdWlyZWQnKTtcbiAgfVxuXG4gIGNvbnN0IGFuYWx5emVyID0gbmV3IFNpbmdsZVRlbXBsYXRlQW5hbHl6ZXIoKTtcbiAgY29uc3QgcmVwb3J0ZXIgPSBuZXcgU2luZ2xlVGVtcGxhdGVSZXBvcnRlcigpO1xuXG4gIHRyeSB7XG4gICAgLy8gQW5hbHl6ZSB0aGUgdGVtcGxhdGVcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBhbmFseXplci5hbmFseXplQ29zdHMob3B0aW9ucy50ZW1wbGF0ZSwgcmVnaW9uLCBvcHRpb25zLmNvbmZpZyk7XG5cbiAgICAvLyBHZW5lcmF0ZSBmb3JtYXR0ZWQgc3VtbWFyeSB1c2luZyB0aGUgcmVwb3J0ZXJcbiAgICBjb25zdCBzdW1tYXJ5ID0gcmVwb3J0ZXIuZ2VuZXJhdGVSZXBvcnQocmVzdWx0LCBmb3JtYXQpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnJlc3VsdCxcbiAgICAgIHN1bW1hcnksXG4gICAgfTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAvLyBIYW5kbGUgQVdTIGNyZWRlbnRpYWxzIGVycm9yc1xuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoJ0NvdWxkIG5vdCBsb2FkIGNyZWRlbnRpYWxzJykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ0FXUyBjcmVkZW50aWFscyBub3QgY29uZmlndXJlZC4gUGxlYXNlIHNldCBBV1MgY3JlZGVudGlhbHMgdXNpbmcgb25lIG9mOlxcbicgK1xuICAgICAgICAnICAtIEFXU19BQ0NFU1NfS0VZX0lEIGFuZCBBV1NfU0VDUkVUX0FDQ0VTU19LRVkgZW52aXJvbm1lbnQgdmFyaWFibGVzXFxuJyArXG4gICAgICAgICcgIC0gQVdTX1BST0ZJTEUgZW52aXJvbm1lbnQgdmFyaWFibGVcXG4nICtcbiAgICAgICAgJyAgLSBBV1MgY3JlZGVudGlhbHMgZmlsZSAofi8uYXdzL2NyZWRlbnRpYWxzKVxcbicgK1xuICAgICAgICAnICAtIEZvciBDSS9DRCwgY29uZmlndXJlIEFXUyBjcmVkZW50aWFscyBpbiB5b3VyIHBpcGVsaW5lJyxcbiAgICAgICk7XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbiJdfQ==
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { ResourceCost } from '../pricing/types';
|
|
2
|
+
import { UsageAssumptionsConfig, CacheConfig } from '../config/types';
|
|
3
|
+
/**
|
|
4
|
+
* Configuration options for single template analysis
|
|
5
|
+
*/
|
|
6
|
+
export interface AnalysisConfig {
|
|
7
|
+
usageAssumptions?: UsageAssumptionsConfig;
|
|
8
|
+
excludedResourceTypes?: string[];
|
|
9
|
+
cacheConfig?: CacheConfig;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Metadata about the analysis
|
|
13
|
+
*/
|
|
14
|
+
export interface AnalysisMetadata {
|
|
15
|
+
templateHash: string;
|
|
16
|
+
region: string;
|
|
17
|
+
analyzedAt: Date;
|
|
18
|
+
resourceCount: number;
|
|
19
|
+
supportedResourceCount: number;
|
|
20
|
+
unsupportedResourceCount: number;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Cost information grouped by resource type
|
|
24
|
+
*/
|
|
25
|
+
export interface ResourceTypeCost {
|
|
26
|
+
resourceType: string;
|
|
27
|
+
count: number;
|
|
28
|
+
totalCost: number;
|
|
29
|
+
resources: ResourceCost[];
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Cost information grouped by confidence level
|
|
33
|
+
*/
|
|
34
|
+
export interface ConfidenceLevelCost {
|
|
35
|
+
confidence: 'high' | 'medium' | 'low' | 'unknown';
|
|
36
|
+
count: number;
|
|
37
|
+
totalCost: number;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Detailed cost breakdown for a template
|
|
41
|
+
*/
|
|
42
|
+
export interface CostBreakdown {
|
|
43
|
+
byResourceType: ResourceTypeCost[];
|
|
44
|
+
byConfidenceLevel: ConfidenceLevelCost[];
|
|
45
|
+
assumptions: string[];
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Enhanced resource cost with additional metadata
|
|
49
|
+
*/
|
|
50
|
+
export interface EnhancedResourceCost extends ResourceCost {
|
|
51
|
+
properties?: Record<string, any>;
|
|
52
|
+
region: string;
|
|
53
|
+
calculatedAt: Date;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Result of single template cost analysis
|
|
57
|
+
*/
|
|
58
|
+
export interface SingleTemplateCostResult {
|
|
59
|
+
totalMonthlyCost: number;
|
|
60
|
+
currency: string;
|
|
61
|
+
resourceCosts: EnhancedResourceCost[];
|
|
62
|
+
costBreakdown: CostBreakdown;
|
|
63
|
+
summary: string;
|
|
64
|
+
metadata: AnalysisMetadata;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Options for analyzing a single template
|
|
68
|
+
*/
|
|
69
|
+
export interface AnalyzeSingleTemplateOptions {
|
|
70
|
+
template: string;
|
|
71
|
+
region?: string;
|
|
72
|
+
format?: 'text' | 'json' | 'markdown';
|
|
73
|
+
config?: AnalysisConfig;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Options for generating single template reports
|
|
77
|
+
*/
|
|
78
|
+
export interface SingleTemplateReportOptions {
|
|
79
|
+
showBreakdown?: boolean;
|
|
80
|
+
showAssumptions?: boolean;
|
|
81
|
+
groupByType?: boolean;
|
|
82
|
+
sortBy?: 'cost' | 'name' | 'type';
|
|
83
|
+
}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2luZ2xlLXRlbXBsYXRlLXR5cGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwaS9zaW5nbGUtdGVtcGxhdGUtdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJlc291cmNlQ29zdCB9IGZyb20gJy4uL3ByaWNpbmcvdHlwZXMnO1xuaW1wb3J0IHsgVXNhZ2VBc3N1bXB0aW9uc0NvbmZpZywgQ2FjaGVDb25maWcgfSBmcm9tICcuLi9jb25maWcvdHlwZXMnO1xuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3Igc2luZ2xlIHRlbXBsYXRlIGFuYWx5c2lzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQW5hbHlzaXNDb25maWcge1xuICB1c2FnZUFzc3VtcHRpb25zPzogVXNhZ2VBc3N1bXB0aW9uc0NvbmZpZztcbiAgZXhjbHVkZWRSZXNvdXJjZVR5cGVzPzogc3RyaW5nW107XG4gIGNhY2hlQ29uZmlnPzogQ2FjaGVDb25maWc7XG59XG5cbi8qKlxuICogTWV0YWRhdGEgYWJvdXQgdGhlIGFuYWx5c2lzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQW5hbHlzaXNNZXRhZGF0YSB7XG4gIHRlbXBsYXRlSGFzaDogc3RyaW5nO1xuICByZWdpb246IHN0cmluZztcbiAgYW5hbHl6ZWRBdDogRGF0ZTtcbiAgcmVzb3VyY2VDb3VudDogbnVtYmVyO1xuICBzdXBwb3J0ZWRSZXNvdXJjZUNvdW50OiBudW1iZXI7XG4gIHVuc3VwcG9ydGVkUmVzb3VyY2VDb3VudDogbnVtYmVyO1xufVxuXG4vKipcbiAqIENvc3QgaW5mb3JtYXRpb24gZ3JvdXBlZCBieSByZXNvdXJjZSB0eXBlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb3VyY2VUeXBlQ29zdCB7XG4gIHJlc291cmNlVHlwZTogc3RyaW5nO1xuICBjb3VudDogbnVtYmVyO1xuICB0b3RhbENvc3Q6IG51bWJlcjtcbiAgcmVzb3VyY2VzOiBSZXNvdXJjZUNvc3RbXTtcbn1cblxuLyoqXG4gKiBDb3N0IGluZm9ybWF0aW9uIGdyb3VwZWQgYnkgY29uZmlkZW5jZSBsZXZlbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbmZpZGVuY2VMZXZlbENvc3Qge1xuICBjb25maWRlbmNlOiAnaGlnaCcgfCAnbWVkaXVtJyB8ICdsb3cnIHwgJ3Vua25vd24nO1xuICBjb3VudDogbnVtYmVyO1xuICB0b3RhbENvc3Q6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBEZXRhaWxlZCBjb3N0IGJyZWFrZG93biBmb3IgYSB0ZW1wbGF0ZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvc3RCcmVha2Rvd24ge1xuICBieVJlc291cmNlVHlwZTogUmVzb3VyY2VUeXBlQ29zdFtdO1xuICBieUNvbmZpZGVuY2VMZXZlbDogQ29uZmlkZW5jZUxldmVsQ29zdFtdO1xuICBhc3N1bXB0aW9uczogc3RyaW5nW107XG59XG5cbi8qKlxuICogRW5oYW5jZWQgcmVzb3VyY2UgY29zdCB3aXRoIGFkZGl0aW9uYWwgbWV0YWRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbmhhbmNlZFJlc291cmNlQ29zdCBleHRlbmRzIFJlc291cmNlQ29zdCB7XG4gIHByb3BlcnRpZXM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICByZWdpb246IHN0cmluZztcbiAgY2FsY3VsYXRlZEF0OiBEYXRlO1xufVxuXG4vKipcbiAqIFJlc3VsdCBvZiBzaW5nbGUgdGVtcGxhdGUgY29zdCBhbmFseXNpc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFNpbmdsZVRlbXBsYXRlQ29zdFJlc3VsdCB7XG4gIHRvdGFsTW9udGhseUNvc3Q6IG51bWJlcjtcbiAgY3VycmVuY3k6IHN0cmluZztcbiAgcmVzb3VyY2VDb3N0czogRW5oYW5jZWRSZXNvdXJjZUNvc3RbXTtcbiAgY29zdEJyZWFrZG93bjogQ29zdEJyZWFrZG93bjtcbiAgc3VtbWFyeTogc3RyaW5nO1xuICBtZXRhZGF0YTogQW5hbHlzaXNNZXRhZGF0YTtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBhbmFseXppbmcgYSBzaW5nbGUgdGVtcGxhdGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBbmFseXplU2luZ2xlVGVtcGxhdGVPcHRpb25zIHtcbiAgdGVtcGxhdGU6IHN0cmluZztcbiAgcmVnaW9uPzogc3RyaW5nO1xuICBmb3JtYXQ/OiAndGV4dCcgfCAnanNvbicgfCAnbWFya2Rvd24nO1xuICBjb25maWc/OiBBbmFseXNpc0NvbmZpZztcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBnZW5lcmF0aW5nIHNpbmdsZSB0ZW1wbGF0ZSByZXBvcnRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2luZ2xlVGVtcGxhdGVSZXBvcnRPcHRpb25zIHtcbiAgc2hvd0JyZWFrZG93bj86IGJvb2xlYW47XG4gIHNob3dBc3N1bXB0aW9ucz86IGJvb2xlYW47XG4gIGdyb3VwQnlUeXBlPzogYm9vbGVhbjtcbiAgc29ydEJ5PzogJ2Nvc3QnIHwgJ25hbWUnIHwgJ3R5cGUnO1xufVxuIl19
|
package/dist/cli/index.js
CHANGED
|
@@ -45,6 +45,48 @@ program
|
|
|
45
45
|
.name('cdk-cost-analyzer')
|
|
46
46
|
.description('Analyze AWS CDK infrastructure changes and provide cost impact summaries')
|
|
47
47
|
.version('1.0.0');
|
|
48
|
+
// New analyze command for single template analysis
|
|
49
|
+
program
|
|
50
|
+
.command('analyze <template>')
|
|
51
|
+
.description('Analyze a single CloudFormation template for estimated costs')
|
|
52
|
+
.option('--region <region>', 'AWS region for pricing', 'eu-central-1')
|
|
53
|
+
.option('--format <format>', 'Output format: text|json|markdown', 'text')
|
|
54
|
+
.option('--config <path>', 'Path to configuration file')
|
|
55
|
+
.option('--debug', 'Enable verbose debug logging for pricing API calls')
|
|
56
|
+
.action(async (templatePath, options) => {
|
|
57
|
+
try {
|
|
58
|
+
// Enable debug logging if flag is set
|
|
59
|
+
if (options.debug) {
|
|
60
|
+
Logger_1.Logger.setDebugEnabled(true);
|
|
61
|
+
Logger_1.Logger.debug('Debug logging enabled');
|
|
62
|
+
}
|
|
63
|
+
// Check if template file exists
|
|
64
|
+
if (!fs.existsSync(templatePath)) {
|
|
65
|
+
console.error(`Error: Template file not found: ${templatePath}`);
|
|
66
|
+
process.exit(1);
|
|
67
|
+
}
|
|
68
|
+
// Read the template
|
|
69
|
+
const template = fs.readFileSync(templatePath, 'utf-8');
|
|
70
|
+
// Analyze the template
|
|
71
|
+
const result = await (0, api_1.analyzeSingleTemplate)({
|
|
72
|
+
template,
|
|
73
|
+
region: options.region,
|
|
74
|
+
format: options.format,
|
|
75
|
+
});
|
|
76
|
+
// Output the results (summary already contains formatted output)
|
|
77
|
+
console.log(result.summary);
|
|
78
|
+
process.exit(0);
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
if (error instanceof Error) {
|
|
82
|
+
console.error(`Error: ${error.message}`);
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
console.error(`Error: ${String(error)}`);
|
|
86
|
+
}
|
|
87
|
+
process.exit(1);
|
|
88
|
+
}
|
|
89
|
+
});
|
|
48
90
|
// Original command for direct template comparison
|
|
49
91
|
program
|
|
50
92
|
.command('compare')
|
|
@@ -224,58 +266,5 @@ program
|
|
|
224
266
|
process.exit(1);
|
|
225
267
|
}
|
|
226
268
|
});
|
|
227
|
-
// Default to compare command for backward compatibility
|
|
228
|
-
program
|
|
229
|
-
.argument('[base]', 'Path to base CloudFormation template')
|
|
230
|
-
.argument('[target]', 'Path to target CloudFormation template')
|
|
231
|
-
.option('--region <region>', 'AWS region', 'eu-central-1')
|
|
232
|
-
.option('--format <format>', 'Output format: text|json|markdown', 'text')
|
|
233
|
-
.option('--config <path>', 'Path to configuration file')
|
|
234
|
-
.option('--debug', 'Enable verbose debug logging for pricing API calls')
|
|
235
|
-
.action(async (basePath, targetPath, options) => {
|
|
236
|
-
if (!basePath || !targetPath) {
|
|
237
|
-
program.help();
|
|
238
|
-
return;
|
|
239
|
-
}
|
|
240
|
-
try {
|
|
241
|
-
// Enable debug logging if flag is set
|
|
242
|
-
if (options?.debug) {
|
|
243
|
-
Logger_1.Logger.setDebugEnabled(true);
|
|
244
|
-
Logger_1.Logger.debug('Debug logging enabled');
|
|
245
|
-
}
|
|
246
|
-
if (!fs.existsSync(basePath)) {
|
|
247
|
-
console.error(`Error: Base template file not found: ${basePath}`);
|
|
248
|
-
process.exit(1);
|
|
249
|
-
}
|
|
250
|
-
if (!fs.existsSync(targetPath)) {
|
|
251
|
-
console.error(`Error: Target template file not found: ${targetPath}`);
|
|
252
|
-
process.exit(1);
|
|
253
|
-
}
|
|
254
|
-
const baseTemplate = fs.readFileSync(basePath, 'utf-8');
|
|
255
|
-
const targetTemplate = fs.readFileSync(targetPath, 'utf-8');
|
|
256
|
-
const result = await (0, api_1.analyzeCosts)({
|
|
257
|
-
baseTemplate,
|
|
258
|
-
targetTemplate,
|
|
259
|
-
region: options?.region || 'eu-central-1',
|
|
260
|
-
format: options?.format || 'text',
|
|
261
|
-
});
|
|
262
|
-
if (options?.format === 'json') {
|
|
263
|
-
console.log(JSON.stringify(result, null, 2));
|
|
264
|
-
}
|
|
265
|
-
else {
|
|
266
|
-
console.log(result.summary);
|
|
267
|
-
}
|
|
268
|
-
process.exit(0);
|
|
269
|
-
}
|
|
270
|
-
catch (error) {
|
|
271
|
-
if (error instanceof Error) {
|
|
272
|
-
console.error(`Error: ${error.message}`);
|
|
273
|
-
}
|
|
274
|
-
else {
|
|
275
|
-
console.error(`Error: ${String(error)}`);
|
|
276
|
-
}
|
|
277
|
-
process.exit(1);
|
|
278
|
-
}
|
|
279
|
-
});
|
|
280
269
|
program.parse();
|
|
281
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2xpL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVBLHVDQUF5QjtBQUN6Qix5Q0FBb0M7QUFDcEMsZ0NBQXNDO0FBQ3RDLHlFQUFzRTtBQUN0RSwyRUFBd0U7QUFDeEUsNENBQXlDO0FBRXpDLE1BQU0sT0FBTyxHQUFHLElBQUksbUJBQU8sRUFBRSxDQUFDO0FBRTlCLE9BQU87S0FDSixJQUFJLENBQUMsbUJBQW1CLENBQUM7S0FDekIsV0FBVyxDQUFDLDBFQUEwRSxDQUFDO0tBQ3ZGLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUVwQixrREFBa0Q7QUFDbEQsT0FBTztLQUNKLE9BQU8sQ0FBQyxTQUFTLENBQUM7S0FDbEIsV0FBVyxDQUFDLHNDQUFzQyxDQUFDO0tBQ25ELFFBQVEsQ0FBQyxRQUFRLEVBQUUsc0NBQXNDLENBQUM7S0FDMUQsUUFBUSxDQUFDLFVBQVUsRUFBRSx3Q0FBd0MsQ0FBQztLQUM5RCxNQUFNLENBQUMsbUJBQW1CLEVBQUUsWUFBWSxFQUFFLGNBQWMsQ0FBQztLQUN6RCxNQUFNLENBQUMsbUJBQW1CLEVBQUUsbUNBQW1DLEVBQUUsTUFBTSxDQUFDO0tBQ3hFLE1BQU0sQ0FBQyxpQkFBaUIsRUFBRSw0QkFBNEIsQ0FBQztLQUN2RCxNQUFNLENBQUMsU0FBUyxFQUFFLG9EQUFvRCxDQUFDO0tBQ3ZFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsUUFBZ0IsRUFBRSxVQUFrQixFQUFFLE9BQTZFLEVBQUUsRUFBRTtJQUNwSSxJQUFJLENBQUM7UUFDSCxzQ0FBc0M7UUFDdEMsSUFBSSxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDbEIsZUFBTSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM3QixlQUFNLENBQUMsS0FBSyxDQUFDLHVCQUF1QixDQUFDLENBQUM7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QUFNLEdBQUcsTUFBTSxJQUFBLGtCQUFZLEVBQUM7WUFDaEMsWUFBWTtZQUNaLGNBQWM7WUFDZCxNQUFNLEVBQUUsT0FBTyxFQUFFLE1BQU0sSUFBSSxjQUFjO1lBQ3pDLE1BQU0sRUFBRyxPQUFPLEVBQUUsTUFBdUMsSUFBSSxNQUFNO1NBQ3BFLENBQUMsQ0FBQztRQUVILElBQUksT0FBTyxFQUFFLE1BQU0sS0FBSyxNQUFNLEVBQUUsQ0FBQztZQUMvQixPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQy9DLENBQUM7YUFBTSxDQUFDO1lBQ04sT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDOUIsQ0FBQztRQUVELE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEIsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixJQUFJLEtBQUssWUFBWSxLQUFLLEVBQUUsQ0FBQztZQUMzQixPQUFPLENBQUMsS0FBSyxDQUFDLFVBQVUsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDM0MsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLENBQUMsS0FBSyxDQUFDLFVBQVUsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMzQyxDQUFDO1FBQ0QsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsQixDQUFDO0FBQ0gsQ0FBQyxDQUFDLENBQUM7QUFFTCxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIjIS91c3IvYmluL2VudiBub2RlXG5cbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcbmltcG9ydCB7IENvbW1hbmQgfSBmcm9tICdjb21tYW5kZXInO1xuaW1wb3J0IHsgYW5hbHl6ZUNvc3RzIH0gZnJvbSAnLi4vYXBpJztcbmltcG9ydCB7IEdpdExhYkludGVncmF0aW9uIH0gZnJvbSAnLi4vaW50ZWdyYXRpb25zL0dpdExhYkludGVncmF0aW9uJztcbmltcG9ydCB7IFBpcGVsaW5lT3JjaGVzdHJhdG9yIH0gZnJvbSAnLi4vcGlwZWxpbmUvUGlwZWxpbmVPcmNoZXN0cmF0b3InO1xuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSAnLi4vdXRpbHMvTG9nZ2VyJztcblxuY29uc3QgcHJvZ3JhbSA9IG5ldyBDb21tYW5kKCk7XG5cbnByb2dyYW1cbiAgLm5hbWUoJ2Nkay1jb3N0LWFuYWx5emVyJylcbiAgLmRlc2NyaXB0aW9uKCdBbmFseXplIEFXUyBDREsgaW5mcmFzdHJ1Y3R1cmUgY2hhbmdlcyBhbmQgcHJvdmlkZSBjb3N0IGltcGFjdCBzdW1tYXJpZXMnKVxuICAudmVyc2lvbignMS4wLjAnKTtcblxuLy8gT3JpZ2luYWwgY29tbWFuZCBmb3IgZGlyZWN0IHRlbXBsYXRlIGNvbXBhcmlzb25cbnByb2dyYW1cbiAgLmNvbW1hbmQoJ2NvbXBhcmUnKVxuICAuZGVzY3JpcHRpb24oJ0NvbXBhcmUgdHdvIENsb3VkRm9ybWF0aW9uIHRlbXBsYXRlcycpXG4gIC5hcmd1bWVudCgnPGJhc2U+JywgJ1BhdGggdG8gYmFzZSBDbG91ZEZvcm1hdGlvbiB0ZW1wbGF0ZScpXG4gIC5hcmd1bWVudCgnPHRhcmdldD4nLCAnUGF0aCB0byB0YXJnZXQgQ2xvdWRGb3JtYXRpb24gdGVtcGxhdGUnKVxuICAub3B0aW9uKCctLXJlZ2lvbiA8cmVnaW9uPicsICdBV1MgcmVnaW9uJywgJ2V1LWNlbnRyYWwtMScpXG4gIC5vcHRpb24oJy0tZm9ybWF0IDxmb3JtYXQ+JywgJ091dHB1dCBmb3JtYXQ6IHRleHR8anNvbnxtYXJrZG93bicsICd0ZXh0JylcbiAgLm9wdGlvbignLS1jb25maWcgPHBhdGg+JywgJ1BhdGggdG8gY29uZmlndXJhdGlvbiBmaWxlJylcbiAgLm9wdGlvbignLS1kZWJ1ZycsICdFbmFibGUgdmVyYm9zZSBkZWJ1ZyBsb2dnaW5nIGZvciBwcmljaW5nIEFQSSBjYWxscycpXG4gIC5hY3Rpb24oYXN5bmMgKGJhc2VQYXRoOiBzdHJpbmcsIHRhcmdldFBhdGg6IHN0cmluZywgb3B0aW9uczogeyByZWdpb246IHN0cmluZzsgZm9ybWF0OiBzdHJpbmc7IGNvbmZpZz86IHN0cmluZzsgZGVidWc/OiBib29sZWFuIH0pID0+IHtcbiAgICB0cnkge1xuICAgICAgLy8gRW5hYmxlIGRlYnVnIGxvZ2dpbmcgaWYgZmxhZyBpcyBzZXRcbiAgICAgIGlmIChvcHRpb25zLmRlYnVnKSB7XG4gICAgICAgIExvZ2dlci5zZXREZWJ1Z0VuYWJsZWQodHJ1ZSk7XG4gICAgICAgIExvZ2dlci5kZWJ1ZygnRGVidWcgbG9nZ2luZyBlbmFibGVkJyk7XG4gICAgICB9XG5cbiAgICAgIGlmICghZnMuZXhpc3RzU3luYyhiYXNlUGF0aCkpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3I6IEJhc2UgdGVtcGxhdGUgZmlsZSBub3QgZm91bmQ6ICR7YmFzZVBhdGh9YCk7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHRhcmdldFBhdGgpKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yOiBUYXJnZXQgdGVtcGxhdGUgZmlsZSBub3QgZm91bmQ6ICR7dGFyZ2V0UGF0aH1gKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBiYXNlVGVtcGxhdGUgPSBmcy5yZWFkRmlsZVN5bmMoYmFzZVBhdGgsICd1dGYtOCcpO1xuICAgICAgY29uc3QgdGFyZ2V0VGVtcGxhdGUgPSBmcy5yZWFkRmlsZVN5bmModGFyZ2V0UGF0aCwgJ3V0Zi04Jyk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGFuYWx5emVDb3N0cyh7XG4gICAgICAgIGJhc2VUZW1wbGF0ZSxcbiAgICAgICAgdGFyZ2V0VGVtcGxhdGUsXG4gICAgICAgIHJlZ2lvbjogb3B0aW9ucy5yZWdpb24sXG4gICAgICAgIGZvcm1hdDogb3B0aW9ucy5mb3JtYXQgYXMgJ3RleHQnIHwgJ2pzb24nIHwgJ21hcmtkb3duJyxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAob3B0aW9ucy5mb3JtYXQgPT09ICdqc29uJykge1xuICAgICAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShyZXN1bHQsIG51bGwsIDIpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKHJlc3VsdC5zdW1tYXJ5KTtcbiAgICAgIH1cblxuICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBFcnJvcjogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3I6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gIH0pO1xuXG4vLyBOZXcgcGlwZWxpbmUgY29tbWFuZCBmb3IgQ0kvQ0QgaW50ZWdyYXRpb24gd2l0aCBzeW50aGVzaXNcbnByb2dyYW1cbiAgLmNvbW1hbmQoJ3BpcGVsaW5lJylcbiAgLmRlc2NyaXB0aW9uKCdSdW4gY29zdCBhbmFseXNpcyBpbiBDSS9DRCBwaXBlbGluZSB3aXRoIGF1dG9tYXRpYyBzeW50aGVzaXMnKVxuICAub3B0aW9uKCctLWJhc2UgPHBhdGg+JywgJ1BhdGggdG8gYmFzZSB0ZW1wbGF0ZSAoaWYgbm90IHVzaW5nIHN5bnRoZXNpcyknKVxuICAub3B0aW9uKCctLXRhcmdldCA8cGF0aD4nLCAnUGF0aCB0byB0YXJnZXQgdGVtcGxhdGUgKGlmIG5vdCB1c2luZyBzeW50aGVzaXMpJylcbiAgLm9wdGlvbignLS1zeW50aCcsICdFbmFibGUgYXV0b21hdGljIENESyBzeW50aGVzaXMnKVxuICAub3B0aW9uKCctLWNkay1hcHAtcGF0aCA8cGF0aD4nLCAnUGF0aCB0byBDREsgYXBwbGljYXRpb24gZGlyZWN0b3J5JylcbiAgLm9wdGlvbignLS1yZWdpb24gPHJlZ2lvbj4nLCAnQVdTIHJlZ2lvbicsICdldS1jZW50cmFsLTEnKVxuICAub3B0aW9uKCctLWNvbmZpZyA8cGF0aD4nLCAnUGF0aCB0byBjb25maWd1cmF0aW9uIGZpbGUnKVxuICAub3B0aW9uKCctLWVudmlyb25tZW50IDxlbnY+JywgJ0Vudmlyb25tZW50IG5hbWUgZm9yIHRocmVzaG9sZCBzZWxlY3Rpb24nKVxuICAub3B0aW9uKCctLWZvcm1hdCA8Zm9ybWF0PicsICdPdXRwdXQgZm9ybWF0OiB0ZXh0fGpzb258bWFya2Rvd24nLCAndGV4dCcpXG4gIC5vcHRpb24oJy0tcG9zdC10by1naXRsYWInLCAnUG9zdCByZXN1bHRzIHRvIEdpdExhYiBtZXJnZSByZXF1ZXN0JylcbiAgLm9wdGlvbignLS1kZWJ1ZycsICdFbmFibGUgdmVyYm9zZSBkZWJ1ZyBsb2dnaW5nIGZvciBwcmljaW5nIEFQSSBjYWxscycpXG4gIC5hY3Rpb24oYXN5bmMgKG9wdGlvbnM6IHtcbiAgICBiYXNlPzogc3RyaW5nO1xuICAgIHRhcmdldD86IHN0cmluZztcbiAgICBzeW50aD86IGJvb2xlYW47XG4gICAgY2RrQXBwUGF0aD86IHN0cmluZztcbiAgICByZWdpb246IHN0cmluZztcbiAgICBjb25maWc/OiBzdHJpbmc7XG4gICAgZW52aXJvbm1lbnQ/OiBzdHJpbmc7XG4gICAgZm9ybWF0OiBzdHJpbmc7XG4gICAgcG9zdFRvR2l0bGFiPzogYm9vbGVhbjtcbiAgICBkZWJ1Zz86IGJvb2xlYW47XG4gIH0pID0+IHtcbiAgICB0cnkge1xuICAgICAgLy8gRW5hYmxlIGRlYnVnIGxvZ2dpbmcgaWYgZmxhZyBpcyBzZXRcbiAgICAgIGlmIChvcHRpb25zLmRlYnVnKSB7XG4gICAgICAgIExvZ2dlci5zZXREZWJ1Z0VuYWJsZWQodHJ1ZSk7XG4gICAgICAgIExvZ2dlci5kZWJ1ZygnRGVidWcgbG9nZ2luZyBlbmFibGVkJyk7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIEFXUyBjcmVkZW50aWFsc1xuICAgICAgaWYgKCFwcm9jZXNzLmVudi5BV1NfQUNDRVNTX0tFWV9JRCAmJiAhcHJvY2Vzcy5lbnYuQVdTX1BST0ZJTEUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3I6IEFXUyBjcmVkZW50aWFscyBub3QgY29uZmlndXJlZCcpO1xuICAgICAgICBjb25zb2xlLmVycm9yKCcnKTtcbiAgICAgICAgY29uc29sZS5lcnJvcignUGxlYXNlIHNldCBBV1MgY3JlZGVudGlhbHMgdXNpbmcgb25lIG9mOicpO1xuICAgICAgICBjb25zb2xlLmVycm9yKCcgIC0gQVdTX0FDQ0VTU19LRVlfSUQgYW5kIEFXU19TRUNSRVRfQUNDRVNTX0tFWSBlbnZpcm9ubWVudCB2YXJpYWJsZXMnKTtcbiAgICAgICAgY29uc29sZS5lcnJvcignICAtIEFXU19QUk9GSUxFIGVudmlyb25tZW50IHZhcmlhYmxlJyk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJyAgLSBBV1MgY3JlZGVudGlhbHMgZmlsZSAofi8uYXdzL2NyZWRlbnRpYWxzKScpO1xuICAgICAgICBjb25zb2xlLmVycm9yKCcnKTtcbiAgICAgICAgY29uc29sZS5lcnJvcignRm9yIEdpdExhYiBDSSwgY29uZmlndXJlIEFXUyBjcmVkZW50aWFscyBpbiBDSS9DRCB2YXJpYWJsZXM6Jyk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJyAgU2V0dGluZ3MgPiBDSS9DRCA+IFZhcmlhYmxlcycpO1xuICAgICAgICBjb25zb2xlLmVycm9yKCcgIEFkZDogQVdTX0FDQ0VTU19LRVlfSUQsIEFXU19TRUNSRVRfQUNDRVNTX0tFWSwgQVdTX1JFR0lPTicpO1xuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG9yY2hlc3RyYXRvciA9IG5ldyBQaXBlbGluZU9yY2hlc3RyYXRvcigpO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBvcmNoZXN0cmF0b3IucnVuUGlwZWxpbmVBbmFseXNpcyh7XG4gICAgICAgIGJhc2VUZW1wbGF0ZTogb3B0aW9ucy5iYXNlLFxuICAgICAgICB0YXJnZXRUZW1wbGF0ZTogb3B0aW9ucy50YXJnZXQsXG4gICAgICAgIHN5bnRoZXNpemU6IG9wdGlvbnMuc3ludGgsXG4gICAgICAgIGNka0FwcFBhdGg6IG9wdGlvbnMuY2RrQXBwUGF0aCxcbiAgICAgICAgcmVnaW9uOiBvcHRpb25zLnJlZ2lvbixcbiAgICAgICAgY29uZmlnUGF0aDogb3B0aW9ucy5jb25maWcsXG4gICAgICAgIGVudmlyb25tZW50OiBvcHRpb25zLmVudmlyb25tZW50LFxuICAgICAgfSk7XG5cbiAgICAgIC8vIERpc3BsYXkgcmVzdWx0c1xuICAgICAgaWYgKG9wdGlvbnMuZm9ybWF0ID09PSAnanNvbicpIHtcbiAgICAgICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkocmVzdWx0LCBudWxsLCAyKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmxvZyhyZXN1bHQuY29zdEFuYWx5c2lzLnN1bW1hcnkpO1xuICAgICAgICBjb25zb2xlLmxvZygnJyk7XG5cbiAgICAgICAgLy8gRGlzcGxheSB0aHJlc2hvbGQgc3RhdHVzXG4gICAgICAgIGlmIChyZXN1bHQudGhyZXNob2xkU3RhdHVzLmxldmVsICE9PSAnbm9uZScpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZygnPScucmVwZWF0KDgwKSk7XG4gICAgICAgICAgY29uc29sZS5sb2coJ1RIUkVTSE9MRCBTVEFUVVMnKTtcbiAgICAgICAgICBjb25zb2xlLmxvZygnPScucmVwZWF0KDgwKSk7XG4gICAgICAgICAgY29uc29sZS5sb2cocmVzdWx0LnRocmVzaG9sZFN0YXR1cy5tZXNzYWdlKTtcbiAgICAgICAgICBjb25zb2xlLmxvZygnJyk7XG5cbiAgICAgICAgICBpZiAocmVzdWx0LnRocmVzaG9sZFN0YXR1cy5yZWNvbW1lbmRhdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ1JlY29tbWVuZGF0aW9uczonKTtcbiAgICAgICAgICAgIHJlc3VsdC50aHJlc2hvbGRTdGF0dXMucmVjb21tZW5kYXRpb25zLmZvckVhY2goKHJlYywgaSkgPT4ge1xuICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgJHtpICsgMX0uICR7cmVjfWApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGlzcGxheSBjb25maWcgc3VtbWFyeVxuICAgICAgICBpZiAocmVzdWx0LmNvbmZpZ1VzZWQuY29uZmlnUGF0aCB8fCByZXN1bHQuY29uZmlnVXNlZC50aHJlc2hvbGRzKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coJz0nLnJlcGVhdCg4MCkpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdDT05GSUdVUkFUSU9OJyk7XG4gICAgICAgICAgY29uc29sZS5sb2coJz0nLnJlcGVhdCg4MCkpO1xuICAgICAgICAgIGlmIChyZXN1bHQuY29uZmlnVXNlZC5jb25maWdQYXRoKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgQ29uZmlnIGZpbGU6ICR7cmVzdWx0LmNvbmZpZ1VzZWQuY29uZmlnUGF0aH1gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHJlc3VsdC5jb25maWdVc2VkLnRocmVzaG9sZHMpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBUaHJlc2hvbGRzOiB3YXJuaW5nPSQke3Jlc3VsdC5jb25maWdVc2VkLnRocmVzaG9sZHMud2FybmluZyB8fCAnbm9uZSd9LCBlcnJvcj0kJHtyZXN1bHQuY29uZmlnVXNlZC50aHJlc2hvbGRzLmVycm9yIHx8ICdub25lJ31gKTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQuY29uZmlnVXNlZC50aHJlc2hvbGRzLmVudmlyb25tZW50KSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBFbnZpcm9ubWVudDogJHtyZXN1bHQuY29uZmlnVXNlZC50aHJlc2hvbGRzLmVudmlyb25tZW50fWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocmVzdWx0LmNvbmZpZ1VzZWQuZXhjbHVkZWRSZXNvdXJjZVR5cGVzPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBFeGNsdWRlZCByZXNvdXJjZXM6ICR7cmVzdWx0LmNvbmZpZ1VzZWQuZXhjbHVkZWRSZXNvdXJjZVR5cGVzLmpvaW4oJywgJyl9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnNvbGUubG9nKCcnKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBQb3N0IHRvIEdpdExhYiBpZiByZXF1ZXN0ZWRcbiAgICAgIGlmIChvcHRpb25zLnBvc3RUb0dpdGxhYikge1xuICAgICAgICBjb25zdCBnaXRsYWJUb2tlbiA9IHByb2Nlc3MuZW52LkdJVExBQl9UT0tFTiB8fCBwcm9jZXNzLmVudi5DSV9KT0JfVE9LRU47XG4gICAgICAgIGNvbnN0IHByb2plY3RJZCA9IHByb2Nlc3MuZW52LkNJX1BST0pFQ1RfSUQ7XG4gICAgICAgIGNvbnN0IG1lcmdlUmVxdWVzdElpZCA9IHByb2Nlc3MuZW52LkNJX01FUkdFX1JFUVVFU1RfSUlEO1xuICAgICAgICBjb25zdCBnaXRsYWJVcmwgPSBwcm9jZXNzLmVudi5DSV9TRVJWRVJfVVJMO1xuXG4gICAgICAgIGlmICghZ2l0bGFiVG9rZW4gfHwgIXByb2plY3RJZCB8fCAhbWVyZ2VSZXF1ZXN0SWlkIHx8ICFnaXRsYWJVcmwpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdXYXJuaW5nOiBHaXRMYWIgZW52aXJvbm1lbnQgdmFyaWFibGVzIG5vdCBmb3VuZC4gU2tpcHBpbmcgR2l0TGFiIHBvc3QuJyk7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignUmVxdWlyZWQ6IENJX0pPQl9UT0tFTiwgQ0lfUFJPSkVDVF9JRCwgQ0lfTUVSR0VfUkVRVUVTVF9JSUQsIENJX1NFUlZFUl9VUkwnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgZ2l0bGFiID0gbmV3IEdpdExhYkludGVncmF0aW9uKHtcbiAgICAgICAgICAgICAgdG9rZW46IGdpdGxhYlRva2VuLFxuICAgICAgICAgICAgICBhcGlVcmw6IGdpdGxhYlVybCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYXdhaXQgZ2l0bGFiLnBvc3RNZXJnZVJlcXVlc3RDb21tZW50KFxuICAgICAgICAgICAgICBwcm9qZWN0SWQsXG4gICAgICAgICAgICAgIG1lcmdlUmVxdWVzdElpZCxcbiAgICAgICAgICAgICAgcmVzdWx0LmNvc3RBbmFseXNpcy5zdW1tYXJ5LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdSZXN1bHRzIHBvc3RlZCB0byBHaXRMYWIgbWVyZ2UgcmVxdWVzdCcpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBXYXJuaW5nOiBGYWlsZWQgdG8gcG9zdCB0byBHaXRMYWI6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBFeGl0IHdpdGggYXBwcm9wcmlhdGUgY29kZSBiYXNlZCBvbiB0aHJlc2hvbGRcbiAgICAgIGlmIChyZXN1bHQudGhyZXNob2xkU3RhdHVzLmxldmVsID09PSAnZXJyb3InICYmICFyZXN1bHQudGhyZXNob2xkU3RhdHVzLnBhc3NlZCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdQaXBlbGluZSBmYWlsZWQ6IENvc3QgdGhyZXNob2xkIGV4Y2VlZGVkJyk7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgyKTtcbiAgICAgIH1cblxuICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBFcnJvcjogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3I6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gIH0pO1xuXG4vLyBEZWZhdWx0IHRvIGNvbXBhcmUgY29tbWFuZCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eVxucHJvZ3JhbVxuICAuYXJndW1lbnQoJ1tiYXNlXScsICdQYXRoIHRvIGJhc2UgQ2xvdWRGb3JtYXRpb24gdGVtcGxhdGUnKVxuICAuYXJndW1lbnQoJ1t0YXJnZXRdJywgJ1BhdGggdG8gdGFyZ2V0IENsb3VkRm9ybWF0aW9uIHRlbXBsYXRlJylcbiAgLm9wdGlvbignLS1yZWdpb24gPHJlZ2lvbj4nLCAnQVdTIHJlZ2lvbicsICdldS1jZW50cmFsLTEnKVxuICAub3B0aW9uKCctLWZvcm1hdCA8Zm9ybWF0PicsICdPdXRwdXQgZm9ybWF0OiB0ZXh0fGpzb258bWFya2Rvd24nLCAndGV4dCcpXG4gIC5vcHRpb24oJy0tY29uZmlnIDxwYXRoPicsICdQYXRoIHRvIGNvbmZpZ3VyYXRpb24gZmlsZScpXG4gIC5vcHRpb24oJy0tZGVidWcnLCAnRW5hYmxlIHZlcmJvc2UgZGVidWcgbG9nZ2luZyBmb3IgcHJpY2luZyBBUEkgY2FsbHMnKVxuICAuYWN0aW9uKGFzeW5jIChiYXNlUGF0aD86IHN0cmluZywgdGFyZ2V0UGF0aD86IHN0cmluZywgb3B0aW9ucz86IHsgcmVnaW9uOiBzdHJpbmc7IGZvcm1hdDogc3RyaW5nOyBjb25maWc/OiBzdHJpbmc7IGRlYnVnPzogYm9vbGVhbiB9KSA9PiB7XG4gICAgaWYgKCFiYXNlUGF0aCB8fCAhdGFyZ2V0UGF0aCkge1xuICAgICAgcHJvZ3JhbS5oZWxwKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIC8vIEVuYWJsZSBkZWJ1ZyBsb2dnaW5nIGlmIGZsYWcgaXMgc2V0XG4gICAgICBpZiAob3B0aW9ucz8uZGVidWcpIHtcbiAgICAgICAgTG9nZ2VyLnNldERlYnVnRW5hYmxlZCh0cnVlKTtcbiAgICAgICAgTG9nZ2VyLmRlYnVnKCdEZWJ1ZyBsb2dnaW5nIGVuYWJsZWQnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKGJhc2VQYXRoKSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBFcnJvcjogQmFzZSB0ZW1wbGF0ZSBmaWxlIG5vdCBmb3VuZDogJHtiYXNlUGF0aH1gKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWZzLmV4aXN0c1N5bmModGFyZ2V0UGF0aCkpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3I6IFRhcmdldCB0ZW1wbGF0ZSBmaWxlIG5vdCBmb3VuZDogJHt0YXJnZXRQYXRofWApO1xuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGJhc2VUZW1wbGF0ZSA9IGZzLnJlYWRGaWxlU3luYyhiYXNlUGF0aCwgJ3V0Zi04Jyk7XG4gICAgICBjb25zdCB0YXJnZXRUZW1wbGF0ZSA9IGZzLnJlYWRGaWxlU3luYyh0YXJnZXRQYXRoLCAndXRmLTgnKTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYW5hbHl6ZUNvc3RzKHtcbiAgICAgICAgYmFzZVRlbXBsYXRlLFxuICAgICAgICB0YXJnZXRUZW1wbGF0ZSxcbiAgICAgICAgcmVnaW9uOiBvcHRpb25zPy5yZWdpb24gfHwgJ2V1LWNlbnRyYWwtMScsXG4gICAgICAgIGZvcm1hdDogKG9wdGlvbnM/LmZvcm1hdCBhcyAndGV4dCcgfCAnanNvbicgfCAnbWFya2Rvd24nKSB8fCAndGV4dCcsXG4gICAgICB9KTtcblxuICAgICAgaWYgKG9wdGlvbnM/LmZvcm1hdCA9PT0gJ2pzb24nKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KHJlc3VsdCwgbnVsbCwgMikpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5sb2cocmVzdWx0LnN1bW1hcnkpO1xuICAgICAgfVxuXG4gICAgICBwcm9jZXNzLmV4aXQoMCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBFcnJvcjogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgfSk7XG5cbnByb2dyYW0ucGFyc2UoKTtcbiJdfQ==
|
|
270
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2xpL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVBLHVDQUF5QjtBQUN6Qix5Q0FBb0M7QUFDcEMsZ0NBQTZEO0FBQzdELHlFQUFzRTtBQUN0RSwyRUFBd0U7QUFDeEUsNENBQXlDO0FBRXpDLE1BQU0sT0FBTyxHQUFHLElBQUksbUJBQU8sRUFBRSxDQUFDO0FBRTlCLE9BQU87S0FDSixJQUFJLENBQUMsbUJBQW1CLENBQUM7S0FDekIsV0FBVyxDQUFDLDBFQUEwRSxDQUFDO0tBQ3ZGLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUVwQixtREFBbUQ7QUFDbkQsT0FBTztLQUNKLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQztLQUM3QixXQUFXLENBQUMsOERBQThELENBQUM7S0FDM0UsTUFBTSxDQUFDLG1CQUFtQixFQUFFLHdCQUF3QixFQUFFLGNBQWMsQ0FBQztLQUNyRSxNQUFNLENBQUMsbUJBQW1CLEVBQUUsbUNBQW1DLEVBQUUsTUFBTSxDQUFDO0tBQ3hFLE1BQU0sQ0FBQyxpQkFBaUIsRUFBRSw0QkFBNEIsQ0FBQztLQUN2RCxNQUFNLENBQUMsU0FBUyxFQUFFLG9EQUFvRCxDQUFDO0tBQ3ZFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsWUFBb0IsRUFBRSxPQUE2RSxFQUFFLEVBQUU7SUFDcEgsSUFBSSxDQUFDO1FBQ0gsc0NBQXNDO1FBQ3RDLElBQUksT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2xCLGVBQU0sQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDN0IsZUFBTSxDQUFDLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1FBQ3hDLENBQUM7UUFFRCxnQ0FBZ0M7UUFDaEMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztZQUNq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QUFLLENBQUMsVUFBVSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUMzQyxDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU8sQ0FBQyxLQUFLLENBQUMsVUFBVSxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzNDLENBQUM7UUFDRCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xCLENBQUM7QUFDSCxDQUFDLENBQUMsQ0FBQztBQUVMLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIiMhL3Vzci9iaW4vZW52IG5vZGVcblxuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuaW1wb3J0IHsgQ29tbWFuZCB9IGZyb20gJ2NvbW1hbmRlcic7XG5pbXBvcnQgeyBhbmFseXplQ29zdHMsIGFuYWx5emVTaW5nbGVUZW1wbGF0ZSB9IGZyb20gJy4uL2FwaSc7XG5pbXBvcnQgeyBHaXRMYWJJbnRlZ3JhdGlvbiB9IGZyb20gJy4uL2ludGVncmF0aW9ucy9HaXRMYWJJbnRlZ3JhdGlvbic7XG5pbXBvcnQgeyBQaXBlbGluZU9yY2hlc3RyYXRvciB9IGZyb20gJy4uL3BpcGVsaW5lL1BpcGVsaW5lT3JjaGVzdHJhdG9yJztcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJy4uL3V0aWxzL0xvZ2dlcic7XG5cbmNvbnN0IHByb2dyYW0gPSBuZXcgQ29tbWFuZCgpO1xuXG5wcm9ncmFtXG4gIC5uYW1lKCdjZGstY29zdC1hbmFseXplcicpXG4gIC5kZXNjcmlwdGlvbignQW5hbHl6ZSBBV1MgQ0RLIGluZnJhc3RydWN0dXJlIGNoYW5nZXMgYW5kIHByb3ZpZGUgY29zdCBpbXBhY3Qgc3VtbWFyaWVzJylcbiAgLnZlcnNpb24oJzEuMC4wJyk7XG5cbi8vIE5ldyBhbmFseXplIGNvbW1hbmQgZm9yIHNpbmdsZSB0ZW1wbGF0ZSBhbmFseXNpc1xucHJvZ3JhbVxuICAuY29tbWFuZCgnYW5hbHl6ZSA8dGVtcGxhdGU+JylcbiAgLmRlc2NyaXB0aW9uKCdBbmFseXplIGEgc2luZ2xlIENsb3VkRm9ybWF0aW9uIHRlbXBsYXRlIGZvciBlc3RpbWF0ZWQgY29zdHMnKVxuICAub3B0aW9uKCctLXJlZ2lvbiA8cmVnaW9uPicsICdBV1MgcmVnaW9uIGZvciBwcmljaW5nJywgJ2V1LWNlbnRyYWwtMScpXG4gIC5vcHRpb24oJy0tZm9ybWF0IDxmb3JtYXQ+JywgJ091dHB1dCBmb3JtYXQ6IHRleHR8anNvbnxtYXJrZG93bicsICd0ZXh0JylcbiAgLm9wdGlvbignLS1jb25maWcgPHBhdGg+JywgJ1BhdGggdG8gY29uZmlndXJhdGlvbiBmaWxlJylcbiAgLm9wdGlvbignLS1kZWJ1ZycsICdFbmFibGUgdmVyYm9zZSBkZWJ1ZyBsb2dnaW5nIGZvciBwcmljaW5nIEFQSSBjYWxscycpXG4gIC5hY3Rpb24oYXN5bmMgKHRlbXBsYXRlUGF0aDogc3RyaW5nLCBvcHRpb25zOiB7IHJlZ2lvbjogc3RyaW5nOyBmb3JtYXQ6IHN0cmluZzsgY29uZmlnPzogc3RyaW5nOyBkZWJ1Zz86IGJvb2xlYW4gfSkgPT4ge1xuICAgIHRyeSB7XG4gICAgICAvLyBFbmFibGUgZGVidWcgbG9nZ2luZyBpZiBmbGFnIGlzIHNldFxuICAgICAgaWYgKG9wdGlvbnMuZGVidWcpIHtcbiAgICAgICAgTG9nZ2VyLnNldERlYnVnRW5hYmxlZCh0cnVlKTtcbiAgICAgICAgTG9nZ2VyLmRlYnVnKCdEZWJ1ZyBsb2dnaW5nIGVuYWJsZWQnKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgdGVtcGxhdGUgZmlsZSBleGlzdHNcbiAgICAgIGlmICghZnMuZXhpc3RzU3luYyh0ZW1wbGF0ZVBhdGgpKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yOiBUZW1wbGF0ZSBmaWxlIG5vdCBmb3VuZDogJHt0ZW1wbGF0ZVBhdGh9YCk7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgIH1cblxuICAgICAgLy8gUmVhZCB0aGUgdGVtcGxhdGVcbiAgICAgIGNvbnN0IHRlbXBsYXRlID0gZnMucmVhZEZpbGVTeW5jKHRlbXBsYXRlUGF0aCwgJ3V0Zi04Jyk7XG5cbiAgICAgIC8vIEFuYWx5emUgdGhlIHRlbXBsYXRlXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBhbmFseXplU2luZ2xlVGVtcGxhdGUoe1xuICAgICAgICB0ZW1wbGF0ZSxcbiAgICAgICAgcmVnaW9uOiBvcHRpb25zLnJlZ2lvbixcbiAgICAgICAgZm9ybWF0OiBvcHRpb25zLmZvcm1hdCBhcyAndGV4dCcgfCAnanNvbicgfCAnbWFya2Rvd24nLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIE91dHB1dCB0aGUgcmVzdWx0cyAoc3VtbWFyeSBhbHJlYWR5IGNvbnRhaW5zIGZvcm1hdHRlZCBvdXRwdXQpXG4gICAgICBjb25zb2xlLmxvZyhyZXN1bHQuc3VtbWFyeSk7XG5cbiAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3I6ICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICB9KTtcblxuLy8gT3JpZ2luYWwgY29tbWFuZCBmb3IgZGlyZWN0IHRlbXBsYXRlIGNvbXBhcmlzb25cbnByb2dyYW1cbiAgLmNvbW1hbmQoJ2NvbXBhcmUnKVxuICAuZGVzY3JpcHRpb24oJ0NvbXBhcmUgdHdvIENsb3VkRm9ybWF0aW9uIHRlbXBsYXRlcycpXG4gIC5hcmd1bWVudCgnPGJhc2U+JywgJ1BhdGggdG8gYmFzZSBDbG91ZEZvcm1hdGlvbiB0ZW1wbGF0ZScpXG4gIC5hcmd1bWVudCgnPHRhcmdldD4nLCAnUGF0aCB0byB0YXJnZXQgQ2xvdWRGb3JtYXRpb24gdGVtcGxhdGUnKVxuICAub3B0aW9uKCctLXJlZ2lvbiA8cmVnaW9uPicsICdBV1MgcmVnaW9uJywgJ2V1LWNlbnRyYWwtMScpXG4gIC5vcHRpb24oJy0tZm9ybWF0IDxmb3JtYXQ+JywgJ091dHB1dCBmb3JtYXQ6IHRleHR8anNvbnxtYXJrZG93bicsICd0ZXh0JylcbiAgLm9wdGlvbignLS1jb25maWcgPHBhdGg+JywgJ1BhdGggdG8gY29uZmlndXJhdGlvbiBmaWxlJylcbiAgLm9wdGlvbignLS1kZWJ1ZycsICdFbmFibGUgdmVyYm9zZSBkZWJ1ZyBsb2dnaW5nIGZvciBwcmljaW5nIEFQSSBjYWxscycpXG4gIC5hY3Rpb24oYXN5bmMgKGJhc2VQYXRoOiBzdHJpbmcsIHRhcmdldFBhdGg6IHN0cmluZywgb3B0aW9uczogeyByZWdpb246IHN0cmluZzsgZm9ybWF0OiBzdHJpbmc7IGNvbmZpZz86IHN0cmluZzsgZGVidWc/OiBib29sZWFuIH0pID0+IHtcbiAgICB0cnkge1xuICAgICAgLy8gRW5hYmxlIGRlYnVnIGxvZ2dpbmcgaWYgZmxhZyBpcyBzZXRcbiAgICAgIGlmIChvcHRpb25zLmRlYnVnKSB7XG4gICAgICAgIExvZ2dlci5zZXREZWJ1Z0VuYWJsZWQodHJ1ZSk7XG4gICAgICAgIExvZ2dlci5kZWJ1ZygnRGVidWcgbG9nZ2luZyBlbmFibGVkJyk7XG4gICAgICB9XG5cbiAgICAgIGlmICghZnMuZXhpc3RzU3luYyhiYXNlUGF0aCkpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3I6IEJhc2UgdGVtcGxhdGUgZmlsZSBub3QgZm91bmQ6ICR7YmFzZVBhdGh9YCk7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHRhcmdldFBhdGgpKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yOiBUYXJnZXQgdGVtcGxhdGUgZmlsZSBub3QgZm91bmQ6ICR7dGFyZ2V0UGF0aH1gKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBiYXNlVGVtcGxhdGUgPSBmcy5yZWFkRmlsZVN5bmMoYmFzZVBhdGgsICd1dGYtOCcpO1xuICAgICAgY29uc3QgdGFyZ2V0VGVtcGxhdGUgPSBmcy5yZWFkRmlsZVN5bmModGFyZ2V0UGF0aCwgJ3V0Zi04Jyk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGFuYWx5emVDb3N0cyh7XG4gICAgICAgIGJhc2VUZW1wbGF0ZSxcbiAgICAgICAgdGFyZ2V0VGVtcGxhdGUsXG4gICAgICAgIHJlZ2lvbjogb3B0aW9ucy5yZWdpb24sXG4gICAgICAgIGZvcm1hdDogb3B0aW9ucy5mb3JtYXQgYXMgJ3RleHQnIHwgJ2pzb24nIHwgJ21hcmtkb3duJyxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAob3B0aW9ucy5mb3JtYXQgPT09ICdqc29uJykge1xuICAgICAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShyZXN1bHQsIG51bGwsIDIpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKHJlc3VsdC5zdW1tYXJ5KTtcbiAgICAgIH1cblxuICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBFcnJvcjogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3I6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gIH0pO1xuXG4vLyBOZXcgcGlwZWxpbmUgY29tbWFuZCBmb3IgQ0kvQ0QgaW50ZWdyYXRpb24gd2l0aCBzeW50aGVzaXNcbnByb2dyYW1cbiAgLmNvbW1hbmQoJ3BpcGVsaW5lJylcbiAgLmRlc2NyaXB0aW9uKCdSdW4gY29zdCBhbmFseXNpcyBpbiBDSS9DRCBwaXBlbGluZSB3aXRoIGF1dG9tYXRpYyBzeW50aGVzaXMnKVxuICAub3B0aW9uKCctLWJhc2UgPHBhdGg+JywgJ1BhdGggdG8gYmFzZSB0ZW1wbGF0ZSAoaWYgbm90IHVzaW5nIHN5bnRoZXNpcyknKVxuICAub3B0aW9uKCctLXRhcmdldCA8cGF0aD4nLCAnUGF0aCB0byB0YXJnZXQgdGVtcGxhdGUgKGlmIG5vdCB1c2luZyBzeW50aGVzaXMpJylcbiAgLm9wdGlvbignLS1zeW50aCcsICdFbmFibGUgYXV0b21hdGljIENESyBzeW50aGVzaXMnKVxuICAub3B0aW9uKCctLWNkay1hcHAtcGF0aCA8cGF0aD4nLCAnUGF0aCB0byBDREsgYXBwbGljYXRpb24gZGlyZWN0b3J5JylcbiAgLm9wdGlvbignLS1yZWdpb24gPHJlZ2lvbj4nLCAnQVdTIHJlZ2lvbicsICdldS1jZW50cmFsLTEnKVxuICAub3B0aW9uKCctLWNvbmZpZyA8cGF0aD4nLCAnUGF0aCB0byBjb25maWd1cmF0aW9uIGZpbGUnKVxuICAub3B0aW9uKCctLWVudmlyb25tZW50IDxlbnY+JywgJ0Vudmlyb25tZW50IG5hbWUgZm9yIHRocmVzaG9sZCBzZWxlY3Rpb24nKVxuICAub3B0aW9uKCctLWZvcm1hdCA8Zm9ybWF0PicsICdPdXRwdXQgZm9ybWF0OiB0ZXh0fGpzb258bWFya2Rvd24nLCAndGV4dCcpXG4gIC5vcHRpb24oJy0tcG9zdC10by1naXRsYWInLCAnUG9zdCByZXN1bHRzIHRvIEdpdExhYiBtZXJnZSByZXF1ZXN0JylcbiAgLm9wdGlvbignLS1kZWJ1ZycsICdFbmFibGUgdmVyYm9zZSBkZWJ1ZyBsb2dnaW5nIGZvciBwcmljaW5nIEFQSSBjYWxscycpXG4gIC5hY3Rpb24oYXN5bmMgKG9wdGlvbnM6IHtcbiAgICBiYXNlPzogc3RyaW5nO1xuICAgIHRhcmdldD86IHN0cmluZztcbiAgICBzeW50aD86IGJvb2xlYW47XG4gICAgY2RrQXBwUGF0aD86IHN0cmluZztcbiAgICByZWdpb246IHN0cmluZztcbiAgICBjb25maWc/OiBzdHJpbmc7XG4gICAgZW52aXJvbm1lbnQ/OiBzdHJpbmc7XG4gICAgZm9ybWF0OiBzdHJpbmc7XG4gICAgcG9zdFRvR2l0bGFiPzogYm9vbGVhbjtcbiAgICBkZWJ1Zz86IGJvb2xlYW47XG4gIH0pID0+IHtcbiAgICB0cnkge1xuICAgICAgLy8gRW5hYmxlIGRlYnVnIGxvZ2dpbmcgaWYgZmxhZyBpcyBzZXRcbiAgICAgIGlmIChvcHRpb25zLmRlYnVnKSB7XG4gICAgICAgIExvZ2dlci5zZXREZWJ1Z0VuYWJsZWQodHJ1ZSk7XG4gICAgICAgIExvZ2dlci5kZWJ1ZygnRGVidWcgbG9nZ2luZyBlbmFibGVkJyk7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIEFXUyBjcmVkZW50aWFsc1xuICAgICAgaWYgKCFwcm9jZXNzLmVudi5BV1NfQUNDRVNTX0tFWV9JRCAmJiAhcHJvY2Vzcy5lbnYuQVdTX1BST0ZJTEUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3I6IEFXUyBjcmVkZW50aWFscyBub3QgY29uZmlndXJlZCcpO1xuICAgICAgICBjb25zb2xlLmVycm9yKCcnKTtcbiAgICAgICAgY29uc29sZS5lcnJvcignUGxlYXNlIHNldCBBV1MgY3JlZGVudGlhbHMgdXNpbmcgb25lIG9mOicpO1xuICAgICAgICBjb25zb2xlLmVycm9yKCcgIC0gQVdTX0FDQ0VTU19LRVlfSUQgYW5kIEFXU19TRUNSRVRfQUNDRVNTX0tFWSBlbnZpcm9ubWVudCB2YXJpYWJsZXMnKTtcbiAgICAgICAgY29uc29sZS5lcnJvcignICAtIEFXU19QUk9GSUxFIGVudmlyb25tZW50IHZhcmlhYmxlJyk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJyAgLSBBV1MgY3JlZGVudGlhbHMgZmlsZSAofi8uYXdzL2NyZWRlbnRpYWxzKScpO1xuICAgICAgICBjb25zb2xlLmVycm9yKCcnKTtcbiAgICAgICAgY29uc29sZS5lcnJvcignRm9yIEdpdExhYiBDSSwgY29uZmlndXJlIEFXUyBjcmVkZW50aWFscyBpbiBDSS9DRCB2YXJpYWJsZXM6Jyk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJyAgU2V0dGluZ3MgPiBDSS9DRCA+IFZhcmlhYmxlcycpO1xuICAgICAgICBjb25zb2xlLmVycm9yKCcgIEFkZDogQVdTX0FDQ0VTU19LRVlfSUQsIEFXU19TRUNSRVRfQUNDRVNTX0tFWSwgQVdTX1JFR0lPTicpO1xuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG9yY2hlc3RyYXRvciA9IG5ldyBQaXBlbGluZU9yY2hlc3RyYXRvcigpO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBvcmNoZXN0cmF0b3IucnVuUGlwZWxpbmVBbmFseXNpcyh7XG4gICAgICAgIGJhc2VUZW1wbGF0ZTogb3B0aW9ucy5iYXNlLFxuICAgICAgICB0YXJnZXRUZW1wbGF0ZTogb3B0aW9ucy50YXJnZXQsXG4gICAgICAgIHN5bnRoZXNpemU6IG9wdGlvbnMuc3ludGgsXG4gICAgICAgIGNka0FwcFBhdGg6IG9wdGlvbnMuY2RrQXBwUGF0aCxcbiAgICAgICAgcmVnaW9uOiBvcHRpb25zLnJlZ2lvbixcbiAgICAgICAgY29uZmlnUGF0aDogb3B0aW9ucy5jb25maWcsXG4gICAgICAgIGVudmlyb25tZW50OiBvcHRpb25zLmVudmlyb25tZW50LFxuICAgICAgfSk7XG5cbiAgICAgIC8vIERpc3BsYXkgcmVzdWx0c1xuICAgICAgaWYgKG9wdGlvbnMuZm9ybWF0ID09PSAnanNvbicpIHtcbiAgICAgICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkocmVzdWx0LCBudWxsLCAyKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmxvZyhyZXN1bHQuY29zdEFuYWx5c2lzLnN1bW1hcnkpO1xuICAgICAgICBjb25zb2xlLmxvZygnJyk7XG5cbiAgICAgICAgLy8gRGlzcGxheSB0aHJlc2hvbGQgc3RhdHVzXG4gICAgICAgIGlmIChyZXN1bHQudGhyZXNob2xkU3RhdHVzLmxldmVsICE9PSAnbm9uZScpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZygnPScucmVwZWF0KDgwKSk7XG4gICAgICAgICAgY29uc29sZS5sb2coJ1RIUkVTSE9MRCBTVEFUVVMnKTtcbiAgICAgICAgICBjb25zb2xlLmxvZygnPScucmVwZWF0KDgwKSk7XG4gICAgICAgICAgY29uc29sZS5sb2cocmVzdWx0LnRocmVzaG9sZFN0YXR1cy5tZXNzYWdlKTtcbiAgICAgICAgICBjb25zb2xlLmxvZygnJyk7XG5cbiAgICAgICAgICBpZiAocmVzdWx0LnRocmVzaG9sZFN0YXR1cy5yZWNvbW1lbmRhdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ1JlY29tbWVuZGF0aW9uczonKTtcbiAgICAgICAgICAgIHJlc3VsdC50aHJlc2hvbGRTdGF0dXMucmVjb21tZW5kYXRpb25zLmZvckVhY2goKHJlYywgaSkgPT4ge1xuICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgJHtpICsgMX0uICR7cmVjfWApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGlzcGxheSBjb25maWcgc3VtbWFyeVxuICAgICAgICBpZiAocmVzdWx0LmNvbmZpZ1VzZWQuY29uZmlnUGF0aCB8fCByZXN1bHQuY29uZmlnVXNlZC50aHJlc2hvbGRzKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coJz0nLnJlcGVhdCg4MCkpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdDT05GSUdVUkFUSU9OJyk7XG4gICAgICAgICAgY29uc29sZS5sb2coJz0nLnJlcGVhdCg4MCkpO1xuICAgICAgICAgIGlmIChyZXN1bHQuY29uZmlnVXNlZC5jb25maWdQYXRoKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgQ29uZmlnIGZpbGU6ICR7cmVzdWx0LmNvbmZpZ1VzZWQuY29uZmlnUGF0aH1gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHJlc3VsdC5jb25maWdVc2VkLnRocmVzaG9sZHMpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBUaHJlc2hvbGRzOiB3YXJuaW5nPSQke3Jlc3VsdC5jb25maWdVc2VkLnRocmVzaG9sZHMud2FybmluZyB8fCAnbm9uZSd9LCBlcnJvcj0kJHtyZXN1bHQuY29uZmlnVXNlZC50aHJlc2hvbGRzLmVycm9yIHx8ICdub25lJ31gKTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQuY29uZmlnVXNlZC50aHJlc2hvbGRzLmVudmlyb25tZW50KSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBFbnZpcm9ubWVudDogJHtyZXN1bHQuY29uZmlnVXNlZC50aHJlc2hvbGRzLmVudmlyb25tZW50fWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocmVzdWx0LmNvbmZpZ1VzZWQuZXhjbHVkZWRSZXNvdXJjZVR5cGVzPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBFeGNsdWRlZCByZXNvdXJjZXM6ICR7cmVzdWx0LmNvbmZpZ1VzZWQuZXhjbHVkZWRSZXNvdXJjZVR5cGVzLmpvaW4oJywgJyl9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnNvbGUubG9nKCcnKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBQb3N0IHRvIEdpdExhYiBpZiByZXF1ZXN0ZWRcbiAgICAgIGlmIChvcHRpb25zLnBvc3RUb0dpdGxhYikge1xuICAgICAgICBjb25zdCBnaXRsYWJUb2tlbiA9IHByb2Nlc3MuZW52LkdJVExBQl9UT0tFTiB8fCBwcm9jZXNzLmVudi5DSV9KT0JfVE9LRU47XG4gICAgICAgIGNvbnN0IHByb2plY3RJZCA9IHByb2Nlc3MuZW52LkNJX1BST0pFQ1RfSUQ7XG4gICAgICAgIGNvbnN0IG1lcmdlUmVxdWVzdElpZCA9IHByb2Nlc3MuZW52LkNJX01FUkdFX1JFUVVFU1RfSUlEO1xuICAgICAgICBjb25zdCBnaXRsYWJVcmwgPSBwcm9jZXNzLmVudi5DSV9TRVJWRVJfVVJMO1xuXG4gICAgICAgIGlmICghZ2l0bGFiVG9rZW4gfHwgIXByb2plY3RJZCB8fCAhbWVyZ2VSZXF1ZXN0SWlkIHx8ICFnaXRsYWJVcmwpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdXYXJuaW5nOiBHaXRMYWIgZW52aXJvbm1lbnQgdmFyaWFibGVzIG5vdCBmb3VuZC4gU2tpcHBpbmcgR2l0TGFiIHBvc3QuJyk7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignUmVxdWlyZWQ6IENJX0pPQl9UT0tFTiwgQ0lfUFJPSkVDVF9JRCwgQ0lfTUVSR0VfUkVRVUVTVF9JSUQsIENJX1NFUlZFUl9VUkwnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgZ2l0bGFiID0gbmV3IEdpdExhYkludGVncmF0aW9uKHtcbiAgICAgICAgICAgICAgdG9rZW46IGdpdGxhYlRva2VuLFxuICAgICAgICAgICAgICBhcGlVcmw6IGdpdGxhYlVybCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYXdhaXQgZ2l0bGFiLnBvc3RNZXJnZVJlcXVlc3RDb21tZW50KFxuICAgICAgICAgICAgICBwcm9qZWN0SWQsXG4gICAgICAgICAgICAgIG1lcmdlUmVxdWVzdElpZCxcbiAgICAgICAgICAgICAgcmVzdWx0LmNvc3RBbmFseXNpcy5zdW1tYXJ5LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdSZXN1bHRzIHBvc3RlZCB0byBHaXRMYWIgbWVyZ2UgcmVxdWVzdCcpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBXYXJuaW5nOiBGYWlsZWQgdG8gcG9zdCB0byBHaXRMYWI6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBFeGl0IHdpdGggYXBwcm9wcmlhdGUgY29kZSBiYXNlZCBvbiB0aHJlc2hvbGRcbiAgICAgIGlmIChyZXN1bHQudGhyZXNob2xkU3RhdHVzLmxldmVsID09PSAnZXJyb3InICYmICFyZXN1bHQudGhyZXNob2xkU3RhdHVzLnBhc3NlZCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdQaXBlbGluZSBmYWlsZWQ6IENvc3QgdGhyZXNob2xkIGV4Y2VlZGVkJyk7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgyKTtcbiAgICAgIH1cblxuICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBFcnJvcjogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3I6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gIH0pO1xuXG5wcm9ncmFtLnBhcnNlKCk7XG4iXX0=
|
|
@@ -29,20 +29,31 @@ class ECSCalculator {
|
|
|
29
29
|
// Default assumptions for Fargate task
|
|
30
30
|
const assumedVCpu = 0.25; // 0.25 vCPU
|
|
31
31
|
const assumedMemoryGB = 0.5; // 0.5 GB
|
|
32
|
+
const regionPrefix = this.getRegionPrefix(region);
|
|
33
|
+
if (!regionPrefix) {
|
|
34
|
+
return {
|
|
35
|
+
amount: 0,
|
|
36
|
+
currency: 'USD',
|
|
37
|
+
confidence: 'unknown',
|
|
38
|
+
assumptions: [
|
|
39
|
+
`Region prefix not found for ${region}`,
|
|
40
|
+
'Unable to query Fargate pricing',
|
|
41
|
+
],
|
|
42
|
+
};
|
|
43
|
+
}
|
|
32
44
|
const vCpuCostPerHour = await pricingClient.getPrice({
|
|
33
45
|
serviceCode: 'AmazonECS',
|
|
34
46
|
region: (0, RegionMapper_1.normalizeRegion)(region),
|
|
35
47
|
filters: [
|
|
36
48
|
{ field: 'productFamily', value: 'Compute' },
|
|
37
|
-
{ field: 'usagetype', value: `${
|
|
49
|
+
{ field: 'usagetype', value: `${regionPrefix}-Fargate-vCPU-Hours:perCPU` },
|
|
38
50
|
],
|
|
39
51
|
});
|
|
40
52
|
const memoryCostPerHour = await pricingClient.getPrice({
|
|
41
53
|
serviceCode: 'AmazonECS',
|
|
42
54
|
region: (0, RegionMapper_1.normalizeRegion)(region),
|
|
43
55
|
filters: [
|
|
44
|
-
{ field: '
|
|
45
|
-
{ field: 'usagetype', value: `${region}-Fargate-GB-Hours:perGB` },
|
|
56
|
+
{ field: 'usagetype', value: `${regionPrefix}-Fargate-GB-Hours` },
|
|
46
57
|
],
|
|
47
58
|
});
|
|
48
59
|
if (vCpuCostPerHour === null || memoryCostPerHour === null) {
|
|
@@ -93,6 +104,54 @@ class ECSCalculator {
|
|
|
93
104
|
],
|
|
94
105
|
};
|
|
95
106
|
}
|
|
107
|
+
getRegionPrefix(region) {
|
|
108
|
+
// AWS uses region prefixes in usage types for ECS Fargate
|
|
109
|
+
// Format: {PREFIX}-Fargate-vCPU-Hours:perCPU or {PREFIX}-Fargate-GB-Hours
|
|
110
|
+
const prefixMap = {
|
|
111
|
+
// US Regions
|
|
112
|
+
'us-east-1': 'USE1',
|
|
113
|
+
'us-east-2': 'USE2',
|
|
114
|
+
'us-west-1': 'USW1',
|
|
115
|
+
'us-west-2': 'USW2',
|
|
116
|
+
// EU Regions
|
|
117
|
+
'eu-west-1': 'EUW1',
|
|
118
|
+
'eu-west-2': 'EUW2',
|
|
119
|
+
'eu-west-3': 'EUW3',
|
|
120
|
+
'eu-central-1': 'EUC1',
|
|
121
|
+
'eu-central-2': 'EUC2',
|
|
122
|
+
'eu-north-1': 'EUN1',
|
|
123
|
+
'eu-south-1': 'EUS1',
|
|
124
|
+
'eu-south-2': 'EUS2',
|
|
125
|
+
// Asia Pacific Regions
|
|
126
|
+
'ap-south-1': 'APS1',
|
|
127
|
+
'ap-south-2': 'APS2',
|
|
128
|
+
'ap-southeast-1': 'APS3',
|
|
129
|
+
'ap-southeast-2': 'APS4',
|
|
130
|
+
'ap-southeast-3': 'APS5',
|
|
131
|
+
'ap-southeast-4': 'APS6',
|
|
132
|
+
'ap-northeast-1': 'APN1',
|
|
133
|
+
'ap-northeast-2': 'APN2',
|
|
134
|
+
'ap-northeast-3': 'APN3',
|
|
135
|
+
'ap-east-1': 'APE1',
|
|
136
|
+
// Canada Regions
|
|
137
|
+
'ca-central-1': 'CAN1',
|
|
138
|
+
'ca-west-1': 'CAW1',
|
|
139
|
+
// South America Regions
|
|
140
|
+
'sa-east-1': 'SAE1',
|
|
141
|
+
// Middle East Regions
|
|
142
|
+
'me-south-1': 'MES1',
|
|
143
|
+
'me-central-1': 'MEC1',
|
|
144
|
+
// Africa Regions
|
|
145
|
+
'af-south-1': 'AFS1',
|
|
146
|
+
// Israel Regions
|
|
147
|
+
'il-central-1': 'ILC1',
|
|
148
|
+
// Other Regions
|
|
149
|
+
'ap-southeast-5': 'APS7',
|
|
150
|
+
'us-gov-west-1': 'UGW1',
|
|
151
|
+
'us-gov-east-1': 'UGE1',
|
|
152
|
+
};
|
|
153
|
+
return prefixMap[region] || '';
|
|
154
|
+
}
|
|
96
155
|
}
|
|
97
156
|
exports.ECSCalculator = ECSCalculator;
|
|
98
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRUNTQ2FsY3VsYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9wcmljaW5nL2NhbGN1bGF0b3JzL0VDU0NhbGN1bGF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRUEsa0RBQWtEO0FBRWxELE1BQWEsYUFBYTtJQUN4QixRQUFRLENBQUMsWUFBb0I7UUFDM0IsT0FBTyxZQUFZLEtBQUssbUJBQW1CLENBQUM7SUFDOUMsQ0FBQztJQUVELEtBQUssQ0FBQyxhQUFhLENBQ2pCLFFBQXdCLEVBQ3hCLE1BQWMsRUFDZCxhQUE0QjtRQUU1QixNQUFNLFlBQVksR0FBSSxRQUFRLENBQUMsVUFBVSxDQUFDLFlBQXVCLElBQUksQ0FBQyxDQUFDO1FBQ3ZFLE1BQU0sVUFBVSxHQUFJLFFBQVEsQ0FBQyxVQUFVLENBQUMsVUFBcUIsSUFBSSxTQUFTLENBQUM7UUFFM0UsSUFBSSxVQUFVLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDN0IsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUMsUUFBUSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFDbEYsQ0FBQzthQUFNLElBQUksVUFBVSxLQUFLLEtBQUssRUFBRSxDQUFDO1lBQ2hDLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzdDLENBQUM7YUFBTSxDQUFDO1lBQ04sT0FBTztnQkFDTCxNQUFNLEVBQUUsQ0FBQztnQkFDVCxRQUFRLEVBQUUsS0FBSztnQkFDZixVQUFVLEVBQUUsU0FBUztnQkFDckIsV0FBVyxFQUFFLENBQUMsNEJBQTRCLFVBQVUsRUFBRSxDQUFDO2FBQ3hELENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztJQUVPLEtBQUssQ0FBQyxvQkFBb0IsQ0FDaEMsU0FBeUIsRUFDekIsWUFBb0IsRUFDcEIsTUFBYyxFQUNkLGFBQTRCO1FBRTVCLElBQUksQ0FBQztZQUNILHVDQUF1QztZQUN2QyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsQ0FBQyxZQUFZO1lBQ3RDLE1BQU0sZUFBZSxHQUFHLEdBQUcsQ0FBQyxDQUFDLFNBQVM7WUFFdEMsTUFBTSxlQUFlLEdBQUcsTUFBTSxhQUFhLENBQUMsUUFBUSxDQUFDO2dCQUNuRCxXQUFXLEVBQUUsV0FBVztnQkFDeEIsTUFBTSxFQUFFLElBQUEsOEJBQWUsRUFBQyxNQUFNLENBQUM7Z0JBQy9CLE9BQU8sRUFBRTtvQkFDUCxFQUFFLEtBQUssRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRTtvQkFDNUMsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxHQUFHLE1BQU0sNEJBQTRCLEVBQUU7aUJBQ3JFO2FBQ0YsQ0FBQyxDQUFDO1lBRUgsTUFBTSxpQkFBaUIsR0FBRyxNQUFNLGFBQWEsQ0FBQyxRQUFRLENBQUM7Z0JBQ3JELFdBQVcsRUFBRSxXQUFXO2dCQUN4QixNQUFNLEVBQUUsSUFBQSw4QkFBZSxFQUFDLE1BQU0sQ0FBQztnQkFDL0IsT0FBTyxFQUFFO29CQUNQLEVBQUUsS0FBSyxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFO29CQUM1QyxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLEdBQUcsTUFBTSx5QkFBeUIsRUFBRTtpQkFDbEU7YUFDRixDQUFDLENBQUM7WUFFSCxJQUFJLGVBQWUsS0FBSyxJQUFJLElBQUksaUJBQWlCLEtBQUssSUFBSSxFQUFFLENBQUM7Z0JBQzNELE9BQU87b0JBQ0wsTUFBTSxFQUFFLENBQUM7b0JBQ1QsUUFBUSxFQUFFLEtBQUs7b0JBQ2YsVUFBVSxFQUFFLFNBQVM7b0JBQ3JCLFdBQVcsRUFBRSxDQUFDLDRDQUE0QyxDQUFDO2lCQUM1RCxDQUFDO1lBQ0osQ0FBQztZQUVELE1BQU0sYUFBYSxHQUFHLEdBQUcsQ0FBQztZQUMxQixNQUFNLFFBQVEsR0FBRyxXQUFXLEdBQUcsZUFBZSxHQUFHLGFBQWEsR0FBRyxZQUFZLENBQUM7WUFDOUUsTUFBTSxVQUFVLEdBQUcsZUFBZSxHQUFHLGlCQUFpQixHQUFHLGFBQWEsR0FBRyxZQUFZLENBQUM7WUFDdEYsTUFBTSxXQUFXLEdBQUcsUUFBUSxHQUFHLFVBQVUsQ0FBQztZQUUxQyxPQUFPO2dCQUNMLE1BQU0sRUFBRSxXQUFXO2dCQUNuQixRQUFRLEVBQUUsS0FBSztnQkFDZixVQUFVLEVBQUUsUUFBUTtnQkFDcEIsV0FBVyxFQUFFO29CQUNYLEdBQUcsWUFBWSxrQkFBa0I7b0JBQ2pDLFdBQVcsV0FBVyxnQkFBZ0I7b0JBQ3RDLFdBQVcsZUFBZSxxQkFBcUI7b0JBQy9DLFdBQVcsYUFBYSxtQ0FBbUM7b0JBQzNELHFCQUFxQjtvQkFDckIsaURBQWlEO2lCQUNsRDthQUNGLENBQUM7UUFDSixDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE9BQU87Z0JBQ0wsTUFBTSxFQUFFLENBQUM7Z0JBQ1QsUUFBUSxFQUFFLEtBQUs7Z0JBQ2YsVUFBVSxFQUFFLFNBQVM7Z0JBQ3JCLFdBQVcsRUFBRSxDQUFDLDRCQUE0QixLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQzthQUNwRyxDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFFTyxnQkFBZ0IsQ0FBQyxZQUFvQjtRQUMzQyxPQUFPO1lBQ0wsTUFBTSxFQUFFLENBQUM7WUFDVCxRQUFRLEVBQUUsS0FBSztZQUNmLFVBQVUsRUFBRSxLQUFLO1lBQ2pCLFdBQVcsRUFBRTtnQkFDWCxHQUFHLFlBQVkscUNBQXFDO2dCQUNwRCwwREFBMEQ7Z0JBQzFELGdEQUFnRDtnQkFDaEQsd0VBQXdFO2FBQ3pFO1NBQ0YsQ0FBQztJQUNKLENBQUM7Q0FFRjtBQTNHRCxzQ0EyR0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSZXNvdXJjZVdpdGhJZCB9IGZyb20gJy4uLy4uL2RpZmYvdHlwZXMnO1xuaW1wb3J0IHsgUmVzb3VyY2VDb3N0Q2FsY3VsYXRvciwgTW9udGhseUNvc3QsIFByaWNpbmdDbGllbnQgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBub3JtYWxpemVSZWdpb24gfSBmcm9tICcuLi9SZWdpb25NYXBwZXInO1xuXG5leHBvcnQgY2xhc3MgRUNTQ2FsY3VsYXRvciBpbXBsZW1lbnRzIFJlc291cmNlQ29zdENhbGN1bGF0b3Ige1xuICBzdXBwb3J0cyhyZXNvdXJjZVR5cGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiByZXNvdXJjZVR5cGUgPT09ICdBV1M6OkVDUzo6U2VydmljZSc7XG4gIH1cblxuICBhc3luYyBjYWxjdWxhdGVDb3N0KFxuICAgIHJlc291cmNlOiBSZXNvdXJjZVdpdGhJZCxcbiAgICByZWdpb246IHN0cmluZyxcbiAgICBwcmljaW5nQ2xpZW50OiBQcmljaW5nQ2xpZW50LFxuICApOiBQcm9taXNlPE1vbnRobHlDb3N0PiB7XG4gICAgY29uc3QgZGVzaXJlZENvdW50ID0gKHJlc291cmNlLnByb3BlcnRpZXMuRGVzaXJlZENvdW50IGFzIG51bWJlcikgfHwgMTtcbiAgICBjb25zdCBsYXVuY2hUeXBlID0gKHJlc291cmNlLnByb3BlcnRpZXMuTGF1bmNoVHlwZSBhcyBzdHJpbmcpIHx8ICdGQVJHQVRFJztcblxuICAgIGlmIChsYXVuY2hUeXBlID09PSAnRkFSR0FURScpIHtcbiAgICAgIHJldHVybiB0aGlzLmNhbGN1bGF0ZUZhcmdhdGVDb3N0KHJlc291cmNlLCBkZXNpcmVkQ291bnQsIHJlZ2lvbiwgcHJpY2luZ0NsaWVudCk7XG4gICAgfSBlbHNlIGlmIChsYXVuY2hUeXBlID09PSAnRUMyJykge1xuICAgICAgcmV0dXJuIHRoaXMuY2FsY3VsYXRlRUMyQ29zdChkZXNpcmVkQ291bnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBhbW91bnQ6IDAsXG4gICAgICAgIGN1cnJlbmN5OiAnVVNEJyxcbiAgICAgICAgY29uZmlkZW5jZTogJ3Vua25vd24nLFxuICAgICAgICBhc3N1bXB0aW9uczogW2BVbnN1cHBvcnRlZCBsYXVuY2ggdHlwZTogJHtsYXVuY2hUeXBlfWBdLFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNhbGN1bGF0ZUZhcmdhdGVDb3N0KFxuICAgIF9yZXNvdXJjZTogUmVzb3VyY2VXaXRoSWQsXG4gICAgZGVzaXJlZENvdW50OiBudW1iZXIsXG4gICAgcmVnaW9uOiBzdHJpbmcsXG4gICAgcHJpY2luZ0NsaWVudDogUHJpY2luZ0NsaWVudCxcbiAgKTogUHJvbWlzZTxNb250aGx5Q29zdD4ge1xuICAgIHRyeSB7XG4gICAgICAvLyBEZWZhdWx0IGFzc3VtcHRpb25zIGZvciBGYXJnYXRlIHRhc2tcbiAgICAgIGNvbnN0IGFzc3VtZWRWQ3B1ID0gMC4yNTsgLy8gMC4yNSB2Q1BVXG4gICAgICBjb25zdCBhc3N1bWVkTWVtb3J5R0IgPSAwLjU7IC8vIDAuNSBHQlxuXG4gICAgICBjb25zdCB2Q3B1Q29zdFBlckhvdXIgPSBhd2FpdCBwcmljaW5nQ2xpZW50LmdldFByaWNlKHtcbiAgICAgICAgc2VydmljZUNvZGU6ICdBbWF6b25FQ1MnLFxuICAgICAgICByZWdpb246IG5vcm1hbGl6ZVJlZ2lvbihyZWdpb24pLFxuICAgICAgICBmaWx0ZXJzOiBbXG4gICAgICAgICAgeyBmaWVsZDogJ3Byb2R1Y3RGYW1pbHknLCB2YWx1ZTogJ0NvbXB1dGUnIH0sXG4gICAgICAgICAgeyBmaWVsZDogJ3VzYWdldHlwZScsIHZhbHVlOiBgJHtyZWdpb259LUZhcmdhdGUtdkNQVS1Ib3VyczpwZXJDUFVgIH0sXG4gICAgICAgIF0sXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgbWVtb3J5Q29zdFBlckhvdXIgPSBhd2FpdCBwcmljaW5nQ2xpZW50LmdldFByaWNlKHtcbiAgICAgICAgc2VydmljZUNvZGU6ICdBbWF6b25FQ1MnLFxuICAgICAgICByZWdpb246IG5vcm1hbGl6ZVJlZ2lvbihyZWdpb24pLFxuICAgICAgICBmaWx0ZXJzOiBbXG4gICAgICAgICAgeyBmaWVsZDogJ3Byb2R1Y3RGYW1pbHknLCB2YWx1ZTogJ0NvbXB1dGUnIH0sXG4gICAgICAgICAgeyBmaWVsZDogJ3VzYWdldHlwZScsIHZhbHVlOiBgJHtyZWdpb259LUZhcmdhdGUtR0ItSG91cnM6cGVyR0JgIH0sXG4gICAgICAgIF0sXG4gICAgICB9KTtcblxuICAgICAgaWYgKHZDcHVDb3N0UGVySG91ciA9PT0gbnVsbCB8fCBtZW1vcnlDb3N0UGVySG91ciA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGFtb3VudDogMCxcbiAgICAgICAgICBjdXJyZW5jeTogJ1VTRCcsXG4gICAgICAgICAgY29uZmlkZW5jZTogJ3Vua25vd24nLFxuICAgICAgICAgIGFzc3VtcHRpb25zOiBbJ1ByaWNpbmcgZGF0YSBub3QgYXZhaWxhYmxlIGZvciBFQ1MgRmFyZ2F0ZSddLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBob3Vyc1Blck1vbnRoID0gNzMwO1xuICAgICAgY29uc3QgdkNwdUNvc3QgPSBhc3N1bWVkVkNwdSAqIHZDcHVDb3N0UGVySG91ciAqIGhvdXJzUGVyTW9udGggKiBkZXNpcmVkQ291bnQ7XG4gICAgICBjb25zdCBtZW1vcnlDb3N0ID0gYXNzdW1lZE1lbW9yeUdCICogbWVtb3J5Q29zdFBlckhvdXIgKiBob3Vyc1Blck1vbnRoICogZGVzaXJlZENvdW50O1xuICAgICAgY29uc3QgbW9udGhseUNvc3QgPSB2Q3B1Q29zdCArIG1lbW9yeUNvc3Q7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGFtb3VudDogbW9udGhseUNvc3QsXG4gICAgICAgIGN1cnJlbmN5OiAnVVNEJyxcbiAgICAgICAgY29uZmlkZW5jZTogJ21lZGl1bScsXG4gICAgICAgIGFzc3VtcHRpb25zOiBbXG4gICAgICAgICAgYCR7ZGVzaXJlZENvdW50fSB0YXNrKHMpIHJ1bm5pbmdgLFxuICAgICAgICAgIGBBc3N1bWVzICR7YXNzdW1lZFZDcHV9IHZDUFUgcGVyIHRhc2tgLFxuICAgICAgICAgIGBBc3N1bWVzICR7YXNzdW1lZE1lbW9yeUdCfSBHQiBtZW1vcnkgcGVyIHRhc2tgLFxuICAgICAgICAgIGBBc3N1bWVzICR7aG91cnNQZXJNb250aH0gaG91cnMgcGVyIG1vbnRoICgyNC83IG9wZXJhdGlvbilgLFxuICAgICAgICAgICdGYXJnYXRlIGxhdW5jaCB0eXBlJyxcbiAgICAgICAgICAnRG9lcyBub3QgaW5jbHVkZSBkYXRhIHRyYW5zZmVyIG9yIHN0b3JhZ2UgY29zdHMnLFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYW1vdW50OiAwLFxuICAgICAgICBjdXJyZW5jeTogJ1VTRCcsXG4gICAgICAgIGNvbmZpZGVuY2U6ICd1bmtub3duJyxcbiAgICAgICAgYXNzdW1wdGlvbnM6IFtgRmFpbGVkIHRvIGZldGNoIHByaWNpbmc6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWBdLFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNhbGN1bGF0ZUVDMkNvc3QoZGVzaXJlZENvdW50OiBudW1iZXIpOiBNb250aGx5Q29zdCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFtb3VudDogMCxcbiAgICAgIGN1cnJlbmN5OiAnVVNEJyxcbiAgICAgIGNvbmZpZGVuY2U6ICdsb3cnLFxuICAgICAgYXNzdW1wdGlvbnM6IFtcbiAgICAgICAgYCR7ZGVzaXJlZENvdW50fSB0YXNrKHMpIHJ1bm5pbmcgb24gRUMyIGxhdW5jaCB0eXBlYCxcbiAgICAgICAgJ0VDMiBsYXVuY2ggdHlwZSBjb3N0cyBkZXBlbmQgb24gdW5kZXJseWluZyBFQzIgaW5zdGFuY2VzJyxcbiAgICAgICAgJ1JlZmVyIHRvIEVDMiBpbnN0YW5jZSBjb3N0cyBmb3IgYWN0dWFsIHByaWNpbmcnLFxuICAgICAgICAnRG9lcyBub3QgaW5jbHVkZSBFQ1MgdGFzay1zcGVjaWZpYyBjb3N0cyAobWluaW1hbCBmb3IgRUMyIGxhdW5jaCB0eXBlKScsXG4gICAgICBdLFxuICAgIH07XG4gIH1cblxufVxuIl19
|
|
157
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRUNTQ2FsY3VsYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9wcmljaW5nL2NhbGN1bGF0b3JzL0VDU0NhbGN1bGF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRUEsa0RBQWtEO0FBRWxELE1BQWEsYUFBYTtJQUN4QixRQUFRLENBQUMsWUFBb0I7UUFDM0IsT0FBTyxZQUFZLEtBQUssbUJBQW1CLENBQUM7SUFDOUMsQ0FBQztJQUVELEtBQUssQ0FBQyxhQUFhLENBQ2pCLFFBQXdCLEVBQ3hCLE1BQWMsRUFDZCxhQUE0QjtRQUU1QixNQUFNLFlBQVksR0FBSSxRQUFRLENBQUMsVUFBVSxDQUFDLFlBQXVCLElBQUksQ0FBQyxDQUFDO1FBQ3ZFLE1BQU0sVUFBVSxHQUFJLFFBQVEsQ0FBQyxVQUFVLENBQUMsVUFBcUIsSUFBSSxTQUFTLENBQUM7UUFFM0UsSUFBSSxVQUFVLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDN0IsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUMsUUFBUSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFDbEYsQ0FBQzthQUFNLElBQUksVUFBVSxLQUFLLEtBQUssRUFBRSxDQUFDO1lBQ2hDLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzdDLENBQUM7YUFBTSxDQUFDO1lBQ04sT0FBTztnQkFDTCxNQUFNLEVBQUUsQ0FBQztnQkFDVCxRQUFRLEVBQUUsS0FBSztnQkFDZixVQUFVLEVBQUUsU0FBUztnQkFDckIsV0FBVyxFQUFFLENBQUMsNEJBQTRCLFVBQVUsRUFBRSxDQUFDO2FBQ3hELENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztJQUVPLEtBQUssQ0FBQyxvQkFBb0IsQ0FDaEMsU0FBeUIsRUFDekIsWUFBb0IsRUFDcEIsTUFBYyxFQUNkLGFBQTRCO1FBRTVCLElBQUksQ0FBQztZQUNILHVDQUF1QztZQUN2QyxNQUFN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QUFlLEVBQUUsTUFBTTtZQUN2QixlQUFlLEVBQUUsTUFBTTtTQUN4QixDQUFDO1FBRUYsT0FBTyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2pDLENBQUM7Q0FDRjtBQXhLRCxzQ0F3S0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSZXNvdXJjZVdpdGhJZCB9IGZyb20gJy4uLy4uL2RpZmYvdHlwZXMnO1xuaW1wb3J0IHsgUmVzb3VyY2VDb3N0Q2FsY3VsYXRvciwgTW9udGhseUNvc3QsIFByaWNpbmdDbGllbnQgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBub3JtYWxpemVSZWdpb24gfSBmcm9tICcuLi9SZWdpb25NYXBwZXInO1xuXG5leHBvcnQgY2xhc3MgRUNTQ2FsY3VsYXRvciBpbXBsZW1lbnRzIFJlc291cmNlQ29zdENhbGN1bGF0b3Ige1xuICBzdXBwb3J0cyhyZXNvdXJjZVR5cGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiByZXNvdXJjZVR5cGUgPT09ICdBV1M6OkVDUzo6U2VydmljZSc7XG4gIH1cblxuICBhc3luYyBjYWxjdWxhdGVDb3N0KFxuICAgIHJlc291cmNlOiBSZXNvdXJjZVdpdGhJZCxcbiAgICByZWdpb246IHN0cmluZyxcbiAgICBwcmljaW5nQ2xpZW50OiBQcmljaW5nQ2xpZW50LFxuICApOiBQcm9taXNlPE1vbnRobHlDb3N0PiB7XG4gICAgY29uc3QgZGVzaXJlZENvdW50ID0gKHJlc291cmNlLnByb3BlcnRpZXMuRGVzaXJlZENvdW50IGFzIG51bWJlcikgfHwgMTtcbiAgICBjb25zdCBsYXVuY2hUeXBlID0gKHJlc291cmNlLnByb3BlcnRpZXMuTGF1bmNoVHlwZSBhcyBzdHJpbmcpIHx8ICdGQVJHQVRFJztcblxuICAgIGlmIChsYXVuY2hUeXBlID09PSAnRkFSR0FURScpIHtcbiAgICAgIHJldHVybiB0aGlzLmNhbGN1bGF0ZUZhcmdhdGVDb3N0KHJlc291cmNlLCBkZXNpcmVkQ291bnQsIHJlZ2lvbiwgcHJpY2luZ0NsaWVudCk7XG4gICAgfSBlbHNlIGlmIChsYXVuY2hUeXBlID09PSAnRUMyJykge1xuICAgICAgcmV0dXJuIHRoaXMuY2FsY3VsYXRlRUMyQ29zdChkZXNpcmVkQ291bnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBhbW91bnQ6IDAsXG4gICAgICAgIGN1cnJlbmN5OiAnVVNEJyxcbiAgICAgICAgY29uZmlkZW5jZTogJ3Vua25vd24nLFxuICAgICAgICBhc3N1bXB0aW9uczogW2BVbnN1cHBvcnRlZCBsYXVuY2ggdHlwZTogJHtsYXVuY2hUeXBlfWBdLFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNhbGN1bGF0ZUZhcmdhdGVDb3N0KFxuICAgIF9yZXNvdXJjZTogUmVzb3VyY2VXaXRoSWQsXG4gICAgZGVzaXJlZENvdW50OiBudW1iZXIsXG4gICAgcmVnaW9uOiBzdHJpbmcsXG4gICAgcHJpY2luZ0NsaWVudDogUHJpY2luZ0NsaWVudCxcbiAgKTogUHJvbWlzZTxNb250aGx5Q29zdD4ge1xuICAgIHRyeSB7XG4gICAgICAvLyBEZWZhdWx0IGFzc3VtcHRpb25zIGZvciBGYXJnYXRlIHRhc2tcbiAgICAgIGNvbnN0IGFzc3VtZWRWQ3B1ID0gMC4yNTsgLy8gMC4yNSB2Q1BVXG4gICAgICBjb25zdCBhc3N1bWVkTWVtb3J5R0IgPSAwLjU7IC8vIDAuNSBHQlxuXG4gICAgICBjb25zdCByZWdpb25QcmVmaXggPSB0aGlzLmdldFJlZ2lvblByZWZpeChyZWdpb24pO1xuICAgICAgaWYgKCFyZWdpb25QcmVmaXgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBhbW91bnQ6IDAsXG4gICAgICAgICAgY3VycmVuY3k6ICdVU0QnLFxuICAgICAgICAgIGNvbmZpZGVuY2U6ICd1bmtub3duJyxcbiAgICAgICAgICBhc3N1bXB0aW9uczogW1xuICAgICAgICAgICAgYFJlZ2lvbiBwcmVmaXggbm90IGZvdW5kIGZvciAke3JlZ2lvbn1gLFxuICAgICAgICAgICAgJ1VuYWJsZSB0byBxdWVyeSBGYXJnYXRlIHByaWNpbmcnLFxuICAgICAgICAgIF0sXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHZDcHVDb3N0UGVySG91ciA9IGF3YWl0IHByaWNpbmdDbGllbnQuZ2V0UHJpY2Uoe1xuICAgICAgICBzZXJ2aWNlQ29kZTogJ0FtYXpvbkVDUycsXG4gICAgICAgIHJlZ2lvbjogbm9ybWFsaXplUmVnaW9uKHJlZ2lvbiksXG4gICAgICAgIGZpbHRlcnM6IFtcbiAgICAgICAgICB7IGZpZWxkOiAncHJvZHVjdEZhbWlseScsIHZhbHVlOiAnQ29tcHV0ZScgfSxcbiAgICAgICAgICB7IGZpZWxkOiAndXNhZ2V0eXBlJywgdmFsdWU6IGAke3JlZ2lvblByZWZpeH0tRmFyZ2F0ZS12Q1BVLUhvdXJzOnBlckNQVWAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBtZW1vcnlDb3N0UGVySG91ciA9IGF3YWl0IHByaWNpbmdDbGllbnQuZ2V0UHJpY2Uoe1xuICAgICAgICBzZXJ2aWNlQ29kZTogJ0FtYXpvbkVDUycsXG4gICAgICAgIHJlZ2lvbjogbm9ybWFsaXplUmVnaW9uKHJlZ2lvbiksXG4gICAgICAgIGZpbHRlcnM6IFtcbiAgICAgICAgICB7IGZpZWxkOiAndXNhZ2V0eXBlJywgdmFsdWU6IGAke3JlZ2lvblByZWZpeH0tRmFyZ2F0ZS1HQi1Ib3Vyc2AgfSxcbiAgICAgICAgXSxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAodkNwdUNvc3RQZXJIb3VyID09PSBudWxsIHx8IG1lbW9yeUNvc3RQZXJIb3VyID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgYW1vdW50OiAwLFxuICAgICAgICAgIGN1cnJlbmN5OiAnVVNEJyxcbiAgICAgICAgICBjb25maWRlbmNlOiAndW5rbm93bicsXG4gICAgICAgICAgYXNzdW1wdGlvbnM6IFsnUHJpY2luZyBkYXRhIG5vdCBhdmFpbGFibGUgZm9yIEVDUyBGYXJnYXRlJ10sXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGhvdXJzUGVyTW9udGggPSA3MzA7XG4gICAgICBjb25zdCB2Q3B1Q29zdCA9IGFzc3VtZWRWQ3B1ICogdkNwdUNvc3RQZXJIb3VyICogaG91cnNQZXJNb250aCAqIGRlc2lyZWRDb3VudDtcbiAgICAgIGNvbnN0IG1lbW9yeUNvc3QgPSBhc3N1bWVkTWVtb3J5R0IgKiBtZW1vcnlDb3N0UGVySG91ciAqIGhvdXJzUGVyTW9udGggKiBkZXNpcmVkQ291bnQ7XG4gICAgICBjb25zdCBtb250aGx5Q29zdCA9IHZDcHVDb3N0ICsgbWVtb3J5Q29zdDtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYW1vdW50OiBtb250aGx5Q29zdCxcbiAgICAgICAgY3VycmVuY3k6ICdVU0QnLFxuICAgICAgICBjb25maWRlbmNlOiAnbWVkaXVtJyxcbiAgICAgICAgYXNzdW1wdGlvbnM6IFtcbiAgICAgICAgICBgJHtkZXNpcmVkQ291bnR9IHRhc2socykgcnVubmluZ2AsXG4gICAgICAgICAgYEFzc3VtZXMgJHthc3N1bWVkVkNwdX0gdkNQVSBwZXIgdGFza2AsXG4gICAgICAgICAgYEFzc3VtZXMgJHthc3N1bWVkTWVtb3J5R0J9IEdCIG1lbW9yeSBwZXIgdGFza2AsXG4gICAgICAgICAgYEFzc3VtZXMgJHtob3Vyc1Blck1vbnRofSBob3VycyBwZXIgbW9udGggKDI0Lzcgb3BlcmF0aW9uKWAsXG4gICAgICAgICAgJ0ZhcmdhdGUgbGF1bmNoIHR5cGUnLFxuICAgICAgICAgICdEb2VzIG5vdCBpbmNsdWRlIGRhdGEgdHJhbnNmZXIgb3Igc3RvcmFnZSBjb3N0cycsXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBhbW91bnQ6IDAsXG4gICAgICAgIGN1cnJlbmN5OiAnVVNEJyxcbiAgICAgICAgY29uZmlkZW5jZTogJ3Vua25vd24nLFxuICAgICAgICBhc3N1bXB0aW9uczogW2BGYWlsZWQgdG8gZmV0Y2ggcHJpY2luZzogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YF0sXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY2FsY3VsYXRlRUMyQ29zdChkZXNpcmVkQ291bnQ6IG51bWJlcik6IE1vbnRobHlDb3N0IHtcbiAgICByZXR1cm4ge1xuICAgICAgYW1vdW50OiAwLFxuICAgICAgY3VycmVuY3k6ICdVU0QnLFxuICAgICAgY29uZmlkZW5jZTogJ2xvdycsXG4gICAgICBhc3N1bXB0aW9uczogW1xuICAgICAgICBgJHtkZXNpcmVkQ291bnR9IHRhc2socykgcnVubmluZyBvbiBFQzIgbGF1bmNoIHR5cGVgLFxuICAgICAgICAnRUMyIGxhdW5jaCB0eXBlIGNvc3RzIGRlcGVuZCBvbiB1bmRlcmx5aW5nIEVDMiBpbnN0YW5jZXMnLFxuICAgICAgICAnUmVmZXIgdG8gRUMyIGluc3RhbmNlIGNvc3RzIGZvciBhY3R1YWwgcHJpY2luZycsXG4gICAgICAgICdEb2VzIG5vdCBpbmNsdWRlIEVDUyB0YXNrLXNwZWNpZmljIGNvc3RzIChtaW5pbWFsIGZvciBFQzIgbGF1bmNoIHR5cGUpJyxcbiAgICAgIF0sXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UmVnaW9uUHJlZml4KHJlZ2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAvLyBBV1MgdXNlcyByZWdpb24gcHJlZml4ZXMgaW4gdXNhZ2UgdHlwZXMgZm9yIEVDUyBGYXJnYXRlXG4gICAgLy8gRm9ybWF0OiB7UFJFRklYfS1GYXJnYXRlLXZDUFUtSG91cnM6cGVyQ1BVIG9yIHtQUkVGSVh9LUZhcmdhdGUtR0ItSG91cnNcbiAgICBjb25zdCBwcmVmaXhNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAvLyBVUyBSZWdpb25zXG4gICAgICAndXMtZWFzdC0xJzogJ1VTRTEnLFxuICAgICAgJ3VzLWVhc3QtMic6ICdVU0UyJyxcbiAgICAgICd1cy13ZXN0LTEnOiAnVVNXMScsXG4gICAgICAndXMtd2VzdC0yJzogJ1VTVzInLFxuICAgICAgLy8gRVUgUmVnaW9uc1xuICAgICAgJ2V1LXdlc3QtMSc6ICdFVVcxJyxcbiAgICAgICdldS13ZXN0LTInOiAnRVVXMicsXG4gICAgICAnZXUtd2VzdC0zJzogJ0VVVzMnLFxuICAgICAgJ2V1LWNlbnRyYWwtMSc6ICdFVUMxJyxcbiAgICAgICdldS1jZW50cmFsLTInOiAnRVVDMicsXG4gICAgICAnZXUtbm9ydGgtMSc6ICdFVU4xJyxcbiAgICAgICdldS1zb3V0aC0xJzogJ0VVUzEnLFxuICAgICAgJ2V1LXNvdXRoLTInOiAnRVVTMicsXG4gICAgICAvLyBBc2lhIFBhY2lmaWMgUmVnaW9uc1xuICAgICAgJ2FwLXNvdXRoLTEnOiAnQVBTMScsXG4gICAgICAnYXAtc291dGgtMic6ICdBUFMyJyxcbiAgICAgICdhcC1zb3V0aGVhc3QtMSc6ICdBUFMzJyxcbiAgICAgICdhcC1zb3V0aGVhc3QtMic6ICdBUFM0JyxcbiAgICAgICdhcC1zb3V0aGVhc3QtMyc6ICdBUFM1JyxcbiAgICAgICdhcC1zb3V0aGVhc3QtNCc6ICdBUFM2JyxcbiAgICAgICdhcC1ub3J0aGVhc3QtMSc6ICdBUE4xJyxcbiAgICAgICdhcC1ub3J0aGVhc3QtMic6ICdBUE4yJyxcbiAgICAgICdhcC1ub3J0aGVhc3QtMyc6ICdBUE4zJyxcbiAgICAgICdhcC1lYXN0LTEnOiAnQVBFMScsXG4gICAgICAvLyBDYW5hZGEgUmVnaW9uc1xuICAgICAgJ2NhLWNlbnRyYWwtMSc6ICdDQU4xJyxcbiAgICAgICdjYS13ZXN0LTEnOiAnQ0FXMScsXG4gICAgICAvLyBTb3V0aCBBbWVyaWNhIFJlZ2lvbnNcbiAgICAgICdzYS1lYXN0LTEnOiAnU0FFMScsXG4gICAgICAvLyBNaWRkbGUgRWFzdCBSZWdpb25zXG4gICAgICAnbWUtc291dGgtMSc6ICdNRVMxJyxcbiAgICAgICdtZS1jZW50cmFsLTEnOiAnTUVDMScsXG4gICAgICAvLyBBZnJpY2EgUmVnaW9uc1xuICAgICAgJ2FmLXNvdXRoLTEnOiAnQUZTMScsXG4gICAgICAvLyBJc3JhZWwgUmVnaW9uc1xuICAgICAgJ2lsLWNlbnRyYWwtMSc6ICdJTEMxJyxcbiAgICAgIC8vIE90aGVyIFJlZ2lvbnNcbiAgICAgICdhcC1zb3V0aGVhc3QtNSc6ICdBUFM3JyxcbiAgICAgICd1cy1nb3Ytd2VzdC0xJzogJ1VHVzEnLFxuICAgICAgJ3VzLWdvdi1lYXN0LTEnOiAnVUdFMScsXG4gICAgfTtcblxuICAgIHJldHVybiBwcmVmaXhNYXBbcmVnaW9uXSB8fCAnJztcbiAgfVxufVxuIl19
|
|
@@ -6,6 +6,8 @@ export declare class LambdaCalculator implements ResourceCostCalculator {
|
|
|
6
6
|
private readonly DEFAULT_INVOCATIONS;
|
|
7
7
|
private readonly DEFAULT_DURATION_MS;
|
|
8
8
|
private readonly DEFAULT_MEMORY_MB;
|
|
9
|
+
private readonly FALLBACK_REQUEST_PRICE;
|
|
10
|
+
private readonly FALLBACK_COMPUTE_PRICE;
|
|
9
11
|
constructor(customInvocationsPerMonth?: number | undefined, customAverageDurationMs?: number | undefined);
|
|
10
12
|
supports(resourceType: string): boolean;
|
|
11
13
|
calculateCost(resource: ResourceWithId, region: string, pricingClient: PricingClient): Promise<MonthlyCost>;
|