cdk-monitoring-constructs
Version:
[](https://badge.fury.io/js/cdk-monitoring-constructs) [](https://m
118 lines • 18.8 kB
JavaScript
"use strict";
var _a;
Object.defineProperty(exports, "__esModule", { value: true });
exports.DynamoTableGlobalSecondaryIndexMonitoring = void 0;
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
const aws_cloudwatch_1 = require("aws-cdk-lib/aws-cloudwatch");
const DynamoTableGlobalSecondaryIndexMetricFactory_1 = require("./DynamoTableGlobalSecondaryIndexMetricFactory");
const common_1 = require("../../common");
const dashboard_1 = require("../../dashboard");
class DynamoTableGlobalSecondaryIndexMonitoring extends common_1.Monitoring {
constructor(scope, props) {
super(scope, props);
const namingStrategy = new dashboard_1.MonitoringNamingStrategy({
...props,
fallbackConstructName: props.globalSecondaryIndexName,
});
this.title = namingStrategy.resolveHumanReadableName();
this.tableUrl = scope
.createAwsConsoleUrlFactory()
.getDynamoTableUrl(props.table.tableName);
const metricFactory = new DynamoTableGlobalSecondaryIndexMetricFactory_1.DynamoTableGlobalSecondaryIndexMetricFactory(scope.createMetricFactory(), props);
this.provisionedReadUnitsMetric =
metricFactory.metricProvisionedReadCapacityUnits();
this.provisionedWriteUnitsMetric =
metricFactory.metricProvisionedWriteCapacityUnits();
this.consumedReadUnitsMetric =
metricFactory.metricConsumedReadCapacityUnits();
this.consumedWriteUnitsMetric =
metricFactory.metricConsumedWriteCapacityUnits();
this.indexConsumedWriteUnitsMetric =
metricFactory.metricIndexConsumedWriteUnitsMetric();
this.readThrottleCountMetric =
metricFactory.metricThrottledReadRequestCount();
this.writeThrottleCountMetric =
metricFactory.metricThrottledWriteRequestCount();
this.indexThrottleCountMetric =
metricFactory.metricThrottledIndexRequestCount();
const alarmFactory = this.createAlarmFactory(namingStrategy.resolveAlarmFriendlyName());
this.gsiAlarmFactory = new common_1.DynamoAlarmFactory(alarmFactory);
this.throttledEventsAnnotations = [];
for (const disambiguator in props.addReadThrottledEventsCountAlarm) {
const alarmProps = props.addReadThrottledEventsCountAlarm[disambiguator];
const createdAlarm = this.gsiAlarmFactory.addThrottledEventsAlarm(this.readThrottleCountMetric, common_1.CapacityType.READ, alarmProps, disambiguator);
this.throttledEventsAnnotations.push(createdAlarm.annotation);
this.addAlarm(createdAlarm);
}
for (const disambiguator in props.addWriteThrottledEventsCountAlarm) {
const alarmProps = props.addWriteThrottledEventsCountAlarm[disambiguator];
const createdAlarm = this.gsiAlarmFactory.addThrottledEventsAlarm(this.writeThrottleCountMetric, common_1.CapacityType.WRITE, alarmProps, disambiguator);
this.throttledEventsAnnotations.push(createdAlarm.annotation);
this.addAlarm(createdAlarm);
}
props.useCreatedAlarms?.consume(this.createdAlarms());
}
summaryWidgets() {
return [
this.createTitleWidget(),
this.createReadCapacityWidget(common_1.ThirdWidth, common_1.DefaultSummaryWidgetHeight),
this.createWriteCapacityWidget(common_1.ThirdWidth, common_1.DefaultSummaryWidgetHeight),
this.createThrottlesWidget(common_1.ThirdWidth, common_1.DefaultSummaryWidgetHeight),
];
}
widgets() {
return [
this.createTitleWidget(),
this.createReadCapacityWidget(common_1.ThirdWidth, common_1.DefaultGraphWidgetHeight),
this.createWriteCapacityWidget(common_1.ThirdWidth, common_1.DefaultGraphWidgetHeight),
this.createThrottlesWidget(common_1.ThirdWidth, common_1.DefaultGraphWidgetHeight),
];
}
createTitleWidget() {
return new dashboard_1.MonitoringHeaderWidget({
family: "Dynamo Table Global Secondary Index",
title: this.title,
goToLinkUrl: this.tableUrl,
});
}
createReadCapacityWidget(width, height) {
return new aws_cloudwatch_1.GraphWidget({
width,
height,
title: "Read Capacity",
left: [this.consumedReadUnitsMetric, this.provisionedReadUnitsMetric],
leftYAxis: common_1.CountAxisFromZero,
});
}
createWriteCapacityWidget(width, height) {
return new aws_cloudwatch_1.GraphWidget({
width,
height,
title: "Write Capacity",
left: [
this.consumedWriteUnitsMetric,
this.provisionedWriteUnitsMetric,
this.indexConsumedWriteUnitsMetric,
],
leftYAxis: common_1.CountAxisFromZero,
});
}
createThrottlesWidget(width, height) {
return new aws_cloudwatch_1.GraphWidget({
width,
height,
title: "Throttles",
left: [
this.readThrottleCountMetric,
this.writeThrottleCountMetric,
this.indexThrottleCountMetric,
],
leftYAxis: common_1.CountAxisFromZero,
leftAnnotations: this.throttledEventsAnnotations,
});
}
}
exports.DynamoTableGlobalSecondaryIndexMonitoring = DynamoTableGlobalSecondaryIndexMonitoring;
_a = JSII_RTTI_SYMBOL_1;
DynamoTableGlobalSecondaryIndexMonitoring[_a] = { fqn: "cdk-monitoring-constructs.DynamoTableGlobalSecondaryIndexMonitoring", version: "10.0.0" };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRHluYW1vVGFibGVHbG9iYWxTZWNvbmRhcnlJbmRleE1vbml0b3JpbmcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJEeW5hbW9UYWJsZUdsb2JhbFNlY29uZGFyeUluZGV4TW9uaXRvcmluZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLCtEQUlvQztBQUVwQyxpSEFHd0Q7QUFDeEQseUNBWXNCO0FBQ3RCLCtDQUd5QjtBQWV6QixNQUFhLHlDQUEwQyxTQUFRLG1CQUFVO0lBZ0J2RSxZQUNFLEtBQXNCLEVBQ3RCLEtBQXFEO1FBRXJELEtBQUssQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFcEIsTUFBTSxjQUFjLEdBQUcsSUFBSSxvQ0FBd0IsQ0FBQztZQUNsRCxHQUFHLEtBQUs7WUFDUixxQkFBcUIsRUFBRSxLQUFLLENBQUMsd0JBQXdCO1NBQ3RELENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxLQUFLLEdBQUcsY0FBYyxDQUFDLHdCQUF3QixFQUFFLENBQUM7UUFDdkQsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLO2FBQ2xCLDBCQUEwQixFQUFFO2FBQzVCLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFNUMsTUFBTSxhQUFhLEdBQUcsSUFBSSwyRkFBNEMsQ0FDcEUsS0FBSyxDQUFDLG1CQUFtQixFQUFFLEVBQzNCLEtBQUssQ0FDTixDQUFDO1FBQ0YsSUFBSSxDQUFDLDBCQUEwQjtZQUM3QixhQUFhLENBQUMsa0NBQWtDLEVBQUUsQ0FBQztRQUNyRCxJQUFJLENBQUMsMkJBQTJCO1lBQzlCLGFBQWEsQ0FBQyxtQ0FBbUMsRUFBRSxDQUFDO1FBQ3RELElBQUksQ0FBQyx1QkFBdUI7WUFDMUIsYUFBYSxDQUFDLCtCQUErQixFQUFFLENBQUM7UUFDbEQsSUFBSSxDQUFDLHdCQUF3QjtZQUMzQixhQUFhLENBQUMsZ0NBQWdDLEVBQUUsQ0FBQztRQUNuRCxJQUFJLENBQUMs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VyxDQUFDO1lBQ3JCLEtBQUs7WUFDTCxNQUFNO1lBQ04sS0FBSyxFQUFFLGVBQWU7WUFDdEIsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLHVCQUF1QixFQUFFLElBQUksQ0FBQywwQkFBMEIsQ0FBQztZQUNyRSxTQUFTLEVBQUUsMEJBQWlCO1NBQzdCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFUyx5QkFBeUIsQ0FBQyxLQUFhLEVBQUUsTUFBYztRQUMvRCxPQUFPLElBQUksNEJBQVcsQ0FBQztZQUNyQixLQUFLO1lBQ0wsTUFBTTtZQUNOLEtBQUssRUFBRSxnQkFBZ0I7WUFDdkIsSUFBSSxFQUFFO2dCQUNKLElBQUksQ0FBQyx3QkFBd0I7Z0JBQzdCLElBQUksQ0FBQywyQkFBMkI7Z0JBQ2hDLElBQUksQ0FBQyw2QkFBNkI7YUFDbkM7WUFDRCxTQUFTLEVBQUUsMEJBQWlCO1NBQzdCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFUyxxQkFBcUIsQ0FBQyxLQUFhLEVBQUUsTUFBYztRQUMzRCxPQUFPLElBQUksNEJBQVcsQ0FBQztZQUNyQixLQUFLO1lBQ0wsTUFBTTtZQUNOLEtBQUssRUFBRSxXQUFXO1lBQ2xCLElBQUksRUFBRTtnQkFDSixJQUFJLENBQUMsdUJBQXVCO2dCQUM1QixJQUFJLENBQUMsd0JBQXdCO2dCQUM3QixJQUFJLENBQUMsd0JBQXdCO2FBQzlCO1lBQ0QsU0FBUyxFQUFFLDBCQUFpQjtZQUM1QixlQUFlLEVBQUUsSUFBSSxDQUFDLDBCQUEwQjtTQUNqRCxDQUFDLENBQUM7SUFDTCxDQUFDOztBQW5KSCw4RkFvSkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBHcmFwaFdpZGdldCxcbiAgSG9yaXpvbnRhbEFubm90YXRpb24sXG4gIElXaWRnZXQsXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtY2xvdWR3YXRjaFwiO1xuXG5pbXBvcnQge1xuICBEeW5hbW9UYWJsZUdsb2JhbFNlY29uZGFyeUluZGV4TWV0cmljRmFjdG9yeSxcbiAgRHluYW1vVGFibGVHbG9iYWxTZWNvbmRhcnlJbmRleE1ldHJpY0ZhY3RvcnlQcm9wcyxcbn0gZnJvbSBcIi4vRHluYW1vVGFibGVHbG9iYWxTZWNvbmRhcnlJbmRleE1ldHJpY0ZhY3RvcnlcIjtcbmltcG9ydCB7XG4gIEJhc2VNb25pdG9yaW5nUHJvcHMsXG4gIENhcGFjaXR5VHlwZSxcbiAgQ291bnRBeGlzRnJvbVplcm8sXG4gIERlZmF1bHRHcmFwaFdpZGdldEhlaWdodCxcbiAgRGVmYXVsdFN1bW1hcnlXaWRnZXRIZWlnaHQsXG4gIER5bmFtb0FsYXJtRmFjdG9yeSxcbiAgTWV0cmljV2l0aEFsYXJtU3VwcG9ydCxcbiAgTW9uaXRvcmluZyxcbiAgTW9uaXRvcmluZ1Njb3BlLFxuICBUaGlyZFdpZHRoLFxuICBUaHJvdHRsZWRFdmVudHNUaHJlc2hvbGQsXG59IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7XG4gIE1vbml0b3JpbmdIZWFkZXJXaWRnZXQsXG4gIE1vbml0b3JpbmdOYW1pbmdTdHJhdGVneSxcbn0gZnJvbSBcIi4uLy4uL2Rhc2hib2FyZFwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIER5bmFtb1RhYmxlR2xvYmFsU2Vjb25kYXJ5SW5kZXhNb25pdG9yaW5nUHJvcHNcbiAgZXh0ZW5kcyBEeW5hbW9UYWJsZUdsb2JhbFNlY29uZGFyeUluZGV4TWV0cmljRmFjdG9yeVByb3BzLFxuICAgIEJhc2VNb25pdG9yaW5nUHJvcHMge1xuICByZWFkb25seSBhZGRSZWFkVGhyb3R0bGVkRXZlbnRzQ291bnRBbGFybT86IFJlY29yZDxcbiAgICBzdHJpbmcsXG4gICAgVGhyb3R0bGVkRXZlbnRzVGhyZXNob2xkXG4gID47XG4gIHJlYWRvbmx5IGFkZFdyaXRlVGhyb3R0bGVkRXZlbnRzQ291bnRBbGFybT86IFJlY29yZDxcbiAgICBzdHJpbmcsXG4gICAgVGhyb3R0bGVkRXZlbnRzVGhyZXNob2xkXG4gID47XG59XG5cbmV4cG9ydCBjbGFzcyBEeW5hbW9UYWJsZUdsb2JhbFNlY29uZGFyeUluZGV4TW9uaXRvcmluZyBleHRlbmRzIE1vbml0b3Jpbmcge1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgdGl0bGU6IHN0cmluZztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHRhYmxlVXJsPzogc3RyaW5nO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBwcm92aXNpb25lZFJlYWRVbml0c01ldHJpYzogTWV0cmljV2l0aEFsYXJtU3VwcG9ydDtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHByb3Zpc2lvbmVkV3JpdGVVbml0c01ldHJpYzogTWV0cmljV2l0aEFsYXJtU3VwcG9ydDtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGNvbnN1bWVkUmVhZFVuaXRzTWV0cmljOiBNZXRyaWNXaXRoQWxhcm1TdXBwb3J0O1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgY29uc3VtZWRXcml0ZVVuaXRzTWV0cmljOiBNZXRyaWNXaXRoQWxhcm1TdXBwb3J0O1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaW5kZXhDb25zdW1lZFdyaXRlVW5pdHNNZXRyaWM6IE1ldHJpY1dpdGhBbGFybVN1cHBvcnQ7XG4gIHByb3RlY3RlZCByZWFkb25seSByZWFkVGhyb3R0bGVDb3VudE1ldHJpYzogTWV0cmljV2l0aEFsYXJtU3VwcG9ydDtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHdyaXRlVGhyb3R0bGVDb3VudE1ldHJpYzogTWV0cmljV2l0aEFsYXJtU3VwcG9ydDtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGluZGV4VGhyb3R0bGVDb3VudE1ldHJpYzogTWV0cmljV2l0aEFsYXJtU3VwcG9ydDtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZ3NpQWxhcm1GYWN0b3J5OiBEeW5hbW9BbGFybUZhY3Rvcnk7XG4gIHByb3RlY3RlZCByZWFkb25seSB0aHJvdHRsZWRFdmVudHNBbm5vdGF0aW9uczogSG9yaXpvbnRhbEFubm90YXRpb25bXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBzY29wZTogTW9uaXRvcmluZ1Njb3BlLFxuICAgIHByb3BzOiBEeW5hbW9UYWJsZUdsb2JhbFNlY29uZGFyeUluZGV4TW9uaXRvcmluZ1Byb3BzLFxuICApIHtcbiAgICBzdXBlcihzY29wZSwgcHJvcHMpO1xuXG4gICAgY29uc3QgbmFtaW5nU3RyYXRlZ3kgPSBuZXcgTW9uaXRvcmluZ05hbWluZ1N0cmF0ZWd5KHtcbiAgICAgIC4uLnByb3BzLFxuICAgICAgZmFsbGJhY2tDb25zdHJ1Y3ROYW1lOiBwcm9wcy5nbG9iYWxTZWNvbmRhcnlJbmRleE5hbWUsXG4gICAgfSk7XG5cbiAgICB0aGlzLnRpdGxlID0gbmFtaW5nU3RyYXRlZ3kucmVzb2x2ZUh1bWFuUmVhZGFibGVOYW1lKCk7XG4gICAgdGhpcy50YWJsZVVybCA9IHNjb3BlXG4gICAgICAuY3JlYXRlQXdzQ29uc29sZVVybEZhY3RvcnkoKVxuICAgICAgLmdldER5bmFtb1RhYmxlVXJsKHByb3BzLnRhYmxlLnRhYmxlTmFtZSk7XG5cbiAgICBjb25zdCBtZXRyaWNGYWN0b3J5ID0gbmV3IER5bmFtb1RhYmxlR2xvYmFsU2Vjb25kYXJ5SW5kZXhNZXRyaWNGYWN0b3J5KFxuICAgICAgc2NvcGUuY3JlYXRlTWV0cmljRmFjdG9yeSgpLFxuICAgICAgcHJvcHMsXG4gICAgKTtcbiAgICB0aGlzLnByb3Zpc2lvbmVkUmVhZFVuaXRzTWV0cmljID1cbiAgICAgIG1ldHJpY0ZhY3RvcnkubWV0cmljUHJvdmlzaW9uZWRSZWFkQ2FwYWNpdHlVbml0cygpO1xuICAgIHRoaXMucHJvdmlzaW9uZWRXcml0ZVVuaXRzTWV0cmljID1cbiAgICAgIG1ldHJpY0ZhY3RvcnkubWV0cmljUHJvdmlzaW9uZWRXcml0ZUNhcGFjaXR5VW5pdHMoKTtcbiAgICB0aGlzLmNvbnN1bWVkUmVhZFVuaXRzTWV0cmljID1cbiAgICAgIG1ldHJpY0ZhY3RvcnkubWV0cmljQ29uc3VtZWRSZWFkQ2FwYWNpdHlVbml0cygpO1xuICAgIHRoaXMuY29uc3VtZWRXcml0ZVVuaXRzTWV0cmljID1cbiAgICAgIG1ldHJpY0ZhY3RvcnkubWV0cmljQ29uc3VtZWRXcml0ZUNhcGFjaXR5VW5pdHMoKTtcbiAgICB0aGlzLmluZGV4Q29uc3VtZWRXcml0ZVVuaXRzTWV0cmljID1cbiAgICAgIG1ldHJpY0ZhY3RvcnkubWV0cmljSW5kZXhDb25zdW1lZFdyaXRlVW5pdHNNZXRyaWMoKTtcbiAgICB0aGlzLnJlYWRUaHJvdHRsZUNvdW50TWV0cmljID1cbiAgICAgIG1ldHJpY0ZhY3RvcnkubWV0cmljVGhyb3R0bGVkUmVhZFJlcXVlc3RDb3VudCgpO1xuICAgIHRoaXMud3JpdGVUaHJvdHRsZUNvdW50TWV0cmljID1cbiAgICAgIG1ldHJpY0ZhY3RvcnkubWV0cmljVGhyb3R0bGVkV3JpdGVSZXF1ZXN0Q291bnQoKTtcbiAgICB0aGlzLmluZGV4VGhyb3R0bGVDb3VudE1ldHJpYyA9XG4gICAgICBtZXRyaWNGYWN0b3J5Lm1ldHJpY1Rocm90dGxlZEluZGV4UmVxdWVzdENvdW50KCk7XG5cbiAgICBjb25zdCBhbGFybUZhY3RvcnkgPSB0aGlzLmNyZWF0ZUFsYXJtRmFjdG9yeShcbiAgICAgIG5hbWluZ1N0cmF0ZWd5LnJlc29sdmVBbGFybUZyaWVuZGx5TmFtZSgpLFxuICAgICk7XG4gICAgdGhpcy5nc2lBbGFybUZhY3RvcnkgPSBuZXcgRHluYW1vQWxhcm1GYWN0b3J5KGFsYXJtRmFjdG9yeSk7XG4gICAgdGhpcy50aHJvdHRsZWRFdmVudHNBbm5vdGF0aW9ucyA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBkaXNhbWJpZ3VhdG9yIGluIHByb3BzLmFkZFJlYWRUaHJvdHRsZWRFdmVudHNDb3VudEFsYXJtKSB7XG4gICAgICBjb25zdCBhbGFybVByb3BzID0gcHJvcHMuYWRkUmVhZFRocm90dGxlZEV2ZW50c0NvdW50QWxhcm1bZGlzYW1iaWd1YXRvcl07XG4gICAgICBjb25zdCBjcmVhdGVkQWxhcm0gPSB0aGlzLmdzaUFsYXJtRmFjdG9yeS5hZGRUaHJvdHRsZWRFdmVudHNBbGFybShcbiAgICAgICAgdGhpcy5yZWFkVGhyb3R0bGVDb3VudE1ldHJpYyxcbiAgICAgICAgQ2FwYWNpdHlUeXBlLlJFQUQsXG4gICAgICAgIGFsYXJtUHJvcHMsXG4gICAgICAgIGRpc2FtYmlndWF0b3IsXG4gICAgICApO1xuICAgICAgdGhpcy50aHJvdHRsZWRFdmVudHNBbm5vdGF0aW9ucy5wdXNoKGNyZWF0ZWRBbGFybS5hbm5vdGF0aW9uKTtcbiAgICAgIHRoaXMuYWRkQWxhcm0oY3JlYXRlZEFsYXJtKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBkaXNhbWJpZ3VhdG9yIGluIHByb3BzLmFkZFdyaXRlVGhyb3R0bGVkRXZlbnRzQ291bnRBbGFybSkge1xuICAgICAgY29uc3QgYWxhcm1Qcm9wcyA9IHByb3BzLmFkZFdyaXRlVGhyb3R0bGVkRXZlbnRzQ291bnRBbGFybVtkaXNhbWJpZ3VhdG9yXTtcbiAgICAgIGNvbnN0IGNyZWF0ZWRBbGFybSA9IHRoaXMuZ3NpQWxhcm1GYWN0b3J5LmFkZFRocm90dGxlZEV2ZW50c0FsYXJtKFxuICAgICAgICB0aGlzLndyaXRlVGhyb3R0bGVDb3VudE1ldHJpYyxcbiAgICAgICAgQ2FwYWNpdHlUeXBlLldSSVRFLFxuICAgICAgICBhbGFybVByb3BzLFxuICAgICAgICBkaXNhbWJpZ3VhdG9yLFxuICAgICAgKTtcbiAgICAgIHRoaXMudGhyb3R0bGVkRXZlbnRzQW5ub3RhdGlvbnMucHVzaChjcmVhdGVkQWxhcm0uYW5ub3RhdGlvbik7XG4gICAgICB0aGlzLmFkZEFsYXJtKGNyZWF0ZWRBbGFybSk7XG4gICAgfVxuICAgIHByb3BzLnVzZUNyZWF0ZWRBbGFybXM/LmNvbnN1bWUodGhpcy5jcmVhdGVkQWxhcm1zKCkpO1xuICB9XG5cbiAgc3VtbWFyeVdpZGdldHMoKTogSVdpZGdldFtdIHtcbiAgICByZXR1cm4gW1xuICAgICAgdGhpcy5jcmVhdGVUaXRsZVdpZGdldCgpLFxuICAgICAgdGhpcy5jcmVhdGVSZWFkQ2FwYWNpdHlXaWRnZXQoVGhpcmRXaWR0aCwgRGVmYXVsdFN1bW1hcnlXaWRnZXRIZWlnaHQpLFxuICAgICAgdGhpcy5jcmVhdGVXcml0ZUNhcGFjaXR5V2lkZ2V0KFRoaXJkV2lkdGgsIERlZmF1bHRTdW1tYXJ5V2lkZ2V0SGVpZ2h0KSxcbiAgICAgIHRoaXMuY3JlYXRlVGhyb3R0bGVzV2lkZ2V0KFRoaXJkV2lkdGgsIERlZmF1bHRTdW1tYXJ5V2lkZ2V0SGVpZ2h0KSxcbiAgICBdO1xuICB9XG5cbiAgd2lkZ2V0cygpOiBJV2lkZ2V0W10ge1xuICAgIHJldHVybiBbXG4gICAgICB0aGlzLmNyZWF0ZVRpdGxlV2lkZ2V0KCksXG4gICAgICB0aGlzLmNyZWF0ZVJlYWRDYXBhY2l0eVdpZGdldChUaGlyZFdpZHRoLCBEZWZhdWx0R3JhcGhXaWRnZXRIZWlnaHQpLFxuICAgICAgdGhpcy5jcmVhdGVXcml0ZUNhcGFjaXR5V2lkZ2V0KFRoaXJkV2lkdGgsIERlZmF1bHRHcmFwaFdpZGdldEhlaWdodCksXG4gICAgICB0aGlzLmNyZWF0ZVRocm90dGxlc1dpZGdldChUaGlyZFdpZHRoLCBEZWZhdWx0R3JhcGhXaWRnZXRIZWlnaHQpLFxuICAgIF07XG4gIH1cblxuICBwcm90ZWN0ZWQgY3JlYXRlVGl0bGVXaWRnZXQoKSB7XG4gICAgcmV0dXJuIG5ldyBNb25pdG9yaW5nSGVhZGVyV2lkZ2V0KHtcbiAgICAgIGZhbWlseTogXCJEeW5hbW8gVGFibGUgR2xvYmFsIFNlY29uZGFyeSBJbmRleFwiLFxuICAgICAgdGl0bGU6IHRoaXMudGl0bGUsXG4gICAgICBnb1RvTGlua1VybDogdGhpcy50YWJsZVVybCxcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjcmVhdGVSZWFkQ2FwYWNpdHlXaWRnZXQod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpIHtcbiAgICByZXR1cm4gbmV3IEdyYXBoV2lkZ2V0KHtcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0LFxuICAgICAgdGl0bGU6IFwiUmVhZCBDYXBhY2l0eVwiLFxuICAgICAgbGVmdDogW3RoaXMuY29uc3VtZWRSZWFkVW5pdHNNZXRyaWMsIHRoaXMucHJvdmlzaW9uZWRSZWFkVW5pdHNNZXRyaWNdLFxuICAgICAgbGVmdFlBeGlzOiBDb3VudEF4aXNGcm9tWmVybyxcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjcmVhdGVXcml0ZUNhcGFjaXR5V2lkZ2V0KHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIG5ldyBHcmFwaFdpZGdldCh7XG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodCxcbiAgICAgIHRpdGxlOiBcIldyaXRlIENhcGFjaXR5XCIsXG4gICAgICBsZWZ0OiBbXG4gICAgICAgIHRoaXMuY29uc3VtZWRXcml0ZVVuaXRzTWV0cmljLFxuICAgICAgICB0aGlzLnByb3Zpc2lvbmVkV3JpdGVVbml0c01ldHJpYyxcbiAgICAgICAgdGhpcy5pbmRleENvbnN1bWVkV3JpdGVVbml0c01ldHJpYyxcbiAgICAgIF0sXG4gICAgICBsZWZ0WUF4aXM6IENvdW50QXhpc0Zyb21aZXJvLFxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNyZWF0ZVRocm90dGxlc1dpZGdldCh3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcikge1xuICAgIHJldHVybiBuZXcgR3JhcGhXaWRnZXQoe1xuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHQsXG4gICAgICB0aXRsZTogXCJUaHJvdHRsZXNcIixcbiAgICAgIGxlZnQ6IFtcbiAgICAgICAgdGhpcy5yZWFkVGhyb3R0bGVDb3VudE1ldHJpYyxcbiAgICAgICAgdGhpcy53cml0ZVRocm90dGxlQ291bnRNZXRyaWMsXG4gICAgICAgIHRoaXMuaW5kZXhUaHJvdHRsZUNvdW50TWV0cmljLFxuICAgICAgXSxcbiAgICAgIGxlZnRZQXhpczogQ291bnRBeGlzRnJvbVplcm8sXG4gICAgICBsZWZ0QW5ub3RhdGlvbnM6IHRoaXMudGhyb3R0bGVkRXZlbnRzQW5ub3RhdGlvbnMsXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==