cdk-cost-analyzer 0.1.39 → 0.1.41
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 +8 -8
- package/.husky/pre-commit +6 -0
- package/dist/action/136.index.js +1 -1
- package/dist/action/762.index.js +1 -1
- package/dist/action/998.index.js +1 -1
- package/dist/action/config/types.d.ts +50 -0
- package/dist/action/index.js +3 -3
- package/dist/action/pricing/calculators/AuroraServerlessCalculator.d.ts +20 -0
- package/dist/action/pricing/calculators/EKSCalculator.d.ts +8 -0
- package/dist/action/pricing/calculators/KinesisCalculator.d.ts +27 -0
- package/dist/action/pricing/calculators/Route53Calculator.d.ts +18 -0
- package/dist/action/pricing/calculators/TransitGatewayCalculator.d.ts +16 -0
- package/dist/action/reporter/index.d.ts +1 -0
- package/dist/action/reporter/markdownUtils.d.ts +30 -0
- package/dist/config/types.d.ts +50 -0
- package/dist/config/types.js +1 -1
- package/dist/pricing/PricingService.js +11 -1
- package/dist/pricing/calculators/AuroraServerlessCalculator.d.ts +20 -0
- package/dist/pricing/calculators/AuroraServerlessCalculator.js +92 -0
- package/dist/pricing/calculators/EKSCalculator.d.ts +8 -0
- package/dist/pricing/calculators/EKSCalculator.js +46 -0
- package/dist/pricing/calculators/KinesisCalculator.d.ts +27 -0
- package/dist/pricing/calculators/KinesisCalculator.js +140 -0
- package/dist/pricing/calculators/Route53Calculator.d.ts +18 -0
- package/dist/pricing/calculators/Route53Calculator.js +99 -0
- package/dist/pricing/calculators/TransitGatewayCalculator.d.ts +16 -0
- package/dist/pricing/calculators/TransitGatewayCalculator.js +97 -0
- package/dist/releasetag.txt +1 -1
- package/dist/reporter/Reporter.js +94 -56
- package/dist/reporter/SingleTemplateReporter.js +49 -21
- package/dist/reporter/index.d.ts +1 -0
- package/dist/reporter/index.js +8 -2
- package/dist/reporter/markdownUtils.d.ts +30 -0
- package/dist/reporter/markdownUtils.js +93 -0
- package/package.json +2 -2
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.SingleTemplateReporter = void 0;
|
|
4
|
+
const markdownUtils_1 = require("./markdownUtils");
|
|
4
5
|
/**
|
|
5
6
|
* Reporter for generating formatted output for single template cost analysis
|
|
6
7
|
*/
|
|
@@ -108,59 +109,86 @@ class SingleTemplateReporter {
|
|
|
108
109
|
generateMarkdownReport(result, options) {
|
|
109
110
|
let report = '';
|
|
110
111
|
// Header
|
|
111
|
-
report += '# Single Template Cost Analysis\n\n';
|
|
112
|
+
report += '# 💰 Single Template Cost Analysis\n\n';
|
|
112
113
|
// Summary
|
|
113
114
|
report += '## Summary\n\n';
|
|
114
115
|
report += `**Total Monthly Cost:** $${result.totalMonthlyCost.toFixed(2)} ${result.currency}\n\n`;
|
|
115
|
-
report +=
|
|
116
|
-
report +=
|
|
117
|
-
report +=
|
|
116
|
+
report += '| Metric | Value |\n';
|
|
117
|
+
report += '|--------|-------|\n';
|
|
118
|
+
report += `| Analysis Date | ${result.metadata.analyzedAt.toISOString()} |\n`;
|
|
119
|
+
report += `| Region | ${result.metadata.region} |\n`;
|
|
120
|
+
report += `| Template Hash | \`${result.metadata.templateHash}\` |\n\n`;
|
|
118
121
|
// Resource counts
|
|
119
|
-
report += '## Resource Overview\n\n';
|
|
120
|
-
report +=
|
|
121
|
-
report +=
|
|
122
|
-
report +=
|
|
122
|
+
report += '## 📊 Resource Overview\n\n';
|
|
123
|
+
report += '| Category | Count |\n';
|
|
124
|
+
report += '|----------|-------|\n';
|
|
125
|
+
report += `| Total Resources | ${result.metadata.resourceCount} |\n`;
|
|
126
|
+
report += `| Supported Resources | ${result.metadata.supportedResourceCount} |\n`;
|
|
127
|
+
report += `| Unsupported Resources | ${result.metadata.unsupportedResourceCount} |\n\n`;
|
|
123
128
|
// Cost breakdown by confidence
|
|
124
129
|
if (result.costBreakdown.byConfidenceLevel.length > 0) {
|
|
125
|
-
report += '## Cost Confidence Breakdown\n\n';
|
|
130
|
+
report += '## 🎯 Cost Confidence Breakdown\n\n';
|
|
126
131
|
report += '| Confidence | Resources | Cost | Percentage |\n';
|
|
127
132
|
report += '|------------|-----------|------|------------|\n';
|
|
128
133
|
for (const conf of result.costBreakdown.byConfidenceLevel) {
|
|
129
134
|
const percentage = ((conf.totalCost / result.totalMonthlyCost) * 100).toFixed(1);
|
|
130
|
-
|
|
135
|
+
const emoji = conf.confidence === 'high' ? '✅' : conf.confidence === 'medium' ? '⚠️' : conf.confidence === 'low' ? '❓' : '❌';
|
|
136
|
+
report += `| ${emoji} ${conf.confidence} | ${conf.count} | $${conf.totalCost.toFixed(2)} | ${percentage}% |\n`;
|
|
131
137
|
}
|
|
132
138
|
report += '\n';
|
|
133
139
|
}
|
|
134
|
-
//
|
|
140
|
+
// Cost breakdown by service
|
|
135
141
|
if (options.showBreakdown && options.groupByType) {
|
|
136
|
-
report += '## Cost Breakdown by
|
|
142
|
+
report += '## 📈 Cost Breakdown by Service\n\n';
|
|
143
|
+
const serviceMap = new Map();
|
|
144
|
+
for (const typeGroup of result.costBreakdown.byResourceType) {
|
|
145
|
+
const service = (0, markdownUtils_1.extractServiceName)(typeGroup.resourceType);
|
|
146
|
+
const existing = serviceMap.get(service) || { totalCost: 0, resources: [] };
|
|
147
|
+
existing.totalCost += typeGroup.totalCost;
|
|
148
|
+
existing.resources.push(...typeGroup.resources);
|
|
149
|
+
serviceMap.set(service, existing);
|
|
150
|
+
}
|
|
151
|
+
const services = Array.from(serviceMap.entries())
|
|
152
|
+
.map(([service, data]) => ({ service, ...data }))
|
|
153
|
+
.sort((a, b) => b.totalCost - a.totalCost);
|
|
154
|
+
report += '| Service | Cost | Percentage | Trend |\n';
|
|
155
|
+
report += '|---------|------|------------|-------|\n';
|
|
156
|
+
for (const svc of services) {
|
|
157
|
+
const percentage = ((svc.totalCost / result.totalMonthlyCost) * 100).toFixed(1);
|
|
158
|
+
const trend = (0, markdownUtils_1.getTrendIndicator)(svc.totalCost);
|
|
159
|
+
report += `| ${svc.service} | $${svc.totalCost.toFixed(2)} | ${percentage}% | ${trend} |\n`;
|
|
160
|
+
}
|
|
161
|
+
report += '\n';
|
|
162
|
+
// Detailed breakdown by resource type
|
|
163
|
+
report += '### Detailed Resource Breakdown\n\n';
|
|
137
164
|
for (const typeGroup of result.costBreakdown.byResourceType) {
|
|
138
165
|
const percentage = ((typeGroup.totalCost / result.totalMonthlyCost) * 100).toFixed(1);
|
|
139
|
-
report +=
|
|
166
|
+
report += `#### \`${typeGroup.resourceType}\`\n\n`;
|
|
140
167
|
report += `- **Count:** ${typeGroup.count}\n`;
|
|
141
168
|
report += `- **Total Cost:** $${typeGroup.totalCost.toFixed(2)} (${percentage}%)\n\n`;
|
|
142
|
-
// Show individual resources in table
|
|
143
169
|
report += '| Resource | Cost | Confidence |\n';
|
|
144
170
|
report += '|----------|------|------------|\n';
|
|
145
171
|
const sortedResources = this.sortResources(typeGroup.resources, options.sortBy);
|
|
146
172
|
for (const resource of sortedResources) {
|
|
147
173
|
const conf = resource.monthlyCost.confidence;
|
|
148
|
-
|
|
174
|
+
const emoji = conf === 'high' ? '✅' : conf === 'medium' ? '⚠️' : conf === 'low' ? '❓' : '❌';
|
|
175
|
+
report += `| ${resource.logicalId} | $${resource.monthlyCost.amount.toFixed(2)} | ${emoji} ${conf} |\n`;
|
|
149
176
|
}
|
|
150
177
|
report += '\n';
|
|
151
178
|
}
|
|
152
179
|
}
|
|
153
|
-
// Assumptions
|
|
180
|
+
// Assumptions (collapsible)
|
|
154
181
|
if (options.showAssumptions && result.costBreakdown.assumptions.length > 0) {
|
|
155
|
-
report += '
|
|
182
|
+
report += '<details>\n';
|
|
183
|
+
report += '<summary><strong>📋 Cost Calculation Assumptions</strong></summary>\n\n';
|
|
156
184
|
for (const assumption of result.costBreakdown.assumptions) {
|
|
157
185
|
report += `- ${assumption}\n`;
|
|
158
186
|
}
|
|
159
|
-
report += '\n';
|
|
187
|
+
report += '\n</details>\n\n';
|
|
160
188
|
}
|
|
161
|
-
//
|
|
189
|
+
// Footer
|
|
162
190
|
report += '---\n\n';
|
|
163
|
-
report += '*Confidence levels: high
|
|
191
|
+
report += '*Powered by [cdk-cost-analyzer](https://github.com/buildinginthecloud/cdk-cost-analyzer) | Confidence levels: ✅ high, ⚠️ medium, ❓ low, ❌ unknown*\n';
|
|
164
192
|
return report;
|
|
165
193
|
}
|
|
166
194
|
/**
|
|
@@ -183,4 +211,4 @@ class SingleTemplateReporter {
|
|
|
183
211
|
}
|
|
184
212
|
}
|
|
185
213
|
exports.SingleTemplateReporter = SingleTemplateReporter;
|
|
186
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2luZ2xlVGVtcGxhdGVSZXBvcnRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9yZXBvcnRlci9TaW5nbGVUZW1wbGF0ZVJlcG9ydGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUtBOztHQUVHO0FBQ0gsTUFBYSxzQkFBc0I7SUFDakM7Ozs7Ozs7T0FPRztJQUNILGNBQWMsQ0FDWixNQUFnQyxFQUNoQyxNQUFvQyxFQUNwQyxPQUFxQztRQUVyQyxNQUFNLElBQUksR0FBRztZQUNYLGFBQWEsRUFBRSxJQUFJO1lBQ25CLGVBQWUsRUFBRSxJQUFJO1lBQ3JCLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLE1BQU0sRUFBRSxNQUFrQztZQUMxQyxHQUFHLE9BQU87U0FDWCxDQUFDO1FBRUYsUUFBUSxNQUFNLEVBQUUsQ0FBQztZQUNmLEtBQUssTUFBTTtnQkFDVCxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN6QyxLQUFLLFVBQVU7Z0JBQ2IsT0FBTyxJQUFJLENBQUMsc0JBQXNCLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ25ELEtBQUssTUFBTSxDQUFDO1lBQ1o7Z0JBQ0UsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ2pELENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxrQkFBa0IsQ0FBQyxNQUFnQztRQUN6RCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQ7O09BRUc7SUFDSyxrQkFBa0IsQ0FDeEIsTUFBZ0MsRUFDaEMsT0FBOEM7UUFFOUMsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBRWhCLFNBQVM7UUFDVCxNQUFNLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUM7UUFD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R0FBRyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUM7UUFFOUIsUUFBUSxNQUFNLEVBQUUsQ0FBQztZQUNmLEtBQUssTUFBTTtnQkFDVCxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDbkUsTUFBTTtZQUNSLEtBQUssTUFBTTtnQkFDVCxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7Z0JBQzlELE1BQU07WUFDUixLQUFLLE1BQU07Z0JBQ1QsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO2dCQUNwRCxNQUFNO1FBQ1YsQ0FBQztRQUVELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7Q0FDRjtBQTdORCx3REE2TkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBTaW5nbGVUZW1wbGF0ZUNvc3RSZXN1bHQsXG4gIFNpbmdsZVRlbXBsYXRlUmVwb3J0T3B0aW9ucyxcbn0gZnJvbSAnLi4vYXBpL3NpbmdsZS10ZW1wbGF0ZS10eXBlcyc7XG5cbi8qKlxuICogUmVwb3J0ZXIgZm9yIGdlbmVyYXRpbmcgZm9ybWF0dGVkIG91dHB1dCBmb3Igc2luZ2xlIHRlbXBsYXRlIGNvc3QgYW5hbHlzaXNcbiAqL1xuZXhwb3J0IGNsYXNzIFNpbmdsZVRlbXBsYXRlUmVwb3J0ZXIge1xuICAvKipcbiAgICogR2VuZXJhdGUgYSBmb3JtYXR0ZWQgcmVwb3J0IGZyb20gc2luZ2xlIHRlbXBsYXRlIGFuYWx5c2lzIHJlc3VsdFxuICAgKiBcbiAgICogQHBhcmFtIHJlc3VsdCAtIFRoZSBhbmFseXNpcyByZXN1bHRcbiAgICogQHBhcmFtIGZvcm1hdCAtIE91dHB1dCBmb3JtYXQgKHRleHQsIGpzb24sIG9yIG1hcmtkb3duKVxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIGZvcm1hdHRpbmcgcHJlZmVyZW5jZXNcbiAgICogQHJldHVybnMgRm9ybWF0dGVkIHJlcG9ydCBzdHJpbmdcbiAgICovXG4gIGdlbmVyYXRlUmVwb3J0KFxuICAgIHJlc3VsdDogU2luZ2xlVGVtcGxhdGVDb3N0UmVzdWx0LFxuICAgIGZvcm1hdDogJ3RleHQnIHwgJ2pzb24nIHwgJ21hcmtkb3duJyxcbiAgICBvcHRpb25zPzogU2luZ2xlVGVtcGxhdGVSZXBvcnRPcHRpb25zLFxuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IG9wdHMgPSB7XG4gICAgICBzaG93QnJlYWtkb3duOiB0cnVlLFxuICAgICAgc2hvd0Fzc3VtcHRpb25zOiB0cnVlLFxuICAgICAgZ3JvdXBCeVR5cGU6IHRydWUsXG4gICAgICBzb3J0Qnk6ICdjb3N0JyBhcyAnY29zdCcgfCAnbmFtZScgfCAndHlwZScsXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH07XG5cbiAgICBzd2l0Y2ggKGZvcm1hdCkge1xuICAgICAgY2FzZSAnanNvbic6XG4gICAgICAgIHJldHVybiB0aGlzLmdlbmVyYXRlSnNvblJlcG9ydChyZXN1bHQpO1xuICAgICAgY2FzZSAnbWFya2Rvd24nOlxuICAgICAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZU1hcmtkb3duUmVwb3J0KHJlc3VsdCwgb3B0cyk7XG4gICAgICBjYXNlICd0ZXh0JzpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB0aGlzLmdlbmVyYXRlVGV4dFJlcG9ydChyZXN1bHQsIG9wdHMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBKU09OIGZvcm1hdCByZXBvcnRcbiAgICovXG4gIHByaXZhdGUgZ2VuZXJhdGVKc29uUmVwb3J0KHJlc3VsdDogU2luZ2xlVGVtcGxhdGVDb3N0UmVzdWx0KTogc3RyaW5nIHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocmVzdWx0LCBudWxsLCAyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSB0ZXh0IGZvcm1hdCByZXBvcnRcbiAgICovXG4gIHByaXZhdGUgZ2VuZXJhdGVUZXh0UmVwb3J0KFxuICAgIHJlc3VsdDogU2luZ2xlVGVtcGxhdGVDb3N0UmVzdWx0LFxuICAgIG9wdGlvbnM6IFJlcXVpcmVkPFNpbmdsZVRlbXBsYXRlUmVwb3J0T3B0aW9ucz4sXG4gICk6IHN0cmluZyB7XG4gICAgbGV0IHJlcG9ydCA9ICcnO1xuXG4gICAgLy8gSGVhZGVyXG4gICAgcmVwb3J0ICs9ICc9Jy5yZXBlYXQoODApICsgJ1xcbic7XG4gICAgcmVwb3J0ICs9ICdTaW5nbGUgVGVtcGxhdGUgQ29zdCBBbmFseXNpc1xcbic7XG4gICAgcmVwb3J0ICs9ICc9Jy5yZXBlYXQoODApICsgJ1xcblxcbic7XG5cbiAgICAvLyBTdW1tYXJ5XG4gICAgcmVwb3J0ICs9IGBUb3RhbCBNb250aGx5IENvc3Q6ICQke3Jlc3VsdC50b3RhbE1vbnRobHlDb3N0LnRvRml4ZWQoMil9ICR7cmVzdWx0LmN1cnJlbmN5fVxcbmA7XG4gICAgcmVwb3J0ICs9IGBBbmFseXNpcyBEYXRlOiAke3Jlc3VsdC5tZXRhZGF0YS5hbmFseXplZEF0LnRvSVNPU3RyaW5nKCl9XFxuYDtcbiAgICByZXBvcnQgKz0gYFJlZ2lvbjogJHtyZXN1bHQubWV0YWRhdGEucmVnaW9ufVxcbmA7XG4gICAgcmVwb3J0ICs9IGBUZW1wbGF0ZSBIYXNoOiAke3Jlc3VsdC5tZXRhZGF0YS50ZW1wbGF0ZUhhc2h9XFxuXFxuYDtcblxuICAgIC8vIFJlc291cmNlIGNvdW50c1xuICAgIHJlcG9ydCArPSBgVG90YWwgUmVzb3VyY2VzOiAke3Jlc3VsdC5tZXRhZGF0YS5yZXNvdXJjZUNvdW50fVxcbmA7XG4gICAgcmVwb3J0ICs9IGBTdXBwb3J0ZWQgUmVzb3VyY2VzOiAke3Jlc3VsdC5tZXRhZGF0YS5zdXBwb3J0ZWRSZXNvdXJjZUNvdW50fVxcbmA7XG4gICAgcmVwb3J0ICs9IGBVbnN1cHBvcnRlZCBSZXNvdXJjZXM6ICR7cmVzdWx0Lm1ldGFkYXRhLnVuc3VwcG9ydGVkUmVzb3VyY2VDb3VudH1cXG5cXG5gO1xuXG4gICAgLy8gQ29zdCBicmVha2Rvd24gYnkgY29uZmlkZW5jZVxuICAgIGlmIChyZXN1bHQuY29zdEJyZWFrZG93bi5ieUNvbmZpZGVuY2VMZXZlbC5sZW5ndGggPiAwKSB7XG4gICAgICByZXBvcnQgKz0gJy0nLnJlcGVhdCg4MCkgKyAnXFxuJztcbiAgICAgIHJlcG9ydCArPSAnQ29zdCBDb25maWRlbmNlIEJyZWFrZG93blxcbic7XG4gICAgICByZXBvcnQgKz0gJy0nLnJlcGVhdCg4MCkgKyAnXFxuXFxuJztcblxuICAgICAgZm9yIChjb25zdCBjb25mIG9mIHJlc3VsdC5jb3N0QnJlYWtkb3duLmJ5Q29uZmlkZW5jZUxldmVsKSB7XG4gICAgICAgIGNvbnN0IHBlcmNlbnRhZ2UgPSAoKGNvbmYudG90YWxDb3N0IC8gcmVzdWx0LnRvdGFsTW9udGhseUNvc3QpICogMTAwKS50b0ZpeGVkKDEpO1xuICAgICAgICByZXBvcnQgKz0gYCR7Y29uZi5jb25maWRlbmNlLnRvVXBwZXJDYXNlKCkucGFkRW5kKDEwKX0gJHtjb25mLmNvdW50fSByZXNvdXJjZXMgICQke2NvbmYudG90YWxDb3N0LnRvRml4ZWQoMil9ICgke3BlcmNlbnRhZ2V9JSlcXG5gO1xuICAgICAgfVxuICAgICAgcmVwb3J0ICs9ICdcXG4nO1xuICAgIH1cblxuICAgIC8vIFJlc291cmNlIGJyZWFrZG93blxuICAgIGlmIChvcHRpb25zLnNob3dCcmVha2Rvd24gJiYgb3B0aW9ucy5ncm91cEJ5VHlwZSkge1xuICAgICAgcmVwb3J0ICs9ICctJy5yZXBlYXQoODApICsgJ1xcbic7XG4gICAgICByZXBvcnQgKz0gJ0Nvc3QgQnJlYWtkb3duIGJ5IFJlc291cmNlIFR5cGVcXG4nO1xuICAgICAgcmVwb3J0ICs9ICctJy5yZXBlYXQoODApICsgJ1xcblxcbic7XG5cbiAgICAgIGZvciAoY29uc3QgdHlwZUdyb3VwIG9mIHJlc3VsdC5jb3N0QnJlYWtkb3duLmJ5UmVzb3VyY2VUeXBlKSB7XG4gICAgICAgIGNvbnN0IHBlcmNlbnRhZ2UgPSAoKHR5cGVHcm91cC50b3RhbENvc3QgLyByZXN1bHQudG90YWxNb250aGx5Q29zdCkgKiAxMDApLnRvRml4ZWQoMSk7XG4gICAgICAgIHJlcG9ydCArPSBgJHt0eXBlR3JvdXAucmVzb3VyY2VUeXBlfVxcbmA7XG4gICAgICAgIHJlcG9ydCArPSBgICBDb3VudDogJHt0eXBlR3JvdXAuY291bnR9XFxuYDtcbiAgICAgICAgcmVwb3J0ICs9IGAgIFRvdGFsIENvc3Q6ICQke3R5cGVHcm91cC50b3RhbENvc3QudG9GaXhlZCgyKX0gKCR7cGVyY2VudGFnZX0lKVxcbmA7XG5cbiAgICAgICAgLy8gU2hvdyBpbmRpdmlkdWFsIHJlc291cmNlc1xuICAgICAgICBjb25zdCBzb3J0ZWRSZXNvdXJjZXMgPSB0aGlzLnNvcnRSZXNvdXJjZXModHlwZUdyb3VwLnJlc291cmNlcywgb3B0aW9ucy5zb3J0QnkpO1xuICAgICAgICBmb3IgKGNvbnN0IHJlc291cmNlIG9mIHNvcnRlZFJlc291cmNlcykge1xuICAgICAgICAgIGNvbnN0IGNvbmYgPSByZXNvdXJjZS5tb250aGx5Q29zdC5jb25maWRlbmNlO1xuICAgICAgICAgIGNvbnN0IGNvbmZJbmRpY2F0b3IgPSBjb25mID09PSAnaGlnaCcgPyAn4pyTJyA6IGNvbmYgPT09ICdtZWRpdW0nID8gJ34nIDogY29uZiA9PT0gJ2xvdycgPyAnPycgOiAn4pyXJztcbiAgICAgICAgICByZXBvcnQgKz0gYCAgICAke2NvbmZJbmRpY2F0b3J9ICR7cmVzb3VyY2UubG9naWNhbElkLnBhZEVuZCg0MCl9ICQke3Jlc291cmNlLm1vbnRobHlDb3N0LmFtb3VudC50b0ZpeGVkKDIpfVxcbmA7XG4gICAgICAgIH1cbiAgICAgICAgcmVwb3J0ICs9ICdcXG4nO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFzc3VtcHRpb25zXG4gICAgaWYgKG9wdGlvbnMuc2hvd0Fzc3VtcHRpb25zICYmIHJlc3VsdC5jb3N0QnJlYWtkb3duLmFzc3VtcHRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIHJlcG9ydCArPSAnLScucmVwZWF0KDgwKSArICdcXG4nO1xuICAgICAgcmVwb3J0ICs9ICdDb3N0IENhbGN1bGF0aW9uIEFzc3VtcHRpb25zXFxuJztcbiAgICAgIHJlcG9ydCArPSAnLScucmVwZWF0KDgwKSArICdcXG5cXG4nO1xuXG4gICAgICBmb3IgKGNvbnN0IGFzc3VtcHRpb24gb2YgcmVzdWx0LmNvc3RCcmVha2Rvd24uYXNzdW1wdGlvbnMpIHtcbiAgICAgICAgcmVwb3J0ICs9IGAgIOKAoiAke2Fzc3VtcHRpb259XFxuYDtcbiAgICAgIH1cbiAgICAgIHJlcG9ydCArPSAnXFxuJztcbiAgICB9XG5cbiAgICAvLyBMZWdlbmRcbiAgICByZXBvcnQgKz0gJy0nLnJlcGVhdCg4MCkgKyAnXFxuJztcbiAgICByZXBvcnQgKz0gJ0xlZ2VuZDog4pyTIEhpZ2ggY29uZmlkZW5jZSAgfiBNZWRpdW0gY29uZmlkZW5jZSAgPyBMb3cgY29uZmlkZW5jZSAg4pyXIFVua25vd24vVW5zdXBwb3J0ZWRcXG4nO1xuICAgIHJlcG9ydCArPSAnPScucmVwZWF0KDgwKSArICdcXG4nO1xuXG4gICAgcmV0dXJuIHJlcG9ydDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBtYXJrZG93biBmb3JtYXQgcmVwb3J0XG4gICAqL1xuICBwcml2YXRlIGdlbmVyYXRlTWFya2Rvd25SZXBvcnQoXG4gICAgcmVzdWx0OiBTaW5nbGVUZW1wbGF0ZUNvc3RSZXN1bHQsXG4gICAgb3B0aW9uczogUmVxdWlyZWQ8U2luZ2xlVGVtcGxhdGVSZXBvcnRPcHRpb25zPixcbiAgKTogc3RyaW5nIHtcbiAgICBsZXQgcmVwb3J0ID0gJyc7XG5cbiAgICAvLyBIZWFkZXJcbiAgICByZXBvcnQgKz0gJyMgU2luZ2xlIFRlbXBsYXRlIENvc3QgQW5hbHlzaXNcXG5cXG4nO1xuXG4gICAgLy8gU3VtbWFyeVxuICAgIHJlcG9ydCArPSAnIyMgU3VtbWFyeVxcblxcbic7XG4gICAgcmVwb3J0ICs9IGAqKlRvdGFsIE1vbnRobHkgQ29zdDoqKiAkJHtyZXN1bHQudG90YWxNb250aGx5Q29zdC50b0ZpeGVkKDIpfSAke3Jlc3VsdC5jdXJyZW5jeX1cXG5cXG5gO1xuICAgIHJlcG9ydCArPSBgLSAqKkFuYWx5c2lzIERhdGU6KiogJHtyZXN1bHQubWV0YWRhdGEuYW5hbHl6ZWRBdC50b0lTT1N0cmluZygpfVxcbmA7XG4gICAgcmVwb3J0ICs9IGAtICoqUmVnaW9uOioqICR7cmVzdWx0Lm1ldGFkYXRhLnJlZ2lvbn1cXG5gO1xuICAgIHJlcG9ydCArPSBgLSAqKlRlbXBsYXRlIEhhc2g6KiogJHtyZXN1bHQubWV0YWRhdGEudGVtcGxhdGVIYXNofVxcblxcbmA7XG5cbiAgICAvLyBSZXNvdXJjZSBjb3VudHNcbiAgICByZXBvcnQgKz0gJyMjIFJlc291cmNlIE92ZXJ2aWV3XFxuXFxuJztcbiAgICByZXBvcnQgKz0gYC0gKipUb3RhbCBSZXNvdXJjZXM6KiogJHtyZXN1bHQubWV0YWRhdGEucmVzb3VyY2VDb3VudH1cXG5gO1xuICAgIHJlcG9ydCArPSBgLSAqKlN1cHBvcnRlZCBSZXNvdXJjZXM6KiogJHtyZXN1bHQubWV0YWRhdGEuc3VwcG9ydGVkUmVzb3VyY2VDb3VudH1cXG5gO1xuICAgIHJlcG9ydCArPSBgLSAqKlVuc3VwcG9ydGVkIFJlc291cmNlczoqKiAke3Jlc3VsdC5tZXRhZGF0YS51bnN1cHBvcnRlZFJlc291cmNlQ291bnR9XFxuXFxuYDtcblxuICAgIC8vIENvc3QgYnJlYWtkb3duIGJ5IGNvbmZpZGVuY2VcbiAgICBpZiAocmVzdWx0LmNvc3RCcmVha2Rvd24uYnlDb25maWRlbmNlTGV2ZWwubGVuZ3RoID4gMCkge1xuICAgICAgcmVwb3J0ICs9ICcjIyBDb3N0IENvbmZpZGVuY2UgQnJlYWtkb3duXFxuXFxuJztcbiAgICAgIHJlcG9ydCArPSAnfCBDb25maWRlbmNlIHwgUmVzb3VyY2VzIHwgQ29zdCB8IFBlcmNlbnRhZ2UgfFxcbic7XG4gICAgICByZXBvcnQgKz0gJ3wtLS0tLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tfC0tLS0tLS0tLS0tLXxcXG4nO1xuXG4gICAgICBmb3IgKGNvbnN0IGNvbmYgb2YgcmVzdWx0LmNvc3RCcmVha2Rvd24uYnlDb25maWRlbmNlTGV2ZWwpIHtcbiAgICAgICAgY29uc3QgcGVyY2VudGFnZSA9ICgoY29uZi50b3RhbENvc3QgLyByZXN1bHQudG90YWxNb250aGx5Q29zdCkgKiAxMDApLnRvRml4ZWQoMSk7XG4gICAgICAgIHJlcG9ydCArPSBgfCAke2NvbmYuY29uZmlkZW5jZX0gfCAke2NvbmYuY291bnR9IHwgJCR7Y29uZi50b3RhbENvc3QudG9GaXhlZCgyKX0gfCAke3BlcmNlbnRhZ2V9JSB8XFxuYDtcbiAgICAgIH1cbiAgICAgIHJlcG9ydCArPSAnXFxuJztcbiAgICB9XG5cbiAgICAvLyBSZXNvdXJjZSBicmVha2Rvd24gYnkgdHlwZVxuICAgIGlmIChvcHRpb25zLnNob3dCcmVha2Rvd24gJiYgb3B0aW9ucy5ncm91cEJ5VHlwZSkge1xuICAgICAgcmVwb3J0ICs9ICcjIyBDb3N0IEJyZWFrZG93biBieSBSZXNvdXJjZSBUeXBlXFxuXFxuJztcblxuICAgICAgZm9yIChjb25zdCB0eXBlR3JvdXAgb2YgcmVzdWx0LmNvc3RCcmVha2Rvd24uYnlSZXNvdXJjZVR5cGUpIHtcbiAgICAgICAgY29uc3QgcGVyY2VudGFnZSA9ICgodHlwZUdyb3VwLnRvdGFsQ29zdCAvIHJlc3VsdC50b3RhbE1vbnRobHlDb3N0KSAqIDEwMCkudG9GaXhlZCgxKTtcbiAgICAgICAgcmVwb3J0ICs9IGAjIyMgJHt0eXBlR3JvdXAucmVzb3VyY2VUeXBlfVxcblxcbmA7XG4gICAgICAgIHJlcG9ydCArPSBgLSAqKkNvdW50OioqICR7dHlwZUdyb3VwLmNvdW50fVxcbmA7XG4gICAgICAgIHJlcG9ydCArPSBgLSAqKlRvdGFsIENvc3Q6KiogJCR7dHlwZUdyb3VwLnRvdGFsQ29zdC50b0ZpeGVkKDIpfSAoJHtwZXJjZW50YWdlfSUpXFxuXFxuYDtcblxuICAgICAgICAvLyBTaG93IGluZGl2aWR1YWwgcmVzb3VyY2VzIGluIHRhYmxlXG4gICAgICAgIHJlcG9ydCArPSAnfCBSZXNvdXJjZSB8IENvc3QgfCBDb25maWRlbmNlIHxcXG4nO1xuICAgICAgICByZXBvcnQgKz0gJ3wtLS0tLS0tLS0tfC0tLS0tLXwtLS0tLS0tLS0tLS18XFxuJztcblxuICAgICAgICBjb25zdCBzb3J0ZWRSZXNvdXJjZXMgPSB0aGlzLnNvcnRSZXNvdXJjZXModHlwZUdyb3VwLnJlc291cmNlcywgb3B0aW9ucy5zb3J0QnkpO1xuICAgICAgICBmb3IgKGNvbnN0IHJlc291cmNlIG9mIHNvcnRlZFJlc291cmNlcykge1xuICAgICAgICAgIGNvbnN0IGNvbmYgPSByZXNvdXJjZS5tb250aGx5Q29zdC5jb25maWRlbmNlO1xuICAgICAgICAgIHJlcG9ydCArPSBgfCAke3Jlc291cmNlLmxvZ2ljYWxJZH0gfCAkJHtyZXNvdXJjZS5tb250aGx5Q29zdC5hbW91bnQudG9GaXhlZCgyKX0gfCAke2NvbmZ9IHxcXG5gO1xuICAgICAgICB9XG4gICAgICAgIHJlcG9ydCArPSAnXFxuJztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBc3N1bXB0aW9uc1xuICAgIGlmIChvcHRpb25zLnNob3dBc3N1bXB0aW9ucyAmJiByZXN1bHQuY29zdEJyZWFrZG93bi5hc3N1bXB0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICByZXBvcnQgKz0gJyMjIENvc3QgQ2FsY3VsYXRpb24gQXNzdW1wdGlvbnNcXG5cXG4nO1xuICAgICAgZm9yIChjb25zdCBhc3N1bXB0aW9uIG9mIHJlc3VsdC5jb3N0QnJlYWtkb3duLmFzc3VtcHRpb25zKSB7XG4gICAgICAgIHJlcG9ydCArPSBgLSAke2Fzc3VtcHRpb259XFxuYDtcbiAgICAgIH1cbiAgICAgIHJlcG9ydCArPSAnXFxuJztcbiAgICB9XG5cbiAgICAvLyBMZWdlbmRcbiAgICByZXBvcnQgKz0gJy0tLVxcblxcbic7XG4gICAgcmVwb3J0ICs9ICcqQ29uZmlkZW5jZSBsZXZlbHM6IGhpZ2ggKOKckyksIG1lZGl1bSAofiksIGxvdyAoPyksIHVua25vd24vdW5zdXBwb3J0ZWQgKOKclykqXFxuJztcblxuICAgIHJldHVybiByZXBvcnQ7XG4gIH1cblxuICAvKipcbiAgICogU29ydCByZXNvdXJjZXMgYmFzZWQgb24gc3BlY2lmaWVkIGNyaXRlcmlhXG4gICAqL1xuICBwcml2YXRlIHNvcnRSZXNvdXJjZXMoXG4gICAgcmVzb3VyY2VzOiBBcnJheTx7IGxvZ2ljYWxJZDogc3RyaW5nOyB0eXBlOiBzdHJpbmc7IG1vbnRobHlDb3N0OiBhbnkgfT4sXG4gICAgc29ydEJ5OiAnY29zdCcgfCAnbmFtZScgfCAndHlwZScsXG4gICk6IEFycmF5PHsgbG9naWNhbElkOiBzdHJpbmc7IHR5cGU6IHN0cmluZzsgbW9udGhseUNvc3Q6IGFueSB9PiB7XG4gICAgY29uc3Qgc29ydGVkID0gWy4uLnJlc291cmNlc107XG5cbiAgICBzd2l0Y2ggKHNvcnRCeSkge1xuICAgICAgY2FzZSAnY29zdCc6XG4gICAgICAgIHNvcnRlZC5zb3J0KChhLCBiKSA9PiBiLm1vbnRobHlDb3N0LmFtb3VudCAtIGEubW9udGhseUNvc3QuYW1vdW50KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICduYW1lJzpcbiAgICAgICAgc29ydGVkLnNvcnQoKGEsIGIpID0+IGEubG9naWNhbElkLmxvY2FsZUNvbXBhcmUoYi5sb2dpY2FsSWQpKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd0eXBlJzpcbiAgICAgICAgc29ydGVkLnNvcnQoKGEsIGIpID0+IGEudHlwZS5sb2NhbGVDb21wYXJlKGIudHlwZSkpO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICByZXR1cm4gc29ydGVkO1xuICB9XG59XG4iXX0=
|
|
214
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2luZ2xlVGVtcGxhdGVSZXBvcnRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9yZXBvcnRlci9TaW5nbGVUZW1wbGF0ZVJlcG9ydGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUlBLG1EQUF3RTtBQUV4RTs7R0FFRztBQUNILE1BQWEsc0JBQXNCO0lBQ2pDOzs7Ozs7O09BT0c7SUFDSCxjQUFjLENBQ1osTUFBZ0MsRUFDaEMsTUFBb0MsRUFDcEMsT0FBcUM7UUFFckMsTUFBTSxJQUFJLEdBQUc7WUFDWCxhQUFhLEVBQUUsSUFBSTtZQUNuQixlQUFlLEVBQUUsSUFBSTtZQUNyQixXQUFXLEVBQUUsSUFBSTtZQUNqQixNQUFNLEVBQUUsTUFBa0M7WUFDMUMsR0FBRyxPQUFPO1NBQ1gsQ0FBQztRQUVGLFFBQVEsTUFBTSxFQUFFLENBQUM7WUFDZixLQUFLLE1BQU07Z0JBQ1QsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDekMsS0FBSyxVQUFVO2dCQUNiLE9BQU8sSUFBSSxDQUFDLHNCQUFzQixDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNuRCxLQUFLLE1BQU0sQ0FBQztZQUNaO2dCQUNFLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNqRCxDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0ssa0JBQWtCLENBQUMsTUFBZ0M7UUFDekQsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVEOztPQUVHO0lBQ0ssa0JBQWtCLENBQ3hCLE1BQWdDLEVBQ2hDLE9BQThDO1FBRTlDLElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQztRQUVoQixTQUFTO1FBQ1QsTUFBTSxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEdBQUcs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Q2YsS0FBSyxNQUFNO2dCQUNULE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUNuRSxNQUFNO1lBQ1IsS0FBSyxNQUFNO2dCQUNULE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztnQkFDOUQsTUFBTTtZQUNSLEtBQUssTUFBTTtnQkFDVCxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7Z0JBQ3BELE1BQU07UUFDVixDQUFDO1FBRUQsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztDQUNGO0FBOVBELHdEQThQQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIFNpbmdsZVRlbXBsYXRlQ29zdFJlc3VsdCxcbiAgU2luZ2xlVGVtcGxhdGVSZXBvcnRPcHRpb25zLFxufSBmcm9tICcuLi9hcGkvc2luZ2xlLXRlbXBsYXRlLXR5cGVzJztcbmltcG9ydCB7IGdldFRyZW5kSW5kaWNhdG9yLCBleHRyYWN0U2VydmljZU5hbWUgfSBmcm9tICcuL21hcmtkb3duVXRpbHMnO1xuXG4vKipcbiAqIFJlcG9ydGVyIGZvciBnZW5lcmF0aW5nIGZvcm1hdHRlZCBvdXRwdXQgZm9yIHNpbmdsZSB0ZW1wbGF0ZSBjb3N0IGFuYWx5c2lzXG4gKi9cbmV4cG9ydCBjbGFzcyBTaW5nbGVUZW1wbGF0ZVJlcG9ydGVyIHtcbiAgLyoqXG4gICAqIEdlbmVyYXRlIGEgZm9ybWF0dGVkIHJlcG9ydCBmcm9tIHNpbmdsZSB0ZW1wbGF0ZSBhbmFseXNpcyByZXN1bHRcbiAgICogXG4gICAqIEBwYXJhbSByZXN1bHQgLSBUaGUgYW5hbHlzaXMgcmVzdWx0XG4gICAqIEBwYXJhbSBmb3JtYXQgLSBPdXRwdXQgZm9ybWF0ICh0ZXh0LCBqc29uLCBvciBtYXJrZG93bilcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBmb3JtYXR0aW5nIHByZWZlcmVuY2VzXG4gICAqIEByZXR1cm5zIEZvcm1hdHRlZCByZXBvcnQgc3RyaW5nXG4gICAqL1xuICBnZW5lcmF0ZVJlcG9ydChcbiAgICByZXN1bHQ6IFNpbmdsZVRlbXBsYXRlQ29zdFJlc3VsdCxcbiAgICBmb3JtYXQ6ICd0ZXh0JyB8ICdqc29uJyB8ICdtYXJrZG93bicsXG4gICAgb3B0aW9ucz86IFNpbmdsZVRlbXBsYXRlUmVwb3J0T3B0aW9ucyxcbiAgKTogc3RyaW5nIHtcbiAgICBjb25zdCBvcHRzID0ge1xuICAgICAgc2hvd0JyZWFrZG93bjogdHJ1ZSxcbiAgICAgIHNob3dBc3N1bXB0aW9uczogdHJ1ZSxcbiAgICAgIGdyb3VwQnlUeXBlOiB0cnVlLFxuICAgICAgc29ydEJ5OiAnY29zdCcgYXMgJ2Nvc3QnIHwgJ25hbWUnIHwgJ3R5cGUnLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9O1xuXG4gICAgc3dpdGNoIChmb3JtYXQpIHtcbiAgICAgIGNhc2UgJ2pzb24nOlxuICAgICAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZUpzb25SZXBvcnQocmVzdWx0KTtcbiAgICAgIGNhc2UgJ21hcmtkb3duJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGVNYXJrZG93blJlcG9ydChyZXN1bHQsIG9wdHMpO1xuICAgICAgY2FzZSAndGV4dCc6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZVRleHRSZXBvcnQocmVzdWx0LCBvcHRzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgSlNPTiBmb3JtYXQgcmVwb3J0XG4gICAqL1xuICBwcml2YXRlIGdlbmVyYXRlSnNvblJlcG9ydChyZXN1bHQ6IFNpbmdsZVRlbXBsYXRlQ29zdFJlc3VsdCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHJlc3VsdCwgbnVsbCwgMik7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgdGV4dCBmb3JtYXQgcmVwb3J0XG4gICAqL1xuICBwcml2YXRlIGdlbmVyYXRlVGV4dFJlcG9ydChcbiAgICByZXN1bHQ6IFNpbmdsZVRlbXBsYXRlQ29zdFJlc3VsdCxcbiAgICBvcHRpb25zOiBSZXF1aXJlZDxTaW5nbGVUZW1wbGF0ZVJlcG9ydE9wdGlvbnM+LFxuICApOiBzdHJpbmcge1xuICAgIGxldCByZXBvcnQgPSAnJztcblxuICAgIC8vIEhlYWRlclxuICAgIHJlcG9ydCArPSAnPScucmVwZWF0KDgwKSArICdcXG4nO1xuICAgIHJlcG9ydCArPSAnU2luZ2xlIFRlbXBsYXRlIENvc3QgQW5hbHlzaXNcXG4nO1xuICAgIHJlcG9ydCArPSAnPScucmVwZWF0KDgwKSArICdcXG5cXG4nO1xuXG4gICAgLy8gU3VtbWFyeVxuICAgIHJlcG9ydCArPSBgVG90YWwgTW9udGhseSBDb3N0OiAkJHtyZXN1bHQudG90YWxNb250aGx5Q29zdC50b0ZpeGVkKDIpfSAke3Jlc3VsdC5jdXJyZW5jeX1cXG5gO1xuICAgIHJlcG9ydCArPSBgQW5hbHlzaXMgRGF0ZTogJHtyZXN1bHQubWV0YWRhdGEuYW5hbHl6ZWRBdC50b0lTT1N0cmluZygpfVxcbmA7XG4gICAgcmVwb3J0ICs9IGBSZWdpb246ICR7cmVzdWx0Lm1ldGFkYXRhLnJlZ2lvbn1cXG5gO1xuICAgIHJlcG9ydCArPSBgVGVtcGxhdGUgSGFzaDogJHtyZXN1bHQubWV0YWRhdGEudGVtcGxhdGVIYXNofVxcblxcbmA7XG5cbiAgICAvLyBSZXNvdXJjZSBjb3VudHNcbiAgICByZXBvcnQgKz0gYFRvdGFsIFJlc291cmNlczogJHtyZXN1bHQubWV0YWRhdGEucmVzb3VyY2VDb3VudH1cXG5gO1xuICAgIHJlcG9ydCArPSBgU3VwcG9ydGVkIFJlc291cmNlczogJHtyZXN1bHQubWV0YWRhdGEuc3VwcG9ydGVkUmVzb3VyY2VDb3VudH1cXG5gO1xuICAgIHJlcG9ydCArPSBgVW5zdXBwb3J0ZWQgUmVzb3VyY2VzOiAke3Jlc3VsdC5tZXRhZGF0YS51bnN1cHBvcnRlZFJlc291cmNlQ291bnR9XFxuXFxuYDtcblxuICAgIC8vIENvc3QgYnJlYWtkb3duIGJ5IGNvbmZpZGVuY2VcbiAgICBpZiAocmVzdWx0LmNvc3RCcmVha2Rvd24uYnlDb25maWRlbmNlTGV2ZWwubGVuZ3RoID4gMCkge1xuICAgICAgcmVwb3J0ICs9ICctJy5yZXBlYXQoODApICsgJ1xcbic7XG4gICAgICByZXBvcnQgKz0gJ0Nvc3QgQ29uZmlkZW5jZSBCcmVha2Rvd25cXG4nO1xuICAgICAgcmVwb3J0ICs9ICctJy5yZXBlYXQoODApICsgJ1xcblxcbic7XG5cbiAgICAgIGZvciAoY29uc3QgY29uZiBvZiByZXN1bHQuY29zdEJyZWFrZG93bi5ieUNvbmZpZGVuY2VMZXZlbCkge1xuICAgICAgICBjb25zdCBwZXJjZW50YWdlID0gKChjb25mLnRvdGFsQ29zdCAvIHJlc3VsdC50b3RhbE1vbnRobHlDb3N0KSAqIDEwMCkudG9GaXhlZCgxKTtcbiAgICAgICAgcmVwb3J0ICs9IGAke2NvbmYuY29uZmlkZW5jZS50b1VwcGVyQ2FzZSgpLnBhZEVuZCgxMCl9ICR7Y29uZi5jb3VudH0gcmVzb3VyY2VzICAkJHtjb25mLnRvdGFsQ29zdC50b0ZpeGVkKDIpfSAoJHtwZXJjZW50YWdlfSUpXFxuYDtcbiAgICAgIH1cbiAgICAgIHJlcG9ydCArPSAnXFxuJztcbiAgICB9XG5cbiAgICAvLyBSZXNvdXJjZSBicmVha2Rvd25cbiAgICBpZiAob3B0aW9ucy5zaG93QnJlYWtkb3duICYmIG9wdGlvbnMuZ3JvdXBCeVR5cGUpIHtcbiAgICAgIHJlcG9ydCArPSAnLScucmVwZWF0KDgwKSArICdcXG4nO1xuICAgICAgcmVwb3J0ICs9ICdDb3N0IEJyZWFrZG93biBieSBSZXNvdXJjZSBUeXBlXFxuJztcbiAgICAgIHJlcG9ydCArPSAnLScucmVwZWF0KDgwKSArICdcXG5cXG4nO1xuXG4gICAgICBmb3IgKGNvbnN0IHR5cGVHcm91cCBvZiByZXN1bHQuY29zdEJyZWFrZG93bi5ieVJlc291cmNlVHlwZSkge1xuICAgICAgICBjb25zdCBwZXJjZW50YWdlID0gKCh0eXBlR3JvdXAudG90YWxDb3N0IC8gcmVzdWx0LnRvdGFsTW9udGhseUNvc3QpICogMTAwKS50b0ZpeGVkKDEpO1xuICAgICAgICByZXBvcnQgKz0gYCR7dHlwZUdyb3VwLnJlc291cmNlVHlwZX1cXG5gO1xuICAgICAgICByZXBvcnQgKz0gYCAgQ291bnQ6ICR7dHlwZUdyb3VwLmNvdW50fVxcbmA7XG4gICAgICAgIHJlcG9ydCArPSBgICBUb3RhbCBDb3N0OiAkJHt0eXBlR3JvdXAudG90YWxDb3N0LnRvRml4ZWQoMil9ICgke3BlcmNlbnRhZ2V9JSlcXG5gO1xuXG4gICAgICAgIC8vIFNob3cgaW5kaXZpZHVhbCByZXNvdXJjZXNcbiAgICAgICAgY29uc3Qgc29ydGVkUmVzb3VyY2VzID0gdGhpcy5zb3J0UmVzb3VyY2VzKHR5cGVHcm91cC5yZXNvdXJjZXMsIG9wdGlvbnMuc29ydEJ5KTtcbiAgICAgICAgZm9yIChjb25zdCByZXNvdXJjZSBvZiBzb3J0ZWRSZXNvdXJjZXMpIHtcbiAgICAgICAgICBjb25zdCBjb25mID0gcmVzb3VyY2UubW9udGhseUNvc3QuY29uZmlkZW5jZTtcbiAgICAgICAgICBjb25zdCBjb25mSW5kaWNhdG9yID0gY29uZiA9PT0gJ2hpZ2gnID8gJ+KckycgOiBjb25mID09PSAnbWVkaXVtJyA/ICd+JyA6IGNvbmYgPT09ICdsb3cnID8gJz8nIDogJ+Kclyc7XG4gICAgICAgICAgcmVwb3J0ICs9IGAgICAgJHtjb25mSW5kaWNhdG9yfSAke3Jlc291cmNlLmxvZ2ljYWxJZC5wYWRFbmQoNDApfSAkJHtyZXNvdXJjZS5tb250aGx5Q29zdC5hbW91bnQudG9GaXhlZCgyKX1cXG5gO1xuICAgICAgICB9XG4gICAgICAgIHJlcG9ydCArPSAnXFxuJztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBc3N1bXB0aW9uc1xuICAgIGlmIChvcHRpb25zLnNob3dBc3N1bXB0aW9ucyAmJiByZXN1bHQuY29zdEJyZWFrZG93bi5hc3N1bXB0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICByZXBvcnQgKz0gJy0nLnJlcGVhdCg4MCkgKyAnXFxuJztcbiAgICAgIHJlcG9ydCArPSAnQ29zdCBDYWxjdWxhdGlvbiBBc3N1bXB0aW9uc1xcbic7XG4gICAgICByZXBvcnQgKz0gJy0nLnJlcGVhdCg4MCkgKyAnXFxuXFxuJztcblxuICAgICAgZm9yIChjb25zdCBhc3N1bXB0aW9uIG9mIHJlc3VsdC5jb3N0QnJlYWtkb3duLmFzc3VtcHRpb25zKSB7XG4gICAgICAgIHJlcG9ydCArPSBgICDigKIgJHthc3N1bXB0aW9ufVxcbmA7XG4gICAgICB9XG4gICAgICByZXBvcnQgKz0gJ1xcbic7XG4gICAgfVxuXG4gICAgLy8gTGVnZW5kXG4gICAgcmVwb3J0ICs9ICctJy5yZXBlYXQoODApICsgJ1xcbic7XG4gICAgcmVwb3J0ICs9ICdMZWdlbmQ6IOKckyBIaWdoIGNvbmZpZGVuY2UgIH4gTWVkaXVtIGNvbmZpZGVuY2UgID8gTG93IGNvbmZpZGVuY2UgIOKclyBVbmtub3duL1Vuc3VwcG9ydGVkXFxuJztcbiAgICByZXBvcnQgKz0gJz0nLnJlcGVhdCg4MCkgKyAnXFxuJztcblxuICAgIHJldHVybiByZXBvcnQ7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgbWFya2Rvd24gZm9ybWF0IHJlcG9ydFxuICAgKi9cbiAgcHJpdmF0ZSBnZW5lcmF0ZU1hcmtkb3duUmVwb3J0KFxuICAgIHJlc3VsdDogU2luZ2xlVGVtcGxhdGVDb3N0UmVzdWx0LFxuICAgIG9wdGlvbnM6IFJlcXVpcmVkPFNpbmdsZVRlbXBsYXRlUmVwb3J0T3B0aW9ucz4sXG4gICk6IHN0cmluZyB7XG4gICAgbGV0IHJlcG9ydCA9ICcnO1xuXG4gICAgLy8gSGVhZGVyXG4gICAgcmVwb3J0ICs9ICcjIPCfkrAgU2luZ2xlIFRlbXBsYXRlIENvc3QgQW5hbHlzaXNcXG5cXG4nO1xuXG4gICAgLy8gU3VtbWFyeVxuICAgIHJlcG9ydCArPSAnIyMgU3VtbWFyeVxcblxcbic7XG4gICAgcmVwb3J0ICs9IGAqKlRvdGFsIE1vbnRobHkgQ29zdDoqKiAkJHtyZXN1bHQudG90YWxNb250aGx5Q29zdC50b0ZpeGVkKDIpfSAke3Jlc3VsdC5jdXJyZW5jeX1cXG5cXG5gO1xuICAgIHJlcG9ydCArPSAnfCBNZXRyaWMgfCBWYWx1ZSB8XFxuJztcbiAgICByZXBvcnQgKz0gJ3wtLS0tLS0tLXwtLS0tLS0tfFxcbic7XG4gICAgcmVwb3J0ICs9IGB8IEFuYWx5c2lzIERhdGUgfCAke3Jlc3VsdC5tZXRhZGF0YS5hbmFseXplZEF0LnRvSVNPU3RyaW5nKCl9IHxcXG5gO1xuICAgIHJlcG9ydCArPSBgfCBSZWdpb24gfCAke3Jlc3VsdC5tZXRhZGF0YS5yZWdpb259IHxcXG5gO1xuICAgIHJlcG9ydCArPSBgfCBUZW1wbGF0ZSBIYXNoIHwgXFxgJHtyZXN1bHQubWV0YWRhdGEudGVtcGxhdGVIYXNofVxcYCB8XFxuXFxuYDtcblxuICAgIC8vIFJlc291cmNlIGNvdW50c1xuICAgIHJlcG9ydCArPSAnIyMg8J+TiiBSZXNvdXJjZSBPdmVydmlld1xcblxcbic7XG4gICAgcmVwb3J0ICs9ICd8IENhdGVnb3J5IHwgQ291bnQgfFxcbic7XG4gICAgcmVwb3J0ICs9ICd8LS0tLS0tLS0tLXwtLS0tLS0tfFxcbic7XG4gICAgcmVwb3J0ICs9IGB8IFRvdGFsIFJlc291cmNlcyB8ICR7cmVzdWx0Lm1ldGFkYXRhLnJlc291cmNlQ291bnR9IHxcXG5gO1xuICAgIHJlcG9ydCArPSBgfCBTdXBwb3J0ZWQgUmVzb3VyY2VzIHwgJHtyZXN1bHQubWV0YWRhdGEuc3VwcG9ydGVkUmVzb3VyY2VDb3VudH0gfFxcbmA7XG4gICAgcmVwb3J0ICs9IGB8IFVuc3VwcG9ydGVkIFJlc291cmNlcyB8ICR7cmVzdWx0Lm1ldGFkYXRhLnVuc3VwcG9ydGVkUmVzb3VyY2VDb3VudH0gfFxcblxcbmA7XG5cbiAgICAvLyBDb3N0IGJyZWFrZG93biBieSBjb25maWRlbmNlXG4gICAgaWYgKHJlc3VsdC5jb3N0QnJlYWtkb3duLmJ5Q29uZmlkZW5jZUxldmVsLmxlbmd0aCA+IDApIHtcbiAgICAgIHJlcG9ydCArPSAnIyMg8J+OryBDb3N0IENvbmZpZGVuY2UgQnJlYWtkb3duXFxuXFxuJztcbiAgICAgIHJlcG9ydCArPSAnfCBDb25maWRlbmNlIHwgUmVzb3VyY2VzIHwgQ29zdCB8IFBlcmNlbnRhZ2UgfFxcbic7XG4gICAgICByZXBvcnQgKz0gJ3wtLS0tLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tfC0tLS0tLS0tLS0tLXxcXG4nO1xuXG4gICAgICBmb3IgKGNvbnN0IGNvbmYgb2YgcmVzdWx0LmNvc3RCcmVha2Rvd24uYnlDb25maWRlbmNlTGV2ZWwpIHtcbiAgICAgICAgY29uc3QgcGVyY2VudGFnZSA9ICgoY29uZi50b3RhbENvc3QgLyByZXN1bHQudG90YWxNb250aGx5Q29zdCkgKiAxMDApLnRvRml4ZWQoMSk7XG4gICAgICAgIGNvbnN0IGVtb2ppID0gY29uZi5jb25maWRlbmNlID09PSAnaGlnaCcgPyAn4pyFJyA6IGNvbmYuY29uZmlkZW5jZSA9PT0gJ21lZGl1bScgPyAn4pqg77iPJyA6IGNvbmYuY29uZmlkZW5jZSA9PT0gJ2xvdycgPyAn4p2TJyA6ICfinYwnO1xuICAgICAgICByZXBvcnQgKz0gYHwgJHtlbW9qaX0gJHtjb25mLmNvbmZpZGVuY2V9IHwgJHtjb25mLmNvdW50fSB8ICQke2NvbmYudG90YWxDb3N0LnRvRml4ZWQoMil9IHwgJHtwZXJjZW50YWdlfSUgfFxcbmA7XG4gICAgICB9XG4gICAgICByZXBvcnQgKz0gJ1xcbic7XG4gICAgfVxuXG4gICAgLy8gQ29zdCBicmVha2Rvd24gYnkgc2VydmljZVxuICAgIGlmIChvcHRpb25zLnNob3dCcmVha2Rvd24gJiYgb3B0aW9ucy5ncm91cEJ5VHlwZSkge1xuICAgICAgcmVwb3J0ICs9ICcjIyDwn5OIIENvc3QgQnJlYWtkb3duIGJ5IFNlcnZpY2VcXG5cXG4nO1xuXG4gICAgICBjb25zdCBzZXJ2aWNlTWFwID0gbmV3IE1hcDxzdHJpbmcsIHsgdG90YWxDb3N0OiBudW1iZXI7IHJlc291cmNlczogQXJyYXk8eyBsb2dpY2FsSWQ6IHN0cmluZzsgdHlwZTogc3RyaW5nOyBtb250aGx5Q29zdDogYW55IH0+IH0+KCk7XG5cbiAgICAgIGZvciAoY29uc3QgdHlwZUdyb3VwIG9mIHJlc3VsdC5jb3N0QnJlYWtkb3duLmJ5UmVzb3VyY2VUeXBlKSB7XG4gICAgICAgIGNvbnN0IHNlcnZpY2UgPSBleHRyYWN0U2VydmljZU5hbWUodHlwZUdyb3VwLnJlc291cmNlVHlwZSk7XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nID0gc2VydmljZU1hcC5nZXQoc2VydmljZSkgfHwgeyB0b3RhbENvc3Q6IDAsIHJlc291cmNlczogW10gfTtcbiAgICAgICAgZXhpc3RpbmcudG90YWxDb3N0ICs9IHR5cGVHcm91cC50b3RhbENvc3Q7XG4gICAgICAgIGV4aXN0aW5nLnJlc291cmNlcy5wdXNoKC4uLnR5cGVHcm91cC5yZXNvdXJjZXMpO1xuICAgICAgICBzZXJ2aWNlTWFwLnNldChzZXJ2aWNlLCBleGlzdGluZyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNlcnZpY2VzID0gQXJyYXkuZnJvbShzZXJ2aWNlTWFwLmVudHJpZXMoKSlcbiAgICAgICAgLm1hcCgoW3NlcnZpY2UsIGRhdGFdKSA9PiAoeyBzZXJ2aWNlLCAuLi5kYXRhIH0pKVxuICAgICAgICAuc29ydCgoYSwgYikgPT4gYi50b3RhbENvc3QgLSBhLnRvdGFsQ29zdCk7XG5cbiAgICAgIHJlcG9ydCArPSAnfCBTZXJ2aWNlIHwgQ29zdCB8IFBlcmNlbnRhZ2UgfCBUcmVuZCB8XFxuJztcbiAgICAgIHJlcG9ydCArPSAnfC0tLS0tLS0tLXwtLS0tLS18LS0tLS0tLS0tLS0tfC0tLS0tLS18XFxuJztcblxuICAgICAgZm9yIChjb25zdCBzdmMgb2Ygc2VydmljZXMpIHtcbiAgICAgICAgY29uc3QgcGVyY2VudGFnZSA9ICgoc3ZjLnRvdGFsQ29zdCAvIHJlc3VsdC50b3RhbE1vbnRobHlDb3N0KSAqIDEwMCkudG9GaXhlZCgxKTtcbiAgICAgICAgY29uc3QgdHJlbmQgPSBnZXRUcmVuZEluZGljYXRvcihzdmMudG90YWxDb3N0KTtcbiAgICAgICAgcmVwb3J0ICs9IGB8ICR7c3ZjLnNlcnZpY2V9IHwgJCR7c3ZjLnRvdGFsQ29zdC50b0ZpeGVkKDIpfSB8ICR7cGVyY2VudGFnZX0lIHwgJHt0cmVuZH0gfFxcbmA7XG4gICAgICB9XG4gICAgICByZXBvcnQgKz0gJ1xcbic7XG5cbiAgICAgIC8vIERldGFpbGVkIGJyZWFrZG93biBieSByZXNvdXJjZSB0eXBlXG4gICAgICByZXBvcnQgKz0gJyMjIyBEZXRhaWxlZCBSZXNvdXJjZSBCcmVha2Rvd25cXG5cXG4nO1xuXG4gICAgICBmb3IgKGNvbnN0IHR5cGVHcm91cCBvZiByZXN1bHQuY29zdEJyZWFrZG93bi5ieVJlc291cmNlVHlwZSkge1xuICAgICAgICBjb25zdCBwZXJjZW50YWdlID0gKCh0eXBlR3JvdXAudG90YWxDb3N0IC8gcmVzdWx0LnRvdGFsTW9udGhseUNvc3QpICogMTAwKS50b0ZpeGVkKDEpO1xuICAgICAgICByZXBvcnQgKz0gYCMjIyMgXFxgJHt0eXBlR3JvdXAucmVzb3VyY2VUeXBlfVxcYFxcblxcbmA7XG4gICAgICAgIHJlcG9ydCArPSBgLSAqKkNvdW50OioqICR7dHlwZUdyb3VwLmNvdW50fVxcbmA7XG4gICAgICAgIHJlcG9ydCArPSBgLSAqKlRvdGFsIENvc3Q6KiogJCR7dHlwZUdyb3VwLnRvdGFsQ29zdC50b0ZpeGVkKDIpfSAoJHtwZXJjZW50YWdlfSUpXFxuXFxuYDtcblxuICAgICAgICByZXBvcnQgKz0gJ3wgUmVzb3VyY2UgfCBDb3N0IHwgQ29uZmlkZW5jZSB8XFxuJztcbiAgICAgICAgcmVwb3J0ICs9ICd8LS0tLS0tLS0tLXwtLS0tLS18LS0tLS0tLS0tLS0tfFxcbic7XG5cbiAgICAgICAgY29uc3Qgc29ydGVkUmVzb3VyY2VzID0gdGhpcy5zb3J0UmVzb3VyY2VzKHR5cGVHcm91cC5yZXNvdXJjZXMsIG9wdGlvbnMuc29ydEJ5KTtcbiAgICAgICAgZm9yIChjb25zdCByZXNvdXJjZSBvZiBzb3J0ZWRSZXNvdXJjZXMpIHtcbiAgICAgICAgICBjb25zdCBjb25mID0gcmVzb3VyY2UubW9udGhseUNvc3QuY29uZmlkZW5jZTtcbiAgICAgICAgICBjb25zdCBlbW9qaSA9IGNvbmYgPT09ICdoaWdoJyA/ICfinIUnIDogY29uZiA9PT0gJ21lZGl1bScgPyAn4pqg77iPJyA6IGNvbmYgPT09ICdsb3cnID8gJ+KdkycgOiAn4p2MJztcbiAgICAgICAgICByZXBvcnQgKz0gYHwgJHtyZXNvdXJjZS5sb2dpY2FsSWR9IHwgJCR7cmVzb3VyY2UubW9udGhseUNvc3QuYW1vdW50LnRvRml4ZWQoMil9IHwgJHtlbW9qaX0gJHtjb25mfSB8XFxuYDtcbiAgICAgICAgfVxuICAgICAgICByZXBvcnQgKz0gJ1xcbic7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQXNzdW1wdGlvbnMgKGNvbGxhcHNpYmxlKVxuICAgIGlmIChvcHRpb25zLnNob3dBc3N1bXB0aW9ucyAmJiByZXN1bHQuY29zdEJyZWFrZG93bi5hc3N1bXB0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICByZXBvcnQgKz0gJzxkZXRhaWxzPlxcbic7XG4gICAgICByZXBvcnQgKz0gJzxzdW1tYXJ5PjxzdHJvbmc+8J+TiyBDb3N0IENhbGN1bGF0aW9uIEFzc3VtcHRpb25zPC9zdHJvbmc+PC9zdW1tYXJ5Plxcblxcbic7XG4gICAgICBmb3IgKGNvbnN0IGFzc3VtcHRpb24gb2YgcmVzdWx0LmNvc3RCcmVha2Rvd24uYXNzdW1wdGlvbnMpIHtcbiAgICAgICAgcmVwb3J0ICs9IGAtICR7YXNzdW1wdGlvbn1cXG5gO1xuICAgICAgfVxuICAgICAgcmVwb3J0ICs9ICdcXG48L2RldGFpbHM+XFxuXFxuJztcbiAgICB9XG5cbiAgICAvLyBGb290ZXJcbiAgICByZXBvcnQgKz0gJy0tLVxcblxcbic7XG4gICAgcmVwb3J0ICs9ICcqUG93ZXJlZCBieSBbY2RrLWNvc3QtYW5hbHl6ZXJdKGh0dHBzOi8vZ2l0aHViLmNvbS9idWlsZGluZ2ludGhlY2xvdWQvY2RrLWNvc3QtYW5hbHl6ZXIpIHwgQ29uZmlkZW5jZSBsZXZlbHM6IOKchSBoaWdoLCDimqDvuI8gbWVkaXVtLCDinZMgbG93LCDinYwgdW5rbm93bipcXG4nO1xuXG4gICAgcmV0dXJuIHJlcG9ydDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTb3J0IHJlc291cmNlcyBiYXNlZCBvbiBzcGVjaWZpZWQgY3JpdGVyaWFcbiAgICovXG4gIHByaXZhdGUgc29ydFJlc291cmNlcyhcbiAgICByZXNvdXJjZXM6IEFycmF5PHsgbG9naWNhbElkOiBzdHJpbmc7IHR5cGU6IHN0cmluZzsgbW9udGhseUNvc3Q6IGFueSB9PixcbiAgICBzb3J0Qnk6ICdjb3N0JyB8ICduYW1lJyB8ICd0eXBlJyxcbiAgKTogQXJyYXk8eyBsb2dpY2FsSWQ6IHN0cmluZzsgdHlwZTogc3RyaW5nOyBtb250aGx5Q29zdDogYW55IH0+IHtcbiAgICBjb25zdCBzb3J0ZWQgPSBbLi4ucmVzb3VyY2VzXTtcblxuICAgIHN3aXRjaCAoc29ydEJ5KSB7XG4gICAgICBjYXNlICdjb3N0JzpcbiAgICAgICAgc29ydGVkLnNvcnQoKGEsIGIpID0+IGIubW9udGhseUNvc3QuYW1vdW50IC0gYS5tb250aGx5Q29zdC5hbW91bnQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ25hbWUnOlxuICAgICAgICBzb3J0ZWQuc29ydCgoYSwgYikgPT4gYS5sb2dpY2FsSWQubG9jYWxlQ29tcGFyZShiLmxvZ2ljYWxJZCkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3R5cGUnOlxuICAgICAgICBzb3J0ZWQuc29ydCgoYSwgYikgPT4gYS50eXBlLmxvY2FsZUNvbXBhcmUoYi50eXBlKSk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHJldHVybiBzb3J0ZWQ7XG4gIH1cbn1cbiJdfQ==
|
package/dist/reporter/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export { Reporter } from './Reporter';
|
|
2
2
|
export { SingleTemplateReporter } from './SingleTemplateReporter';
|
|
3
3
|
export { GitHubActionReporter } from './GitHubActionReporter';
|
|
4
|
+
export { ServiceBreakdown, getTrendIndicator, getPercentageChange, extractServiceName, groupCostsByService, calculateTotalCosts, } from './markdownUtils';
|
|
4
5
|
export * from './types';
|
package/dist/reporter/index.js
CHANGED
|
@@ -14,12 +14,18 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
14
14
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
exports.GitHubActionReporter = exports.SingleTemplateReporter = exports.Reporter = void 0;
|
|
17
|
+
exports.calculateTotalCosts = exports.groupCostsByService = exports.extractServiceName = exports.getPercentageChange = exports.getTrendIndicator = exports.GitHubActionReporter = exports.SingleTemplateReporter = exports.Reporter = void 0;
|
|
18
18
|
var Reporter_1 = require("./Reporter");
|
|
19
19
|
Object.defineProperty(exports, "Reporter", { enumerable: true, get: function () { return Reporter_1.Reporter; } });
|
|
20
20
|
var SingleTemplateReporter_1 = require("./SingleTemplateReporter");
|
|
21
21
|
Object.defineProperty(exports, "SingleTemplateReporter", { enumerable: true, get: function () { return SingleTemplateReporter_1.SingleTemplateReporter; } });
|
|
22
22
|
var GitHubActionReporter_1 = require("./GitHubActionReporter");
|
|
23
23
|
Object.defineProperty(exports, "GitHubActionReporter", { enumerable: true, get: function () { return GitHubActionReporter_1.GitHubActionReporter; } });
|
|
24
|
+
var markdownUtils_1 = require("./markdownUtils");
|
|
25
|
+
Object.defineProperty(exports, "getTrendIndicator", { enumerable: true, get: function () { return markdownUtils_1.getTrendIndicator; } });
|
|
26
|
+
Object.defineProperty(exports, "getPercentageChange", { enumerable: true, get: function () { return markdownUtils_1.getPercentageChange; } });
|
|
27
|
+
Object.defineProperty(exports, "extractServiceName", { enumerable: true, get: function () { return markdownUtils_1.extractServiceName; } });
|
|
28
|
+
Object.defineProperty(exports, "groupCostsByService", { enumerable: true, get: function () { return markdownUtils_1.groupCostsByService; } });
|
|
29
|
+
Object.defineProperty(exports, "calculateTotalCosts", { enumerable: true, get: function () { return markdownUtils_1.calculateTotalCosts; } });
|
|
24
30
|
__exportStar(require("./types"), exports);
|
|
25
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
31
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcmVwb3J0ZXIvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSx1Q0FBc0M7QUFBN0Isb0dBQUEsUUFBUSxPQUFBO0FBQ2pCLG1FQUFrRTtBQUF6RCxnSUFBQSxzQkFBc0IsT0FBQTtBQUMvQiwrREFBOEQ7QUFBckQsNEhBQUEsb0JBQW9CLE9BQUE7QUFDN0IsaURBT3lCO0FBTHZCLGtIQUFBLGlCQUFpQixPQUFBO0FBQ2pCLG9IQUFBLG1CQUFtQixPQUFBO0FBQ25CLG1IQUFBLGtCQUFrQixPQUFBO0FBQ2xCLG9IQUFBLG1CQUFtQixPQUFBO0FBQ25CLG9IQUFBLG1CQUFtQixPQUFBO0FBRXJCLDBDQUF3QiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IFJlcG9ydGVyIH0gZnJvbSAnLi9SZXBvcnRlcic7XG5leHBvcnQgeyBTaW5nbGVUZW1wbGF0ZVJlcG9ydGVyIH0gZnJvbSAnLi9TaW5nbGVUZW1wbGF0ZVJlcG9ydGVyJztcbmV4cG9ydCB7IEdpdEh1YkFjdGlvblJlcG9ydGVyIH0gZnJvbSAnLi9HaXRIdWJBY3Rpb25SZXBvcnRlcic7XG5leHBvcnQge1xuICBTZXJ2aWNlQnJlYWtkb3duLFxuICBnZXRUcmVuZEluZGljYXRvcixcbiAgZ2V0UGVyY2VudGFnZUNoYW5nZSxcbiAgZXh0cmFjdFNlcnZpY2VOYW1lLFxuICBncm91cENvc3RzQnlTZXJ2aWNlLFxuICBjYWxjdWxhdGVUb3RhbENvc3RzLFxufSBmcm9tICcuL21hcmtkb3duVXRpbHMnO1xuZXhwb3J0ICogZnJvbSAnLi90eXBlcyc7XG4iXX0=
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { CostDelta } from '../pricing/types';
|
|
2
|
+
/** Service breakdown entry for cost grouping */
|
|
3
|
+
export interface ServiceBreakdown {
|
|
4
|
+
service: string;
|
|
5
|
+
totalCost: number;
|
|
6
|
+
resourceCount: number;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Get trend indicator emoji based on cost change direction
|
|
10
|
+
*/
|
|
11
|
+
export declare function getTrendIndicator(amount: number): string;
|
|
12
|
+
/**
|
|
13
|
+
* Calculate percentage change between old and new amounts
|
|
14
|
+
*/
|
|
15
|
+
export declare function getPercentageChange(oldAmount: number, newAmount: number): string;
|
|
16
|
+
/**
|
|
17
|
+
* Extract AWS service name from resource type (e.g., AWS::EC2::Instance -> EC2)
|
|
18
|
+
*/
|
|
19
|
+
export declare function extractServiceName(resourceType: string): string;
|
|
20
|
+
/**
|
|
21
|
+
* Group costs by AWS service (e.g., EC2, S3, Lambda)
|
|
22
|
+
*/
|
|
23
|
+
export declare function groupCostsByService(costDelta: CostDelta): ServiceBreakdown[];
|
|
24
|
+
/**
|
|
25
|
+
* Calculate total costs before and after changes
|
|
26
|
+
*/
|
|
27
|
+
export declare function calculateTotalCosts(costDelta: CostDelta): {
|
|
28
|
+
before: number;
|
|
29
|
+
after: number;
|
|
30
|
+
};
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getTrendIndicator = getTrendIndicator;
|
|
4
|
+
exports.getPercentageChange = getPercentageChange;
|
|
5
|
+
exports.extractServiceName = extractServiceName;
|
|
6
|
+
exports.groupCostsByService = groupCostsByService;
|
|
7
|
+
exports.calculateTotalCosts = calculateTotalCosts;
|
|
8
|
+
/**
|
|
9
|
+
* Get trend indicator emoji based on cost change direction
|
|
10
|
+
*/
|
|
11
|
+
function getTrendIndicator(amount) {
|
|
12
|
+
if (amount > 0)
|
|
13
|
+
return '↗️';
|
|
14
|
+
if (amount < 0)
|
|
15
|
+
return '↘️';
|
|
16
|
+
return '➡️';
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Calculate percentage change between old and new amounts
|
|
20
|
+
*/
|
|
21
|
+
function getPercentageChange(oldAmount, newAmount) {
|
|
22
|
+
if (oldAmount === 0) {
|
|
23
|
+
return newAmount > 0 ? '+∞%' : '0%';
|
|
24
|
+
}
|
|
25
|
+
const percentage = ((newAmount - oldAmount) / oldAmount) * 100;
|
|
26
|
+
if (percentage === 0)
|
|
27
|
+
return '0%';
|
|
28
|
+
const sign = percentage > 0 ? '+' : '';
|
|
29
|
+
return `${sign}${percentage.toFixed(1)}%`;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Extract AWS service name from resource type (e.g., AWS::EC2::Instance -> EC2)
|
|
33
|
+
*/
|
|
34
|
+
function extractServiceName(resourceType) {
|
|
35
|
+
const parts = resourceType.split('::');
|
|
36
|
+
if (parts.length >= 2) {
|
|
37
|
+
return parts[1];
|
|
38
|
+
}
|
|
39
|
+
return resourceType;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Group costs by AWS service (e.g., EC2, S3, Lambda)
|
|
43
|
+
*/
|
|
44
|
+
function groupCostsByService(costDelta) {
|
|
45
|
+
const serviceMap = new Map();
|
|
46
|
+
for (const resource of costDelta.addedCosts) {
|
|
47
|
+
const service = extractServiceName(resource.type);
|
|
48
|
+
const existing = serviceMap.get(service) || { totalCost: 0, resourceCount: 0 };
|
|
49
|
+
existing.totalCost += resource.monthlyCost.amount;
|
|
50
|
+
existing.resourceCount += 1;
|
|
51
|
+
serviceMap.set(service, existing);
|
|
52
|
+
}
|
|
53
|
+
for (const resource of costDelta.removedCosts) {
|
|
54
|
+
const service = extractServiceName(resource.type);
|
|
55
|
+
const existing = serviceMap.get(service) || { totalCost: 0, resourceCount: 0 };
|
|
56
|
+
existing.totalCost -= resource.monthlyCost.amount;
|
|
57
|
+
existing.resourceCount += 1;
|
|
58
|
+
serviceMap.set(service, existing);
|
|
59
|
+
}
|
|
60
|
+
for (const resource of costDelta.modifiedCosts) {
|
|
61
|
+
const service = extractServiceName(resource.type);
|
|
62
|
+
const existing = serviceMap.get(service) || { totalCost: 0, resourceCount: 0 };
|
|
63
|
+
existing.totalCost += resource.costDelta;
|
|
64
|
+
existing.resourceCount += 1;
|
|
65
|
+
serviceMap.set(service, existing);
|
|
66
|
+
}
|
|
67
|
+
return Array.from(serviceMap.entries())
|
|
68
|
+
.map(([service, data]) => ({
|
|
69
|
+
service,
|
|
70
|
+
totalCost: data.totalCost,
|
|
71
|
+
resourceCount: data.resourceCount,
|
|
72
|
+
}))
|
|
73
|
+
.sort((a, b) => Math.abs(b.totalCost) - Math.abs(a.totalCost));
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Calculate total costs before and after changes
|
|
77
|
+
*/
|
|
78
|
+
function calculateTotalCosts(costDelta) {
|
|
79
|
+
let before = 0;
|
|
80
|
+
let after = 0;
|
|
81
|
+
for (const resource of costDelta.addedCosts) {
|
|
82
|
+
after += resource.monthlyCost.amount;
|
|
83
|
+
}
|
|
84
|
+
for (const resource of costDelta.removedCosts) {
|
|
85
|
+
before += resource.monthlyCost.amount;
|
|
86
|
+
}
|
|
87
|
+
for (const resource of costDelta.modifiedCosts) {
|
|
88
|
+
before += resource.oldMonthlyCost.amount;
|
|
89
|
+
after += resource.newMonthlyCost.amount;
|
|
90
|
+
}
|
|
91
|
+
return { before, after };
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFya2Rvd25VdGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9yZXBvcnRlci9tYXJrZG93blV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBWUEsOENBSUM7QUFLRCxrREFRQztBQUtELGdEQU1DO0FBS0Qsa0RBa0NDO0FBS0Qsa0RBa0JDO0FBN0ZEOztHQUVHO0FBQ0gsU0FBZ0IsaUJBQWlCLENBQUMsTUFBYztJQUM5QyxJQUFJLE1BQU0sR0FBRyxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDNUIsSUFBSSxNQUFNLEdBQUcsQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQzVCLE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBZ0IsbUJBQW1CLENBQUMsU0FBaUIsRUFBRSxTQUFpQjtJQUN0RSxJQUFJLFNBQVMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNwQixPQUFPLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ3RDLENBQUM7SUFDRCxNQUFNLFVBQVUsR0FBRyxDQUFDLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUMvRCxJQUFJLFVBQVUsS0FBSyxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDbEMsTUFBTSxJQUFJLEdBQUcsVUFBVSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDdkMsT0FBTyxHQUFHLElBQUksR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7QUFDNUMsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBZ0Isa0JBQWtCLENBQUMsWUFBb0I7SUFDckQsTUFBTSxLQUFLLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJ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LFVBQVUsRUFBRSxDQUFDO1FBQzVDLEtBQUssSUFBSSxRQUFRLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQztJQUN2QyxDQUFDO0lBRUQsS0FBSyxNQUFNLFFBQVEsSUFBSSxTQUFTLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDOUMsTUFBTSxJQUFJLFFBQVEsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDO0lBQ3hDLENBQUM7SUFFRCxLQUFLLE1BQU0sUUFBUSxJQUFJLFNBQVMsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUMvQyxNQUFNLElBQUksUUFBUSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUM7UUFDekMsS0FBSyxJQUFJLFFBQVEsQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDO0lBQzFDLENBQUM7SUFFRCxPQUFPLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDO0FBQzNCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb3N0RGVsdGEgfSBmcm9tICcuLi9wcmljaW5nL3R5cGVzJztcblxuLyoqIFNlcnZpY2UgYnJlYWtkb3duIGVudHJ5IGZvciBjb3N0IGdyb3VwaW5nICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VCcmVha2Rvd24ge1xuICBzZXJ2aWNlOiBzdHJpbmc7XG4gIHRvdGFsQ29zdDogbnVtYmVyO1xuICByZXNvdXJjZUNvdW50OiBudW1iZXI7XG59XG5cbi8qKlxuICogR2V0IHRyZW5kIGluZGljYXRvciBlbW9qaSBiYXNlZCBvbiBjb3N0IGNoYW5nZSBkaXJlY3Rpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFRyZW5kSW5kaWNhdG9yKGFtb3VudDogbnVtYmVyKTogc3RyaW5nIHtcbiAgaWYgKGFtb3VudCA+IDApIHJldHVybiAn4oaX77iPJztcbiAgaWYgKGFtb3VudCA8IDApIHJldHVybiAn4oaY77iPJztcbiAgcmV0dXJuICfinqHvuI8nO1xufVxuXG4vKipcbiAqIENhbGN1bGF0ZSBwZXJjZW50YWdlIGNoYW5nZSBiZXR3ZWVuIG9sZCBhbmQgbmV3IGFtb3VudHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFBlcmNlbnRhZ2VDaGFuZ2Uob2xkQW1vdW50OiBudW1iZXIsIG5ld0Ftb3VudDogbnVtYmVyKTogc3RyaW5nIHtcbiAgaWYgKG9sZEFtb3VudCA9PT0gMCkge1xuICAgIHJldHVybiBuZXdBbW91bnQgPiAwID8gJyviiJ4lJyA6ICcwJSc7XG4gIH1cbiAgY29uc3QgcGVyY2VudGFnZSA9ICgobmV3QW1vdW50IC0gb2xkQW1vdW50KSAvIG9sZEFtb3VudCkgKiAxMDA7XG4gIGlmIChwZXJjZW50YWdlID09PSAwKSByZXR1cm4gJzAlJztcbiAgY29uc3Qgc2lnbiA9IHBlcmNlbnRhZ2UgPiAwID8gJysnIDogJyc7XG4gIHJldHVybiBgJHtzaWdufSR7cGVyY2VudGFnZS50b0ZpeGVkKDEpfSVgO1xufVxuXG4vKipcbiAqIEV4dHJhY3QgQVdTIHNlcnZpY2UgbmFtZSBmcm9tIHJlc291cmNlIHR5cGUgKGUuZy4sIEFXUzo6RUMyOjpJbnN0YW5jZSAtPiBFQzIpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0U2VydmljZU5hbWUocmVzb3VyY2VUeXBlOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBwYXJ0cyA9IHJlc291cmNlVHlwZS5zcGxpdCgnOjonKTtcbiAgaWYgKHBhcnRzLmxlbmd0aCA+PSAyKSB7XG4gICAgcmV0dXJuIHBhcnRzWzFdO1xuICB9XG4gIHJldHVybiByZXNvdXJjZVR5cGU7XG59XG5cbi8qKlxuICogR3JvdXAgY29zdHMgYnkgQVdTIHNlcnZpY2UgKGUuZy4sIEVDMiwgUzMsIExhbWJkYSlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdyb3VwQ29zdHNCeVNlcnZpY2UoY29zdERlbHRhOiBDb3N0RGVsdGEpOiBTZXJ2aWNlQnJlYWtkb3duW10ge1xuICBjb25zdCBzZXJ2aWNlTWFwID0gbmV3IE1hcDxzdHJpbmcsIHsgdG90YWxDb3N0OiBudW1iZXI7IHJlc291cmNlQ291bnQ6IG51bWJlciB9PigpO1xuXG4gIGZvciAoY29uc3QgcmVzb3VyY2Ugb2YgY29zdERlbHRhLmFkZGVkQ29zdHMpIHtcbiAgICBjb25zdCBzZXJ2aWNlID0gZXh0cmFjdFNlcnZpY2VOYW1lKHJlc291cmNlLnR5cGUpO1xuICAgIGNvbnN0IGV4aXN0aW5nID0gc2VydmljZU1hcC5nZXQoc2VydmljZSkgfHwgeyB0b3RhbENvc3Q6IDAsIHJlc291cmNlQ291bnQ6IDAgfTtcbiAgICBleGlzdGluZy50b3RhbENvc3QgKz0gcmVzb3VyY2UubW9udGhseUNvc3QuYW1vdW50O1xuICAgIGV4aXN0aW5nLnJlc291cmNlQ291bnQgKz0gMTtcbiAgICBzZXJ2aWNlTWFwLnNldChzZXJ2aWNlLCBleGlzdGluZyk7XG4gIH1cblxuICBmb3IgKGNvbnN0IHJlc291cmNlIG9mIGNvc3REZWx0YS5yZW1vdmVkQ29zdHMpIHtcbiAgICBjb25zdCBzZXJ2aWNlID0gZXh0cmFjdFNlcnZpY2VOYW1lKHJlc291cmNlLnR5cGUpO1xuICAgIGNvbnN0IGV4aXN0aW5nID0gc2VydmljZU1hcC5nZXQoc2VydmljZSkgfHwgeyB0b3RhbENvc3Q6IDAsIHJlc291cmNlQ291bnQ6IDAgfTtcbiAgICBleGlzdGluZy50b3RhbENvc3QgLT0gcmVzb3VyY2UubW9udGhseUNvc3QuYW1vdW50O1xuICAgIGV4aXN0aW5nLnJlc291cmNlQ291bnQgKz0gMTtcbiAgICBzZXJ2aWNlTWFwLnNldChzZXJ2aWNlLCBleGlzdGluZyk7XG4gIH1cblxuICBmb3IgKGNvbnN0IHJlc291cmNlIG9mIGNvc3REZWx0YS5tb2RpZmllZENvc3RzKSB7XG4gICAgY29uc3Qgc2VydmljZSA9IGV4dHJhY3RTZXJ2aWNlTmFtZShyZXNvdXJjZS50eXBlKTtcbiAgICBjb25zdCBleGlzdGluZyA9IHNlcnZpY2VNYXAuZ2V0KHNlcnZpY2UpIHx8IHsgdG90YWxDb3N0OiAwLCByZXNvdXJjZUNvdW50OiAwIH07XG4gICAgZXhpc3RpbmcudG90YWxDb3N0ICs9IHJlc291cmNlLmNvc3REZWx0YTtcbiAgICBleGlzdGluZy5yZXNvdXJjZUNvdW50ICs9IDE7XG4gICAgc2VydmljZU1hcC5zZXQoc2VydmljZSwgZXhpc3RpbmcpO1xuICB9XG5cbiAgcmV0dXJuIEFycmF5LmZyb20oc2VydmljZU1hcC5lbnRyaWVzKCkpXG4gICAgLm1hcCgoW3NlcnZpY2UsIGRhdGFdKSA9PiAoe1xuICAgICAgc2VydmljZSxcbiAgICAgIHRvdGFsQ29zdDogZGF0YS50b3RhbENvc3QsXG4gICAgICByZXNvdXJjZUNvdW50OiBkYXRhLnJlc291cmNlQ291bnQsXG4gICAgfSkpXG4gICAgLnNvcnQoKGEsIGIpID0+IE1hdGguYWJzKGIudG90YWxDb3N0KSAtIE1hdGguYWJzKGEudG90YWxDb3N0KSk7XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlIHRvdGFsIGNvc3RzIGJlZm9yZSBhbmQgYWZ0ZXIgY2hhbmdlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY2FsY3VsYXRlVG90YWxDb3N0cyhjb3N0RGVsdGE6IENvc3REZWx0YSk6IHsgYmVmb3JlOiBudW1iZXI7IGFmdGVyOiBudW1iZXIgfSB7XG4gIGxldCBiZWZvcmUgPSAwO1xuICBsZXQgYWZ0ZXIgPSAwO1xuXG4gIGZvciAoY29uc3QgcmVzb3VyY2Ugb2YgY29zdERlbHRhLmFkZGVkQ29zdHMpIHtcbiAgICBhZnRlciArPSByZXNvdXJjZS5tb250aGx5Q29zdC5hbW91bnQ7XG4gIH1cblxuICBmb3IgKGNvbnN0IHJlc291cmNlIG9mIGNvc3REZWx0YS5yZW1vdmVkQ29zdHMpIHtcbiAgICBiZWZvcmUgKz0gcmVzb3VyY2UubW9udGhseUNvc3QuYW1vdW50O1xuICB9XG5cbiAgZm9yIChjb25zdCByZXNvdXJjZSBvZiBjb3N0RGVsdGEubW9kaWZpZWRDb3N0cykge1xuICAgIGJlZm9yZSArPSByZXNvdXJjZS5vbGRNb250aGx5Q29zdC5hbW91bnQ7XG4gICAgYWZ0ZXIgKz0gcmVzb3VyY2UubmV3TW9udGhseUNvc3QuYW1vdW50O1xuICB9XG5cbiAgcmV0dXJuIHsgYmVmb3JlLCBhZnRlciB9O1xufVxuIl19
|
package/package.json
CHANGED
|
@@ -56,7 +56,7 @@
|
|
|
56
56
|
"eslint-plugin-import": "^2.32.0",
|
|
57
57
|
"fast-check": "^3.23.1",
|
|
58
58
|
"husky": "^9.0.0",
|
|
59
|
-
"jest": "^30.
|
|
59
|
+
"jest": "^30.3.0",
|
|
60
60
|
"jest-junit": "^16",
|
|
61
61
|
"lint-staged": "^15.0.0",
|
|
62
62
|
"projen": "^0.99.19",
|
|
@@ -87,7 +87,7 @@
|
|
|
87
87
|
"publishConfig": {
|
|
88
88
|
"access": "public"
|
|
89
89
|
},
|
|
90
|
-
"version": "0.1.
|
|
90
|
+
"version": "0.1.41",
|
|
91
91
|
"bugs": {
|
|
92
92
|
"url": "https://github.com/buildinginthecloud/cdk-cost-analyzer/issues"
|
|
93
93
|
},
|