cdk-cost-analyzer 0.1.41 → 0.1.43
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/dist/action/api/index.d.ts +1 -0
- package/dist/action/api/single-template-types.d.ts +4 -0
- package/dist/action/api/types.d.ts +3 -0
- package/dist/action/config/types.d.ts +2 -0
- package/dist/action/optimization/OptimizationEngine.d.ts +11 -0
- package/dist/action/optimization/analyzers/GravitonMigrationAnalyzer.d.ts +17 -0
- package/dist/action/optimization/analyzers/NATGatewayOptimizationAnalyzer.d.ts +13 -0
- package/dist/action/optimization/analyzers/ReservedInstanceAnalyzer.d.ts +13 -0
- package/dist/action/optimization/analyzers/RightSizingAnalyzer.d.ts +13 -0
- package/dist/action/optimization/analyzers/SavingsPlansAnalyzer.d.ts +11 -0
- package/dist/action/optimization/analyzers/SpotInstanceAnalyzer.d.ts +12 -0
- package/dist/action/optimization/analyzers/StorageOptimizationAnalyzer.d.ts +14 -0
- package/dist/action/optimization/defaults.d.ts +2 -0
- package/dist/action/optimization/index.d.ts +10 -0
- package/dist/action/optimization/types.d.ts +35 -0
- package/dist/action/reporter/RecommendationReporter.d.ts +3 -0
- package/dist/analysis/SingleTemplateAnalyzer.js +12 -1
- package/dist/api/index.d.ts +1 -0
- package/dist/api/index.js +2 -1
- package/dist/api/single-template-types.d.ts +4 -0
- package/dist/api/single-template-types.js +1 -1
- package/dist/api/types.d.ts +3 -0
- package/dist/api/types.js +1 -1
- package/dist/cli/index.js +13 -2
- package/dist/config/types.d.ts +2 -0
- package/dist/config/types.js +1 -1
- package/dist/optimization/OptimizationEngine.d.ts +11 -0
- package/dist/optimization/OptimizationEngine.js +51 -0
- package/dist/optimization/analyzers/GravitonMigrationAnalyzer.d.ts +17 -0
- package/dist/optimization/analyzers/GravitonMigrationAnalyzer.js +209 -0
- package/dist/optimization/analyzers/NATGatewayOptimizationAnalyzer.d.ts +13 -0
- package/dist/optimization/analyzers/NATGatewayOptimizationAnalyzer.js +142 -0
- package/dist/optimization/analyzers/ReservedInstanceAnalyzer.d.ts +13 -0
- package/dist/optimization/analyzers/ReservedInstanceAnalyzer.js +102 -0
- package/dist/optimization/analyzers/RightSizingAnalyzer.d.ts +13 -0
- package/dist/optimization/analyzers/RightSizingAnalyzer.js +109 -0
- package/dist/optimization/analyzers/SavingsPlansAnalyzer.d.ts +11 -0
- package/dist/optimization/analyzers/SavingsPlansAnalyzer.js +102 -0
- package/dist/optimization/analyzers/SpotInstanceAnalyzer.d.ts +12 -0
- package/dist/optimization/analyzers/SpotInstanceAnalyzer.js +113 -0
- package/dist/optimization/analyzers/StorageOptimizationAnalyzer.d.ts +14 -0
- package/dist/optimization/analyzers/StorageOptimizationAnalyzer.js +142 -0
- package/dist/optimization/defaults.d.ts +2 -0
- package/dist/optimization/defaults.js +22 -0
- package/dist/optimization/index.d.ts +10 -0
- package/dist/optimization/index.js +22 -0
- package/dist/optimization/types.d.ts +35 -0
- package/dist/optimization/types.js +3 -0
- package/dist/releasetag.txt +1 -1
- package/dist/reporter/RecommendationReporter.d.ts +3 -0
- package/dist/reporter/RecommendationReporter.js +133 -0
- package/dist/reporter/SingleTemplateReporter.js +11 -1
- package/docs/CALCULATORS.md +374 -8
- package/docs/README.md +3 -2
- package/docs/RECOMMENDATIONS.md +466 -0
- package/docs/SINGLE-TEMPLATE-ANALYSIS.md +59 -16
- package/docs/index.md +38 -8
- package/examples/recommendations-demo.json +74 -0
- package/package.json +1 -1
package/dist/cli/index.js
CHANGED
|
@@ -59,6 +59,8 @@ program
|
|
|
59
59
|
.option('--region <region>', 'AWS region for pricing', 'eu-central-1')
|
|
60
60
|
.option('--format <format>', 'Output format: text|json|markdown', 'text')
|
|
61
61
|
.option('--config <path>', 'Path to configuration file')
|
|
62
|
+
.option('--recommendations', 'Include cost optimization recommendations')
|
|
63
|
+
.option('--min-savings <amount>', 'Minimum monthly savings to show (USD)', parseFloat)
|
|
62
64
|
.option('--debug', 'Enable verbose debug logging for pricing API calls')
|
|
63
65
|
.action(async (templatePath, options) => {
|
|
64
66
|
try {
|
|
@@ -79,9 +81,18 @@ program
|
|
|
79
81
|
template,
|
|
80
82
|
region: options.region,
|
|
81
83
|
format: options.format,
|
|
84
|
+
config: {
|
|
85
|
+
recommendations: options.recommendations,
|
|
86
|
+
minimumSavingsThreshold: options.minSavings,
|
|
87
|
+
},
|
|
82
88
|
});
|
|
83
|
-
// Output the results
|
|
89
|
+
// Output the results
|
|
90
|
+
// For text/markdown, summary already includes recommendations via SingleTemplateReporter
|
|
84
91
|
console.log(result.summary);
|
|
92
|
+
// For JSON format, append recommendations as structured data
|
|
93
|
+
if (options.format === 'json' && options.recommendations && result.recommendations) {
|
|
94
|
+
console.log(JSON.stringify({ recommendations: result.recommendations }, null, 2));
|
|
95
|
+
}
|
|
85
96
|
process.exit(0);
|
|
86
97
|
}
|
|
87
98
|
catch (error) {
|
|
@@ -327,4 +338,4 @@ program
|
|
|
327
338
|
}
|
|
328
339
|
});
|
|
329
340
|
program.parse();
|
|
330
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2xpL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVBLHVDQUF5QjtBQUN6QiwyQ0FBNkI7QUFDN0IseUNBQW9DO0FBQ3BDLGdDQUE2RDtBQUM3RCx5RUFBc0U7QUFDdEUseUVBQXNFO0FBRXRFLDJFQUF3RTtBQUN4RSwyRUFBd0U7QUFDeEUsNENBQXlDO0FBRXpDLGlDQUFpQztBQUNqQyxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO0FBQ25FLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxlQUFlLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztBQUMxRSxNQUFNLE9BQU8sR0FBRyxXQUFXLENBQUMsT0FBTyxJQUFJLE9BQU8sQ0FBQztBQUUvQyxNQUFNLE9BQU8sR0FBRyxJQUFJLG1CQUFPLEVBQUUsQ0FBQztBQUU5QixPQUFPO0tBQ0osSUFBSSxDQUFDLG1CQUFtQixDQUFDO0tBQ3pCLFdBQVcsQ0FBQywwRUFBMEUsQ0FBQztLQUN2RixPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7QUFFcEIsbURBQW1EO0FBQ25ELE9BQU87S0FDSixPQUFPLENBQUMsb0JBQW9CLENBQUM7S0FDN0IsV0FBVyxDQUFDLDhEQUE4RCxDQUFDO0tBQzNFLE1BQU0sQ0FBQyxtQkFBbUIsRUFBRSx3QkFBd0IsRUFBRSxjQUFjLENBQUM7S0FDckUsTUFBTSxDQUFDLG1CQUFtQixFQUFFLG1DQUFtQyxFQUFFLE1BQU0sQ0FBQztLQUN4RSxNQUFNLENBQUMsaUJBQWlCLEVBQUUsNEJBQTRCLENBQUM7S0FDdkQsTUFBTSxDQUFDLFNBQVMsRUFBRSxvREFBb0QsQ0FBQztLQUN2RSxNQUFNLENBQUMsS0FBSyxFQUFFLFlBQW9CLEVBQUUsT0FBNkUsRUFBRSxFQUFFO0lBQ3BILElBQUksQ0FBQztRQUNILHNDQUFzQztRQUN0QyxJQUFJLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNsQixlQUFNLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzdCLGVBQU0sQ0FBQyxLQUFLLENBQUMsdUJBQXVCLENBQUMsQ0FBQztRQUN4QyxDQUFDO1FBRUQsZ0NBQWdDO1FBQ2hDLElBQUksQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7WUFDakMsT0FBTyxDQUFDLEtBQUssQ0FBQyxtQ0FBbUMsWUFBWSxFQUFFLENBQUMsQ0FBQztZQUNqRSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xCLENBQUM7UUFFRCxvQkFBb0I7UUFDcEIsTUFBTSxRQUFRLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxZQUFZLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFFeEQsdUJBQXVCO1FBQ3ZCLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBQSwyQkFBcUIsRUFBQztZQUN6QyxRQUFRO1lBQ1IsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNO1lBQ3RCLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBc0M7U0FDdkQsQ0FBQyxDQUFDO1FBRUgsaUVBQWlFO1FBQ2pFLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRTVCLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEIsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixJQUFJLEtBQUssWUFBWSxLQUFLLEVBQUUsQ0FBQztZQUMzQixPQUFPLENBQUMsS0FBSyxDQUFDLFVBQVUsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDM0MsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLENBQUMsS0FBSyxDQUFDLFVBQVUsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMzQyxDQUFDO1FBQ0QsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsQixDQUFDO0FBQ0gsQ0FBQyxDQUFDLENBQUM7QUFFTCxrREFBa0Q7QUFDbEQsT0FBTztLQUNKLE9BQU8sQ0FBQyxTQUFTLENBQUM7S0FDbEIsV0FBVyxDQUFDLHNDQUFzQyxDQUFDO0tBQ25ELFFBQVEsQ0FBQyxRQUFRLEVBQUUsc0NBQXNDLENBQUM7S0FDMUQsUUFBUSxDQUFDLFVBQVUsRUFBRSx3Q0FBd0MsQ0FBQztLQUM5RCxNQUFNLENBQUMsbUJBQW1CLEVBQUUsWUFBWSxFQUFFLGNBQWMsQ0FBQztLQUN6RCxNQUFNLENBQUMsbUJBQW1CLEVBQUUsbUNBQW1DLEVBQUUsTUFBTSxDQUFDO0tBQ3hFLE1BQU0sQ0FBQyxpQkFBaUIsRUFBRSw0QkFBNEIsQ0FBQztLQUN2RCxNQUFNLENBQUMsU0FBUyxFQUFFLG9EQUFvRCxDQUFDO0tBQ3ZFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsUUFBZ0IsRUFBRSxVQUFrQixFQUFFLE9BQTZFLEVBQUUsRUFBRTtJQUNwSSxJQUFJLENBQUM7UUFDSCxzQ0FBc0M7UUFDdEMsSUFBSSxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDbEIsZUFBTSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM3QixlQUFNLENBQUMsS0FBSyxDQUFDLHVCQUF1QixDQUFDLENBQUM7UUFDeEMsQ0FBQztRQUVELElBQUksQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDN0IsT0FBTyxDQUFDLEtBQUssQ0FBQyx3Q0FBd0MsUUFBUSxFQUFFLENBQUMsQ0FBQztZQUNsRSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xCLENBQUM7UUFFRCxJQUFJLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1lBQy9CLE9BQU8sQ0FBQyxLQUFLLENBQUMsMENBQTBDLFVBQVUsRUFBRSxDQUFDLENBQUM7WUFDdEUsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsQixDQUFDO1FBRUQsTUFBTSxZQUFZLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDeEQsTUFBTSxjQUFjLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFFNUQsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFBLGtCQUFZLEVBQUM7WUFDaEMsWUFBWTtZQUNaLGNBQWM7WUFDZCxNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU07WUFDdEIsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFzQztTQUN2RCxDQUFDLENBQUM7UUFFSCxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssTUFBTSxFQUFFLENBQUM7WUFDOUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMvQyxDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzlCLENBQUM7UUFFRCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xCLENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsSUFBSSxLQUFLLFlBQVksS0FBSyxFQUFFLENBQUM7WUFDM0IsT0FBTyxDQUFDLEtBQUssQ0FBQyxVQUFVLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQzNDLENBQUM7YUFBTSxDQUFDO1lBQ04sT0FBTyxDQUFDLEtBQUssQ0FBQyxVQUFVLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDM0MsQ0FBQztRQUNELE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEIsQ0FBQztBQUNILENBQUMsQ0FBQyxDQUFDO0FBRUwsNERBQTREO0FBQzVELE9BQU87S0FDSixPQUFPLENBQUMsVUFBVSxDQUFDO0tBQ25CLFdBQVcsQ0FBQyw4REFBOEQsQ0FBQztLQUMzRSxNQUFNLENBQUMsZUFBZSxFQUFFLGdEQUFnRCxDQUFDO0tBQ3pFLE1BQU0sQ0FBQyxpQkFBaUIsRUFBRSxrREFBa0QsQ0FBQztLQUM3RSxNQUFNLENBQUMsU0FBUyxFQUFFLGdDQUFnQyxDQUFDO0tBQ25ELE1BQU0sQ0FBQyx1QkFBdUIsRUFBRSxtQ0FBbUMsQ0FBQztLQUNwRSxNQUFNLENBQUMsbUJBQW1CLEVBQUUsWUFBWSxFQUFFLGNBQWMsQ0FBQztLQUN6RCxNQUFNLENBQUMsaUJBQWlCLEVBQUUsNEJBQTRCLENBQUM7S0FDdkQsTUFBTSxDQUFDLHFCQUFxQixFQUFFLDBDQUEwQyxDQUFDO0tBQ3pFLE1BQU0sQ0FBQyxtQkFBbUIsRUFBRSxtQ0FBbUMsRUFBRSxNQUFNLENBQUM7S0FDeEUsTUFBTSxDQUFDLGtCQUFrQixFQUFFLHNDQUFzQyxDQUFDO0tBQ2xFLE1BQU0sQ0FBQyxrQkFBa0IsRUFBRSxxQ0FBcUMsQ0FBQztLQUNqRSxNQUFNLENBQUMsK0JBQStCLEVBQUUsb0RBQW9ELEVBQUUsUUFBUSxDQUFDO0tBQ3ZHLE1BQU0sQ0FBQyxTQUFTLEVBQUUsb0RBQW9ELENBQUM7S0FDdkUsTUFBTSxDQUFDLEtBQUssRUFBRSxPQWFkLEVBQUUsRUFBRTtJQUNILElBQUksQ0FBQztRQUNILHNDQUFzQztRQUN0QyxJQUFJLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNsQixlQUFNLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzdCLGVBQU0sQ0FBQyxLQUFLLENBQUMsdUJBQXVCLENBQUMsQ0FBQztRQUN4QyxDQUFDO1FBRUQsd0JBQXdCO1FBQ3hCLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGlCQUFpQixJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUMvRCxPQUFPLENBQUMsS0FBSyxDQUFDLHVDQUF1QyxDQUFDLENBQUM7WUFDdkQsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNsQixPQUFPLENBQUMsS0FBSyxDQUFDLDBDQUEwQyxDQUFDLENBQUM7WUFDMUQsT0FBTyxDQUFDLEtBQUssQ0FBQyx1RUFBdUUsQ0FBQyxDQUFDO1lBQ3ZGLE9BQU8sQ0FBQyxLQUFLLENBQUMsc0NBQXNDLENBQUMsQ0FBQztZQUN0RCxPQUFPLENBQUMsS0FBSyxDQUFDLCtDQUErQyxDQUFDLENBQUM7WUFDL0QsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNsQixPQUFPLENBQUMsS0FBSyxDQUFDLDhEQUE4RCxDQUFDLENBQUM7WUFDOUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO1lBQ2hELE9BQU8sQ0FBQyxLQUFLLENBQUMsNkRBQTZELENBQUMsQ0FBQztZQUM3RSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xCLENBQUM7UUFFRCxNQUFNLFlBQVksR0FBRyxJQUFJLDJDQUFvQixFQUFFLENBQUM7UUFFaEQsTUFBTSxNQUFNLEdBQUcsTUFBTSxZQUFZLENBQUMsbUJBQW1CLENBQUM7WUFDcEQsWUFBWSxFQUFFLE9BQU8sQ0FBQyxJQUFJO1lBQzFCLGNBQWMsRUFBRSxPQUFPLENBQUMsTUFBTTtZQUM5QixVQUFVLEVBQUUsT0FBTyxDQUFDLEtBQUs7WUFDekIsVUFBVSxFQUFFLE9BQU8sQ0FBQyxVQUFVO1lBQzlCLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTTtZQUN0QixVQUFVLEVBQUUsT0FBTyxDQUFDLE1BQU07WUFDMUIsV0FBVyxFQUFFLE9BQU8sQ0FBQyxXQUFXO1NBQ2pDLENBQUMsQ0FBQztRQUVILGtCQUFrQjtRQUNsQixJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssTUFBTSxFQUFFLENBQUM7WUFDOUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMvQyxDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN6QyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBRWhCLDJCQUEyQjtZQUMzQixJQUFJLE1BQU0sQ0FBQyxlQUFlLENBQUMsS0FBSyxLQUFLLE1BQU0sRUFBRSxDQUFDO2dCQUM1QyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDNUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO2dCQUNoQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDNUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUM1QyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUVoQixJQUFJLE1BQU0sQ0FBQyxlQUFlLENBQUMsZUFBZSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDdEQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO29CQUNoQyxNQUFNLENBQUMsZUFBZSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUU7d0JBQ3hELE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDLENBQUM7b0JBQ2xDLENBQUMsQ0FBQyxDQUFDO29CQUNILE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ2xCLENBQUM7WUFDSCxDQUFDO1lBRUQseUJBQXlCO1lBQ3pCLElBQUksTUFBTSxDQUFDLFVBQVUsQ0FBQyxVQUFVLElBQUksTUFBTSxDQUFDLFVBQVUsQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDakUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQzVCLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUM7Z0JBQzdCLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUM1QixJQUFJLE1BQU0sQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFLENBQUM7b0JBQ2pDLE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLE1BQU0sQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztnQkFDOUQsQ0FBQztnQkFDRCxJQUFJLE1BQU0sQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFLENBQUM7b0JBQ2pDLE9BQU8sQ0FBQyxHQUFHLENBQUMsd0JBQXdCLE1BQU0sQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxNQUFNLFlBQVksTUFBTSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsS0FBSyxJQUFJLE1BQU0sRUFBRSxDQUFDLENBQUM7b0JBQzlJLElBQUksTUFBTSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFLENBQUM7d0JBQzdDLE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLE1BQU0sQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7b0JBQzFFLENBQUM7Z0JBQ0gsQ0FBQztnQkFDRCxJQUFJLE1BQU0sQ0FBQyxVQUFVLENBQUMscUJBQXFCLEVBQUUsTUFBTSxFQUFFLENBQUM7b0JBQ3BELE9BQU8sQ0FBQyxHQUFHLENBQUMsdUJBQXVCLE1BQU0sQ0FBQyxVQUFVLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDM0YsQ0FBQztnQkFDRCxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ2xCLENBQUM7UUFDSCxDQUFDO1FBRUQsOEJBQThCO1FBQzlCLElBQUksT0FBTyxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3pCLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsWUFBWSxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDO1lBQ3pFLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDO1lBQzVDLE1BQU0sZUFBZSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsb0JBQW9CLENBQUM7WUFDekQsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUM7WUFFNUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxDQUFDLFNBQVMsSUFBSSxDQUFDLGVBQWUsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUNqRSxPQUFPLENBQUMsS0FBSyxDQUFDLHdFQUF3RSxDQUFDLENBQUM7Z0JBQ3hGLE9BQU8sQ0FBQyxLQUFLLENBQUMsNEVBQTRFLENBQUMsQ0FBQztZQUM5RixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sSUFBSSxDQUFDO29CQUNILE1BQU0sTUFBTSxHQUFHLElBQUkscUNBQWlCLENBQUM7d0JBQ25DLEtBQUssRUFBRSxXQUFXO3dCQUNsQixNQUFNLEVBQUUsU0FBUztxQkFDbEIsQ0FBQyxDQUFDO29CQUNILE1BQU0sTUFBTSxDQUFDLHVCQUF1QixDQUNsQyxTQUFTLEVBQ1QsZUFBZSxFQUNmLE1BQU0sQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUM1QixDQUFDO29CQUNGLE9BQU8sQ0FBQyxHQUFHLENBQUMsd0NBQXdDLENBQUMsQ0FBQztnQkFDeEQsQ0FBQztnQkFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO29CQUNmLE9BQU8sQ0FBQyxLQUFLLENBQUMsc0NBQXNDLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ2hILENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUVELDhCQUE4QjtRQUM5QixJQUFJLE9BQU8sQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN6QixNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQztZQUM3QyxNQUFNLGdCQUFnQixHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUM7WUFDdkQsTUFBTSxlQUFlLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQztZQUV0RCxJQUFJLENBQUMsV0FBVyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztnQkFDdEMsT0FBTyxDQUFDLEtBQUssQ0FBQyx3RUFBd0UsQ0FBQyxDQUFDO2dCQUN4RixPQUFPLENBQUMsS0FBSyxDQUFDLDJDQUEyQyxDQUFDLENBQUM7WUFDN0QsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLElBQUksQ0FBQztvQkFDSCxrQ0FBa0M7b0JBQ2xDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEdBQUcsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUVsRCxtQ0FBbUM7b0JBQ25DLElBQUksUUFBNEIsQ0FBQztvQkFDakMsSUFBSSxlQUFlLElBQUksRUFBRSxDQUFDLFVBQVUsQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDO3dCQUN0RCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsZUFBZSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7d0JBQzNFLFFBQVEsR0FBRyxZQUFZLENBQUMsWUFBWSxFQUFFLE1BQU0sSUFBSSxZQUFZLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQztvQkFDN0UsQ0FBQztvQkFFRCxpREFBaUQ7b0JBQ2pELElBQUksQ0FBQyxRQUFRLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO3dCQUM5QyxRQUFRLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsRUFBRSxDQUFDLENBQUM7b0JBQ3hELENBQUM7b0JBRUQsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO3dCQUNkLE9BQU8sQ0FBQyxLQUFLLENBQUMsK0RBQStELENBQUMsQ0FBQzt3QkFDL0UsT0FBTyxDQUFDLEtBQUssQ0FBQyw4RUFBOEUsQ0FBQyxDQUFDO29CQUNoRyxDQUFDO3lCQUFNLENBQUM7d0JBQ04sTUFBTSxNQUFNLEdBQUcsSUFBSSxxQ0FBaUIsQ0FBQzs0QkFDbkMsS0FBSyxFQUFFLFdBQVc7NEJBQ2xCLE1BQU0sRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsSUFBSSx3QkFBd0I7eUJBQy9ELENBQUMsQ0FBQzt3QkFFSCx3REFBd0Q7d0JBQ3hELE1BQU0sY0FBYyxHQUFHLElBQUksMkNBQW9CLEVBQUUsQ0FBQzt3QkFDbEQsTUFBTSxPQUFPLEdBQUcsY0FBYyxDQUFDLGNBQWMsQ0FBQzs0QkFDNUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxZQUFZLENBQUMsVUFBVTs0QkFDMUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxZQUFZLENBQUMsUUFBUTs0QkFDdEMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxZQUFZLENBQUMsY0FBYzs0QkFDOUMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxZQUFZLENBQUMsZ0JBQWdCOzRCQUNsRCxhQUFhLEVBQUUsTUFBTSxDQUFDLFlBQVksQ0FBQyxpQkFBaUI7eUJBQ3JELENBQUMsQ0FBQzt3QkFFSCxNQUFNLFFBQVEsR0FBRyxDQUFDLE9BQU8sQ0FBQyxlQUFlLElBQUksUUFBUSxDQUFvQixDQUFDO3dCQUMxRSxNQUFNLE1BQU0sQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDO3dCQUNyRSxPQUFPLENBQUMsR0FBRyxDQUFDLHVDQUF1QyxDQUFDLENBQUM7b0JBQ3ZELENBQUM7Z0JBQ0gsQ0FBQztnQkFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO29CQUNmLE9BQU8sQ0FBQyxLQUFLLENBQUMsc0NBQXNDLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ2hILENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUVELGdEQUFnRDtRQUNoRCxJQUFJLE1BQU0sQ0FBQyxlQUFlLENBQUMsS0FBSyxLQUFLLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDL0UsT0FBTyxDQUFDLEtBQUssQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO1lBQzFELE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEIsQ0FBQztRQUVELE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEIsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixJQUFJLEtBQUssWUFBWSxLQUFLLEVBQUUsQ0FBQztZQUMzQixPQUFPLENBQUMsS0FBSyxDQUFDLFVBQVUsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDM0MsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLENBQUMsS0FBSyxDQUFDLFVBQVUsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMzQyxDQUFDO1FBQ0QsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsQixDQUFDO0FBQ0gsQ0FBQyxDQUFDLENBQUM7QUFFTCxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIjIS91c3IvYmluL2VudiBub2RlXG5cbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBDb21tYW5kIH0gZnJvbSAnY29tbWFuZGVyJztcbmltcG9ydCB7IGFuYWx5emVDb3N0cywgYW5hbHl6ZVNpbmdsZVRlbXBsYXRlIH0gZnJvbSAnLi4vYXBpJztcbmltcG9ydCB7IEdpdExhYkludGVncmF0aW9uIH0gZnJvbSAnLi4vaW50ZWdyYXRpb25zL0dpdExhYkludGVncmF0aW9uJztcbmltcG9ydCB7IEdpdEh1YkludGVncmF0aW9uIH0gZnJvbSAnLi4vaW50ZWdyYXRpb25zL0dpdEh1YkludGVncmF0aW9uJztcbmltcG9ydCB7IENvbW1lbnRTdHJhdGVneSB9IGZyb20gJy4uL2ludGVncmF0aW9ucy90eXBlcyc7XG5pbXBvcnQgeyBQaXBlbGluZU9yY2hlc3RyYXRvciB9IGZyb20gJy4uL3BpcGVsaW5lL1BpcGVsaW5lT3JjaGVzdHJhdG9yJztcbmltcG9ydCB7IEdpdEh1YkFjdGlvblJlcG9ydGVyIH0gZnJvbSAnLi4vcmVwb3J0ZXIvR2l0SHViQWN0aW9uUmVwb3J0ZXInO1xuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSAnLi4vdXRpbHMvTG9nZ2VyJztcblxuLy8gUmVhZCB2ZXJzaW9uIGZyb20gcGFja2FnZS5qc29uXG5jb25zdCBwYWNrYWdlSnNvblBhdGggPSBwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4vLi4vcGFja2FnZS5qc29uJyk7XG5jb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhY2thZ2VKc29uUGF0aCwgJ3V0Zi04JykpO1xuY29uc3QgdmVyc2lvbiA9IHBhY2thZ2VKc29uLnZlcnNpb24gfHwgJzAuMC4wJztcblxuY29uc3QgcHJvZ3JhbSA9IG5ldyBDb21tYW5kKCk7XG5cbnByb2dyYW1cbiAgLm5hbWUoJ2Nkay1jb3N0LWFuYWx5emVyJylcbiAgLmRlc2NyaXB0aW9uKCdBbmFseXplIEFXUyBDREsgaW5mcmFzdHJ1Y3R1cmUgY2hhbmdlcyBhbmQgcHJvdmlkZSBjb3N0IGltcGFjdCBzdW1tYXJpZXMnKVxuICAudmVyc2lvbih2ZXJzaW9uKTtcblxuLy8gTmV3IGFuYWx5emUgY29tbWFuZCBmb3Igc2luZ2xlIHRlbXBsYXRlIGFuYWx5c2lzXG5wcm9ncmFtXG4gIC5jb21tYW5kKCdhbmFseXplIDx0ZW1wbGF0ZT4nKVxuICAuZGVzY3JpcHRpb24oJ0FuYWx5emUgYSBzaW5nbGUgQ2xvdWRGb3JtYXRpb24gdGVtcGxhdGUgZm9yIGVzdGltYXRlZCBjb3N0cycpXG4gIC5vcHRpb24oJy0tcmVnaW9uIDxyZWdpb24+JywgJ0FXUyByZWdpb24gZm9yIHByaWNpbmcnLCAnZXUtY2VudHJhbC0xJylcbiAgLm9wdGlvbignLS1mb3JtYXQgPGZvcm1hdD4nLCAnT3V0cHV0IGZvcm1hdDogdGV4dHxqc29ufG1hcmtkb3duJywgJ3RleHQnKVxuICAub3B0aW9uKCctLWNvbmZpZyA8cGF0aD4nLCAnUGF0aCB0byBjb25maWd1cmF0aW9uIGZpbGUnKVxuICAub3B0aW9uKCctLWRlYnVnJywgJ0VuYWJsZSB2ZXJib3NlIGRlYnVnIGxvZ2dpbmcgZm9yIHByaWNpbmcgQVBJIGNhbGxzJylcbiAgLmFjdGlvbihhc3luYyAodGVtcGxhdGVQYXRoOiBzdHJpbmcsIG9wdGlvbnM6IHsgcmVnaW9uOiBzdHJpbmc7IGZvcm1hdDogc3RyaW5nOyBjb25maWc/OiBzdHJpbmc7IGRlYnVnPzogYm9vbGVhbiB9KSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEVuYWJsZSBkZWJ1ZyBsb2dnaW5nIGlmIGZsYWcgaXMgc2V0XG4gICAgICBpZiAob3B0aW9ucy5kZWJ1Zykge1xuICAgICAgICBMb2dnZXIuc2V0RGVidWdFbmFibGVkKHRydWUpO1xuICAgICAgICBMb2dnZXIuZGVidWcoJ0RlYnVnIGxvZ2dpbmcgZW5hYmxlZCcpO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBpZiB0ZW1wbGF0ZSBmaWxlIGV4aXN0c1xuICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHRlbXBsYXRlUGF0aCkpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3I6IFRlbXBsYXRlIGZpbGUgbm90IGZvdW5kOiAke3RlbXBsYXRlUGF0aH1gKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgfVxuXG4gICAgICAvLyBSZWFkIHRoZSB0ZW1wbGF0ZVxuICAgICAgY29uc3QgdGVtcGxhdGUgPSBmcy5yZWFkRmlsZVN5bmModGVtcGxhdGVQYXRoLCAndXRmLTgnKTtcblxuICAgICAgLy8gQW5hbHl6ZSB0aGUgdGVtcGxhdGVcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGFuYWx5emVTaW5nbGVUZW1wbGF0ZSh7XG4gICAgICAgIHRlbXBsYXRlLFxuICAgICAgICByZWdpb246IG9wdGlvbnMucmVnaW9uLFxuICAgICAgICBmb3JtYXQ6IG9wdGlvbnMuZm9ybWF0IGFzICd0ZXh0JyB8ICdqc29uJyB8ICdtYXJrZG93bicsXG4gICAgICB9KTtcblxuICAgICAgLy8gT3V0cHV0IHRoZSByZXN1bHRzIChzdW1tYXJ5IGFscmVhZHkgY29udGFpbnMgZm9ybWF0dGVkIG91dHB1dClcbiAgICAgIGNvbnNvbGUubG9nKHJlc3VsdC5zdW1tYXJ5KTtcblxuICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBFcnJvcjogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3I6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gIH0pO1xuXG4vLyBPcmlnaW5hbCBjb21tYW5kIGZvciBkaXJlY3QgdGVtcGxhdGUgY29tcGFyaXNvblxucHJvZ3JhbVxuICAuY29tbWFuZCgnY29tcGFyZScpXG4gIC5kZXNjcmlwdGlvbignQ29tcGFyZSB0d28gQ2xvdWRGb3JtYXRpb24gdGVtcGxhdGVzJylcbiAgLmFyZ3VtZW50KCc8YmFzZT4nLCAnUGF0aCB0byBiYXNlIENsb3VkRm9ybWF0aW9uIHRlbXBsYXRlJylcbiAgLmFyZ3VtZW50KCc8dGFyZ2V0PicsICdQYXRoIHRvIHRhcmdldCBDbG91ZEZvcm1hdGlvbiB0ZW1wbGF0ZScpXG4gIC5vcHRpb24oJy0tcmVnaW9uIDxyZWdpb24+JywgJ0FXUyByZWdpb24nLCAnZXUtY2VudHJhbC0xJylcbiAgLm9wdGlvbignLS1mb3JtYXQgPGZvcm1hdD4nLCAnT3V0cHV0IGZvcm1hdDogdGV4dHxqc29ufG1hcmtkb3duJywgJ3RleHQnKVxuICAub3B0aW9uKCctLWNvbmZpZyA8cGF0aD4nLCAnUGF0aCB0byBjb25maWd1cmF0aW9uIGZpbGUnKVxuICAub3B0aW9uKCctLWRlYnVnJywgJ0VuYWJsZSB2ZXJib3NlIGRlYnVnIGxvZ2dpbmcgZm9yIHByaWNpbmcgQVBJIGNhbGxzJylcbiAgLmFjdGlvbihhc3luYyAoYmFzZVBhdGg6IHN0cmluZywgdGFyZ2V0UGF0aDogc3RyaW5nLCBvcHRpb25zOiB7IHJlZ2lvbjogc3RyaW5nOyBmb3JtYXQ6IHN0cmluZzsgY29uZmlnPzogc3RyaW5nOyBkZWJ1Zz86IGJvb2xlYW4gfSkgPT4ge1xuICAgIHRyeSB7XG4gICAgICAvLyBFbmFibGUgZGVidWcgbG9nZ2luZyBpZiBmbGFnIGlzIHNldFxuICAgICAgaWYgKG9wdGlvbnMuZGVidWcpIHtcbiAgICAgICAgTG9nZ2VyLnNldERlYnVnRW5hYmxlZCh0cnVlKTtcbiAgICAgICAgTG9nZ2VyLmRlYnVnKCdEZWJ1ZyBsb2dnaW5nIGVuYWJsZWQnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKGJhc2VQYXRoKSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBFcnJvcjogQmFzZSB0ZW1wbGF0ZSBmaWxlIG5vdCBmb3VuZDogJHtiYXNlUGF0aH1gKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWZzLmV4aXN0c1N5bmModGFyZ2V0UGF0aCkpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3I6IFRhcmdldCB0ZW1wbGF0ZSBmaWxlIG5vdCBmb3VuZDogJHt0YXJnZXRQYXRofWApO1xuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGJhc2VUZW1wbGF0ZSA9IGZzLnJlYWRGaWxlU3luYyhiYXNlUGF0aCwgJ3V0Zi04Jyk7XG4gICAgICBjb25zdCB0YXJnZXRUZW1wbGF0ZSA9IGZzLnJlYWRGaWxlU3luYyh0YXJnZXRQYXRoLCAndXRmLTgnKTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYW5hbHl6ZUNvc3RzKHtcbiAgICAgICAgYmFzZVRlbXBsYXRlLFxuICAgICAgICB0YXJnZXRUZW1wbGF0ZSxcbiAgICAgICAgcmVnaW9uOiBvcHRpb25zLnJlZ2lvbixcbiAgICAgICAgZm9ybWF0OiBvcHRpb25zLmZvcm1hdCBhcyAndGV4dCcgfCAnanNvbicgfCAnbWFya2Rvd24nLFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChvcHRpb25zLmZvcm1hdCA9PT0gJ2pzb24nKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KHJlc3VsdCwgbnVsbCwgMikpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5sb2cocmVzdWx0LnN1bW1hcnkpO1xuICAgICAgfVxuXG4gICAgICBwcm9jZXNzLmV4aXQoMCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBFcnJvcjogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgfSk7XG5cbi8vIE5ldyBwaXBlbGluZSBjb21tYW5kIGZvciBDSS9DRCBpbnRlZ3JhdGlvbiB3aXRoIHN5bnRoZXNpc1xucHJvZ3JhbVxuICAuY29tbWFuZCgncGlwZWxpbmUnKVxuICAuZGVzY3JpcHRpb24oJ1J1biBjb3N0IGFuYWx5c2lzIGluIENJL0NEIHBpcGVsaW5lIHdpdGggYXV0b21hdGljIHN5bnRoZXNpcycpXG4gIC5vcHRpb24oJy0tYmFzZSA8cGF0aD4nLCAnUGF0aCB0byBiYXNlIHRlbXBsYXRlIChpZiBub3QgdXNpbmcgc3ludGhlc2lzKScpXG4gIC5vcHRpb24oJy0tdGFyZ2V0IDxwYXRoPicsICdQYXRoIHRvIHRhcmdldCB0ZW1wbGF0ZSAoaWYgbm90IHVzaW5nIHN5bnRoZXNpcyknKVxuICAub3B0aW9uKCctLXN5bnRoJywgJ0VuYWJsZSBhdXRvbWF0aWMgQ0RLIHN5bnRoZXNpcycpXG4gIC5vcHRpb24oJy0tY2RrLWFwcC1wYXRoIDxwYXRoPicsICdQYXRoIHRvIENESyBhcHBsaWNhdGlvbiBkaXJlY3RvcnknKVxuICAub3B0aW9uKCctLXJlZ2lvbiA8cmVnaW9uPicsICdBV1MgcmVnaW9uJywgJ2V1LWNlbnRyYWwtMScpXG4gIC5vcHRpb24oJy0tY29uZmlnIDxwYXRoPicsICdQYXRoIHRvIGNvbmZpZ3VyYXRpb24gZmlsZScpXG4gIC5vcHRpb24oJy0tZW52aXJvbm1lbnQgPGVudj4nLCAnRW52aXJvbm1lbnQgbmFtZSBmb3IgdGhyZXNob2xkIHNlbGVjdGlvbicpXG4gIC5vcHRpb24oJy0tZm9ybWF0IDxmb3JtYXQ+JywgJ091dHB1dCBmb3JtYXQ6IHRleHR8anNvbnxtYXJrZG93bicsICd0ZXh0JylcbiAgLm9wdGlvbignLS1wb3N0LXRvLWdpdGxhYicsICdQb3N0IHJlc3VsdHMgdG8gR2l0TGFiIG1lcmdlIHJlcXVlc3QnKVxuICAub3B0aW9uKCctLXBvc3QtdG8tZ2l0aHViJywgJ1Bvc3QgcmVzdWx0cyB0byBHaXRIdWIgcHVsbCByZXF1ZXN0JylcbiAgLm9wdGlvbignLS1jb21tZW50LXN0cmF0ZWd5IDxzdHJhdGVneT4nLCAnQ29tbWVudCB1cGRhdGUgc3RyYXRlZ3k6IG5ld3x1cGRhdGV8ZGVsZXRlLWFuZC1uZXcnLCAndXBkYXRlJylcbiAgLm9wdGlvbignLS1kZWJ1ZycsICdFbmFibGUgdmVyYm9zZSBkZWJ1ZyBsb2dnaW5nIGZvciBwcmljaW5nIEFQSSBjYWxscycpXG4gIC5hY3Rpb24oYXN5bmMgKG9wdGlvbnM6IHtcbiAgICBiYXNlPzogc3RyaW5nO1xuICAgIHRhcmdldD86IHN0cmluZztcbiAgICBzeW50aD86IGJvb2xlYW47XG4gICAgY2RrQXBwUGF0aD86IHN0cmluZztcbiAgICByZWdpb246IHN0cmluZztcbiAgICBjb25maWc/OiBzdHJpbmc7XG4gICAgZW52aXJvbm1lbnQ/OiBzdHJpbmc7XG4gICAgZm9ybWF0OiBzdHJpbmc7XG4gICAgcG9zdFRvR2l0bGFiPzogYm9vbGVhbjtcbiAgICBwb3N0VG9HaXRodWI/OiBib29sZWFuO1xuICAgIGNvbW1lbnRTdHJhdGVneT86IHN0cmluZztcbiAgICBkZWJ1Zz86IGJvb2xlYW47XG4gIH0pID0+IHtcbiAgICB0cnkge1xuICAgICAgLy8gRW5hYmxlIGRlYnVnIGxvZ2dpbmcgaWYgZmxhZyBpcyBzZXRcbiAgICAgIGlmIChvcHRpb25zLmRlYnVnKSB7XG4gICAgICAgIExvZ2dlci5zZXREZWJ1Z0VuYWJsZWQodHJ1ZSk7XG4gICAgICAgIExvZ2dlci5kZWJ1ZygnRGVidWcgbG9nZ2luZyBlbmFibGVkJyk7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIEFXUyBjcmVkZW50aWFsc1xuICAgICAgaWYgKCFwcm9jZXNzLmVudi5BV1NfQUNDRVNTX0tFWV9JRCAmJiAhcHJvY2Vzcy5lbnYuQVdTX1BST0ZJTEUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3I6IEFXUyBjcmVkZW50aWFscyBub3QgY29uZmlndXJlZCcpO1xuICAgICAgICBjb25zb2xlLmVycm9yKCcnKTtcbiAgICAgICAgY29uc29sZS5lcnJvcignUGxlYXNlIHNldCBBV1MgY3JlZGVudGlhbHMgdXNpbmcgb25lIG9mOicpO1xuICAgICAgICBjb25zb2xlLmVycm9yKCcgIC0gQVdTX0FDQ0VTU19LRVlfSUQgYW5kIEFXU19TRUNSRVRfQUNDRVNTX0tFWSBlbnZpcm9ubWVudCB2YXJpYWJsZXMnKTtcbiAgICAgICAgY29uc29sZS5lcnJvcignICAtIEFXU19QUk9GSUxFIGVudmlyb25tZW50IHZhcmlhYmxlJyk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJyAgLSBBV1MgY3JlZGVudGlhbHMgZmlsZSAofi8uYXdzL2NyZWRlbnRpYWxzKScpO1xuICAgICAgICBjb25zb2xlLmVycm9yKCcnKTtcbiAgICAgICAgY29uc29sZS5lcnJvcignRm9yIEdpdExhYiBDSSwgY29uZmlndXJlIEFXUyBjcmVkZW50aWFscyBpbiBDSS9DRCB2YXJpYWJsZXM6Jyk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJyAgU2V0dGluZ3MgPiBDSS9DRCA+IFZhcmlhYmxlcycpO1xuICAgICAgICBjb25zb2xlLmVycm9yKCcgIEFkZDogQVdTX0FDQ0VTU19LRVlfSUQsIEFXU19TRUNSRVRfQUNDRVNTX0tFWSwgQVdTX1JFR0lPTicpO1xuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG9yY2hlc3RyYXRvciA9IG5ldyBQaXBlbGluZU9yY2hlc3RyYXRvcigpO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBvcmNoZXN0cmF0b3IucnVuUGlwZWxpbmVBbmFseXNpcyh7XG4gICAgICAgIGJhc2VUZW1wbGF0ZTogb3B0aW9ucy5iYXNlLFxuICAgICAgICB0YXJnZXRUZW1wbGF0ZTogb3B0aW9ucy50YXJnZXQsXG4gICAgICAgIHN5bnRoZXNpemU6IG9wdGlvbnMuc3ludGgsXG4gICAgICAgIGNka0FwcFBhdGg6IG9wdGlvbnMuY2RrQXBwUGF0aCxcbiAgICAgICAgcmVnaW9uOiBvcHRpb25zLnJlZ2lvbixcbiAgICAgICAgY29uZmlnUGF0aDogb3B0aW9ucy5jb25maWcsXG4gICAgICAgIGVudmlyb25tZW50OiBvcHRpb25zLmVudmlyb25tZW50LFxuICAgICAgfSk7XG5cbiAgICAgIC8vIERpc3BsYXkgcmVzdWx0c1xuICAgICAgaWYgKG9wdGlvbnMuZm9ybWF0ID09PSAnanNvbicpIHtcbiAgICAgICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkocmVzdWx0LCBudWxsLCAyKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmxvZyhyZXN1bHQuY29zdEFuYWx5c2lzLnN1bW1hcnkpO1xuICAgICAgICBjb25zb2xlLmxvZygnJyk7XG5cbiAgICAgICAgLy8gRGlzcGxheSB0aHJlc2hvbGQgc3RhdHVzXG4gICAgICAgIGlmIChyZXN1bHQudGhyZXNob2xkU3RhdHVzLmxldmVsICE9PSAnbm9uZScpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZygnPScucmVwZWF0KDgwKSk7XG4gICAgICAgICAgY29uc29sZS5sb2coJ1RIUkVTSE9MRCBTVEFUVVMnKTtcbiAgICAgICAgICBjb25zb2xlLmxvZygnPScucmVwZWF0KDgwKSk7XG4gICAgICAgICAgY29uc29sZS5sb2cocmVzdWx0LnRocmVzaG9sZFN0YXR1cy5tZXNzYWdlKTtcbiAgICAgICAgICBjb25zb2xlLmxvZygnJyk7XG5cbiAgICAgICAgICBpZiAocmVzdWx0LnRocmVzaG9sZFN0YXR1cy5yZWNvbW1lbmRhdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ1JlY29tbWVuZGF0aW9uczonKTtcbiAgICAgICAgICAgIHJlc3VsdC50aHJlc2hvbGRTdGF0dXMucmVjb21tZW5kYXRpb25zLmZvckVhY2goKHJlYywgaSkgPT4ge1xuICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgJHtpICsgMX0uICR7cmVjfWApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGlzcGxheSBjb25maWcgc3VtbWFyeVxuICAgICAgICBpZiAocmVzdWx0LmNvbmZpZ1VzZWQuY29uZmlnUGF0aCB8fCByZXN1bHQuY29uZmlnVXNlZC50aHJlc2hvbGRzKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coJz0nLnJlcGVhdCg4MCkpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdDT05GSUdVUkFUSU9OJyk7XG4gICAgICAgICAgY29uc29sZS5sb2coJz0nLnJlcGVhdCg4MCkpO1xuICAgICAgICAgIGlmIChyZXN1bHQuY29uZmlnVXNlZC5jb25maWdQYXRoKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgQ29uZmlnIGZpbGU6ICR7cmVzdWx0LmNvbmZpZ1VzZWQuY29uZmlnUGF0aH1gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHJlc3VsdC5jb25maWdVc2VkLnRocmVzaG9sZHMpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBUaHJlc2hvbGRzOiB3YXJuaW5nPSQke3Jlc3VsdC5jb25maWdVc2VkLnRocmVzaG9sZHMud2FybmluZyB8fCAnbm9uZSd9LCBlcnJvcj0kJHtyZXN1bHQuY29uZmlnVXNlZC50aHJlc2hvbGRzLmVycm9yIHx8ICdub25lJ31gKTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQuY29uZmlnVXNlZC50aHJlc2hvbGRzLmVudmlyb25tZW50KSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBFbnZpcm9ubWVudDogJHtyZXN1bHQuY29uZmlnVXNlZC50aHJlc2hvbGRzLmVudmlyb25tZW50fWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocmVzdWx0LmNvbmZpZ1VzZWQuZXhjbHVkZWRSZXNvdXJjZVR5cGVzPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBFeGNsdWRlZCByZXNvdXJjZXM6ICR7cmVzdWx0LmNvbmZpZ1VzZWQuZXhjbHVkZWRSZXNvdXJjZVR5cGVzLmpvaW4oJywgJyl9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnNvbGUubG9nKCcnKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBQb3N0IHRvIEdpdExhYiBpZiByZXF1ZXN0ZWRcbiAgICAgIGlmIChvcHRpb25zLnBvc3RUb0dpdGxhYikge1xuICAgICAgICBjb25zdCBnaXRsYWJUb2tlbiA9IHByb2Nlc3MuZW52LkdJVExBQl9UT0tFTiB8fCBwcm9jZXNzLmVudi5DSV9KT0JfVE9LRU47XG4gICAgICAgIGNvbnN0IHByb2plY3RJZCA9IHByb2Nlc3MuZW52LkNJX1BST0pFQ1RfSUQ7XG4gICAgICAgIGNvbnN0IG1lcmdlUmVxdWVzdElpZCA9IHByb2Nlc3MuZW52LkNJX01FUkdFX1JFUVVFU1RfSUlEO1xuICAgICAgICBjb25zdCBnaXRsYWJVcmwgPSBwcm9jZXNzLmVudi5DSV9TRVJWRVJfVVJMO1xuXG4gICAgICAgIGlmICghZ2l0bGFiVG9rZW4gfHwgIXByb2plY3RJZCB8fCAhbWVyZ2VSZXF1ZXN0SWlkIHx8ICFnaXRsYWJVcmwpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdXYXJuaW5nOiBHaXRMYWIgZW52aXJvbm1lbnQgdmFyaWFibGVzIG5vdCBmb3VuZC4gU2tpcHBpbmcgR2l0TGFiIHBvc3QuJyk7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignUmVxdWlyZWQ6IENJX0pPQl9UT0tFTiwgQ0lfUFJPSkVDVF9JRCwgQ0lfTUVSR0VfUkVRVUVTVF9JSUQsIENJX1NFUlZFUl9VUkwnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgZ2l0bGFiID0gbmV3IEdpdExhYkludGVncmF0aW9uKHtcbiAgICAgICAgICAgICAgdG9rZW46IGdpdGxhYlRva2VuLFxuICAgICAgICAgICAgICBhcGlVcmw6IGdpdGxhYlVybCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYXdhaXQgZ2l0bGFiLnBvc3RNZXJnZVJlcXVlc3RDb21tZW50KFxuICAgICAgICAgICAgICBwcm9qZWN0SWQsXG4gICAgICAgICAgICAgIG1lcmdlUmVxdWVzdElpZCxcbiAgICAgICAgICAgICAgcmVzdWx0LmNvc3RBbmFseXNpcy5zdW1tYXJ5LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdSZXN1bHRzIHBvc3RlZCB0byBHaXRMYWIgbWVyZ2UgcmVxdWVzdCcpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBXYXJuaW5nOiBGYWlsZWQgdG8gcG9zdCB0byBHaXRMYWI6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBQb3N0IHRvIEdpdEh1YiBpZiByZXF1ZXN0ZWRcbiAgICAgIGlmIChvcHRpb25zLnBvc3RUb0dpdGh1Yikge1xuICAgICAgICBjb25zdCBnaXRodWJUb2tlbiA9IHByb2Nlc3MuZW52LkdJVEhVQl9UT0tFTjtcbiAgICAgICAgY29uc3QgZ2l0aHViUmVwb3NpdG9yeSA9IHByb2Nlc3MuZW52LkdJVEhVQl9SRVBPU0lUT1JZO1xuICAgICAgICBjb25zdCBnaXRodWJFdmVudFBhdGggPSBwcm9jZXNzLmVudi5HSVRIVUJfRVZFTlRfUEFUSDtcblxuICAgICAgICBpZiAoIWdpdGh1YlRva2VuIHx8ICFnaXRodWJSZXBvc2l0b3J5KSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignV2FybmluZzogR2l0SHViIGVudmlyb25tZW50IHZhcmlhYmxlcyBub3QgZm91bmQuIFNraXBwaW5nIEdpdEh1YiBwb3N0LicpO1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1JlcXVpcmVkOiBHSVRIVUJfVE9LRU4sIEdJVEhVQl9SRVBPU0lUT1JZJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFBhcnNlIHJlcG9zaXRvcnkgb3duZXIgYW5kIG5hbWVcbiAgICAgICAgICAgIGNvbnN0IFtvd25lciwgcmVwb10gPSBnaXRodWJSZXBvc2l0b3J5LnNwbGl0KCcvJyk7XG5cbiAgICAgICAgICAgIC8vIEdldCBQUiBudW1iZXIgZnJvbSBldmVudCBwYXlsb2FkXG4gICAgICAgICAgICBsZXQgcHJOdW1iZXI6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmIChnaXRodWJFdmVudFBhdGggJiYgZnMuZXhpc3RzU3luYyhnaXRodWJFdmVudFBhdGgpKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGV2ZW50UGF5bG9hZCA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKGdpdGh1YkV2ZW50UGF0aCwgJ3V0Zi04JykpO1xuICAgICAgICAgICAgICBwck51bWJlciA9IGV2ZW50UGF5bG9hZC5wdWxsX3JlcXVlc3Q/Lm51bWJlciB8fCBldmVudFBheWxvYWQuaXNzdWU/Lm51bWJlcjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQWxzbyBjaGVjayBHSVRIVUJfUFJfTlVNQkVSIGZvciBkaXJlY3Qgc2V0dGluZ1xuICAgICAgICAgICAgaWYgKCFwck51bWJlciAmJiBwcm9jZXNzLmVudi5HSVRIVUJfUFJfTlVNQkVSKSB7XG4gICAgICAgICAgICAgIHByTnVtYmVyID0gcGFyc2VJbnQocHJvY2Vzcy5lbnYuR0lUSFVCX1BSX05VTUJFUiwgMTApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIXByTnVtYmVyKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1dhcm5pbmc6IENvdWxkIG5vdCBkZXRlcm1pbmUgUFIgbnVtYmVyLiBTa2lwcGluZyBHaXRIdWIgcG9zdC4nKTtcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignU2V0IEdJVEhVQl9QUl9OVU1CRVIgZW52aXJvbm1lbnQgdmFyaWFibGUgb3IgZW5zdXJlIHJ1bm5pbmcgaW4gYSBQUiBjb250ZXh0LicpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY29uc3QgZ2l0aHViID0gbmV3IEdpdEh1YkludGVncmF0aW9uKHtcbiAgICAgICAgICAgICAgICB0b2tlbjogZ2l0aHViVG9rZW4sXG4gICAgICAgICAgICAgICAgYXBpVXJsOiBwcm9jZXNzLmVudi5HSVRIVUJfQVBJX1VSTCB8fCAnaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbScsXG4gICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgIC8vIEdlbmVyYXRlIEdpdEh1Yi1zcGVjaWZpYyByZXBvcnQgd2l0aCB0cmVuZCBpbmRpY2F0b3JzXG4gICAgICAgICAgICAgIGNvbnN0IGdpdGh1YlJlcG9ydGVyID0gbmV3IEdpdEh1YkFjdGlvblJlcG9ydGVyKCk7XG4gICAgICAgICAgICAgIGNvbnN0IGNvbW1lbnQgPSBnaXRodWJSZXBvcnRlci5nZW5lcmF0ZVJlcG9ydCh7XG4gICAgICAgICAgICAgICAgdG90YWxEZWx0YTogcmVzdWx0LmNvc3RBbmFseXNpcy50b3RhbERlbHRhLFxuICAgICAgICAgICAgICAgIGN1cnJlbmN5OiByZXN1bHQuY29zdEFuYWx5c2lzLmN1cnJlbmN5LFxuICAgICAgICAgICAgICAgIGFkZGVkQ29zdHM6IHJlc3VsdC5jb3N0QW5hbHlzaXMuYWRkZWRSZXNvdXJjZXMsXG4gICAgICAgICAgICAgICAgcmVtb3ZlZENvc3RzOiByZXN1bHQuY29zdEFuYWx5c2lzLnJlbW92ZWRSZXNvdXJjZXMsXG4gICAgICAgICAgICAgICAgbW9kaWZpZWRDb3N0czogcmVzdWx0LmNvc3RBbmFseXNpcy5tb2RpZmllZFJlc291cmNlcyxcbiAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgY29uc3Qgc3RyYXRlZ3kgPSAob3B0aW9ucy5jb21tZW50U3RyYXRlZ3kgfHwgJ3VwZGF0ZScpIGFzIENvbW1lbnRTdHJhdGVneTtcbiAgICAgICAgICAgICAgYXdhaXQgZ2l0aHViLnBvc3RQUkNvbW1lbnQob3duZXIsIHJlcG8sIHByTnVtYmVyLCBjb21tZW50LCBzdHJhdGVneSk7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdSZXN1bHRzIHBvc3RlZCB0byBHaXRIdWIgcHVsbCByZXF1ZXN0Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFdhcm5pbmc6IEZhaWxlZCB0byBwb3N0IHRvIEdpdEh1YjogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEV4aXQgd2l0aCBhcHByb3ByaWF0ZSBjb2RlIGJhc2VkIG9uIHRocmVzaG9sZFxuICAgICAgaWYgKHJlc3VsdC50aHJlc2hvbGRTdGF0dXMubGV2ZWwgPT09ICdlcnJvcicgJiYgIXJlc3VsdC50aHJlc2hvbGRTdGF0dXMucGFzc2VkKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1BpcGVsaW5lIGZhaWxlZDogQ29zdCB0aHJlc2hvbGQgZXhjZWVkZWQnKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDIpO1xuICAgICAgfVxuXG4gICAgICBwcm9jZXNzLmV4aXQoMCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBFcnJvcjogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgfSk7XG5cbnByb2dyYW0ucGFyc2UoKTtcbiJdfQ==
|
|
341
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2xpL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVBLHVDQUF5QjtBQUN6QiwyQ0FBNkI7QUFDN0IseUNBQW9DO0FBQ3BDLGdDQUE2RDtBQUM3RCx5RUFBc0U7QUFDdEUseUVBQXNFO0FBRXRFLDJFQUF3RTtBQUN4RSwyRUFBd0U7QUFDeEUsNENBQXlDO0FBRXpDLGlDQUFpQztBQUNqQyxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO0FBQ25FLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxlQUFlLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztBQUMxRSxNQUFNLE9BQU8sR0FBRyxXQUFXLENBQUMsT0FBTyxJQUFJLE9BQU8sQ0FBQztBQUUvQyxNQUFNLE9BQU8sR0FBRyxJQUFJLG1CQUFPLEVBQUUsQ0FBQztBQUU5QixPQUFPO0tBQ0osSUFBSSxDQUFDLG1CQUFtQixDQUFDO0tBQ3pCLFdBQVcsQ0FBQywwRUFBMEUsQ0FBQztLQUN2RixPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7QUFFcEIsbURBQW1EO0FBQ25ELE9BQU87S0FDSixPQUFPLENBQUMsb0JBQW9CLENBQUM7S0FDN0IsV0FBVyxDQUFDLDhEQUE4RCxDQUFDO0tBQzNFLE1BQU0sQ0FBQyxtQkFBbUIsRUFBRSx3QkFBd0IsRUFBRSxjQUFjLENBQUM7S0FDckUsTUFBTSxDQUFDLG1CQUFtQixFQUFFLG1DQUFtQyxFQUFFLE1BQU0sQ0FBQztLQUN4RSxNQUFNLENBQUMsaUJBQWlCLEVBQUUsNEJBQTRCLENBQUM7S0FDdkQsTUFBTSxDQUFDLG1CQUFtQixFQUFFLDJDQUEyQyxDQUFDO0tBQ3hFLE1BQU0sQ0FBQyx3QkFB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S0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDM0MsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLENBQUMsS0FBSyxDQUFDLFVBQVUsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMzQyxDQUFDO1FBQ0QsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsQixDQUFDO0FBQ0gsQ0FBQyxDQUFDLENBQUM7QUFFTCxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIjIS91c3IvYmluL2VudiBub2RlXG5cbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBDb21tYW5kIH0gZnJvbSAnY29tbWFuZGVyJztcbmltcG9ydCB7IGFuYWx5emVDb3N0cywgYW5hbHl6ZVNpbmdsZVRlbXBsYXRlIH0gZnJvbSAnLi4vYXBpJztcbmltcG9ydCB7IEdpdExhYkludGVncmF0aW9uIH0gZnJvbSAnLi4vaW50ZWdyYXRpb25zL0dpdExhYkludGVncmF0aW9uJztcbmltcG9ydCB7IEdpdEh1YkludGVncmF0aW9uIH0gZnJvbSAnLi4vaW50ZWdyYXRpb25zL0dpdEh1YkludGVncmF0aW9uJztcbmltcG9ydCB7IENvbW1lbnRTdHJhdGVneSB9IGZyb20gJy4uL2ludGVncmF0aW9ucy90eXBlcyc7XG5pbXBvcnQgeyBQaXBlbGluZU9yY2hlc3RyYXRvciB9IGZyb20gJy4uL3BpcGVsaW5lL1BpcGVsaW5lT3JjaGVzdHJhdG9yJztcbmltcG9ydCB7IEdpdEh1YkFjdGlvblJlcG9ydGVyIH0gZnJvbSAnLi4vcmVwb3J0ZXIvR2l0SHViQWN0aW9uUmVwb3J0ZXInO1xuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSAnLi4vdXRpbHMvTG9nZ2VyJztcblxuLy8gUmVhZCB2ZXJzaW9uIGZyb20gcGFja2FnZS5qc29uXG5jb25zdCBwYWNrYWdlSnNvblBhdGggPSBwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4vLi4vcGFja2FnZS5qc29uJyk7XG5jb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhY2thZ2VKc29uUGF0aCwgJ3V0Zi04JykpO1xuY29uc3QgdmVyc2lvbiA9IHBhY2thZ2VKc29uLnZlcnNpb24gfHwgJzAuMC4wJztcblxuY29uc3QgcHJvZ3JhbSA9IG5ldyBDb21tYW5kKCk7XG5cbnByb2dyYW1cbiAgLm5hbWUoJ2Nkay1jb3N0LWFuYWx5emVyJylcbiAgLmRlc2NyaXB0aW9uKCdBbmFseXplIEFXUyBDREsgaW5mcmFzdHJ1Y3R1cmUgY2hhbmdlcyBhbmQgcHJvdmlkZSBjb3N0IGltcGFjdCBzdW1tYXJpZXMnKVxuICAudmVyc2lvbih2ZXJzaW9uKTtcblxuLy8gTmV3IGFuYWx5emUgY29tbWFuZCBmb3Igc2luZ2xlIHRlbXBsYXRlIGFuYWx5c2lzXG5wcm9ncmFtXG4gIC5jb21tYW5kKCdhbmFseXplIDx0ZW1wbGF0ZT4nKVxuICAuZGVzY3JpcHRpb24oJ0FuYWx5emUgYSBzaW5nbGUgQ2xvdWRGb3JtYXRpb24gdGVtcGxhdGUgZm9yIGVzdGltYXRlZCBjb3N0cycpXG4gIC5vcHRpb24oJy0tcmVnaW9uIDxyZWdpb24+JywgJ0FXUyByZWdpb24gZm9yIHByaWNpbmcnLCAnZXUtY2VudHJhbC0xJylcbiAgLm9wdGlvbignLS1mb3JtYXQgPGZvcm1hdD4nLCAnT3V0cHV0IGZvcm1hdDogdGV4dHxqc29ufG1hcmtkb3duJywgJ3RleHQnKVxuICAub3B0aW9uKCctLWNvbmZpZyA8cGF0aD4nLCAnUGF0aCB0byBjb25maWd1cmF0aW9uIGZpbGUnKVxuICAub3B0aW9uKCctLXJlY29tbWVuZGF0aW9ucycsICdJbmNsdWRlIGNvc3Qgb3B0aW1pemF0aW9uIHJlY29tbWVuZGF0aW9ucycpXG4gIC5vcHRpb24oJy0tbWluLXNhdmluZ3MgPGFtb3VudD4nLCAnTWluaW11bSBtb250aGx5IHNhdmluZ3MgdG8gc2hvdyAoVVNEKScsIHBhcnNlRmxvYXQpXG4gIC5vcHRpb24oJy0tZGVidWcnLCAnRW5hYmxlIHZlcmJvc2UgZGVidWcgbG9nZ2luZyBmb3IgcHJpY2luZyBBUEkgY2FsbHMnKVxuICAuYWN0aW9uKGFzeW5jICh0ZW1wbGF0ZVBhdGg6IHN0cmluZywgb3B0aW9uczogeyByZWdpb246IHN0cmluZzsgZm9ybWF0OiBzdHJpbmc7IGNvbmZpZz86IHN0cmluZzsgcmVjb21tZW5kYXRpb25zPzogYm9vbGVhbjsgbWluU2F2aW5ncz86IG51bWJlcjsgZGVidWc/OiBib29sZWFuIH0pID0+IHtcbiAgICB0cnkge1xuICAgICAgLy8gRW5hYmxlIGRlYnVnIGxvZ2dpbmcgaWYgZmxhZyBpcyBzZXRcbiAgICAgIGlmIChvcHRpb25zLmRlYnVnKSB7XG4gICAgICAgIExvZ2dlci5zZXREZWJ1Z0VuYWJsZWQodHJ1ZSk7XG4gICAgICAgIExvZ2dlci5kZWJ1ZygnRGVidWcgbG9nZ2luZyBlbmFibGVkJyk7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIHRlbXBsYXRlIGZpbGUgZXhpc3RzXG4gICAgICBpZiAoIWZzLmV4aXN0c1N5bmModGVtcGxhdGVQYXRoKSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBFcnJvcjogVGVtcGxhdGUgZmlsZSBub3QgZm91bmQ6ICR7dGVtcGxhdGVQYXRofWApO1xuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFJlYWQgdGhlIHRlbXBsYXRlXG4gICAgICBjb25zdCB0ZW1wbGF0ZSA9IGZzLnJlYWRGaWxlU3luYyh0ZW1wbGF0ZVBhdGgsICd1dGYtOCcpO1xuXG4gICAgICAvLyBBbmFseXplIHRoZSB0ZW1wbGF0ZVxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYW5hbHl6ZVNpbmdsZVRlbXBsYXRlKHtcbiAgICAgICAgdGVtcGxhdGUsXG4gICAgICAgIHJlZ2lvbjogb3B0aW9ucy5yZWdpb24sXG4gICAgICAgIGZvcm1hdDogb3B0aW9ucy5mb3JtYXQgYXMgJ3RleHQnIHwgJ2pzb24nIHwgJ21hcmtkb3duJyxcbiAgICAgICAgY29uZmlnOiB7XG4gICAgICAgICAgcmVjb21tZW5kYXRpb25zOiBvcHRpb25zLnJlY29tbWVuZGF0aW9ucyxcbiAgICAgICAgICBtaW5pbXVtU2F2aW5nc1RocmVzaG9sZDogb3B0aW9ucy5taW5TYXZpbmdzLFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIC8vIE91dHB1dCB0aGUgcmVzdWx0c1xuICAgICAgLy8gRm9yIHRleHQvbWFya2Rvd24sIHN1bW1hcnkgYWxyZWFkeSBpbmNsdWRlcyByZWNvbW1lbmRhdGlvbnMgdmlhIFNpbmdsZVRlbXBsYXRlUmVwb3J0ZXJcbiAgICAgIGNvbnNvbGUubG9nKHJlc3VsdC5zdW1tYXJ5KTtcblxuICAgICAgLy8gRm9yIEpTT04gZm9ybWF0LCBhcHBlbmQgcmVjb21tZW5kYXRpb25zIGFzIHN0cnVjdHVyZWQgZGF0YVxuICAgICAgaWYgKG9wdGlvbnMuZm9ybWF0ID09PSAnanNvbicgJiYgb3B0aW9ucy5yZWNvbW1lbmRhdGlvbnMgJiYgcmVzdWx0LnJlY29tbWVuZGF0aW9ucykge1xuICAgICAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeSh7IHJlY29tbWVuZGF0aW9uczogcmVzdWx0LnJlY29tbWVuZGF0aW9ucyB9LCBudWxsLCAyKSk7XG4gICAgICB9XG5cbiAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3I6ICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICB9KTtcblxuLy8gT3JpZ2luYWwgY29tbWFuZCBmb3IgZGlyZWN0IHRlbXBsYXRlIGNvbXBhcmlzb25cbnByb2dyYW1cbiAgLmNvbW1hbmQoJ2NvbXBhcmUnKVxuICAuZGVzY3JpcHRpb24oJ0NvbXBhcmUgdHdvIENsb3VkRm9ybWF0aW9uIHRlbXBsYXRlcycpXG4gIC5hcmd1bWVudCgnPGJhc2U+JywgJ1BhdGggdG8gYmFzZSBDbG91ZEZvcm1hdGlvbiB0ZW1wbGF0ZScpXG4gIC5hcmd1bWVudCgnPHRhcmdldD4nLCAnUGF0aCB0byB0YXJnZXQgQ2xvdWRGb3JtYXRpb24gdGVtcGxhdGUnKVxuICAub3B0aW9uKCctLXJlZ2lvbiA8cmVnaW9uPicsICdBV1MgcmVnaW9uJywgJ2V1LWNlbnRyYWwtMScpXG4gIC5vcHRpb24oJy0tZm9ybWF0IDxmb3JtYXQ+JywgJ091dHB1dCBmb3JtYXQ6IHRleHR8anNvbnxtYXJrZG93bicsICd0ZXh0JylcbiAgLm9wdGlvbignLS1jb25maWcgPHBhdGg+JywgJ1BhdGggdG8gY29uZmlndXJhdGlvbiBmaWxlJylcbiAgLm9wdGlvbignLS1kZWJ1ZycsICdFbmFibGUgdmVyYm9zZSBkZWJ1ZyBsb2dnaW5nIGZvciBwcmljaW5nIEFQSSBjYWxscycpXG4gIC5hY3Rpb24oYXN5bmMgKGJhc2VQYXRoOiBzdHJpbmcsIHRhcmdldFBhdGg6IHN0cmluZywgb3B0aW9uczogeyByZWdpb246IHN0cmluZzsgZm9ybWF0OiBzdHJpbmc7IGNvbmZpZz86IHN0cmluZzsgZGVidWc/OiBib29sZWFuIH0pID0+IHtcbiAgICB0cnkge1xuICAgICAgLy8gRW5hYmxlIGRlYnVnIGxvZ2dpbmcgaWYgZmxhZyBpcyBzZXRcbiAgICAgIGlmIChvcHRpb25zLmRlYnVnKSB7XG4gICAgICAgIExvZ2dlci5zZXREZWJ1Z0VuYWJsZWQodHJ1ZSk7XG4gICAgICAgIExvZ2dlci5kZWJ1ZygnRGVidWcgbG9nZ2luZyBlbmFibGVkJyk7XG4gICAgICB9XG5cbiAgICAgIGlmICghZnMuZXhpc3RzU3luYyhiYXNlUGF0aCkpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3I6IEJhc2UgdGVtcGxhdGUgZmlsZSBub3QgZm91bmQ6ICR7YmFzZVBhdGh9YCk7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHRhcmdldFBhdGgpKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yOiBUYXJnZXQgdGVtcGxhdGUgZmlsZSBub3QgZm91bmQ6ICR7dGFyZ2V0UGF0aH1gKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBiYXNlVGVtcGxhdGUgPSBmcy5yZWFkRmlsZVN5bmMoYmFzZVBhdGgsICd1dGYtOCcpO1xuICAgICAgY29uc3QgdGFyZ2V0VGVtcGxhdGUgPSBmcy5yZWFkRmlsZVN5bmModGFyZ2V0UGF0aCwgJ3V0Zi04Jyk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGFuYWx5emVDb3N0cyh7XG4gICAgICAgIGJhc2VUZW1wbGF0ZSxcbiAgICAgICAgdGFyZ2V0VGVtcGxhdGUsXG4gICAgICAgIHJlZ2lvbjogb3B0aW9ucy5yZWdpb24sXG4gICAgICAgIGZvcm1hdDogb3B0aW9ucy5mb3JtYXQgYXMgJ3RleHQnIHwgJ2pzb24nIHwgJ21hcmtkb3duJyxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAob3B0aW9ucy5mb3JtYXQgPT09ICdqc29uJykge1xuICAgICAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShyZXN1bHQsIG51bGwsIDIpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKHJlc3VsdC5zdW1tYXJ5KTtcbiAgICAgIH1cblxuICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBFcnJvcjogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3I6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gIH0pO1xuXG4vLyBOZXcgcGlwZWxpbmUgY29tbWFuZCBmb3IgQ0kvQ0QgaW50ZWdyYXRpb24gd2l0aCBzeW50aGVzaXNcbnByb2dyYW1cbiAgLmNvbW1hbmQoJ3BpcGVsaW5lJylcbiAgLmRlc2NyaXB0aW9uKCdSdW4gY29zdCBhbmFseXNpcyBpbiBDSS9DRCBwaXBlbGluZSB3aXRoIGF1dG9tYXRpYyBzeW50aGVzaXMnKVxuICAub3B0aW9uKCctLWJhc2UgPHBhdGg+JywgJ1BhdGggdG8gYmFzZSB0ZW1wbGF0ZSAoaWYgbm90IHVzaW5nIHN5bnRoZXNpcyknKVxuICAub3B0aW9uKCctLXRhcmdldCA8cGF0aD4nLCAnUGF0aCB0byB0YXJnZXQgdGVtcGxhdGUgKGlmIG5vdCB1c2luZyBzeW50aGVzaXMpJylcbiAgLm9wdGlvbignLS1zeW50aCcsICdFbmFibGUgYXV0b21hdGljIENESyBzeW50aGVzaXMnKVxuICAub3B0aW9uKCctLWNkay1hcHAtcGF0aCA8cGF0aD4nLCAnUGF0aCB0byBDREsgYXBwbGljYXRpb24gZGlyZWN0b3J5JylcbiAgLm9wdGlvbignLS1yZWdpb24gPHJlZ2lvbj4nLCAnQVdTIHJlZ2lvbicsICdldS1jZW50cmFsLTEnKVxuICAub3B0aW9uKCctLWNvbmZpZyA8cGF0aD4nLCAnUGF0aCB0byBjb25maWd1cmF0aW9uIGZpbGUnKVxuICAub3B0aW9uKCctLWVudmlyb25tZW50IDxlbnY+JywgJ0Vudmlyb25tZW50IG5hbWUgZm9yIHRocmVzaG9sZCBzZWxlY3Rpb24nKVxuICAub3B0aW9uKCctLWZvcm1hdCA8Zm9ybWF0PicsICdPdXRwdXQgZm9ybWF0OiB0ZXh0fGpzb258bWFya2Rvd24nLCAndGV4dCcpXG4gIC5vcHRpb24oJy0tcG9zdC10by1naXRsYWInLCAnUG9zdCByZXN1bHRzIHRvIEdpdExhYiBtZXJnZSByZXF1ZXN0JylcbiAgLm9wdGlvbignLS1wb3N0LXRvLWdpdGh1YicsICdQb3N0IHJlc3VsdHMgdG8gR2l0SHViIHB1bGwgcmVxdWVzdCcpXG4gIC5vcHRpb24oJy0tY29tbWVudC1zdHJhdGVneSA8c3RyYXRlZ3k+JywgJ0NvbW1lbnQgdXBkYXRlIHN0cmF0ZWd5OiBuZXd8dXBkYXRlfGRlbGV0ZS1hbmQtbmV3JywgJ3VwZGF0ZScpXG4gIC5vcHRpb24oJy0tZGVidWcnLCAnRW5hYmxlIHZlcmJvc2UgZGVidWcgbG9nZ2luZyBmb3IgcHJpY2luZyBBUEkgY2FsbHMnKVxuICAuYWN0aW9uKGFzeW5jIChvcHRpb25zOiB7XG4gICAgYmFzZT86IHN0cmluZztcbiAgICB0YXJnZXQ/OiBzdHJpbmc7XG4gICAgc3ludGg/OiBib29sZWFuO1xuICAgIGNka0FwcFBhdGg/OiBzdHJpbmc7XG4gICAgcmVnaW9uOiBzdHJpbmc7XG4gICAgY29uZmlnPzogc3RyaW5nO1xuICAgIGVudmlyb25tZW50Pzogc3RyaW5nO1xuICAgIGZvcm1hdDogc3RyaW5nO1xuICAgIHBvc3RUb0dpdGxhYj86IGJvb2xlYW47XG4gICAgcG9zdFRvR2l0aHViPzogYm9vbGVhbjtcbiAgICBjb21tZW50U3RyYXRlZ3k/OiBzdHJpbmc7XG4gICAgZGVidWc/OiBib29sZWFuO1xuICB9KSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEVuYWJsZSBkZWJ1ZyBsb2dnaW5nIGlmIGZsYWcgaXMgc2V0XG4gICAgICBpZiAob3B0aW9ucy5kZWJ1Zykge1xuICAgICAgICBMb2dnZXIuc2V0RGVidWdFbmFibGVkKHRydWUpO1xuICAgICAgICBMb2dnZXIuZGVidWcoJ0RlYnVnIGxvZ2dpbmcgZW5hYmxlZCcpO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBBV1MgY3JlZGVudGlhbHNcbiAgICAgIGlmICghcHJvY2Vzcy5lbnYuQVdTX0FDQ0VTU19LRVlfSUQgJiYgIXByb2Nlc3MuZW52LkFXU19QUk9GSUxFKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yOiBBV1MgY3JlZGVudGlhbHMgbm90IGNvbmZpZ3VyZWQnKTtcbiAgICAgICAgY29uc29sZS5lcnJvcignJyk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1BsZWFzZSBzZXQgQVdTIGNyZWRlbnRpYWxzIHVzaW5nIG9uZSBvZjonKTtcbiAgICAgICAgY29uc29sZS5lcnJvcignICAtIEFXU19BQ0NFU1NfS0VZX0lEIGFuZCBBV1NfU0VDUkVUX0FDQ0VTU19LRVkgZW52aXJvbm1lbnQgdmFyaWFibGVzJyk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJyAgLSBBV1NfUFJPRklMRSBlbnZpcm9ubWVudCB2YXJpYWJsZScpO1xuICAgICAgICBjb25zb2xlLmVycm9yKCcgIC0gQVdTIGNyZWRlbnRpYWxzIGZpbGUgKH4vLmF3cy9jcmVkZW50aWFscyknKTtcbiAgICAgICAgY29uc29sZS5lcnJvcignJyk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZvciBHaXRMYWIgQ0ksIGNvbmZpZ3VyZSBBV1MgY3JlZGVudGlhbHMgaW4gQ0kvQ0QgdmFyaWFibGVzOicpO1xuICAgICAgICBjb25zb2xlLmVycm9yKCcgIFNldHRpbmdzID4gQ0kvQ0QgPiBWYXJpYWJsZXMnKTtcbiAgICAgICAgY29uc29sZS5lcnJvcignICBBZGQ6IEFXU19BQ0NFU1NfS0VZX0lELCBBV1NfU0VDUkVUX0FDQ0VTU19LRVksIEFXU19SRUdJT04nKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBvcmNoZXN0cmF0b3IgPSBuZXcgUGlwZWxpbmVPcmNoZXN0cmF0b3IoKTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgb3JjaGVzdHJhdG9yLnJ1blBpcGVsaW5lQW5hbHlzaXMoe1xuICAgICAgICBiYXNlVGVtcGxhdGU6IG9wdGlvbnMuYmFzZSxcbiAgICAgICAgdGFyZ2V0VGVtcGxhdGU6IG9wdGlvbnMudGFyZ2V0LFxuICAgICAgICBzeW50aGVzaXplOiBvcHRpb25zLnN5bnRoLFxuICAgICAgICBjZGtBcHBQYXRoOiBvcHRpb25zLmNka0FwcFBhdGgsXG4gICAgICAgIHJlZ2lvbjogb3B0aW9ucy5yZWdpb24sXG4gICAgICAgIGNvbmZpZ1BhdGg6IG9wdGlvbnMuY29uZmlnLFxuICAgICAgICBlbnZpcm9ubWVudDogb3B0aW9ucy5lbnZpcm9ubWVudCxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBEaXNwbGF5IHJlc3VsdHNcbiAgICAgIGlmIChvcHRpb25zLmZvcm1hdCA9PT0gJ2pzb24nKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KHJlc3VsdCwgbnVsbCwgMikpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5sb2cocmVzdWx0LmNvc3RBbmFseXNpcy5zdW1tYXJ5KTtcbiAgICAgICAgY29uc29sZS5sb2coJycpO1xuXG4gICAgICAgIC8vIERpc3BsYXkgdGhyZXNob2xkIHN0YXR1c1xuICAgICAgICBpZiAocmVzdWx0LnRocmVzaG9sZFN0YXR1cy5sZXZlbCAhPT0gJ25vbmUnKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coJz0nLnJlcGVhdCg4MCkpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdUSFJFU0hPTEQgU1RBVFVTJyk7XG4gICAgICAgICAgY29uc29sZS5sb2coJz0nLnJlcGVhdCg4MCkpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKHJlc3VsdC50aHJlc2hvbGRTdGF0dXMubWVzc2FnZSk7XG4gICAgICAgICAgY29uc29sZS5sb2coJycpO1xuXG4gICAgICAgICAgaWYgKHJlc3VsdC50aHJlc2hvbGRTdGF0dXMucmVjb21tZW5kYXRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdSZWNvbW1lbmRhdGlvbnM6Jyk7XG4gICAgICAgICAgICByZXN1bHQudGhyZXNob2xkU3RhdHVzLnJlY29tbWVuZGF0aW9ucy5mb3JFYWNoKChyZWMsIGkpID0+IHtcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coYCR7aSArIDF9LiAke3JlY31gKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc29sZS5sb2coJycpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERpc3BsYXkgY29uZmlnIHN1bW1hcnlcbiAgICAgICAgaWYgKHJlc3VsdC5jb25maWdVc2VkLmNvbmZpZ1BhdGggfHwgcmVzdWx0LmNvbmZpZ1VzZWQudGhyZXNob2xkcykge1xuICAgICAgICAgIGNvbnNvbGUubG9nKCc9Jy5yZXBlYXQoODApKTtcbiAgICAgICAgICBjb25zb2xlLmxvZygnQ09ORklHVVJBVElPTicpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKCc9Jy5yZXBlYXQoODApKTtcbiAgICAgICAgICBpZiAocmVzdWx0LmNvbmZpZ1VzZWQuY29uZmlnUGF0aCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coYENvbmZpZyBmaWxlOiAke3Jlc3VsdC5jb25maWdVc2VkLmNvbmZpZ1BhdGh9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChyZXN1bHQuY29uZmlnVXNlZC50aHJlc2hvbGRzKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgVGhyZXNob2xkczogd2FybmluZz0kJHtyZXN1bHQuY29uZmlnVXNlZC50aHJlc2hvbGRzLndhcm5pbmcgfHwgJ25vbmUnfSwgZXJyb3I9JCR7cmVzdWx0LmNvbmZpZ1VzZWQudGhyZXNob2xkcy5lcnJvciB8fCAnbm9uZSd9YCk7XG4gICAgICAgICAgICBpZiAocmVzdWx0LmNvbmZpZ1VzZWQudGhyZXNob2xkcy5lbnZpcm9ubWVudCkge1xuICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgRW52aXJvbm1lbnQ6ICR7cmVzdWx0LmNvbmZpZ1VzZWQudGhyZXNob2xkcy5lbnZpcm9ubWVudH1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHJlc3VsdC5jb25maWdVc2VkLmV4Y2x1ZGVkUmVzb3VyY2VUeXBlcz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgRXhjbHVkZWQgcmVzb3VyY2VzOiAke3Jlc3VsdC5jb25maWdVc2VkLmV4Y2x1ZGVkUmVzb3VyY2VUeXBlcy5qb2luKCcsICcpfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zb2xlLmxvZygnJyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gUG9zdCB0byBHaXRMYWIgaWYgcmVxdWVzdGVkXG4gICAgICBpZiAob3B0aW9ucy5wb3N0VG9HaXRsYWIpIHtcbiAgICAgICAgY29uc3QgZ2l0bGFiVG9rZW4gPSBwcm9jZXNzLmVudi5HSVRMQUJfVE9LRU4gfHwgcHJvY2Vzcy5lbnYuQ0lfSk9CX1RPS0VOO1xuICAgICAgICBjb25zdCBwcm9qZWN0SWQgPSBwcm9jZXNzLmVudi5DSV9QUk9KRUNUX0lEO1xuICAgICAgICBjb25zdCBtZXJnZVJlcXVlc3RJaWQgPSBwcm9jZXNzLmVudi5DSV9NRVJHRV9SRVFVRVNUX0lJRDtcbiAgICAgICAgY29uc3QgZ2l0bGFiVXJsID0gcHJvY2Vzcy5lbnYuQ0lfU0VSVkVSX1VSTDtcblxuICAgICAgICBpZiAoIWdpdGxhYlRva2VuIHx8ICFwcm9qZWN0SWQgfHwgIW1lcmdlUmVxdWVzdElpZCB8fCAhZ2l0bGFiVXJsKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignV2FybmluZzogR2l0TGFiIGVudmlyb25tZW50IHZhcmlhYmxlcyBub3QgZm91bmQuIFNraXBwaW5nIEdpdExhYiBwb3N0LicpO1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1JlcXVpcmVkOiBDSV9KT0JfVE9LRU4sIENJX1BST0pFQ1RfSUQsIENJX01FUkdFX1JFUVVFU1RfSUlELCBDSV9TRVJWRVJfVVJMJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGdpdGxhYiA9IG5ldyBHaXRMYWJJbnRlZ3JhdGlvbih7XG4gICAgICAgICAgICAgIHRva2VuOiBnaXRsYWJUb2tlbixcbiAgICAgICAgICAgICAgYXBpVXJsOiBnaXRsYWJVcmwsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGF3YWl0IGdpdGxhYi5wb3N0TWVyZ2VSZXF1ZXN0Q29tbWVudChcbiAgICAgICAgICAgICAgcHJvamVjdElkLFxuICAgICAgICAgICAgICBtZXJnZVJlcXVlc3RJaWQsXG4gICAgICAgICAgICAgIHJlc3VsdC5jb3N0QW5hbHlzaXMuc3VtbWFyeSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnUmVzdWx0cyBwb3N0ZWQgdG8gR2l0TGFiIG1lcmdlIHJlcXVlc3QnKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgV2FybmluZzogRmFpbGVkIHRvIHBvc3QgdG8gR2l0TGFiOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gUG9zdCB0byBHaXRIdWIgaWYgcmVxdWVzdGVkXG4gICAgICBpZiAob3B0aW9ucy5wb3N0VG9HaXRodWIpIHtcbiAgICAgICAgY29uc3QgZ2l0aHViVG9rZW4gPSBwcm9jZXNzLmVudi5HSVRIVUJfVE9LRU47XG4gICAgICAgIGNvbnN0IGdpdGh1YlJlcG9zaXRvcnkgPSBwcm9jZXNzLmVudi5HSVRIVUJfUkVQT1NJVE9SWTtcbiAgICAgICAgY29uc3QgZ2l0aHViRXZlbnRQYXRoID0gcHJvY2Vzcy5lbnYuR0lUSFVCX0VWRU5UX1BBVEg7XG5cbiAgICAgICAgaWYgKCFnaXRodWJUb2tlbiB8fCAhZ2l0aHViUmVwb3NpdG9yeSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1dhcm5pbmc6IEdpdEh1YiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgbm90IGZvdW5kLiBTa2lwcGluZyBHaXRIdWIgcG9zdC4nKTtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdSZXF1aXJlZDogR0lUSFVCX1RPS0VOLCBHSVRIVUJfUkVQT1NJVE9SWScpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBQYXJzZSByZXBvc2l0b3J5IG93bmVyIGFuZCBuYW1lXG4gICAgICAgICAgICBjb25zdCBbb3duZXIsIHJlcG9dID0gZ2l0aHViUmVwb3NpdG9yeS5zcGxpdCgnLycpO1xuXG4gICAgICAgICAgICAvLyBHZXQgUFIgbnVtYmVyIGZyb20gZXZlbnQgcGF5bG9hZFxuICAgICAgICAgICAgbGV0IHByTnVtYmVyOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAoZ2l0aHViRXZlbnRQYXRoICYmIGZzLmV4aXN0c1N5bmMoZ2l0aHViRXZlbnRQYXRoKSkge1xuICAgICAgICAgICAgICBjb25zdCBldmVudFBheWxvYWQgPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhnaXRodWJFdmVudFBhdGgsICd1dGYtOCcpKTtcbiAgICAgICAgICAgICAgcHJOdW1iZXIgPSBldmVudFBheWxvYWQucHVsbF9yZXF1ZXN0Py5udW1iZXIgfHwgZXZlbnRQYXlsb2FkLmlzc3VlPy5udW1iZXI7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEFsc28gY2hlY2sgR0lUSFVCX1BSX05VTUJFUiBmb3IgZGlyZWN0IHNldHRpbmdcbiAgICAgICAgICAgIGlmICghcHJOdW1iZXIgJiYgcHJvY2Vzcy5lbnYuR0lUSFVCX1BSX05VTUJFUikge1xuICAgICAgICAgICAgICBwck51bWJlciA9IHBhcnNlSW50KHByb2Nlc3MuZW52LkdJVEhVQl9QUl9OVU1CRVIsIDEwKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFwck51bWJlcikge1xuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdXYXJuaW5nOiBDb3VsZCBub3QgZGV0ZXJtaW5lIFBSIG51bWJlci4gU2tpcHBpbmcgR2l0SHViIHBvc3QuJyk7XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1NldCBHSVRIVUJfUFJfTlVNQkVSIGVudmlyb25tZW50IHZhcmlhYmxlIG9yIGVuc3VyZSBydW5uaW5nIGluIGEgUFIgY29udGV4dC4nKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGNvbnN0IGdpdGh1YiA9IG5ldyBHaXRIdWJJbnRlZ3JhdGlvbih7XG4gICAgICAgICAgICAgICAgdG9rZW46IGdpdGh1YlRva2VuLFxuICAgICAgICAgICAgICAgIGFwaVVybDogcHJvY2Vzcy5lbnYuR0lUSFVCX0FQSV9VUkwgfHwgJ2h0dHBzOi8vYXBpLmdpdGh1Yi5jb20nLFxuICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAvLyBHZW5lcmF0ZSBHaXRIdWItc3BlY2lmaWMgcmVwb3J0IHdpdGggdHJlbmQgaW5kaWNhdG9yc1xuICAgICAgICAgICAgICBjb25zdCBnaXRodWJSZXBvcnRlciA9IG5ldyBHaXRIdWJBY3Rpb25SZXBvcnRlcigpO1xuICAgICAgICAgICAgICBjb25zdCBjb21tZW50ID0gZ2l0aHViUmVwb3J0ZXIuZ2VuZXJhdGVSZXBvcnQoe1xuICAgICAgICAgICAgICAgIHRvdGFsRGVsdGE6IHJlc3VsdC5jb3N0QW5hbHlzaXMudG90YWxEZWx0YSxcbiAgICAgICAgICAgICAgICBjdXJyZW5jeTogcmVzdWx0LmNvc3RBbmFseXNpcy5jdXJyZW5jeSxcbiAgICAgICAgICAgICAgICBhZGRlZENvc3RzOiByZXN1bHQuY29zdEFuYWx5c2lzLmFkZGVkUmVzb3VyY2VzLFxuICAgICAgICAgICAgICAgIHJlbW92ZWRDb3N0czogcmVzdWx0LmNvc3RBbmFseXNpcy5yZW1vdmVkUmVzb3VyY2VzLFxuICAgICAgICAgICAgICAgIG1vZGlmaWVkQ29zdHM6IHJlc3VsdC5jb3N0QW5hbHlzaXMubW9kaWZpZWRSZXNvdXJjZXMsXG4gICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgIGNvbnN0IHN0cmF0ZWd5ID0gKG9wdGlvbnMuY29tbWVudFN0cmF0ZWd5IHx8ICd1cGRhdGUnKSBhcyBDb21tZW50U3RyYXRlZ3k7XG4gICAgICAgICAgICAgIGF3YWl0IGdpdGh1Yi5wb3N0UFJDb21tZW50KG93bmVyLCByZXBvLCBwck51bWJlciwgY29tbWVudCwgc3RyYXRlZ3kpO1xuICAgICAgICAgICAgICBjb25zb2xlLmxvZygnUmVzdWx0cyBwb3N0ZWQgdG8gR2l0SHViIHB1bGwgcmVxdWVzdCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBXYXJuaW5nOiBGYWlsZWQgdG8gcG9zdCB0byBHaXRIdWI6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBFeGl0IHdpdGggYXBwcm9wcmlhdGUgY29kZSBiYXNlZCBvbiB0aHJlc2hvbGRcbiAgICAgIGlmIChyZXN1bHQudGhyZXNob2xkU3RhdHVzLmxldmVsID09PSAnZXJyb3InICYmICFyZXN1bHQudGhyZXNob2xkU3RhdHVzLnBhc3NlZCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdQaXBlbGluZSBmYWlsZWQ6IENvc3QgdGhyZXNob2xkIGV4Y2VlZGVkJyk7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgyKTtcbiAgICAgIH1cblxuICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBFcnJvcjogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3I6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gIH0pO1xuXG5wcm9ncmFtLnBhcnNlKCk7XG4iXX0=
|
package/dist/config/types.d.ts
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
|
+
import { OptimizationConfig } from '../optimization/types';
|
|
1
2
|
export interface CostAnalyzerConfig {
|
|
2
3
|
thresholds?: ThresholdConfig;
|
|
3
4
|
usageAssumptions?: UsageAssumptionsConfig;
|
|
4
5
|
synthesis?: SynthesisConfig;
|
|
5
6
|
exclusions?: ExclusionsConfig;
|
|
6
7
|
cache?: CacheConfig;
|
|
8
|
+
optimization?: OptimizationConfig;
|
|
7
9
|
}
|
|
8
10
|
export interface ThresholdConfig {
|
|
9
11
|
default?: ThresholdLevels;
|
package/dist/config/types.js
CHANGED
|
@@ -12,4 +12,4 @@ class ConfigurationError extends Error {
|
|
|
12
12
|
}
|
|
13
13
|
}
|
|
14
14
|
exports.ConfigurationError = ConfigurationError;
|
|
15
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
15
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29uZmlnL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQWlOQSxNQUFhLGtCQUFtQixTQUFRLEtBQUs7SUFHbEM7SUFDQTtJQUhULFlBQ0UsT0FBZSxFQUNSLFVBQWtCLEVBQ2xCLGdCQUEwQjtRQUVqQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFIUixlQUFVLEdBQVYsVUFBVSxDQUFRO1FBQ2xCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBVTtRQUdqQyxJQUFJLENBQUMsSUFBSSxHQUFHLG9CQUFvQixDQUFDO0lBQ25DLENBQUM7Q0FDRjtBQVRELGdEQVNDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT3B0aW1pemF0aW9uQ29uZmlnIH0gZnJvbSAnLi4vb3B0aW1pemF0aW9uL3R5cGVzJztcblxuZXhwb3J0IGludGVyZmFjZSBDb3N0QW5hbHl6ZXJDb25maWcge1xuICB0aHJlc2hvbGRzPzogVGhyZXNob2xkQ29uZmlnO1xuICB1c2FnZUFzc3VtcHRpb25zPzogVXNhZ2VBc3N1bXB0aW9uc0NvbmZpZztcbiAgc3ludGhlc2lzPzogU3ludGhlc2lzQ29uZmlnO1xuICBleGNsdXNpb25zPzogRXhjbHVzaW9uc0NvbmZpZztcbiAgY2FjaGU/OiBDYWNoZUNvbmZpZztcbiAgb3B0aW1pemF0aW9uPzogT3B0aW1pemF0aW9uQ29uZmlnO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRocmVzaG9sZENvbmZpZyB7XG4gIGRlZmF1bHQ/OiBUaHJlc2hvbGRMZXZlbHM7XG4gIGVudmlyb25tZW50cz86IFJlY29yZDxzdHJpbmcsIFRocmVzaG9sZExldmVscz47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGhyZXNob2xkTGV2ZWxzIHtcbiAgd2FybmluZz86IG51bWJlcjtcbiAgZXJyb3I/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXNhZ2VBc3N1bXB0aW9uc0NvbmZpZyB7XG4gIHMzPzoge1xuICAgIHN0b3JhZ2VHQj86IG51bWJlcjtcbiAgICBnZXRSZXF1ZXN0cz86IG51bWJlcjtcbiAgICBwdXRSZXF1ZXN0cz86IG51bWJlcjtcbiAgfTtcbiAgbGFtYmRhPzoge1xuICAgIGludm9jYXRpb25zUGVyTW9udGg/OiBudW1iZXI7XG4gICAgYXZlcmFnZUR1cmF0aW9uTXM/OiBudW1iZXI7XG4gIH07XG4gIC8qKlxuICAgKiBEeW5hbW9EQiB1c2FnZSBhc3N1bXB0aW9ucyBmb3Igb24tZGVtYW5kIChwYXktcGVyLXJlcXVlc3QpIGJpbGxpbmcgbW9kZS5cbiAgICogVGhlc2UgdmFsdWVzIGFyZSB1c2VkIHRvIGVzdGltYXRlIG1vbnRobHkgY29zdHMgZm9yIER5bmFtb0RCIHRhYmxlc1xuICAgKiBjb25maWd1cmVkIHdpdGggQmlsbGluZ01vZGU6IFBBWV9QRVJfUkVRVUVTVC5cbiAgICpcbiAgICogRm9yIHByb3Zpc2lvbmVkIGJpbGxpbmcgbW9kZSwgY29zdHMgYXJlIGNhbGN1bGF0ZWQgYmFzZWQgb24gdGhlXG4gICAqIFJlYWRDYXBhY2l0eVVuaXRzIGFuZCBXcml0ZUNhcGFjaXR5VW5pdHMgc3BlY2lmaWVkIGluIHRoZSB0ZW1wbGF0ZS5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2F3cy5hbWF6b24uY29tL2R5bmFtb2RiL3ByaWNpbmcvXG4gICAqL1xuICBkeW5hbW9kYj86IHtcbiAgICAvKiogTnVtYmVyIG9mIHJlYWQgcmVxdWVzdHMgcGVyIG1vbnRoIChkZWZhdWx0OiAxMCwwMDAsMDAwKSAqL1xuICAgIHJlYWRSZXF1ZXN0c1Blck1vbnRoPzogbnVtYmVyO1xuICAgIC8qKiBOdW1iZXIgb2Ygd3JpdGUgcmVxdWVzdHMgcGVyIG1vbnRoIChkZWZhdWx0OiAxLDAwMCwwMDApICovXG4gICAgd3JpdGVSZXF1ZXN0c1Blck1vbnRoPzogbnVtYmVyO1xuICB9O1xuICBuYXRHYXRld2F5Pzoge1xuICAgIGRhdGFQcm9jZXNzZWRHQj86IG51bWJlcjtcbiAgfTtcbiAgYWxiPzoge1xuICAgIG5ld0Nvbm5lY3Rpb25zUGVyU2Vjb25kPzogbnVtYmVyO1xuICAgIGFjdGl2ZUNvbm5lY3Rpb25zUGVyTWludXRlPzogbnVtYmVyO1xuICAgIHByb2Nlc3NlZEJ5dGVzR0I/OiBudW1iZXI7XG4gIH07XG4gIG5sYj86IHtcbiAgICBuZXdDb25uZWN0aW9uc1BlclNlY29uZD86IG51bWJlcjtcbiAgICBhY3RpdmVDb25uZWN0aW9uc1Blck1pbnV0ZT86IG51bWJlcjtcbiAgICBwcm9jZXNzZWRCeXRlc0dCPzogbnVtYmVyO1xuICB9O1xuICBjbG91ZGZyb250Pzoge1xuICAgIGRhdGFUcmFuc2ZlckdCPzogbnVtYmVyO1xuICAgIHJlcXVlc3RzPzogbnVtYmVyO1xuICB9O1xuICBhcGlHYXRld2F5Pzoge1xuICAgIHJlcXVlc3RzUGVyTW9udGg/OiBudW1iZXI7XG4gIH07XG4gIHZwY0VuZHBvaW50Pzoge1xuICAgIGRhdGFQcm9jZXNzZWRHQj86IG51bWJlcjtcbiAgfTtcbiAgLyoqXG4gICAqIEVGUyAoRWxhc3RpYyBGaWxlIFN5c3RlbSkgdXNhZ2UgYXNzdW1wdGlvbnMgZm9yIGNvc3QgZXN0aW1hdGlvbi5cbiAgICogVGhlc2UgdmFsdWVzIGFyZSB1c2VkIHRvIGVzdGltYXRlIG1vbnRobHkgY29zdHMgZm9yIEVGUyBmaWxlIHN5c3RlbXMuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9hd3MuYW1hem9uLmNvbS9lZnMvcHJpY2luZy9cbiAgICovXG4gIGVmcz86IHtcbiAgICAvKiogVG90YWwgc3RvcmFnZSBzaXplIGluIEdCIChkZWZhdWx0OiAxMDApICovXG4gICAgc3RvcmFnZVNpemVHYj86IG51bWJlcjtcbiAgICAvKiogUGVyY2VudGFnZSBvZiBzdG9yYWdlIGluIEluZnJlcXVlbnQgQWNjZXNzIGNsYXNzIChkZWZhdWx0OiAwLCByYW5nZTogMC0xMDApICovXG4gICAgaW5mcmVxdWVudEFjY2Vzc1BlcmNlbnRhZ2U/OiBudW1iZXI7XG4gIH07XG4gIC8qKlxuICAgKiBTTlMgKFNpbXBsZSBOb3RpZmljYXRpb24gU2VydmljZSkgdXNhZ2UgYXNzdW1wdGlvbnMuXG4gICAqIFRoZXNlIHZhbHVlcyBhcmUgdXNlZCB0byBlc3RpbWF0ZSBtb250aGx5IGNvc3RzIGZvciBTTlMgdG9waWNzLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vYXdzLmFtYXpvbi5jb20vc25zL3ByaWNpbmcvXG4gICAqL1xuICBzbnM/OiB7XG4gICAgLyoqIE51bWJlciBvZiBwdWJsaXNoIHJlcXVlc3RzIHBlciBtb250aCAoZGVmYXVsdDogMSwwMDAsMDAwKSAqL1xuICAgIG1vbnRobHlQdWJsaXNoZXM/OiBudW1iZXI7XG4gICAgLyoqIE51bWJlciBvZiBIVFRQL1MgZGVsaXZlcmllcyBwZXIgbW9udGggKGRlZmF1bHQ6IDEsMDAwLDAwMCkgKi9cbiAgICBodHRwRGVsaXZlcmllcz86IG51bWJlcjtcbiAgICAvKiogTnVtYmVyIG9mIGVtYWlsIGRlbGl2ZXJpZXMgcGVyIG1vbnRoIChkZWZhdWx0OiAwKSAqL1xuICAgIGVtYWlsRGVsaXZlcmllcz86IG51bWJlcjtcbiAgICAvKiogTnVtYmVyIG9mIFNNUyBkZWxpdmVyaWVzIHBlciBtb250aCAoZGVmYXVsdDogMCkgKi9cbiAgICBzbXNEZWxpdmVyaWVzPzogbnVtYmVyO1xuICAgIC8qKiBOdW1iZXIgb2YgbW9iaWxlIHB1c2ggZGVsaXZlcmllcyBwZXIgbW9udGggKGRlZmF1bHQ6IDApICovXG4gICAgbW9iaWxlUHVzaERlbGl2ZXJpZXM/OiBudW1iZXI7XG4gIH07XG4gIC8qKlxuICAgKiBTUVMgdXNhZ2UgYXNzdW1wdGlvbnMgZm9yIGNvc3QgZXN0aW1hdGlvbi5cbiAgICogQXBwbGllcyB0byBib3RoIFN0YW5kYXJkIGFuZCBGSUZPIHF1ZXVlcy5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2F3cy5hbWF6b24uY29tL3Nxcy9wcmljaW5nL1xuICAgKi9cbiAgc3FzPzoge1xuICAgIC8qKiBOdW1iZXIgb2YgcmVxdWVzdHMgcGVyIG1vbnRoIChkZWZhdWx0OiAxLDAwMCwwMDApICovXG4gICAgbW9udGhseVJlcXVlc3RzPzogbnVtYmVyO1xuICB9O1xuICAvKipcbiAgICogU3RlcCBGdW5jdGlvbnMgdXNhZ2UgYXNzdW1wdGlvbnMgZm9yIGNvc3QgZXN0aW1hdGlvbi5cbiAgICpcbiAgICogU3RhbmRhcmQgd29ya2Zsb3dzIGFyZSBjaGFyZ2VkIHBlciBzdGF0ZSB0cmFuc2l0aW9uLlxuICAgKiBFeHByZXNzIHdvcmtmbG93cyBhcmUgY2hhcmdlZCBwZXIgcmVxdWVzdCBhbmQgcGVyIEdCLXNlY29uZCBvZiBkdXJhdGlvbi5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2F3cy5hbWF6b24uY29tL3N0ZXAtZnVuY3Rpb25zL3ByaWNpbmcvXG4gICAqL1xuICBzdGVwRnVuY3Rpb25zPzoge1xuICAgIC8qKiBOdW1iZXIgb2Ygd29ya2Zsb3cgZXhlY3V0aW9ucyBwZXIgbW9udGggKGRlZmF1bHQ6IDEwLDAwMCkgKi9cbiAgICBtb250aGx5RXhlY3V0aW9ucz86IG51bWJlcjtcbiAgICAvKiogTnVtYmVyIG9mIHN0YXRlIHRyYW5zaXRpb25zIHBlciBleGVjdXRpb24gKGRlZmF1bHQ6IDEwLCBmb3IgU3RhbmRhcmQgd29ya2Zsb3dzKSAqL1xuICAgIHN0YXRlVHJhbnNpdGlvbnNQZXJFeGVjdXRpb24/OiBudW1iZXI7XG4gICAgLyoqIEF2ZXJhZ2UgZXhlY3V0aW9uIGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kcyAoZGVmYXVsdDogMTAwMCwgZm9yIEV4cHJlc3Mgd29ya2Zsb3dzKSAqL1xuICAgIGF2ZXJhZ2VEdXJhdGlvbk1zPzogbnVtYmVyO1xuICB9O1xuICAvKipcbiAgICogU2VjcmV0cyBNYW5hZ2VyIHVzYWdlIGFzc3VtcHRpb25zIGZvciBjb3N0IGVzdGltYXRpb24uXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9hd3MuYW1hem9uLmNvbS9zZWNyZXRzLW1hbmFnZXIvcHJpY2luZy9cbiAgICovXG4gIHNlY3JldHNNYW5hZ2VyPzoge1xuICAgIC8qKiBOdW1iZXIgb2YgQVBJIGNhbGxzIHBlciBtb250aCAoZGVmYXVsdDogMTAsMDAwKSAqL1xuICAgIG1vbnRobHlBcGlDYWxscz86IG51bWJlcjtcbiAgfTtcbiAgLyoqXG4gICAqIEF1cm9yYSBTZXJ2ZXJsZXNzIHVzYWdlIGFzc3VtcHRpb25zIGZvciBjb3N0IGVzdGltYXRpb24uXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9hd3MuYW1hem9uLmNvbS9yZHMvYXVyb3JhL3ByaWNpbmcvXG4gICAqL1xuICBhdXJvcmFTZXJ2ZXJsZXNzPzoge1xuICAgIC8qKiBNaW5pbXVtIEFDVSBjYXBhY2l0eSAoZGVmYXVsdDogMC41KSAqL1xuICAgIG1pbkFDVT86IG51bWJlcjtcbiAgICAvKiogTWF4aW11bSBBQ1UgY2FwYWNpdHkgKGRlZmF1bHQ6IDE2KSAqL1xuICAgIG1heEFDVT86IG51bWJlcjtcbiAgICAvKiogU3RvcmFnZSBzaXplIGluIEdCIChkZWZhdWx0OiAxMDApICovXG4gICAgc3RvcmFnZUdCPzogbnVtYmVyO1xuICB9O1xuICAvKipcbiAgICogVHJhbnNpdCBHYXRld2F5IHVzYWdlIGFzc3VtcHRpb25zIGZvciBjb3N0IGVzdGltYXRpb24uXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9hd3MuYW1hem9uLmNvbS90cmFuc2l0LWdhdGV3YXkvcHJpY2luZy9cbiAgICovXG4gIHRyYW5zaXRHYXRld2F5Pzoge1xuICAgIC8qKiBOdW1iZXIgb2YgVlBDL1ZQTiBhdHRhY2htZW50cyAoZGVmYXVsdDogMykgKi9cbiAgICBhdHRhY2htZW50cz86IG51bWJlcjtcbiAgICAvKiogTW9udGhseSBkYXRhIHByb2Nlc3NlZCBpbiBHQiAoZGVmYXVsdDogMTAwMCkgKi9cbiAgICBtb250aGx5RGF0YUdCPzogbnVtYmVyO1xuICB9O1xuICAvKipcbiAgICogUm91dGUgNTMgdXNhZ2UgYXNzdW1wdGlvbnMgZm9yIGNvc3QgZXN0aW1hdGlvbi5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2F3cy5hbWF6b24uY29tL3JvdXRlNTMvcHJpY2luZy9cbiAgICovXG4gIHJvdXRlNTM/OiB7XG4gICAgLyoqIE1vbnRobHkgRE5TIHF1ZXJpZXMgKGRlZmF1bHQ6IDEsMDAwLDAwMCkgKi9cbiAgICBtb250aGx5UXVlcmllcz86IG51bWJlcjtcbiAgfTtcbiAgLyoqXG4gICAqIEtpbmVzaXMgdXNhZ2UgYXNzdW1wdGlvbnMgZm9yIGNvc3QgZXN0aW1hdGlvbi5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2F3cy5hbWF6b24uY29tL2tpbmVzaXMvcHJpY2luZy9cbiAgICovXG4gIGtpbmVzaXM/OiB7XG4gICAgLyoqIE51bWJlciBvZiBzaGFyZHMgZm9yIHByb3Zpc2lvbmVkIHN0cmVhbXMgKGRlZmF1bHQ6IDIpICovXG4gICAgc2hhcmRDb3VudD86IG51bWJlcjtcbiAgICAvKiogTW9udGhseSBkYXRhIGluZ2VzdGlvbiBpbiBHQiBmb3Igb24tZGVtYW5kIHN0cmVhbXMgKGRlZmF1bHQ6IDEwMDApICovXG4gICAgaW5nZXN0aW9uR0I/OiBudW1iZXI7XG4gICAgLyoqIE1vbnRobHkgZGF0YSByZXRyaWV2YWwgaW4gR0IgZm9yIG9uLWRlbWFuZCBzdHJlYW1zIChkZWZhdWx0OiAyMDAwKSAqL1xuICAgIHJldHJpZXZhbEdCPzogbnVtYmVyO1xuICAgIC8qKiBNb250aGx5IGRhdGEgaW5nZXN0aW9uIGluIEdCIGZvciBGaXJlaG9zZSAoZGVmYXVsdDogMTAwMCkgKi9cbiAgICBmaXJlaG9zZUdCPzogbnVtYmVyO1xuICAgIC8qKiBOdW1iZXIgb2YgS2luZXNpcyBQcm9jZXNzaW5nIFVuaXRzIGZvciBBbmFseXRpY3MgKGRlZmF1bHQ6IDIpICovXG4gICAga3B1cz86IG51bWJlcjtcbiAgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTeW50aGVzaXNDb25maWcge1xuICBhcHBQYXRoPzogc3RyaW5nO1xuICBvdXRwdXRQYXRoPzogc3RyaW5nO1xuICBjdXN0b21Db21tYW5kPzogc3RyaW5nO1xuICBjb250ZXh0PzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFeGNsdXNpb25zQ29uZmlnIHtcbiAgcmVzb3VyY2VUeXBlcz86IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENhY2hlQ29uZmlnIHtcbiAgZW5hYmxlZD86IGJvb2xlYW47XG4gIGR1cmF0aW9uSG91cnM/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmFsaWRhdGlvblJlc3VsdCB7XG4gIHZhbGlkOiBib29sZWFuO1xuICBlcnJvcnM6IHN0cmluZ1tdO1xuICB3YXJuaW5nczogc3RyaW5nW107XG59XG5cbmV4cG9ydCBjbGFzcyBDb25maWd1cmF0aW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICBwdWJsaWMgY29uZmlnUGF0aDogc3RyaW5nLFxuICAgIHB1YmxpYyB2YWxpZGF0aW9uRXJyb3JzOiBzdHJpbmdbXSxcbiAgKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gICAgdGhpcy5uYW1lID0gJ0NvbmZpZ3VyYXRpb25FcnJvcic7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { ResourceWithId } from '../diff/types';
|
|
2
|
+
import { ResourceCost } from '../pricing/types';
|
|
3
|
+
import { OptimizationAnalyzer, OptimizationConfig, OptimizationResult } from './types';
|
|
4
|
+
export declare class OptimizationEngine {
|
|
5
|
+
private readonly config;
|
|
6
|
+
private readonly analyzers;
|
|
7
|
+
constructor(analyzers: OptimizationAnalyzer[], config?: OptimizationConfig);
|
|
8
|
+
analyze(resources: ResourceWithId[], resourceCosts: ResourceCost[], region: string): Promise<OptimizationResult>;
|
|
9
|
+
private filterAnalyzers;
|
|
10
|
+
private applyThreshold;
|
|
11
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.OptimizationEngine = void 0;
|
|
4
|
+
class OptimizationEngine {
|
|
5
|
+
config;
|
|
6
|
+
analyzers = [];
|
|
7
|
+
constructor(analyzers, config = {}) {
|
|
8
|
+
this.config = config;
|
|
9
|
+
this.analyzers = this.filterAnalyzers(analyzers);
|
|
10
|
+
}
|
|
11
|
+
async analyze(resources, resourceCosts, region) {
|
|
12
|
+
const allRecommendations = [];
|
|
13
|
+
for (const analyzer of this.analyzers) {
|
|
14
|
+
if (!analyzer.isApplicable(resources)) {
|
|
15
|
+
continue;
|
|
16
|
+
}
|
|
17
|
+
const recommendations = await analyzer.analyze(resources, resourceCosts, region);
|
|
18
|
+
allRecommendations.push(...recommendations);
|
|
19
|
+
}
|
|
20
|
+
const filtered = this.applyThreshold(allRecommendations);
|
|
21
|
+
const sorted = filtered.sort((a, b) => b.estimatedMonthlySavings - a.estimatedMonthlySavings);
|
|
22
|
+
return {
|
|
23
|
+
recommendations: sorted,
|
|
24
|
+
totalEstimatedMonthlySavings: sorted.reduce((sum, r) => sum + r.estimatedMonthlySavings, 0),
|
|
25
|
+
currency: 'USD',
|
|
26
|
+
analyzedResourceCount: resources.length,
|
|
27
|
+
analyzedAt: new Date().toISOString(),
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
filterAnalyzers(analyzers) {
|
|
31
|
+
const { enabledCategories, disabledCategories } = this.config;
|
|
32
|
+
return analyzers.filter((a) => {
|
|
33
|
+
if (enabledCategories && !enabledCategories.includes(a.category)) {
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
if (disabledCategories && disabledCategories.includes(a.category)) {
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
return true;
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
applyThreshold(recommendations) {
|
|
43
|
+
const threshold = this.config.minimumSavingsThreshold;
|
|
44
|
+
if (!threshold) {
|
|
45
|
+
return recommendations;
|
|
46
|
+
}
|
|
47
|
+
return recommendations.filter((r) => r.estimatedMonthlySavings >= threshold);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
exports.OptimizationEngine = OptimizationEngine;
|
|
51
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiT3B0aW1pemF0aW9uRW5naW5lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL29wdGltaXphdGlvbi9PcHRpbWl6YXRpb25FbmdpbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBU0EsTUFBYSxrQkFBa0I7SUFLVjtJQUpGLFNBQVMsR0FBMkIsRUFBRSxDQUFDO0lBRXhELFlBQ0UsU0FBaUMsRUFDaEIsU0FBNkIsRUFBRTtRQUEvQixXQUFNLEdBQU4sTUFBTSxDQUF5QjtRQUVoRCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUVELEtBQUssQ0FBQyxPQUFPLENBQ1gsU0FBMkIsRUFDM0IsYUFBNkIsRUFDN0IsTUFBYztRQUVkLE1BQU0sa0JBQWtCLEdBQXFCLEVBQUUsQ0FBQztRQUVoRCxLQUFLLE1BQU0sUUFBUSxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUN0QyxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO2dCQUN0QyxTQUFTO1lBQ1gsQ0FBQztZQUVELE1BQU0sZUFBZSxHQUFHLE1BQU0sUUFBUSxDQUFDLE9BQU8sQ0FDNUMsU0FBUyxFQUNULGFBQWEsRUFDYixNQUFNLENBQ1AsQ0FBQztZQUNGLGtCQUFrQixDQUFDLElBQUksQ0FBQyxHQUFHLGVBQWUsQ0FBQyxDQUFDO1FBQzlDLENBQUM7UUFFRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDekQsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FDMUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsdUJBQXVCLEdBQUcsQ0FBQyxDQUFDLHVCQUF1QixDQUNoRSxDQUFDO1FBRUYsT0FBTztZQUNMLGVBQWUsRUFBRSxNQUFNO1lBQ3ZCLDRCQUE0QixFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQ3pDLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyx1QkFBdUIsRUFDM0MsQ0FBQyxDQUNGO1lBQ0QsUUFBUSxFQUFFLEtBQUs7WUFDZixxQkFBcUIsRUFBRSxTQUFTLENBQUMsTUFBTTtZQUN2QyxVQUFVLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUU7U0FDckMsQ0FBQztJQUNKLENBQUM7SUFFTyxlQUFlLENBQ3JCLFNBQWlDO1FBRWpDLE1BQU0sRUFBRSxpQkFBaUIsRUFBRSxrQkFBa0IsRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFFOUQsT0FBTyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7WUFDNUIsSUFBSSxpQkFBaUIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztnQkFDakUsT0FBTyxLQUFLLENBQUM7WUFDZixDQUFDO1lBQ0QsSUFBSSxrQkFBa0IsSUFBSSxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7Z0JBQ2xFLE9BQU8sS0FBSyxDQUFDO1lBQ2YsQ0FBQztZQUNELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sY0FBYyxDQUNwQixlQUFpQztRQUVqQyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLHVCQUF1QixDQUFDO1FBQ3RELElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNmLE9BQU8sZUFBZSxDQUFDO1FBQ3pCLENBQUM7UUFDRCxPQUFPLGVBQWUsQ0FBQyxNQUFNLENBQzNCLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsdUJBQXVCLElBQUksU0FBUyxDQUM5QyxDQUFDO0lBQ0osQ0FBQztDQUNGO0FBMUVELGdEQTBFQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJlc291cmNlV2l0aElkIH0gZnJvbSAnLi4vZGlmZi90eXBlcyc7XG5pbXBvcnQgeyBSZXNvdXJjZUNvc3QgfSBmcm9tICcuLi9wcmljaW5nL3R5cGVzJztcbmltcG9ydCB7XG4gIE9wdGltaXphdGlvbkFuYWx5emVyLFxuICBPcHRpbWl6YXRpb25Db25maWcsXG4gIE9wdGltaXphdGlvblJlc3VsdCxcbiAgUmVjb21tZW5kYXRpb24sXG59IGZyb20gJy4vdHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgT3B0aW1pemF0aW9uRW5naW5lIHtcbiAgcHJpdmF0ZSByZWFkb25seSBhbmFseXplcnM6IE9wdGltaXphdGlvbkFuYWx5emVyW10gPSBbXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBhbmFseXplcnM6IE9wdGltaXphdGlvbkFuYWx5emVyW10sXG4gICAgcHJpdmF0ZSByZWFkb25seSBjb25maWc6IE9wdGltaXphdGlvbkNvbmZpZyA9IHt9LFxuICApIHtcbiAgICB0aGlzLmFuYWx5emVycyA9IHRoaXMuZmlsdGVyQW5hbHl6ZXJzKGFuYWx5emVycyk7XG4gIH1cblxuICBhc3luYyBhbmFseXplKFxuICAgIHJlc291cmNlczogUmVzb3VyY2VXaXRoSWRbXSxcbiAgICByZXNvdXJjZUNvc3RzOiBSZXNvdXJjZUNvc3RbXSxcbiAgICByZWdpb246IHN0cmluZyxcbiAgKTogUHJvbWlzZTxPcHRpbWl6YXRpb25SZXN1bHQ+IHtcbiAgICBjb25zdCBhbGxSZWNvbW1lbmRhdGlvbnM6IFJlY29tbWVuZGF0aW9uW10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgYW5hbHl6ZXIgb2YgdGhpcy5hbmFseXplcnMpIHtcbiAgICAgIGlmICghYW5hbHl6ZXIuaXNBcHBsaWNhYmxlKHJlc291cmNlcykpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlY29tbWVuZGF0aW9ucyA9IGF3YWl0IGFuYWx5emVyLmFuYWx5emUoXG4gICAgICAgIHJlc291cmNlcyxcbiAgICAgICAgcmVzb3VyY2VDb3N0cyxcbiAgICAgICAgcmVnaW9uLFxuICAgICAgKTtcbiAgICAgIGFsbFJlY29tbWVuZGF0aW9ucy5wdXNoKC4uLnJlY29tbWVuZGF0aW9ucyk7XG4gICAgfVxuXG4gICAgY29uc3QgZmlsdGVyZWQgPSB0aGlzLmFwcGx5VGhyZXNob2xkKGFsbFJlY29tbWVuZGF0aW9ucyk7XG4gICAgY29uc3Qgc29ydGVkID0gZmlsdGVyZWQuc29ydChcbiAgICAgIChhLCBiKSA9PiBiLmVzdGltYXRlZE1vbnRobHlTYXZpbmdzIC0gYS5lc3RpbWF0ZWRNb250aGx5U2F2aW5ncyxcbiAgICApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHJlY29tbWVuZGF0aW9uczogc29ydGVkLFxuICAgICAgdG90YWxFc3RpbWF0ZWRNb250aGx5U2F2aW5nczogc29ydGVkLnJlZHVjZShcbiAgICAgICAgKHN1bSwgcikgPT4gc3VtICsgci5lc3RpbWF0ZWRNb250aGx5U2F2aW5ncyxcbiAgICAgICAgMCxcbiAgICAgICksXG4gICAgICBjdXJyZW5jeTogJ1VTRCcsXG4gICAgICBhbmFseXplZFJlc291cmNlQ291bnQ6IHJlc291cmNlcy5sZW5ndGgsXG4gICAgICBhbmFseXplZEF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgZmlsdGVyQW5hbHl6ZXJzKFxuICAgIGFuYWx5emVyczogT3B0aW1pemF0aW9uQW5hbHl6ZXJbXSxcbiAgKTogT3B0aW1pemF0aW9uQW5hbHl6ZXJbXSB7XG4gICAgY29uc3QgeyBlbmFibGVkQ2F0ZWdvcmllcywgZGlzYWJsZWRDYXRlZ29yaWVzIH0gPSB0aGlzLmNvbmZpZztcblxuICAgIHJldHVybiBhbmFseXplcnMuZmlsdGVyKChhKSA9PiB7XG4gICAgICBpZiAoZW5hYmxlZENhdGVnb3JpZXMgJiYgIWVuYWJsZWRDYXRlZ29yaWVzLmluY2x1ZGVzKGEuY2F0ZWdvcnkpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmIChkaXNhYmxlZENhdGVnb3JpZXMgJiYgZGlzYWJsZWRDYXRlZ29yaWVzLmluY2x1ZGVzKGEuY2F0ZWdvcnkpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseVRocmVzaG9sZChcbiAgICByZWNvbW1lbmRhdGlvbnM6IFJlY29tbWVuZGF0aW9uW10sXG4gICk6IFJlY29tbWVuZGF0aW9uW10ge1xuICAgIGNvbnN0IHRocmVzaG9sZCA9IHRoaXMuY29uZmlnLm1pbmltdW1TYXZpbmdzVGhyZXNob2xkO1xuICAgIGlmICghdGhyZXNob2xkKSB7XG4gICAgICByZXR1cm4gcmVjb21tZW5kYXRpb25zO1xuICAgIH1cbiAgICByZXR1cm4gcmVjb21tZW5kYXRpb25zLmZpbHRlcihcbiAgICAgIChyKSA9PiByLmVzdGltYXRlZE1vbnRobHlTYXZpbmdzID49IHRocmVzaG9sZCxcbiAgICApO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { ResourceWithId } from '../../diff/types';
|
|
2
|
+
import { ResourceCost } from '../../pricing/types';
|
|
3
|
+
import { OptimizationAnalyzer, OptimizationCategory, Recommendation } from '../types';
|
|
4
|
+
export declare class GravitonMigrationAnalyzer implements OptimizationAnalyzer {
|
|
5
|
+
readonly category: OptimizationCategory;
|
|
6
|
+
readonly name = "Graviton Migration";
|
|
7
|
+
isApplicable(resources: ResourceWithId[]): boolean;
|
|
8
|
+
analyze(resources: ResourceWithId[], resourceCosts: ResourceCost[], _region: string): Promise<Recommendation[]>;
|
|
9
|
+
private analyzeResource;
|
|
10
|
+
private analyzeEC2;
|
|
11
|
+
private analyzeRDS;
|
|
12
|
+
private analyzeElastiCache;
|
|
13
|
+
private extractFamily;
|
|
14
|
+
private extractRDSFamily;
|
|
15
|
+
private extractElastiCacheFamily;
|
|
16
|
+
private findCost;
|
|
17
|
+
}
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GravitonMigrationAnalyzer = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Mapping of x86 instance families to their Graviton equivalents.
|
|
6
|
+
* Graviton instances typically offer 20-40% better price-performance.
|
|
7
|
+
*/
|
|
8
|
+
const GRAVITON_ALTERNATIVES = {
|
|
9
|
+
m5: 'm7g',
|
|
10
|
+
m5a: 'm7g',
|
|
11
|
+
m5n: 'm7g',
|
|
12
|
+
m6i: 'm7g',
|
|
13
|
+
c5: 'c7g',
|
|
14
|
+
c5a: 'c7g',
|
|
15
|
+
c5n: 'c7g',
|
|
16
|
+
c6i: 'c7g',
|
|
17
|
+
r5: 'r7g',
|
|
18
|
+
r5a: 'r7g',
|
|
19
|
+
r5n: 'r7g',
|
|
20
|
+
r6i: 'r7g',
|
|
21
|
+
t3: 't4g',
|
|
22
|
+
t3a: 't4g',
|
|
23
|
+
};
|
|
24
|
+
const RDS_GRAVITON_ALTERNATIVES = {
|
|
25
|
+
'db.m5': 'db.m7g',
|
|
26
|
+
'db.m6i': 'db.m7g',
|
|
27
|
+
'db.r5': 'db.r7g',
|
|
28
|
+
'db.r6i': 'db.r7g',
|
|
29
|
+
'db.t3': 'db.t4g',
|
|
30
|
+
};
|
|
31
|
+
const ELASTICACHE_GRAVITON_ALTERNATIVES = {
|
|
32
|
+
'cache.m5': 'cache.m7g',
|
|
33
|
+
'cache.m6i': 'cache.m7g',
|
|
34
|
+
'cache.r5': 'cache.r7g',
|
|
35
|
+
'cache.r6i': 'cache.r7g',
|
|
36
|
+
'cache.t3': 'cache.t4g',
|
|
37
|
+
};
|
|
38
|
+
const GRAVITON_SAVINGS_PERCENT = 20;
|
|
39
|
+
const EC2_TYPES = ['AWS::EC2::Instance', 'AWS::EC2::LaunchTemplate'];
|
|
40
|
+
const RDS_TYPES = ['AWS::RDS::DBInstance', 'AWS::RDS::DBCluster'];
|
|
41
|
+
const ELASTICACHE_TYPES = [
|
|
42
|
+
'AWS::ElastiCache::CacheCluster',
|
|
43
|
+
'AWS::ElastiCache::ReplicationGroup',
|
|
44
|
+
];
|
|
45
|
+
class GravitonMigrationAnalyzer {
|
|
46
|
+
category = 'graviton-migration';
|
|
47
|
+
name = 'Graviton Migration';
|
|
48
|
+
isApplicable(resources) {
|
|
49
|
+
return resources.some((r) => EC2_TYPES.includes(r.type) ||
|
|
50
|
+
RDS_TYPES.includes(r.type) ||
|
|
51
|
+
ELASTICACHE_TYPES.includes(r.type));
|
|
52
|
+
}
|
|
53
|
+
async analyze(resources, resourceCosts, _region) {
|
|
54
|
+
const recommendations = [];
|
|
55
|
+
for (const resource of resources) {
|
|
56
|
+
const recommendation = this.analyzeResource(resource, resourceCosts);
|
|
57
|
+
if (recommendation) {
|
|
58
|
+
recommendations.push(recommendation);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return recommendations;
|
|
62
|
+
}
|
|
63
|
+
analyzeResource(resource, resourceCosts) {
|
|
64
|
+
if (EC2_TYPES.includes(resource.type)) {
|
|
65
|
+
return this.analyzeEC2(resource, resourceCosts);
|
|
66
|
+
}
|
|
67
|
+
if (RDS_TYPES.includes(resource.type)) {
|
|
68
|
+
return this.analyzeRDS(resource, resourceCosts);
|
|
69
|
+
}
|
|
70
|
+
if (ELASTICACHE_TYPES.includes(resource.type)) {
|
|
71
|
+
return this.analyzeElastiCache(resource, resourceCosts);
|
|
72
|
+
}
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
analyzeEC2(resource, resourceCosts) {
|
|
76
|
+
const props = resource.properties;
|
|
77
|
+
let instanceType;
|
|
78
|
+
if (resource.type === 'AWS::EC2::LaunchTemplate') {
|
|
79
|
+
const launchData = props.LaunchTemplateData;
|
|
80
|
+
instanceType = launchData?.InstanceType;
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
instanceType = props.InstanceType;
|
|
84
|
+
}
|
|
85
|
+
if (!instanceType)
|
|
86
|
+
return null;
|
|
87
|
+
const family = this.extractFamily(instanceType);
|
|
88
|
+
const gravitonFamily = GRAVITON_ALTERNATIVES[family];
|
|
89
|
+
if (!gravitonFamily)
|
|
90
|
+
return null;
|
|
91
|
+
const gravitonType = instanceType.replace(family, gravitonFamily);
|
|
92
|
+
const cost = this.findCost(resource.logicalId, resourceCosts);
|
|
93
|
+
const savings = cost * (GRAVITON_SAVINGS_PERCENT / 100);
|
|
94
|
+
return {
|
|
95
|
+
id: `graviton-${resource.logicalId}`,
|
|
96
|
+
title: `Migrate ${resource.logicalId} to Graviton (${gravitonType})`,
|
|
97
|
+
description: `${instanceType} can be replaced with ${gravitonType} for ~${GRAVITON_SAVINGS_PERCENT}% cost reduction. AWS Graviton processors deliver better price-performance for most workloads.`,
|
|
98
|
+
category: this.category,
|
|
99
|
+
priority: savings >= 50 ? 'high' : savings >= 20 ? 'medium' : 'low',
|
|
100
|
+
estimatedMonthlySavings: Math.round(savings * 100) / 100,
|
|
101
|
+
estimatedSavingsPercent: GRAVITON_SAVINGS_PERCENT,
|
|
102
|
+
affectedResources: [resource.logicalId],
|
|
103
|
+
actionItems: [
|
|
104
|
+
`Change instance type from ${instanceType} to ${gravitonType}`,
|
|
105
|
+
'Test application compatibility with ARM64 architecture',
|
|
106
|
+
'Verify all dependencies support ARM64',
|
|
107
|
+
'Deploy to staging first and monitor for 24 hours',
|
|
108
|
+
],
|
|
109
|
+
caveats: [
|
|
110
|
+
'Requires ARM64-compatible AMI and software',
|
|
111
|
+
'Some x86-specific workloads may not be compatible',
|
|
112
|
+
`Savings estimate of ${GRAVITON_SAVINGS_PERCENT}% is approximate`,
|
|
113
|
+
],
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
analyzeRDS(resource, resourceCosts) {
|
|
117
|
+
const props = resource.properties;
|
|
118
|
+
const instanceClass = props.DBInstanceClass;
|
|
119
|
+
if (!instanceClass)
|
|
120
|
+
return null;
|
|
121
|
+
const family = this.extractRDSFamily(instanceClass);
|
|
122
|
+
const gravitonFamily = RDS_GRAVITON_ALTERNATIVES[family];
|
|
123
|
+
if (!gravitonFamily)
|
|
124
|
+
return null;
|
|
125
|
+
const gravitonClass = instanceClass.replace(family, gravitonFamily);
|
|
126
|
+
const cost = this.findCost(resource.logicalId, resourceCosts);
|
|
127
|
+
const savings = cost * (GRAVITON_SAVINGS_PERCENT / 100);
|
|
128
|
+
return {
|
|
129
|
+
id: `graviton-${resource.logicalId}`,
|
|
130
|
+
title: `Migrate ${resource.logicalId} to Graviton (${gravitonClass})`,
|
|
131
|
+
description: `${instanceClass} can be replaced with ${gravitonClass} for ~${GRAVITON_SAVINGS_PERCENT}% cost reduction. RDS on Graviton offers the same functionality at lower cost.`,
|
|
132
|
+
category: this.category,
|
|
133
|
+
priority: savings >= 50 ? 'high' : savings >= 20 ? 'medium' : 'low',
|
|
134
|
+
estimatedMonthlySavings: Math.round(savings * 100) / 100,
|
|
135
|
+
estimatedSavingsPercent: GRAVITON_SAVINGS_PERCENT,
|
|
136
|
+
affectedResources: [resource.logicalId],
|
|
137
|
+
actionItems: [
|
|
138
|
+
`Change DB instance class from ${instanceClass} to ${gravitonClass}`,
|
|
139
|
+
'Schedule a maintenance window for the instance class change',
|
|
140
|
+
'Test database performance after migration',
|
|
141
|
+
],
|
|
142
|
+
caveats: [
|
|
143
|
+
'Requires a short downtime during instance class modification',
|
|
144
|
+
'Verify database engine version supports Graviton',
|
|
145
|
+
`Savings estimate of ${GRAVITON_SAVINGS_PERCENT}% is approximate`,
|
|
146
|
+
],
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
analyzeElastiCache(resource, resourceCosts) {
|
|
150
|
+
const props = resource.properties;
|
|
151
|
+
const nodeType = props.CacheNodeType ||
|
|
152
|
+
props.CacheNodeType;
|
|
153
|
+
if (!nodeType)
|
|
154
|
+
return null;
|
|
155
|
+
const family = this.extractElastiCacheFamily(nodeType);
|
|
156
|
+
const gravitonFamily = ELASTICACHE_GRAVITON_ALTERNATIVES[family];
|
|
157
|
+
if (!gravitonFamily)
|
|
158
|
+
return null;
|
|
159
|
+
const gravitonNodeType = nodeType.replace(family, gravitonFamily);
|
|
160
|
+
const cost = this.findCost(resource.logicalId, resourceCosts);
|
|
161
|
+
const savings = cost * (GRAVITON_SAVINGS_PERCENT / 100);
|
|
162
|
+
return {
|
|
163
|
+
id: `graviton-${resource.logicalId}`,
|
|
164
|
+
title: `Migrate ${resource.logicalId} to Graviton (${gravitonNodeType})`,
|
|
165
|
+
description: `${nodeType} can be replaced with ${gravitonNodeType} for ~${GRAVITON_SAVINGS_PERCENT}% cost reduction.`,
|
|
166
|
+
category: this.category,
|
|
167
|
+
priority: savings >= 50 ? 'high' : savings >= 20 ? 'medium' : 'low',
|
|
168
|
+
estimatedMonthlySavings: Math.round(savings * 100) / 100,
|
|
169
|
+
estimatedSavingsPercent: GRAVITON_SAVINGS_PERCENT,
|
|
170
|
+
affectedResources: [resource.logicalId],
|
|
171
|
+
actionItems: [
|
|
172
|
+
`Change node type from ${nodeType} to ${gravitonNodeType}`,
|
|
173
|
+
'Schedule maintenance window for node type change',
|
|
174
|
+
'Monitor cache performance after migration',
|
|
175
|
+
],
|
|
176
|
+
caveats: [
|
|
177
|
+
'Requires a brief failover during node type modification',
|
|
178
|
+
`Savings estimate of ${GRAVITON_SAVINGS_PERCENT}% is approximate`,
|
|
179
|
+
],
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
extractFamily(instanceType) {
|
|
183
|
+
// e.g., "m5.xlarge" -> "m5", "c5a.2xlarge" -> "c5a"
|
|
184
|
+
const parts = instanceType.split('.');
|
|
185
|
+
return parts[0] || '';
|
|
186
|
+
}
|
|
187
|
+
extractRDSFamily(instanceClass) {
|
|
188
|
+
// e.g., "db.m5.large" -> "db.m5"
|
|
189
|
+
const parts = instanceClass.split('.');
|
|
190
|
+
if (parts.length >= 3) {
|
|
191
|
+
return `${parts[0]}.${parts[1]}`;
|
|
192
|
+
}
|
|
193
|
+
return '';
|
|
194
|
+
}
|
|
195
|
+
extractElastiCacheFamily(nodeType) {
|
|
196
|
+
// e.g., "cache.m5.large" -> "cache.m5"
|
|
197
|
+
const parts = nodeType.split('.');
|
|
198
|
+
if (parts.length >= 3) {
|
|
199
|
+
return `${parts[0]}.${parts[1]}`;
|
|
200
|
+
}
|
|
201
|
+
return '';
|
|
202
|
+
}
|
|
203
|
+
findCost(logicalId, resourceCosts) {
|
|
204
|
+
const cost = resourceCosts.find((c) => c.logicalId === logicalId);
|
|
205
|
+
return cost?.monthlyCost.amount ?? 0;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
exports.GravitonMigrationAnalyzer = GravitonMigrationAnalyzer;
|
|
209
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR3Jhdml0b25NaWdyYXRpb25BbmFseXplci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9vcHRpbWl6YXRpb24vYW5hbHl6ZXJzL0dyYXZpdG9uTWlncmF0aW9uQW5hbHl6ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBUUE7OztHQUdHO0FBQ0gsTUFBTSxxQkFBcUIsR0FBMkI7SUFDcEQsRUFBRSxFQUFFLEtBQUs7SUFDVCxHQUFHLEVBQUUsS0FBSztJQUNWLEdBQUcsRUFBRSxLQUFLO0lBQ1YsR0FBRyxFQUFFLEtBQUs7SUFDVixFQUFFLEVBQUUsS0FBSztJQUNULEdBQUcsRUFBRSxLQUFLO0lBQ1YsR0FBRyxFQUFFLEtBQUs7SUFDVixHQUFHLEVBQUUsS0FBSztJQUNWLEVBQUUsRUFBRSxLQUFLO0lBQ1QsR0FBRyxFQUFFLEtBQUs7SUFDVixHQUFHLEVBQUUsS0FBSztJQUNWLEdBQUcsRUFBRSxLQUFLO0lBQ1YsRUFBRSxFQUFFLEtBQUs7SUFDVCxHQUFHLEVBQUUsS0FBSztDQUNYLENBQUM7QUFFRixNQUFNLHlCQUF5QixHQUEyQjtJQUN4RCxPQUFPLEVBQUUsUUFBUTtJQUNqQixRQUFRLEVBQUUsUUFBUTtJQUNsQixPQUFPLEVBQUUsUUFBUTtJQUNqQixRQUFRLEVBQUUsUUFBUTtJQUNsQixPQUFPLEVBQUUsUUFBUTtDQUNsQixDQUFDO0FBRUYsTUFBTSxpQ0FBaUMsR0FBMkI7SUFDaEUsVUFBVSxFQUFFLFdBQVc7SUFDdkIsV0FBVyxFQUFFLFdBQVc7SUFDeEIsVUFBVSxFQUFFLFdBQVc7SUFDdkIsV0FBVyxFQUFFLFdBQVc7SUFDeEIsVUFBVSxFQUFFLFdBQVc7Q0FDeEIsQ0FBQztBQUVGLE1BQU0sd0JBQXdCLEdBQUcsRUFBRSxDQUFDO0FBRXBDLE1BQU0sU0FBUyxHQUFHLENBQUMsb0JBQW9CLEVBQUUsMEJBQTBCLENBQUMsQ0FBQztBQUNyRSxNQUFNLFNBQVMsR0FBRyxDQUFDLHNCQUFzQixFQUFFLHFCQUFxQixDQUFDLENBQUM7QUFDbEUsTUFBTSxpQkFBaUIsR0FBRztJQUN4QixnQ0FBZ0M7SUFDaEMsb0NBQW9DO0NBQ3JDLENBQUM7QUFFRixNQUFhLHlCQUF5QjtJQUMzQixRQUFRLEdBQXlCLG9CQUFvQixDQUFDO0lBQ3RELElBQUksR0FBRyxvQkFBb0IsQ0FBQztJQUVyQyxZQUFZLENBQUMsU0FBMkI7UUFDdEMsT0FBTyxTQUFTLENBQUMsSUFBSSxDQUNuQixDQUFDLENBQUMsRUFBRSxFQUFFLENBQ0osU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQzFCLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUMxQixpQkFBaUIsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUNyQyxDQUFDO0lBQ0osQ0FBQztJQUVELEtBQUssQ0FBQyxPQUFPLENBQ1gsU0FBMkIsRUFDM0IsYUFBNkIsRUFDN0IsT0FBZTtRQUVmLE1BQU0sZUFBZSxHQUFxQixFQUFFLENBQUM7UUFFN0MsS0FBSyxNQUFNLFFBQVEsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUNqQyxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsRUFBRSxhQUFhLENBQUMsQ0FBQztZQUNyRSxJQUFJLGNBQWMsRUFBRSxDQUFDO2dCQUNuQixlQUFlLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQ3ZDLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxlQUFlLENBQUM7SUFDekIsQ0FBQztJQUVPLGVBQWUsQ0FDckIsUUFBd0IsRUFDeEIsYUFBNkI7UUFFN0IsSUFBSSxTQUFTLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3RDLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFDbEQsQ0FBQztRQUNELElBQUksU0FBUyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUN0QyxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQ2xELENBQUM7UUFDRCxJQUFJLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUM5QyxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFDMUQsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVPLFVBQVUsQ0FDaEIsUUFBd0IsRUFDeEIsYUFBNkI7UUFFN0IsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLFVBQVUsQ0FBQztRQUNsQyxJQUFJLFlBQWdDLENBQUM7UUFFckMsSUFBSSxRQUFRLENBQUMsSUFBSSxLQUFLLDBCQUEwQixFQUFFLENBQUM7WUFDakQsTUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLGtCQUVaLENBQUM7WUFDZCxZQUFZLEdBQUcsVUFBVSxFQUFFLFlBQWtDLENBQUM7UUFDaEUsQ0FBQzthQUFNLENBQUM7WUFDTixZQUFZLEdBQUcsS0FBSyxDQUFDLFlBQWtDLENBQUM7UUFDMUQsQ0FBQztRQUVELElBQUksQ0FBQyxZQUFZO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFFL0IsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNoRCxNQUFNLGNBQWMsR0FBRyxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNyRCxJQUFJLENBQUMsY0FBYztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBRWpDLE1BQU0sWUFBWSxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBQ2xFLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxhQUFhLENBQUMsQ0FBQztRQUM5RCxNQUFNLE9BQU8sR0FBRyxJQUFJLEdBQUcsQ0FBQyx3QkFBd0IsR0FBRyxHQUFHLENBQUMsQ0FBQztRQUV4RCxPQUFPO1lBQ0wsRUFBRSxFQUFFLFlBQVksUUFBUSxDQUFDLFNBQVMsRUFBRTtZQUNwQyxLQUFLLEVBQUUsV0FBVyxRQUFRLENBQUMsU0FBUyxpQkFBaUIsWUFBWSxHQUFHO1lBQ3BFLFdBQVcsRUFBRSxHQUFHLFlBQVkseUJBQXlCLFlBQVksU0FBUyx3QkFBd0IsZ0dBQWdHO1lBQ2xNLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtZQUN2QixRQUFRLEVBQUUsT0FBTyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUs7WUFDbkUsdUJBQXVCLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRztZQUN4RCx1QkFBdUIsRUFBRSx3QkFBd0I7WUFDakQsaUJBQWlCLEVBQUUsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDO1lBQ3ZDLFdBQVcsRUFBRTtnQkFDWCw2QkFBNkIsWUFBWSxPQUFPLFlBQVksRUFBRTtnQkFDOUQsd0RBQXdEO2dCQUN4RCx1Q0FBdUM7Z0JBQ3ZDLGtEQUFrRDthQUNuRDtZQUNELE9BQU8sRUFBRTtnQkFDUCw0Q0FBNEM7Z0JBQzVDLG1EQUFtRDtnQkFDbkQsdUJBQXVCLHdCQUF3QixrQkFBa0I7YUFDbEU7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVPLFVBQVUsQ0FDaEIsUUFBd0IsRUFDeEIsYUFBNkI7UUFFN0IsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLFVBQVUsQ0FBQztRQUNsQyxNQUFNLGFBQWEsR0FBRyxLQUFLLENBQUMsZUFBcUMsQ0FBQztRQUNsRSxJQUFJLENBQUMsYUFBYTtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBRWhDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUNwRCxNQUFNLGNBQWMsR0FBRyx5QkFBeUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN6RCxJQUFJLENBQUMsY0FBYztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBRWpDLE1BQU0sYUFBYSxHQUFHLGFBQWEsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBQ3BFLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxhQUFhLENBQUMsQ0FBQztRQUM5RCxNQUFNLE9BQU8sR0FBRyxJQUFJLEdBQUcsQ0FBQyx3QkFBd0IsR0FBRyxHQUFHLENBQUMsQ0FBQztRQUV4RCxPQUFPO1lBQ0wsRUFBRSxFQUFFLFlBQVksUUFBUSxDQUFDLFNBQVMsRUFBRTtZQUNwQyxLQUFLLEVBQUUsV0FBVyxRQUFRLENBQUMsU0FBUyxpQkFBaUIsYUFBYSxHQUFHO1lBQ3JFLFdBQVcsRUFBRSxHQUFHLGFBQWEseUJBQXlCLGFBQWEsU0FBUyx3QkFBd0IsZ0ZBQWdGO1lBQ3BMLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtZQUN2QixRQUFRLEVBQUUsT0FBTyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUs7WUFDbkUsdUJBQXVCLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRztZQUN4RCx1QkFBdUIsRUFBRSx3QkFBd0I7WUFDakQsaUJBQWlCLEVBQUUsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDO1lBQ3ZDLFdBQVcsRUFBRTtnQkFDWCxpQ0FBaUMsYUFBYSxPQUFPLGFBQWEsRUFBRTtnQkFDcEUsNkRBQTZEO2dCQUM3RCwyQ0FBMkM7YUFDNUM7WUFDRCxPQUFPLEVBQUU7Z0JBQ1AsOERBQThEO2dCQUM5RCxrREFBa0Q7Z0JBQ2xELHVCQUF1Qix3QkFBd0Isa0JBQWtCO2FBQ2xFO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFTyxrQkFBa0IsQ0FDeEIsUUFBd0IsRUFDeEIsYUFBNkI7UUFFN0IsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLFVBQVUsQ0FBQztRQUNsQyxNQUFNLFFBQVEsR0FBSSxLQUFLLENBQUMsYUFBd0I7WUFDN0MsS0FBSyxDQUFDLGFBQXdCLENBQUM7UUFDbEMsSUFBSSxDQUFDLFFBQVE7WUFBRSxPQUFPLElBQUksQ0FBQztRQUUzQixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDdkQsTUFBTSxjQUFjLEdBQUcsaUNBQWlDLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDakUsSUFBSSxDQUFDLGNBQWM7WUFBRSxPQUFPLElBQUksQ0FBQztRQUVqQyxNQUFNLGdCQUFnQixHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBQ2xFLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxhQUFhLENBQUMsQ0FBQztRQUM5RCxNQUFNLE9BQU8sR0FBRyxJQUFJLEdBQUcsQ0FBQyx3QkFBd0IsR0FBRyxHQUFHLENBQUMsQ0FBQztRQUV4RCxPQUFPO1lBQ0wsRUFBRSxFQUFFLFlBQVksUUFBUSxDQUFDLFNBQVMsRUFBRTtZQUNwQyxLQUFLLEVBQUUsV0FBVyxRQUFRLENBQUMsU0FBUyxpQkFBaUIsZ0JBQWdCLEdBQUc7WUFDeEUsV0FBVyxFQUFFLEdBQUcsUUFBUSx5QkFBeUIsZ0JBQWdCLFNBQVMsd0JBQXdCLG1CQUFtQjtZQUNySCxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7WUFDdkIsUUFBUSxFQUFFLE9BQU8sSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLO1lBQ25FLHVCQUF1QixFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUc7WUFDeEQsdUJBQXVCLEVBQUUsd0JBQXdCO1lBQ2pELGlCQUFpQixFQUFFLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQztZQUN2QyxXQUFXLEVBQUU7Z0JBQ1gseUJBQXlCLFFBQVEsT0FBTyxnQkFBZ0IsRUFBRTtnQkFDMUQsa0RBQWtEO2dCQUNsRCwyQ0FBMkM7YUFDNUM7WUFDRCxPQUFPLEVBQUU7Z0JBQ1AseURBQXlEO2dCQUN6RCx1QkFBdUIsd0JBQXdCLGtCQUFrQjthQUNsRTtTQUNGLENBQUM7SUFDSixDQUFDO0lBRU8sYUFBYSxDQUFDLFlBQW9CO1FBQ3hDLG9EQUFvRDtRQUNwRCxNQUFNLEtBQUssR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3RDLE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBRU8sZ0JBQWdCLENBQUMsYUFBcUI7UUFDNUMsaUNBQWlDO1FBQ2pDLE1BQU0sS0FBSyxHQUFHLGFBQWEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdkMsSUFBSSxLQUFLLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3RCLE9BQU8sR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDbkMsQ0FBQztRQUNELE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVPLHdCQUF3QixDQUFDLFFBQWdCO1FBQy9DLHVDQUF1QztRQUN2QyxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2xDLElBQUksS0FBSyxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUN0QixPQUFPLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ25DLENBQUM7UUFDRCxPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFFTyxRQUFRLENBQUMsU0FBaUIsRUFBRSxhQUE2QjtRQUMvRCxNQUFNLElBQUksR0FBRyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxLQUFLLFNBQVMsQ0FBQyxDQUFDO1FBQ2xFLE9BQU8sSUFBSSxFQUFFLFdBQVcsQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7Q0FDRjtBQXZNRCw4REF1TUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSZXNvdXJjZVdpdGhJZCB9IGZyb20gJy4uLy4uL2RpZmYvdHlwZXMnO1xuaW1wb3J0IHsgUmVzb3VyY2VDb3N0IH0gZnJvbSAnLi4vLi4vcHJpY2luZy90eXBlcyc7XG5pbXBvcnQge1xuICBPcHRpbWl6YXRpb25BbmFseXplcixcbiAgT3B0aW1pemF0aW9uQ2F0ZWdvcnksXG4gIFJlY29tbWVuZGF0aW9uLFxufSBmcm9tICcuLi90eXBlcyc7XG5cbi8qKlxuICogTWFwcGluZyBvZiB4ODYgaW5zdGFuY2UgZmFtaWxpZXMgdG8gdGhlaXIgR3Jhdml0b24gZXF1aXZhbGVudHMuXG4gKiBHcmF2aXRvbiBpbnN0YW5jZXMgdHlwaWNhbGx5IG9mZmVyIDIwLTQwJSBiZXR0ZXIgcHJpY2UtcGVyZm9ybWFuY2UuXG4gKi9cbmNvbnN0IEdSQVZJVE9OX0FMVEVSTkFUSVZFUzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgbTU6ICdtN2cnLFxuICBtNWE6ICdtN2cnLFxuICBtNW46ICdtN2cnLFxuICBtNmk6ICdtN2cnLFxuICBjNTogJ2M3ZycsXG4gIGM1YTogJ2M3ZycsXG4gIGM1bjogJ2M3ZycsXG4gIGM2aTogJ2M3ZycsXG4gIHI1OiAncjdnJyxcbiAgcjVhOiAncjdnJyxcbiAgcjVuOiAncjdnJyxcbiAgcjZpOiAncjdnJyxcbiAgdDM6ICd0NGcnLFxuICB0M2E6ICd0NGcnLFxufTtcblxuY29uc3QgUkRTX0dSQVZJVE9OX0FMVEVSTkFUSVZFUzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgJ2RiLm01JzogJ2RiLm03ZycsXG4gICdkYi5tNmknOiAnZGIubTdnJyxcbiAgJ2RiLnI1JzogJ2RiLnI3ZycsXG4gICdkYi5yNmknOiAnZGIucjdnJyxcbiAgJ2RiLnQzJzogJ2RiLnQ0ZycsXG59O1xuXG5jb25zdCBFTEFTVElDQUNIRV9HUkFWSVRPTl9BTFRFUk5BVElWRVM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICdjYWNoZS5tNSc6ICdjYWNoZS5tN2cnLFxuICAnY2FjaGUubTZpJzogJ2NhY2hlLm03ZycsXG4gICdjYWNoZS5yNSc6ICdjYWNoZS5yN2cnLFxuICAnY2FjaGUucjZpJzogJ2NhY2hlLnI3ZycsXG4gICdjYWNoZS50Myc6ICdjYWNoZS50NGcnLFxufTtcblxuY29uc3QgR1JBVklUT05fU0FWSU5HU19QRVJDRU5UID0gMjA7XG5cbmNvbnN0IEVDMl9UWVBFUyA9IFsnQVdTOjpFQzI6Okluc3RhbmNlJywgJ0FXUzo6RUMyOjpMYXVuY2hUZW1wbGF0ZSddO1xuY29uc3QgUkRTX1RZUEVTID0gWydBV1M6OlJEUzo6REJJbnN0YW5jZScsICdBV1M6OlJEUzo6REJDbHVzdGVyJ107XG5jb25zdCBFTEFTVElDQUNIRV9UWVBFUyA9IFtcbiAgJ0FXUzo6RWxhc3RpQ2FjaGU6OkNhY2hlQ2x1c3RlcicsXG4gICdBV1M6OkVsYXN0aUNhY2hlOjpSZXBsaWNhdGlvbkdyb3VwJyxcbl07XG5cbmV4cG9ydCBjbGFzcyBHcmF2aXRvbk1pZ3JhdGlvbkFuYWx5emVyIGltcGxlbWVudHMgT3B0aW1pemF0aW9uQW5hbHl6ZXIge1xuICByZWFkb25seSBjYXRlZ29yeTogT3B0aW1pemF0aW9uQ2F0ZWdvcnkgPSAnZ3Jhdml0b24tbWlncmF0aW9uJztcbiAgcmVhZG9ubHkgbmFtZSA9ICdHcmF2aXRvbiBNaWdyYXRpb24nO1xuXG4gIGlzQXBwbGljYWJsZShyZXNvdXJjZXM6IFJlc291cmNlV2l0aElkW10pOiBib29sZWFuIHtcbiAgICByZXR1cm4gcmVzb3VyY2VzLnNvbWUoXG4gICAgICAocikgPT5cbiAgICAgICAgRUMyX1RZUEVTLmluY2x1ZGVzKHIudHlwZSkgfHxcbiAgICAgICAgUkRTX1RZUEVTLmluY2x1ZGVzKHIudHlwZSkgfHxcbiAgICAgICAgRUxBU1RJQ0FDSEVfVFlQRVMuaW5jbHVkZXMoci50eXBlKSxcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgYW5hbHl6ZShcbiAgICByZXNvdXJjZXM6IFJlc291cmNlV2l0aElkW10sXG4gICAgcmVzb3VyY2VDb3N0czogUmVzb3VyY2VDb3N0W10sXG4gICAgX3JlZ2lvbjogc3RyaW5nLFxuICApOiBQcm9taXNlPFJlY29tbWVuZGF0aW9uW10+IHtcbiAgICBjb25zdCByZWNvbW1lbmRhdGlvbnM6IFJlY29tbWVuZGF0aW9uW10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgcmVzb3VyY2Ugb2YgcmVzb3VyY2VzKSB7XG4gICAgICBjb25zdCByZWNvbW1lbmRhdGlvbiA9IHRoaXMuYW5hbHl6ZVJlc291cmNlKHJlc291cmNlLCByZXNvdXJjZUNvc3RzKTtcbiAgICAgIGlmIChyZWNvbW1lbmRhdGlvbikge1xuICAgICAgICByZWNvbW1lbmRhdGlvbnMucHVzaChyZWNvbW1lbmRhdGlvbik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlY29tbWVuZGF0aW9ucztcbiAgfVxuXG4gIHByaXZhdGUgYW5hbHl6ZVJlc291cmNlKFxuICAgIHJlc291cmNlOiBSZXNvdXJjZVdpdGhJZCxcbiAgICByZXNvdXJjZUNvc3RzOiBSZXNvdXJjZUNvc3RbXSxcbiAgKTogUmVjb21tZW5kYXRpb24gfCBudWxsIHtcbiAgICBpZiAoRUMyX1RZUEVTLmluY2x1ZGVzKHJlc291cmNlLnR5cGUpKSB7XG4gICAgICByZXR1cm4gdGhpcy5hbmFseXplRUMyKHJlc291cmNlLCByZXNvdXJjZUNvc3RzKTtcbiAgICB9XG4gICAgaWYgKFJEU19UWVBFUy5pbmNsdWRlcyhyZXNvdXJjZS50eXBlKSkge1xuICAgICAgcmV0dXJuIHRoaXMuYW5hbHl6ZVJEUyhyZXNvdXJjZSwgcmVzb3VyY2VDb3N0cyk7XG4gICAgfVxuICAgIGlmIChFTEFTVElDQUNIRV9UWVBFUy5pbmNsdWRlcyhyZXNvdXJjZS50eXBlKSkge1xuICAgICAgcmV0dXJuIHRoaXMuYW5hbHl6ZUVsYXN0aUNhY2hlKHJlc291cmNlLCByZXNvdXJjZUNvc3RzKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIGFuYWx5emVFQzIoXG4gICAgcmVzb3VyY2U6IFJlc291cmNlV2l0aElkLFxuICAgIHJlc291cmNlQ29zdHM6IFJlc291cmNlQ29zdFtdLFxuICApOiBSZWNvbW1lbmRhdGlvbiB8IG51bGwge1xuICAgIGNvbnN0IHByb3BzID0gcmVzb3VyY2UucHJvcGVydGllcztcbiAgICBsZXQgaW5zdGFuY2VUeXBlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgICBpZiAocmVzb3VyY2UudHlwZSA9PT0gJ0FXUzo6RUMyOjpMYXVuY2hUZW1wbGF0ZScpIHtcbiAgICAgIGNvbnN0IGxhdW5jaERhdGEgPSBwcm9wcy5MYXVuY2hUZW1wbGF0ZURhdGEgYXNcbiAgICAgICAgfCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgICAgICB8IHVuZGVmaW5lZDtcbiAgICAgIGluc3RhbmNlVHlwZSA9IGxhdW5jaERhdGE/Lkluc3RhbmNlVHlwZSBhcyBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGluc3RhbmNlVHlwZSA9IHByb3BzLkluc3RhbmNlVHlwZSBhcyBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgaWYgKCFpbnN0YW5jZVR5cGUpIHJldHVybiBudWxsO1xuXG4gICAgY29uc3QgZmFtaWx5ID0gdGhpcy5leHRyYWN0RmFtaWx5KGluc3RhbmNlVHlwZSk7XG4gICAgY29uc3QgZ3Jhdml0b25GYW1pbHkgPSBHUkFWSVRPTl9BTFRFUk5BVElWRVNbZmFtaWx5XTtcbiAgICBpZiAoIWdyYXZpdG9uRmFtaWx5KSByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IGdyYXZpdG9uVHlwZSA9IGluc3RhbmNlVHlwZS5yZXBsYWNlKGZhbWlseSwgZ3Jhdml0b25GYW1pbHkpO1xuICAgIGNvbnN0IGNvc3QgPSB0aGlzLmZpbmRDb3N0KHJlc291cmNlLmxvZ2ljYWxJZCwgcmVzb3VyY2VDb3N0cyk7XG4gICAgY29uc3Qgc2F2aW5ncyA9IGNvc3QgKiAoR1JBVklUT05fU0FWSU5HU19QRVJDRU5UIC8gMTAwKTtcblxuICAgIHJldHVybiB7XG4gICAgICBpZDogYGdyYXZpdG9uLSR7cmVzb3VyY2UubG9naWNhbElkfWAsXG4gICAgICB0aXRsZTogYE1pZ3JhdGUgJHtyZXNvdXJjZS5sb2dpY2FsSWR9IHRvIEdyYXZpdG9uICgke2dyYXZpdG9uVHlwZX0pYCxcbiAgICAgIGRlc2NyaXB0aW9uOiBgJHtpbnN0YW5jZVR5cGV9IGNhbiBiZSByZXBsYWNlZCB3aXRoICR7Z3Jhdml0b25UeXBlfSBmb3IgfiR7R1JBVklUT05fU0FWSU5HU19QRVJDRU5UfSUgY29zdCByZWR1Y3Rpb24uIEFXUyBHcmF2aXRvbiBwcm9jZXNzb3JzIGRlbGl2ZXIgYmV0dGVyIHByaWNlLXBlcmZvcm1hbmNlIGZvciBtb3N0IHdvcmtsb2Fkcy5gLFxuICAgICAgY2F0ZWdvcnk6IHRoaXMuY2F0ZWdvcnksXG4gICAgICBwcmlvcml0eTogc2F2aW5ncyA+PSA1MCA/ICdoaWdoJyA6IHNhdmluZ3MgPj0gMjAgPyAnbWVkaXVtJyA6ICdsb3cnLFxuICAgICAgZXN0aW1hdGVkTW9udGhseVNhdmluZ3M6IE1hdGgucm91bmQoc2F2aW5ncyAqIDEwMCkgLyAxMDAsXG4gICAgICBlc3RpbWF0ZWRTYXZpbmdzUGVyY2VudDogR1JBVklUT05fU0FWSU5HU19QRVJDRU5ULFxuICAgICAgYWZmZWN0ZWRSZXNvdXJjZXM6IFtyZXNvdXJjZS5sb2dpY2FsSWRdLFxuICAgICAgYWN0aW9uSXRlbXM6IFtcbiAgICAgICAgYENoYW5nZSBpbnN0YW5jZSB0eXBlIGZyb20gJHtpbnN0YW5jZVR5cGV9IHRvICR7Z3Jhdml0b25UeXBlfWAsXG4gICAgICAgICdUZXN0IGFwcGxpY2F0aW9uIGNvbXBhdGliaWxpdHkgd2l0aCBBUk02NCBhcmNoaXRlY3R1cmUnLFxuICAgICAgICAnVmVyaWZ5IGFsbCBkZXBlbmRlbmNpZXMgc3VwcG9ydCBBUk02NCcsXG4gICAgICAgICdEZXBsb3kgdG8gc3RhZ2luZyBmaXJzdCBhbmQgbW9uaXRvciBmb3IgMjQgaG91cnMnLFxuICAgICAgXSxcbiAgICAgIGNhdmVhdHM6IFtcbiAgICAgICAgJ1JlcXVpcmVzIEFSTTY0LWNvbXBhdGlibGUgQU1JIGFuZCBzb2Z0d2FyZScsXG4gICAgICAgICdTb21lIHg4Ni1zcGVjaWZpYyB3b3JrbG9hZHMgbWF5IG5vdCBiZSBjb21wYXRpYmxlJyxcbiAgICAgICAgYFNhdmluZ3MgZXN0aW1hdGUgb2YgJHtHUkFWSVRPTl9TQVZJTkdTX1BFUkNFTlR9JSBpcyBhcHByb3hpbWF0ZWAsXG4gICAgICBdLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGFuYWx5emVSRFMoXG4gICAgcmVzb3VyY2U6IFJlc291cmNlV2l0aElkLFxuICAgIHJlc291cmNlQ29zdHM6IFJlc291cmNlQ29zdFtdLFxuICApOiBSZWNvbW1lbmRhdGlvbiB8IG51bGwge1xuICAgIGNvbnN0IHByb3BzID0gcmVzb3VyY2UucHJvcGVydGllcztcbiAgICBjb25zdCBpbnN0YW5jZUNsYXNzID0gcHJvcHMuREJJbnN0YW5jZUNsYXNzIGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBpZiAoIWluc3RhbmNlQ2xhc3MpIHJldHVybiBudWxsO1xuXG4gICAgY29uc3QgZmFtaWx5ID0gdGhpcy5leHRyYWN0UkRTRmFtaWx5KGluc3RhbmNlQ2xhc3MpO1xuICAgIGNvbnN0IGdyYXZpdG9uRmFtaWx5ID0gUkRTX0dSQVZJVE9OX0FMVEVSTkFUSVZFU1tmYW1pbHldO1xuICAgIGlmICghZ3Jhdml0b25GYW1pbHkpIHJldHVybiBudWxsO1xuXG4gICAgY29uc3QgZ3Jhdml0b25DbGFzcyA9IGluc3RhbmNlQ2xhc3MucmVwbGFjZShmYW1pbHksIGdyYXZpdG9uRmFtaWx5KTtcbiAgICBjb25zdCBjb3N0ID0gdGhpcy5maW5kQ29zdChyZXNvdXJjZS5sb2dpY2FsSWQsIHJlc291cmNlQ29zdHMpO1xuICAgIGNvbnN0IHNhdmluZ3MgPSBjb3N0ICogKEdSQVZJVE9OX1NBVklOR1NfUEVSQ0VOVCAvIDEwMCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IGBncmF2aXRvbi0ke3Jlc291cmNlLmxvZ2ljYWxJZH1gLFxuICAgICAgdGl0bGU6IGBNaWdyYXRlICR7cmVzb3VyY2UubG9naWNhbElkfSB0byBHcmF2aXRvbiAoJHtncmF2aXRvbkNsYXNzfSlgLFxuICAgICAgZGVzY3JpcHRpb246IGAke2luc3RhbmNlQ2xhc3N9IGNhbiBiZSByZXBsYWNlZCB3aXRoICR7Z3Jhdml0b25DbGFzc30gZm9yIH4ke0dSQVZJVE9OX1NBVklOR1NfUEVSQ0VOVH0lIGNvc3QgcmVkdWN0aW9uLiBSRFMgb24gR3Jhdml0b24gb2ZmZXJzIHRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkgYXQgbG93ZXIgY29zdC5gLFxuICAgICAgY2F0ZWdvcnk6IHRoaXMuY2F0ZWdvcnksXG4gICAgICBwcmlvcml0eTogc2F2aW5ncyA+PSA1MCA/ICdoaWdoJyA6IHNhdmluZ3MgPj0gMjAgPyAnbWVkaXVtJyA6ICdsb3cnLFxuICAgICAgZXN0aW1hdGVkTW9udGhseVNhdmluZ3M6IE1hdGgucm91bmQoc2F2aW5ncyAqIDEwMCkgLyAxMDAsXG4gICAgICBlc3RpbWF0ZWRTYXZpbmdzUGVyY2VudDogR1JBVklUT05fU0FWSU5HU19QRVJDRU5ULFxuICAgICAgYWZmZWN0ZWRSZXNvdXJjZXM6IFtyZXNvdXJjZS5sb2dpY2FsSWRdLFxuICAgICAgYWN0aW9uSXRlbXM6IFtcbiAgICAgICAgYENoYW5nZSBEQiBpbnN0YW5jZSBjbGFzcyBmcm9tICR7aW5zdGFuY2VDbGFzc30gdG8gJHtncmF2aXRvbkNsYXNzfWAsXG4gICAgICAgICdTY2hlZHVsZSBhIG1haW50ZW5hbmNlIHdpbmRvdyBmb3IgdGhlIGluc3RhbmNlIGNsYXNzIGNoYW5nZScsXG4gICAgICAgICdUZXN0IGRhdGFiYXNlIHBlcmZvcm1hbmNlIGFmdGVyIG1pZ3JhdGlvbicsXG4gICAgICBdLFxuICAgICAgY2F2ZWF0czogW1xuICAgICAgICAnUmVxdWlyZXMgYSBzaG9ydCBkb3dudGltZSBkdXJpbmcgaW5zdGFuY2UgY2xhc3MgbW9kaWZpY2F0aW9uJyxcbiAgICAgICAgJ1ZlcmlmeSBkYXRhYmFzZSBlbmdpbmUgdmVyc2lvbiBzdXBwb3J0cyBHcmF2aXRvbicsXG4gICAgICAgIGBTYXZpbmdzIGVzdGltYXRlIG9mICR7R1JBVklUT05fU0FWSU5HU19QRVJDRU5UfSUgaXMgYXBwcm94aW1hdGVgLFxuICAgICAgXSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhbmFseXplRWxhc3RpQ2FjaGUoXG4gICAgcmVzb3VyY2U6IFJlc291cmNlV2l0aElkLFxuICAgIHJlc291cmNlQ29zdHM6IFJlc291cmNlQ29zdFtdLFxuICApOiBSZWNvbW1lbmRhdGlvbiB8IG51bGwge1xuICAgIGNvbnN0IHByb3BzID0gcmVzb3VyY2UucHJvcGVydGllcztcbiAgICBjb25zdCBub2RlVHlwZSA9IChwcm9wcy5DYWNoZU5vZGVUeXBlIGFzIHN0cmluZykgfHxcbiAgICAgIChwcm9wcy5DYWNoZU5vZGVUeXBlIGFzIHN0cmluZyk7XG4gICAgaWYgKCFub2RlVHlwZSkgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCBmYW1pbHkgPSB0aGlzLmV4dHJhY3RFbGFzdGlDYWNoZUZhbWlseShub2RlVHlwZSk7XG4gICAgY29uc3QgZ3Jhdml0b25GYW1pbHkgPSBFTEFTVElDQUNIRV9HUkFWSVRPTl9BTFRFUk5BVElWRVNbZmFtaWx5XTtcbiAgICBpZiAoIWdyYXZpdG9uRmFtaWx5KSByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IGdyYXZpdG9uTm9kZVR5cGUgPSBub2RlVHlwZS5yZXBsYWNlKGZhbWlseSwgZ3Jhdml0b25GYW1pbHkpO1xuICAgIGNvbnN0IGNvc3QgPSB0aGlzLmZpbmRDb3N0KHJlc291cmNlLmxvZ2ljYWxJZCwgcmVzb3VyY2VDb3N0cyk7XG4gICAgY29uc3Qgc2F2aW5ncyA9IGNvc3QgKiAoR1JBVklUT05fU0FWSU5HU19QRVJDRU5UIC8gMTAwKTtcblxuICAgIHJldHVybiB7XG4gICAgICBpZDogYGdyYXZpdG9uLSR7cmVzb3VyY2UubG9naWNhbElkfWAsXG4gICAgICB0aXRsZTogYE1pZ3JhdGUgJHtyZXNvdXJjZS5sb2dpY2FsSWR9IHRvIEdyYXZpdG9uICgke2dyYXZpdG9uTm9kZVR5cGV9KWAsXG4gICAgICBkZXNjcmlwdGlvbjogYCR7bm9kZVR5cGV9IGNhbiBiZSByZXBsYWNlZCB3aXRoICR7Z3Jhdml0b25Ob2RlVHlwZX0gZm9yIH4ke0dSQVZJVE9OX1NBVklOR1NfUEVSQ0VOVH0lIGNvc3QgcmVkdWN0aW9uLmAsXG4gICAgICBjYXRlZ29yeTogdGhpcy5jYXRlZ29yeSxcbiAgICAgIHByaW9yaXR5OiBzYXZpbmdzID49IDUwID8gJ2hpZ2gnIDogc2F2aW5ncyA+PSAyMCA/ICdtZWRpdW0nIDogJ2xvdycsXG4gICAgICBlc3RpbWF0ZWRNb250aGx5U2F2aW5nczogTWF0aC5yb3VuZChzYXZpbmdzICogMTAwKSAvIDEwMCxcbiAgICAgIGVzdGltYXRlZFNhdmluZ3NQZXJjZW50OiBHUkFWSVRPTl9TQVZJTkdTX1BFUkNFTlQsXG4gICAgICBhZmZlY3RlZFJlc291cmNlczogW3Jlc291cmNlLmxvZ2ljYWxJZF0sXG4gICAgICBhY3Rpb25JdGVtczogW1xuICAgICAgICBgQ2hhbmdlIG5vZGUgdHlwZSBmcm9tICR7bm9kZVR5cGV9IHRvICR7Z3Jhdml0b25Ob2RlVHlwZX1gLFxuICAgICAgICAnU2NoZWR1bGUgbWFpbnRlbmFuY2Ugd2luZG93IGZvciBub2RlIHR5cGUgY2hhbmdlJyxcbiAgICAgICAgJ01vbml0b3IgY2FjaGUgcGVyZm9ybWFuY2UgYWZ0ZXIgbWlncmF0aW9uJyxcbiAgICAgIF0sXG4gICAgICBjYXZlYXRzOiBbXG4gICAgICAgICdSZXF1aXJlcyBhIGJyaWVmIGZhaWxvdmVyIGR1cmluZyBub2RlIHR5cGUgbW9kaWZpY2F0aW9uJyxcbiAgICAgICAgYFNhdmluZ3MgZXN0aW1hdGUgb2YgJHtHUkFWSVRPTl9TQVZJTkdTX1BFUkNFTlR9JSBpcyBhcHByb3hpbWF0ZWAsXG4gICAgICBdLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGV4dHJhY3RGYW1pbHkoaW5zdGFuY2VUeXBlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIGUuZy4sIFwibTUueGxhcmdlXCIgLT4gXCJtNVwiLCBcImM1YS4yeGxhcmdlXCIgLT4gXCJjNWFcIlxuICAgIGNvbnN0IHBhcnRzID0gaW5zdGFuY2VUeXBlLnNwbGl0KCcuJyk7XG4gICAgcmV0dXJuIHBhcnRzWzBdIHx8ICcnO1xuICB9XG5cbiAgcHJpdmF0ZSBleHRyYWN0UkRTRmFtaWx5KGluc3RhbmNlQ2xhc3M6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgLy8gZS5nLiwgXCJkYi5tNS5sYXJnZVwiIC0+IFwiZGIubTVcIlxuICAgIGNvbnN0IHBhcnRzID0gaW5zdGFuY2VDbGFzcy5zcGxpdCgnLicpO1xuICAgIGlmIChwYXJ0cy5sZW5ndGggPj0gMykge1xuICAgICAgcmV0dXJuIGAke3BhcnRzWzBdfS4ke3BhcnRzWzFdfWA7XG4gICAgfVxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIHByaXZhdGUgZXh0cmFjdEVsYXN0aUNhY2hlRmFtaWx5KG5vZGVUeXBlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIGUuZy4sIFwiY2FjaGUubTUubGFyZ2VcIiAtPiBcImNhY2hlLm01XCJcbiAgICBjb25zdCBwYXJ0cyA9IG5vZGVUeXBlLnNwbGl0KCcuJyk7XG4gICAgaWYgKHBhcnRzLmxlbmd0aCA+PSAzKSB7XG4gICAgICByZXR1cm4gYCR7cGFydHNbMF19LiR7cGFydHNbMV19YDtcbiAgICB9XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5kQ29zdChsb2dpY2FsSWQ6IHN0cmluZywgcmVzb3VyY2VDb3N0czogUmVzb3VyY2VDb3N0W10pOiBudW1iZXIge1xuICAgIGNvbnN0IGNvc3QgPSByZXNvdXJjZUNvc3RzLmZpbmQoKGMpID0+IGMubG9naWNhbElkID09PSBsb2dpY2FsSWQpO1xuICAgIHJldHVybiBjb3N0Py5tb250aGx5Q29zdC5hbW91bnQgPz8gMDtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { ResourceWithId } from '../../diff/types';
|
|
2
|
+
import { ResourceCost } from '../../pricing/types';
|
|
3
|
+
import { OptimizationAnalyzer, OptimizationCategory, Recommendation } from '../types';
|
|
4
|
+
export declare class NATGatewayOptimizationAnalyzer implements OptimizationAnalyzer {
|
|
5
|
+
readonly category: OptimizationCategory;
|
|
6
|
+
readonly name = "NAT Gateway Optimization";
|
|
7
|
+
isApplicable(resources: ResourceWithId[]): boolean;
|
|
8
|
+
analyze(resources: ResourceWithId[], resourceCosts: ResourceCost[], _region: string): Promise<Recommendation[]>;
|
|
9
|
+
private suggestNATInstanceForDev;
|
|
10
|
+
private suggestVPCEndpoints;
|
|
11
|
+
private suggestConsolidation;
|
|
12
|
+
private findCost;
|
|
13
|
+
}
|