cdk-monitoring-constructs
Version:
[](https://gitpod.io/#https://github.com/cdklabs/cdk-monitoring-constructs) [](https://badge
211 lines • 36.1 kB
JavaScript
"use strict";
var _a;
Object.defineProperty(exports, "__esModule", { value: true });
exports.KinesisDataStreamMonitoring = void 0;
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
const aws_cloudwatch_1 = require("aws-cdk-lib/aws-cloudwatch");
const common_1 = require("../../common");
const dashboard_1 = require("../../dashboard");
const KinesisDataStreamMetricFactory_1 = require("./KinesisDataStreamMetricFactory");
class KinesisDataStreamMonitoring extends common_1.Monitoring {
constructor(scope, props) {
super(scope, props);
const namingStrategy = new dashboard_1.MonitoringNamingStrategy({
...props,
fallbackConstructName: props.streamName,
});
this.title = namingStrategy.resolveHumanReadableName();
this.streamUrl = scope
.createAwsConsoleUrlFactory()
.getKinesisDataStreamUrl(props.streamName);
const alarmFactory = this.createAlarmFactory(namingStrategy.resolveAlarmFriendlyName());
this.kinesisAlarmFactory = new common_1.KinesisAlarmFactory(alarmFactory);
this.provisionedCapacityAnnotations = [];
this.ageAnnotations = [];
this.recordCountAnnotations = [];
const metricFactory = new KinesisDataStreamMetricFactory_1.KinesisDataStreamMetricFactory(scope.createMetricFactory(), props);
this.metricGetRecordSumBytes = metricFactory.metricGetRecordsSumBytes();
this.metricGetRecordsIteratorAge =
metricFactory.metricGetRecordsIteratorAgeMaxMs();
this.metricGetRecordsLatencyAverage =
metricFactory.metricGetRecordsLatencyAverageMs();
this.metricGetRecordsSumCount = metricFactory.metricGetRecordsSumCount();
this.metricGetRecordsSuccessCount =
metricFactory.metricGetRecordsSuccessCount();
this.incomingDataSumBytesMetric =
metricFactory.metricIncomingDataSumBytes();
this.incomingDataSumCountMetric =
metricFactory.metricIncomingDataSumCount();
this.putRecordSumBytesMetric = metricFactory.metricPutRecordSumBytes();
this.putRecordLatencyAverageMetric =
metricFactory.metricPutRecordLatencyAverageMs();
this.putRecordSuccessCountMetric =
metricFactory.metricPutRecordSuccessCount();
this.putRecordsSumBytesMetric = metricFactory.metricPutRecordsSumBytes();
this.putRecordsLatencyAverageMetric =
metricFactory.metricPutRecordsLatencyAverageMs();
this.putRecordsSuccessCountMetric =
metricFactory.metricPutRecordsSuccessCount();
this.putRecordsTotalRecordsCountMetric =
metricFactory.metricPutRecordsTotalRecordsCount();
this.putRecordsSuccessfulRecordsCountMetric =
metricFactory.metricPutRecordsSuccessfulRecordsCount();
this.putRecordsThrottledRecordsCountMetric =
metricFactory.metricPutRecordsThrottledRecordsCount();
this.putRecordsFailedRecordsCountMetric =
metricFactory.metricPutRecordsFailedRecordsCount();
this.readProvisionedThroughputExceededMetric =
metricFactory.metricReadProvisionedThroughputExceededPercent();
this.writeProvisionedThroughputExceededMetric =
metricFactory.metricWriteProvisionedThroughputExceededPercent();
for (const disambiguator in props.addIteratorMaxAgeAlarm) {
const alarmProps = props.addIteratorMaxAgeAlarm[disambiguator];
const createdAlarm = this.kinesisAlarmFactory.addIteratorMaxAgeAlarm(this.metricGetRecordsIteratorAge, alarmProps, disambiguator);
this.ageAnnotations.push(createdAlarm.annotation);
this.addAlarm(createdAlarm);
}
for (const disambiguator in props.addPutRecordsThrottledAlarm) {
const alarmProps = props.addPutRecordsThrottledAlarm[disambiguator];
const createdAlarm = this.kinesisAlarmFactory.addPutRecordsThrottledAlarm(this.putRecordsThrottledRecordsCountMetric, alarmProps, disambiguator);
this.recordCountAnnotations.push(createdAlarm.annotation);
this.addAlarm(createdAlarm);
}
for (const disambiguator in props.addPutRecordsFailedAlarm) {
const alarmProps = props.addPutRecordsFailedAlarm[disambiguator];
const createdAlarm = this.kinesisAlarmFactory.addPutRecordsFailedAlarm(this.putRecordsFailedRecordsCountMetric, alarmProps, disambiguator);
this.recordCountAnnotations.push(createdAlarm.annotation);
this.addAlarm(createdAlarm);
}
for (const disambiguator in props.addReadProvisionedThroughputExceededAlarm) {
const alarmProps = props.addReadProvisionedThroughputExceededAlarm[disambiguator];
const createdAlarm = this.kinesisAlarmFactory.addProvisionedReadThroughputExceededAlarm(this.readProvisionedThroughputExceededMetric, alarmProps, disambiguator);
this.provisionedCapacityAnnotations.push(createdAlarm.annotation);
this.addAlarm(createdAlarm);
}
for (const disambiguator in props.addWriteProvisionedThroughputExceededAlarm) {
const alarmProps = props.addWriteProvisionedThroughputExceededAlarm[disambiguator];
const createdAlarm = this.kinesisAlarmFactory.addProvisionedWriteThroughputExceededAlarm(this.writeProvisionedThroughputExceededMetric, alarmProps, disambiguator);
this.provisionedCapacityAnnotations.push(createdAlarm.annotation);
this.addAlarm(createdAlarm);
}
props.useCreatedAlarms?.consume(this.createdAlarms());
}
summaryWidgets() {
return [
this.createTitleWidget(),
new aws_cloudwatch_1.Row(this.createIncomingDataWidget(common_1.QuarterWidth, common_1.DefaultSummaryWidgetHeight), this.createIteratorAgeWidget(common_1.QuarterWidth, common_1.DefaultSummaryWidgetHeight), this.createLatencyWidget(common_1.QuarterWidth, common_1.DefaultSummaryWidgetHeight), this.createCapacityWidget(common_1.QuarterWidth, common_1.DefaultSummaryWidgetHeight)),
];
}
widgets() {
return [
this.createTitleWidget(),
new aws_cloudwatch_1.Row(this.createIncomingDataWidget(common_1.QuarterWidth, common_1.DefaultGraphWidgetHeight), this.createIteratorAgeWidget(common_1.QuarterWidth, common_1.DefaultGraphWidgetHeight), this.createLatencyWidget(common_1.QuarterWidth, common_1.DefaultGraphWidgetHeight), this.createCapacityWidget(common_1.QuarterWidth, common_1.DefaultGraphWidgetHeight)),
this.createFirstAdditionalRow(),
this.createSecondAdditionalRow(),
];
}
createFirstAdditionalRow() {
return new aws_cloudwatch_1.Row(this.createRecordSizeWidget(common_1.HalfWidth, common_1.DefaultGraphWidgetHeight), this.createOperationWidget(common_1.HalfWidth, common_1.DefaultGraphWidgetHeight));
}
createSecondAdditionalRow() {
return new aws_cloudwatch_1.Row(this.createRecordNumberWidget(common_1.FullWidth, common_1.DefaultGraphWidgetHeight));
}
createTitleWidget() {
return new dashboard_1.MonitoringHeaderWidget({
family: "Kinesis Data Stream",
title: this.title,
goToLinkUrl: this.streamUrl,
});
}
createIncomingDataWidget(width, height) {
return new aws_cloudwatch_1.GraphWidget({
width,
height,
title: "Incoming",
left: [this.incomingDataSumCountMetric],
leftYAxis: common_1.CountAxisFromZero,
});
}
createIteratorAgeWidget(width, height) {
return new aws_cloudwatch_1.GraphWidget({
width,
height,
title: "Iterator",
left: [this.metricGetRecordsIteratorAge],
leftAnnotations: this.ageAnnotations,
leftYAxis: common_1.TimeAxisMillisFromZero,
});
}
createLatencyWidget(width, height) {
return new aws_cloudwatch_1.GraphWidget({
width,
height,
title: "Latency (Average)",
left: [
this.metricGetRecordsLatencyAverage,
this.putRecordLatencyAverageMetric,
this.putRecordsLatencyAverageMetric,
],
leftYAxis: common_1.TimeAxisMillisFromZero,
});
}
createCapacityWidget(width, height) {
return new aws_cloudwatch_1.GraphWidget({
width,
height,
title: "Provisioned Capacity Exceeded",
left: [
this.readProvisionedThroughputExceededMetric,
this.writeProvisionedThroughputExceededMetric,
],
leftYAxis: common_1.TimeAxisMillisFromZero,
leftAnnotations: this.provisionedCapacityAnnotations,
});
}
createRecordSizeWidget(width, height) {
return new aws_cloudwatch_1.GraphWidget({
width,
height,
title: "Bytes",
left: [
this.metricGetRecordSumBytes,
this.putRecordSumBytesMetric,
this.putRecordsSumBytesMetric,
],
leftYAxis: common_1.SizeAxisBytesFromZero,
});
}
createOperationWidget(width, height) {
return new aws_cloudwatch_1.GraphWidget({
width,
height,
title: "Successful Operations",
left: [
this.metricGetRecordsSuccessCount,
this.putRecordSuccessCountMetric,
this.putRecordsSuccessCountMetric,
],
leftYAxis: common_1.CountAxisFromZero,
});
}
createRecordNumberWidget(width, height) {
return new aws_cloudwatch_1.GraphWidget({
width,
height,
title: "Records",
left: [
this.metricGetRecordsSumCount,
this.putRecordsTotalRecordsCountMetric,
this.putRecordsSuccessfulRecordsCountMetric,
this.putRecordsFailedRecordsCountMetric,
this.putRecordsThrottledRecordsCountMetric,
],
leftAnnotations: this.recordCountAnnotations,
leftYAxis: common_1.CountAxisFromZero,
});
}
}
exports.KinesisDataStreamMonitoring = KinesisDataStreamMonitoring;
_a = JSII_RTTI_SYMBOL_1;
KinesisDataStreamMonitoring[_a] = { fqn: "cdk-monitoring-constructs.KinesisDataStreamMonitoring", version: "1.21.0" };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiS2luZXNpc0RhdGFTdHJlYW1Nb25pdG9yaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiS2luZXNpc0RhdGFTdHJlYW1Nb25pdG9yaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsK0RBS29DO0FBRXBDLHlDQWlCc0I7QUFDdEIsK0NBR3lCO0FBQ3pCLHFGQUcwQztBQXlCMUMsTUFBYSwyQkFBNEIsU0FBUSxtQkFBVTtJQTZCekQsWUFBWSxLQUFzQixFQUFFLEtBQXVDO1FBQ3pFLEtBQUssQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFcEIsTUFBTSxjQUFjLEdBQUcsSUFBSSxvQ0FBd0IsQ0FBQztZQUNsRCxHQUFHLEtBQUs7WUFDUixxQkFBcUIsRUFBRSxLQUFLLENBQUMsVUFBVTtTQUN4QyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsS0FBSyxHQUFHLGNBQWMsQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1FBQ3ZELElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSzthQUNuQiwwQkFBMEIsRUFBRTthQUM1Qix1QkFBdUIsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFN0MsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUMxQyxjQUFjLENBQUMsd0JBQXdCLEVBQUUsQ0FDMUMsQ0FBQztRQUNGLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLDRCQUFtQixDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ2pFLElBQUksQ0FBQyw4QkFBOEIsR0FBRyxFQUFFLENBQUM7UUFDekMsSUFBSSxDQUFDLGNBQWMsR0FBRyxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLHNCQUFzQixHQUFHLEVBQUUsQ0FBQztRQUVqQyxNQUFNLGFBQWEsR0FBRyxJQUFJLCtEQUE4QixDQUN0RCxLQUFLLENBQUMsbUJBQW1CLEVBQUUsRUFDM0IsS0FBSyxDQUNOLENBQUM7UUFDRixJQUFJLENBQUMsdUJBQXVCLEdBQUcsYUFB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LElBQUksQ0FBQyxzQkFBc0I7WUFDNUMsU0FBUyxFQUFFLDBCQUFpQjtTQUM3QixDQUFDLENBQUM7SUFDTCxDQUFDOztBQTdSSCxrRUE4UkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBHcmFwaFdpZGdldCxcbiAgSG9yaXpvbnRhbEFubm90YXRpb24sXG4gIElXaWRnZXQsXG4gIFJvdyxcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1jbG91ZHdhdGNoXCI7XG5cbmltcG9ydCB7XG4gIEJhc2VNb25pdG9yaW5nUHJvcHMsXG4gIENvdW50QXhpc0Zyb21aZXJvLFxuICBEZWZhdWx0R3JhcGhXaWRnZXRIZWlnaHQsXG4gIERlZmF1bHRTdW1tYXJ5V2lkZ2V0SGVpZ2h0LFxuICBGdWxsV2lkdGgsXG4gIEhhbGZXaWR0aCxcbiAgS2luZXNpc0FsYXJtRmFjdG9yeSxcbiAgTWF4SXRlcmF0b3JBZ2VUaHJlc2hvbGQsXG4gIE1ldHJpY1dpdGhBbGFybVN1cHBvcnQsXG4gIE1vbml0b3JpbmcsXG4gIE1vbml0b3JpbmdTY29wZSxcbiAgUXVhcnRlcldpZHRoLFxuICBSZWNvcmRzRmFpbGVkVGhyZXNob2xkLFxuICBSZWNvcmRzVGhyb3R0bGVkVGhyZXNob2xkLFxuICBTaXplQXhpc0J5dGVzRnJvbVplcm8sXG4gIFRpbWVBeGlzTWlsbGlzRnJvbVplcm8sXG59IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7XG4gIE1vbml0b3JpbmdIZWFkZXJXaWRnZXQsXG4gIE1vbml0b3JpbmdOYW1pbmdTdHJhdGVneSxcbn0gZnJvbSBcIi4uLy4uL2Rhc2hib2FyZFwiO1xuaW1wb3J0IHtcbiAgS2luZXNpc0RhdGFTdHJlYW1NZXRyaWNGYWN0b3J5LFxuICBLaW5lc2lzRGF0YVN0cmVhbU1ldHJpY0ZhY3RvcnlQcm9wcyxcbn0gZnJvbSBcIi4vS2luZXNpc0RhdGFTdHJlYW1NZXRyaWNGYWN0b3J5XCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgS2luZXNpc0RhdGFTdHJlYW1Nb25pdG9yaW5nT3B0aW9uc1xuICBleHRlbmRzIEJhc2VNb25pdG9yaW5nUHJvcHMge1xuICByZWFkb25seSBhZGRJdGVyYXRvck1heEFnZUFsYXJtPzogUmVjb3JkPHN0cmluZywgTWF4SXRlcmF0b3JBZ2VUaHJlc2hvbGQ+O1xuICByZWFkb25seSBhZGRQdXRSZWNvcmRzVGhyb3R0bGVkQWxhcm0/OiBSZWNvcmQ8XG4gICAgc3RyaW5nLFxuICAgIFJlY29yZHNUaHJvdHRsZWRUaHJlc2hvbGRcbiAgPjtcbiAgcmVhZG9ubHkgYWRkUHV0UmVjb3Jkc0ZhaWxlZEFsYXJtPzogUmVjb3JkPHN0cmluZywgUmVjb3Jkc0ZhaWxlZFRocmVzaG9sZD47XG4gIHJlYWRvbmx5IGFkZFRocm90dGxlZFJlY29yZHNBbGFybT86IFJlY29yZDxzdHJpbmcsIFJlY29yZHNUaHJvdHRsZWRUaHJlc2hvbGQ+O1xuICByZWFkb25seSBhZGRSZWFkUHJvdmlzaW9uZWRUaHJvdWdocHV0RXhjZWVkZWRBbGFybT86IFJlY29yZDxcbiAgICBzdHJpbmcsXG4gICAgUmVjb3Jkc1Rocm90dGxlZFRocmVzaG9sZFxuICA+O1xuICByZWFkb25seSBhZGRXcml0ZVByb3Zpc2lvbmVkVGhyb3VnaHB1dEV4Y2VlZGVkQWxhcm0/OiBSZWNvcmQ8XG4gICAgc3RyaW5nLFxuICAgIFJlY29yZHNUaHJvdHRsZWRUaHJlc2hvbGRcbiAgPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBLaW5lc2lzRGF0YVN0cmVhbU1vbml0b3JpbmdQcm9wc1xuICBleHRlbmRzIEtpbmVzaXNEYXRhU3RyZWFtTWV0cmljRmFjdG9yeVByb3BzLFxuICAgIEtpbmVzaXNEYXRhU3RyZWFtTW9uaXRvcmluZ09wdGlvbnMge31cblxuZXhwb3J0IGNsYXNzIEtpbmVzaXNEYXRhU3RyZWFtTW9uaXRvcmluZyBleHRlbmRzIE1vbml0b3Jpbmcge1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgdGl0bGU6IHN0cmluZztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHN0cmVhbVVybD86IHN0cmluZztcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkga2luZXNpc0FsYXJtRmFjdG9yeTogS2luZXNpc0FsYXJtRmFjdG9yeTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGFnZUFubm90YXRpb25zOiBIb3Jpem9udGFsQW5ub3RhdGlvbltdO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcHJvdmlzaW9uZWRDYXBhY2l0eUFubm90YXRpb25zOiBIb3Jpem9udGFsQW5ub3RhdGlvbltdO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcmVjb3JkQ291bnRBbm5vdGF0aW9uczogSG9yaXpvbnRhbEFubm90YXRpb25bXTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgbWV0cmljR2V0UmVjb3JkU3VtQnl0ZXM6IE1ldHJpY1dpdGhBbGFybVN1cHBvcnQ7XG4gIHByb3RlY3RlZCByZWFkb25seSBtZXRyaWNHZXRSZWNvcmRzSXRlcmF0b3JBZ2U6IE1ldHJpY1dpdGhBbGFybVN1cHBvcnQ7XG4gIHByb3RlY3RlZCByZWFkb25seSBtZXRyaWNHZXRSZWNvcmRzTGF0ZW5jeUF2ZXJhZ2U6IE1ldHJpY1dpdGhBbGFybVN1cHBvcnQ7XG4gIHByb3RlY3RlZCByZWFkb25seSBtZXRyaWNHZXRSZWNvcmRzU3VtQ291bnQ6IE1ldHJpY1dpdGhBbGFybVN1cHBvcnQ7XG4gIHByb3RlY3RlZCByZWFkb25seSBtZXRyaWNHZXRSZWNvcmRzU3VjY2Vzc0NvdW50OiBNZXRyaWNXaXRoQWxhcm1TdXBwb3J0O1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaW5jb21pbmdEYXRhU3VtQnl0ZXNNZXRyaWM6IE1ldHJpY1dpdGhBbGFybVN1cHBvcnQ7XG4gIHByb3RlY3RlZCByZWFkb25seSBpbmNvbWluZ0RhdGFTdW1Db3VudE1ldHJpYzogTWV0cmljV2l0aEFsYXJtU3VwcG9ydDtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHB1dFJlY29yZFN1bUJ5dGVzTWV0cmljOiBNZXRyaWNXaXRoQWxhcm1TdXBwb3J0O1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcHV0UmVjb3JkTGF0ZW5jeUF2ZXJhZ2VNZXRyaWM6IE1ldHJpY1dpdGhBbGFybVN1cHBvcnQ7XG4gIHByb3RlY3RlZCByZWFkb25seSBwdXRSZWNvcmRTdWNjZXNzQ291bnRNZXRyaWM6IE1ldHJpY1dpdGhBbGFybVN1cHBvcnQ7XG4gIHByb3RlY3RlZCByZWFkb25seSBwdXRSZWNvcmRzU3VtQnl0ZXNNZXRyaWM6IE1ldHJpY1dpdGhBbGFybVN1cHBvcnQ7XG4gIHByb3RlY3RlZCByZWFkb25seSBwdXRSZWNvcmRzTGF0ZW5jeUF2ZXJhZ2VNZXRyaWM6IE1ldHJpY1dpdGhBbGFybVN1cHBvcnQ7XG4gIHByb3RlY3RlZCByZWFkb25seSBwdXRSZWNvcmRzU3VjY2Vzc0NvdW50TWV0cmljOiBNZXRyaWNXaXRoQWxhcm1TdXBwb3J0O1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcHV0UmVjb3Jkc1RvdGFsUmVjb3Jkc0NvdW50TWV0cmljOiBNZXRyaWNXaXRoQWxhcm1TdXBwb3J0O1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcHV0UmVjb3Jkc1N1Y2Nlc3NmdWxSZWNvcmRzQ291bnRNZXRyaWM6IE1ldHJpY1dpdGhBbGFybVN1cHBvcnQ7XG4gIHByb3RlY3RlZCByZWFkb25seSBwdXRSZWNvcmRzRmFpbGVkUmVjb3Jkc0NvdW50TWV0cmljOiBNZXRyaWNXaXRoQWxhcm1TdXBwb3J0O1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcHV0UmVjb3Jkc1Rocm90dGxlZFJlY29yZHNDb3VudE1ldHJpYzogTWV0cmljV2l0aEFsYXJtU3VwcG9ydDtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHJlYWRQcm92aXNpb25lZFRocm91Z2hwdXRFeGNlZWRlZE1ldHJpYzogTWV0cmljV2l0aEFsYXJtU3VwcG9ydDtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHdyaXRlUHJvdmlzaW9uZWRUaHJvdWdocHV0RXhjZWVkZWRNZXRyaWM6IE1ldHJpY1dpdGhBbGFybVN1cHBvcnQ7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IE1vbml0b3JpbmdTY29wZSwgcHJvcHM6IEtpbmVzaXNEYXRhU3RyZWFtTW9uaXRvcmluZ1Byb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIHByb3BzKTtcblxuICAgIGNvbnN0IG5hbWluZ1N0cmF0ZWd5ID0gbmV3IE1vbml0b3JpbmdOYW1pbmdTdHJhdGVneSh7XG4gICAgICAuLi5wcm9wcyxcbiAgICAgIGZhbGxiYWNrQ29uc3RydWN0TmFtZTogcHJvcHMuc3RyZWFtTmFtZSxcbiAgICB9KTtcbiAgICB0aGlzLnRpdGxlID0gbmFtaW5nU3RyYXRlZ3kucmVzb2x2ZUh1bWFuUmVhZGFibGVOYW1lKCk7XG4gICAgdGhpcy5zdHJlYW1VcmwgPSBzY29wZVxuICAgICAgLmNyZWF0ZUF3c0NvbnNvbGVVcmxGYWN0b3J5KClcbiAgICAgIC5nZXRLaW5lc2lzRGF0YVN0cmVhbVVybChwcm9wcy5zdHJlYW1OYW1lKTtcblxuICAgIGNvbnN0IGFsYXJtRmFjdG9yeSA9IHRoaXMuY3JlYXRlQWxhcm1GYWN0b3J5KFxuICAgICAgbmFtaW5nU3RyYXRlZ3kucmVzb2x2ZUFsYXJtRnJpZW5kbHlOYW1lKClcbiAgICApO1xuICAgIHRoaXMua2luZXNpc0FsYXJtRmFjdG9yeSA9IG5ldyBLaW5lc2lzQWxhcm1GYWN0b3J5KGFsYXJtRmFjdG9yeSk7XG4gICAgdGhpcy5wcm92aXNpb25lZENhcGFjaXR5QW5ub3RhdGlvbnMgPSBbXTtcbiAgICB0aGlzLmFnZUFubm90YXRpb25zID0gW107XG4gICAgdGhpcy5yZWNvcmRDb3VudEFubm90YXRpb25zID0gW107XG5cbiAgICBjb25zdCBtZXRyaWNGYWN0b3J5ID0gbmV3IEtpbmVzaXNEYXRhU3RyZWFtTWV0cmljRmFjdG9yeShcbiAgICAgIHNjb3BlLmNyZWF0ZU1ldHJpY0ZhY3RvcnkoKSxcbiAgICAgIHByb3BzXG4gICAgKTtcbiAgICB0aGlzLm1ldHJpY0dldFJlY29yZFN1bUJ5dGVzID0gbWV0cmljRmFjdG9yeS5tZXRyaWNHZXRSZWNvcmRzU3VtQnl0ZXMoKTtcbiAgICB0aGlzLm1ldHJpY0dldFJlY29yZHNJdGVyYXRvckFnZSA9XG4gICAgICBtZXRyaWNGYWN0b3J5Lm1ldHJpY0dldFJlY29yZHNJdGVyYXRvckFnZU1heE1zKCk7XG4gICAgdGhpcy5tZXRyaWNHZXRSZWNvcmRzTGF0ZW5jeUF2ZXJhZ2UgPVxuICAgICAgbWV0cmljRmFjdG9yeS5tZXRyaWNHZXRSZWNvcmRzTGF0ZW5jeUF2ZXJhZ2VNcygpO1xuICAgIHRoaXMubWV0cmljR2V0UmVjb3Jkc1N1bUNvdW50ID0gbWV0cmljRmFjdG9yeS5tZXRyaWNHZXRSZWNvcmRzU3VtQ291bnQoKTtcbiAgICB0aGlzLm1ldHJpY0dldFJlY29yZHNTdWNjZXNzQ291bnQgPVxuICAgICAgbWV0cmljRmFjdG9yeS5tZXRyaWNHZXRSZWNvcmRzU3VjY2Vzc0NvdW50KCk7XG4gICAgdGhpcy5pbmNvbWluZ0RhdGFTdW1CeXRlc01ldHJpYyA9XG4gICAgICBtZXRyaWNGYWN0b3J5Lm1ldHJpY0luY29taW5nRGF0YVN1bUJ5dGVzKCk7XG4gICAgdGhpcy5pbmNvbWluZ0RhdGFTdW1Db3VudE1ldHJpYyA9XG4gICAgICBtZXRyaWNGYWN0b3J5Lm1ldHJpY0luY29taW5nRGF0YVN1bUNvdW50KCk7XG4gICAgdGhpcy5wdXRSZWNvcmRTdW1CeXRlc01ldHJpYyA9IG1ldHJpY0ZhY3RvcnkubWV0cmljUHV0UmVjb3JkU3VtQnl0ZXMoKTtcbiAgICB0aGlzLnB1dFJlY29yZExhdGVuY3lBdmVyYWdlTWV0cmljID1cbiAgICAgIG1ldHJpY0ZhY3RvcnkubWV0cmljUHV0UmVjb3JkTGF0ZW5jeUF2ZXJhZ2VNcygpO1xuICAgIHRoaXMucHV0UmVjb3JkU3VjY2Vzc0NvdW50TWV0cmljID1cbiAgICAgIG1ldHJpY0ZhY3RvcnkubWV0cmljUHV0UmVjb3JkU3VjY2Vzc0NvdW50KCk7XG4gICAgdGhpcy5wdXRSZWNvcmRzU3VtQnl0ZXNNZXRyaWMgPSBtZXRyaWNGYWN0b3J5Lm1ldHJpY1B1dFJlY29yZHNTdW1CeXRlcygpO1xuICAgIHRoaXMucHV0UmVjb3Jkc0xhdGVuY3lBdmVyYWdlTWV0cmljID1cbiAgICAgIG1ldHJpY0ZhY3RvcnkubWV0cmljUHV0UmVjb3Jkc0xhdGVuY3lBdmVyYWdlTXMoKTtcbiAgICB0aGlzLnB1dFJlY29yZHNTdWNjZXNzQ291bnRNZXRyaWMgPVxuICAgICAgbWV0cmljRmFjdG9yeS5tZXRyaWNQdXRSZWNvcmRzU3VjY2Vzc0NvdW50KCk7XG4gICAgdGhpcy5wdXRSZWNvcmRzVG90YWxSZWNvcmRzQ291bnRNZXRyaWMgPVxuICAgICAgbWV0cmljRmFjdG9yeS5tZXRyaWNQdXRSZWNvcmRzVG90YWxSZWNvcmRzQ291bnQoKTtcbiAgICB0aGlzLnB1dFJlY29yZHNTdWNjZXNzZnVsUmVjb3Jkc0NvdW50TWV0cmljID1cbiAgICAgIG1ldHJpY0ZhY3RvcnkubWV0cmljUHV0UmVjb3Jkc1N1Y2Nlc3NmdWxSZWNvcmRzQ291bnQoKTtcbiAgICB0aGlzLnB1dFJlY29yZHNUaHJvdHRsZWRSZWNvcmRzQ291bnRNZXRyaWMgPVxuICAgICAgbWV0cmljRmFjdG9yeS5tZXRyaWNQdXRSZWNvcmRzVGhyb3R0bGVkUmVjb3Jkc0NvdW50KCk7XG4gICAgdGhpcy5wdXRSZWNvcmRzRmFpbGVkUmVjb3Jkc0NvdW50TWV0cmljID1cbiAgICAgIG1ldHJpY0ZhY3RvcnkubWV0cmljUHV0UmVjb3Jkc0ZhaWxlZFJlY29yZHNDb3VudCgpO1xuICAgIHRoaXMucmVhZFByb3Zpc2lvbmVkVGhyb3VnaHB1dEV4Y2VlZGVkTWV0cmljID1cbiAgICAgIG1ldHJpY0ZhY3RvcnkubWV0cmljUmVhZFByb3Zpc2lvbmVkVGhyb3VnaHB1dEV4Y2VlZGVkUGVyY2VudCgpO1xuICAgIHRoaXMud3JpdGVQcm92aXNpb25lZFRocm91Z2hwdXRFeGNlZWRlZE1ldHJpYyA9XG4gICAgICBtZXRyaWNGYWN0b3J5Lm1ldHJpY1dyaXRlUHJvdmlzaW9uZWRUaHJvdWdocHV0RXhjZWVkZWRQZXJjZW50KCk7XG5cbiAgICBmb3IgKGNvbnN0IGRpc2FtYmlndWF0b3IgaW4gcHJvcHMuYWRkSXRlcmF0b3JNYXhBZ2VBbGFybSkge1xuICAgICAgY29uc3QgYWxhcm1Qcm9wcyA9IHByb3BzLmFkZEl0ZXJhdG9yTWF4QWdlQWxhcm1bZGlzYW1iaWd1YXRvcl07XG4gICAgICBjb25zdCBjcmVhdGVkQWxhcm0gPSB0aGlzLmtpbmVzaXNBbGFybUZhY3RvcnkuYWRkSXRlcmF0b3JNYXhBZ2VBbGFybShcbiAgICAgICAgdGhpcy5tZXRyaWNHZXRSZWNvcmRzSXRlcmF0b3JBZ2UsXG4gICAgICAgIGFsYXJtUHJvcHMsXG4gICAgICAgIGRpc2FtYmlndWF0b3JcbiAgICAgICk7XG4gICAgICB0aGlzLmFnZUFubm90YXRpb25zLnB1c2goY3JlYXRlZEFsYXJtLmFubm90YXRpb24pO1xuICAgICAgdGhpcy5hZGRBbGFybShjcmVhdGVkQWxhcm0pO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGRpc2FtYmlndWF0b3IgaW4gcHJvcHMuYWRkUHV0UmVjb3Jkc1Rocm90dGxlZEFsYXJtKSB7XG4gICAgICBjb25zdCBhbGFybVByb3BzID0gcHJvcHMuYWRkUHV0UmVjb3Jkc1Rocm90dGxlZEFsYXJtW2Rpc2FtYmlndWF0b3JdO1xuICAgICAgY29uc3QgY3JlYXRlZEFsYXJtID0gdGhpcy5raW5lc2lzQWxhcm1GYWN0b3J5LmFkZFB1dFJlY29yZHNUaHJvdHRsZWRBbGFybShcbiAgICAgICAgdGhpcy5wdXRSZWNvcmRzVGhyb3R0bGVkUmVjb3Jkc0NvdW50TWV0cmljLFxuICAgICAgICBhbGFybVByb3BzLFxuICAgICAgICBkaXNhbWJpZ3VhdG9yXG4gICAgICApO1xuICAgICAgdGhpcy5yZWNvcmRDb3VudEFubm90YXRpb25zLnB1c2goY3JlYXRlZEFsYXJtLmFubm90YXRpb24pO1xuICAgICAgdGhpcy5hZGRBbGFybShjcmVhdGVkQWxhcm0pO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGRpc2FtYmlndWF0b3IgaW4gcHJvcHMuYWRkUHV0UmVjb3Jkc0ZhaWxlZEFsYXJtKSB7XG4gICAgICBjb25zdCBhbGFybVByb3BzID0gcHJvcHMuYWRkUHV0UmVjb3Jkc0ZhaWxlZEFsYXJtW2Rpc2FtYmlndWF0b3JdO1xuICAgICAgY29uc3QgY3JlYXRlZEFsYXJtID0gdGhpcy5raW5lc2lzQWxhcm1GYWN0b3J5LmFkZFB1dFJlY29yZHNGYWlsZWRBbGFybShcbiAgICAgICAgdGhpcy5wdXRSZWNvcmRzRmFpbGVkUmVjb3Jkc0NvdW50TWV0cmljLFxuICAgICAgICBhbGFybVByb3BzLFxuICAgICAgICBkaXNhbWJpZ3VhdG9yXG4gICAgICApO1xuICAgICAgdGhpcy5yZWNvcmRDb3VudEFubm90YXRpb25zLnB1c2goY3JlYXRlZEFsYXJtLmFubm90YXRpb24pO1xuICAgICAgdGhpcy5hZGRBbGFybShjcmVhdGVkQWxhcm0pO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGRpc2FtYmlndWF0b3IgaW4gcHJvcHMuYWRkUmVhZFByb3Zpc2lvbmVkVGhyb3VnaHB1dEV4Y2VlZGVkQWxhcm0pIHtcbiAgICAgIGNvbnN0IGFsYXJtUHJvcHMgPVxuICAgICAgICBwcm9wcy5hZGRSZWFkUHJvdmlzaW9uZWRUaHJvdWdocHV0RXhjZWVkZWRBbGFybVtkaXNhbWJpZ3VhdG9yXTtcbiAgICAgIGNvbnN0IGNyZWF0ZWRBbGFybSA9XG4gICAgICAgIHRoaXMua2luZXNpc0FsYXJtRmFjdG9yeS5hZGRQcm92aXNpb25lZFJlYWRUaHJvdWdocHV0RXhjZWVkZWRBbGFybShcbiAgICAgICAgICB0aGlzLnJlYWRQcm92aXNpb25lZFRocm91Z2hwdXRFeGNlZWRlZE1ldHJpYyxcbiAgICAgICAgICBhbGFybVByb3BzLFxuICAgICAgICAgIGRpc2FtYmlndWF0b3JcbiAgICAgICAgKTtcbiAgICAgIHRoaXMucHJvdmlzaW9uZWRDYXBhY2l0eUFubm90YXRpb25zLnB1c2goY3JlYXRlZEFsYXJtLmFubm90YXRpb24pO1xuICAgICAgdGhpcy5hZGRBbGFybShjcmVhdGVkQWxhcm0pO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGRpc2FtYmlndWF0b3IgaW4gcHJvcHMuYWRkV3JpdGVQcm92aXNpb25lZFRocm91Z2hwdXRFeGNlZWRlZEFsYXJtKSB7XG4gICAgICBjb25zdCBhbGFybVByb3BzID1cbiAgICAgICAgcHJvcHMuYWRkV3JpdGVQcm92aXNpb25lZFRocm91Z2hwdXRFeGNlZWRlZEFsYXJtW2Rpc2FtYmlndWF0b3JdO1xuICAgICAgY29uc3QgY3JlYXRlZEFsYXJtID1cbiAgICAgICAgdGhpcy5raW5lc2lzQWxhcm1GYWN0b3J5LmFkZFByb3Zpc2lvbmVkV3JpdGVUaHJvdWdocHV0RXhjZWVkZWRBbGFybShcbiAgICAgICAgICB0aGlzLndyaXRlUHJvdmlzaW9uZWRUaHJvdWdocHV0RXhjZWVkZWRNZXRyaWMsXG4gICAgICAgICAgYWxhcm1Qcm9wcyxcbiAgICAgICAgICBkaXNhbWJpZ3VhdG9yXG4gICAgICAgICk7XG4gICAgICB0aGlzLnByb3Zpc2lvbmVkQ2FwYWNpdHlBbm5vdGF0aW9ucy5wdXNoKGNyZWF0ZWRBbGFybS5hbm5vdGF0aW9uKTtcbiAgICAgIHRoaXMuYWRkQWxhcm0oY3JlYXRlZEFsYXJtKTtcbiAgICB9XG5cbiAgICBwcm9wcy51c2VDcmVhdGVkQWxhcm1zPy5jb25zdW1lKHRoaXMuY3JlYXRlZEFsYXJtcygpKTtcbiAgfVxuXG4gIHN1bW1hcnlXaWRnZXRzKCk6IElXaWRnZXRbXSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHRoaXMuY3JlYXRlVGl0bGVXaWRnZXQoKSxcbiAgICAgIG5ldyBSb3coXG4gICAgICAgIHRoaXMuY3JlYXRlSW5jb21pbmdEYXRhV2lkZ2V0KFF1YXJ0ZXJXaWR0aCwgRGVmYXVsdFN1bW1hcnlXaWRnZXRIZWlnaHQpLFxuICAgICAgICB0aGlzLmNyZWF0ZUl0ZXJhdG9yQWdlV2lkZ2V0KFF1YXJ0ZXJXaWR0aCwgRGVmYXVsdFN1bW1hcnlXaWRnZXRIZWlnaHQpLFxuICAgICAgICB0aGlzLmNyZWF0ZUxhdGVuY3lXaWRnZXQoUXVhcnRlcldpZHRoLCBEZWZhdWx0U3VtbWFyeVdpZGdldEhlaWdodCksXG4gICAgICAgIHRoaXMuY3JlYXRlQ2FwYWNpdHlXaWRnZXQoUXVhcnRlcldpZHRoLCBEZWZhdWx0U3VtbWFyeVdpZGdldEhlaWdodClcbiAgICAgICksXG4gICAgXTtcbiAgfVxuXG4gIHdpZGdldHMoKTogSVdpZGdldFtdIHtcbiAgICByZXR1cm4gW1xuICAgICAgdGhpcy5jcmVhdGVUaXRsZVdpZGdldCgpLFxuICAgICAgbmV3IFJvdyhcbiAgICAgICAgdGhpcy5jcmVhdGVJbmNvbWluZ0RhdGFXaWRnZXQoUXVhcnRlcldpZHRoLCBEZWZhdWx0R3JhcGhXaWRnZXRIZWlnaHQpLFxuICAgICAgICB0aGlzLmNyZWF0ZUl0ZXJhdG9yQWdlV2lkZ2V0KFF1YXJ0ZXJXaWR0aCwgRGVmYXVsdEdyYXBoV2lkZ2V0SGVpZ2h0KSxcbiAgICAgICAgdGhpcy5jcmVhdGVMYXRlbmN5V2lkZ2V0KFF1YXJ0ZXJXaWR0aCwgRGVmYXVsdEdyYXBoV2lkZ2V0SGVpZ2h0KSxcbiAgICAgICAgdGhpcy5jcmVhdGVDYXBhY2l0eVdpZGdldChRdWFydGVyV2lkdGgsIERlZmF1bHRHcmFwaFdpZGdldEhlaWdodClcbiAgICAgICksXG4gICAgICB0aGlzLmNyZWF0ZUZpcnN0QWRkaXRpb25hbFJvdygpLFxuICAgICAgdGhpcy5jcmVhdGVTZWNvbmRBZGRpdGlvbmFsUm93KCksXG4gICAgXTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlRmlyc3RBZGRpdGlvbmFsUm93KCkge1xuICAgIHJldHVybiBuZXcgUm93KFxuICAgICAgdGhpcy5jcmVhdGVSZWNvcmRTaXplV2lkZ2V0KEhhbGZXaWR0aCwgRGVmYXVsdEdyYXBoV2lkZ2V0SGVpZ2h0KSxcbiAgICAgIHRoaXMuY3JlYXRlT3BlcmF0aW9uV2lkZ2V0KEhhbGZXaWR0aCwgRGVmYXVsdEdyYXBoV2lkZ2V0SGVpZ2h0KVxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY3JlYXRlU2Vjb25kQWRkaXRpb25hbFJvdygpIHtcbiAgICByZXR1cm4gbmV3IFJvdyhcbiAgICAgIHRoaXMuY3JlYXRlUmVjb3JkTnVtYmVyV2lkZ2V0KEZ1bGxXaWR0aCwgRGVmYXVsdEdyYXBoV2lkZ2V0SGVpZ2h0KVxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY3JlYXRlVGl0bGVXaWRnZXQoKSB7XG4gICAgcmV0dXJuIG5ldyBNb25pdG9yaW5nSGVhZGVyV2lkZ2V0KHtcbiAgICAgIGZhbWlseTogXCJLaW5lc2lzIERhdGEgU3RyZWFtXCIsXG4gICAgICB0aXRsZTogdGhpcy50aXRsZSxcbiAgICAgIGdvVG9MaW5rVXJsOiB0aGlzLnN0cmVhbVVybCxcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjcmVhdGVJbmNvbWluZ0RhdGFXaWRnZXQod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpIHtcbiAgICByZXR1cm4gbmV3IEdyYXBoV2lkZ2V0KHtcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0LFxuICAgICAgdGl0bGU6IFwiSW5jb21pbmdcIixcbiAgICAgIGxlZnQ6IFt0aGlzLmluY29taW5nRGF0YVN1bUNvdW50TWV0cmljXSxcbiAgICAgIGxlZnRZQXhpczogQ291bnRBeGlzRnJvbVplcm8sXG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY3JlYXRlSXRlcmF0b3JBZ2VXaWRnZXQod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpIHtcbiAgICByZXR1cm4gbmV3IEdyYXBoV2lkZ2V0KHtcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0LFxuICAgICAgdGl0bGU6IFwiSXRlcmF0b3JcIixcbiAgICAgIGxlZnQ6IFt0aGlzLm1ldHJpY0dldFJlY29yZHNJdGVyYXRvckFnZV0sXG4gICAgICBsZWZ0QW5ub3RhdGlvbnM6IHRoaXMuYWdlQW5ub3RhdGlvbnMsXG4gICAgICBsZWZ0WUF4aXM6IFRpbWVBeGlzTWlsbGlzRnJvbVplcm8sXG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY3JlYXRlTGF0ZW5jeVdpZGdldCh3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcikge1xuICAgIHJldHVybiBuZXcgR3JhcGhXaWRnZXQoe1xuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHQsXG4gICAgICB0aXRsZTogXCJMYXRlbmN5IChBdmVyYWdlKVwiLFxuICAgICAgbGVmdDogW1xuICAgICAgICB0aGlzLm1ldHJpY0dldFJlY29yZHNMYXRlbmN5QXZlcmFnZSxcbiAgICAgICAgdGhpcy5wdXRSZWNvcmRMYXRlbmN5QXZlcmFnZU1ldHJpYyxcbiAgICAgICAgdGhpcy5wdXRSZWNvcmRzTGF0ZW5jeUF2ZXJhZ2VNZXRyaWMsXG4gICAgICBdLFxuICAgICAgbGVmdFlBeGlzOiBUaW1lQXhpc01pbGxpc0Zyb21aZXJvLFxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNyZWF0ZUNhcGFjaXR5V2lkZ2V0KHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIG5ldyBHcmFwaFdpZGdldCh7XG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodCxcbiAgICAgIHRpdGxlOiBcIlByb3Zpc2lvbmVkIENhcGFjaXR5IEV4Y2VlZGVkXCIsXG4gICAgICBsZWZ0OiBbXG4gICAgICAgIHRoaXMucmVhZFByb3Zpc2lvbmVkVGhyb3VnaHB1dEV4Y2VlZGVkTWV0cmljLFxuICAgICAgICB0aGlzLndyaXRlUHJvdmlzaW9uZWRUaHJvdWdocHV0RXhjZWVkZWRNZXRyaWMsXG4gICAgICBdLFxuICAgICAgbGVmdFlBeGlzOiBUaW1lQXhpc01pbGxpc0Zyb21aZXJvLFxuICAgICAgbGVmdEFubm90YXRpb25zOiB0aGlzLnByb3Zpc2lvbmVkQ2FwYWNpdHlBbm5vdGF0aW9ucyxcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjcmVhdGVSZWNvcmRTaXplV2lkZ2V0KHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIG5ldyBHcmFwaFdpZGdldCh7XG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodCxcbiAgICAgIHRpdGxlOiBcIkJ5dGVzXCIsXG4gICAgICBsZWZ0OiBbXG4gICAgICAgIHRoaXMubWV0cmljR2V0UmVjb3JkU3VtQnl0ZXMsXG4gICAgICAgIHRoaXMucHV0UmVjb3JkU3VtQnl0ZXNNZXRyaWMsXG4gICAgICAgIHRoaXMucHV0UmVjb3Jkc1N1bUJ5dGVzTWV0cmljLFxuICAgICAgXSxcbiAgICAgIGxlZnRZQXhpczogU2l6ZUF4aXNCeXRlc0Zyb21aZXJvLFxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNyZWF0ZU9wZXJhdGlvbldpZGdldCh3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcikge1xuICAgIHJldHVybiBuZXcgR3JhcGhXaWRnZXQoe1xuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHQsXG4gICAgICB0aXRsZTogXCJTdWNjZXNzZnVsIE9wZXJhdGlvbnNcIixcbiAgICAgIGxlZnQ6IFtcbiAgICAgICAgdGhpcy5tZXRyaWNHZXRSZWNvcmRzU3VjY2Vzc0NvdW50LFxuICAgICAgICB0aGlzLnB1dFJlY29yZFN1Y2Nlc3NDb3VudE1ldHJpYyxcbiAgICAgICAgdGhpcy5wdXRSZWNvcmRzU3VjY2Vzc0NvdW50TWV0cmljLFxuICAgICAgXSxcbiAgICAgIGxlZnRZQXhpczogQ291bnRBeGlzRnJvbVplcm8sXG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY3JlYXRlUmVjb3JkTnVtYmVyV2lkZ2V0KHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIG5ldyBHcmFwaFdpZGdldCh7XG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodCxcbiAgICAgIHRpdGxlOiBcIlJlY29yZHNcIixcbiAgICAgIGxlZnQ6IFtcbiAgICAgICAgdGhpcy5tZXRyaWNHZXRSZWNvcmRzU3VtQ291bnQsXG4gICAgICAgIHRoaXMucHV0UmVjb3Jkc1RvdGFsUmVjb3Jkc0NvdW50TWV0cmljLFxuICAgICAgICB0aGlzLnB1dFJlY29yZHNTdWNjZXNzZnVsUmVjb3Jkc0NvdW50TWV0cmljLFxuICAgICAgICB0aGlzLnB1dFJlY29yZHNGYWlsZWRSZWNvcmRzQ291bnRNZXRyaWMsXG4gICAgICAgIHRoaXMucHV0UmVjb3Jkc1Rocm90dGxlZFJlY29yZHNDb3VudE1ldHJpYyxcbiAgICAgIF0sXG4gICAgICBsZWZ0QW5ub3RhdGlvbnM6IHRoaXMucmVjb3JkQ291bnRBbm5vdGF0aW9ucyxcbiAgICAgIGxlZnRZQXhpczogQ291bnRBeGlzRnJvbVplcm8sXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==