UNPKG

cdk-monitoring-constructs

Version:

[![NPM version](https://badge.fury.io/js/cdk-monitoring-constructs.svg)](https://badge.fury.io/js/cdk-monitoring-constructs) [![Maven Central](https://maven-badges.herokuapp.com/maven-central/io.github.cdklabs/cdkmonitoringconstructs/badge.svg)](https://m

110 lines 16.3 kB
"use strict"; var _a; Object.defineProperty(exports, "__esModule", { value: true }); exports.LogMonitoring = void 0; const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); const aws_cloudwatch_1 = require("aws-cdk-lib/aws-cloudwatch"); const CloudWatchLogsMetricFactory_1 = require("./CloudWatchLogsMetricFactory"); const common_1 = require("../../common"); const dashboard_1 = require("../../dashboard"); const DefaultLimit = 10; /** * Monitors a CloudWatch log group for various patterns. */ class LogMonitoring extends common_1.Monitoring { constructor(scope, props) { super(scope); this.logGroupName = props.logGroupName; this.logGroupUrl = scope .createAwsConsoleUrlFactory() .getCloudWatchLogGroupUrl(props.logGroupName); this.title = props.title; this.pattern = props.pattern; this.limit = props.limit ?? DefaultLimit; const namingStrategy = new dashboard_1.MonitoringNamingStrategy({ ...props, fallbackConstructName: this.logGroupName, }); this.alarmFactory = this.createAlarmFactory(namingStrategy.resolveAlarmFriendlyName()); this.usageAlarmFactory = new common_1.UsageAlarmFactory(this.alarmFactory); this.usageAnnotations = []; const metricFactory = new CloudWatchLogsMetricFactory_1.CloudWatchLogsMetricFactory(scope.createMetricFactory(), props); this.incomingLogEventsMetric = metricFactory.metricIncomingLogEvents(); for (const disambiguator in props.addMinIncomingLogsAlarm) { const alarmProps = props.addMinIncomingLogsAlarm[disambiguator]; const createdAlarm = this.usageAlarmFactory.addMinUsageCountAlarm(this.incomingLogEventsMetric, alarmProps, disambiguator); this.usageAnnotations.push(createdAlarm.annotation); this.addAlarm(createdAlarm); } for (const disambiguator in props.addMaxIncomingLogsAlarm) { const alarmProps = props.addMaxIncomingLogsAlarm[disambiguator]; const createdAlarm = this.usageAlarmFactory.addMaxCountAlarm(this.incomingLogEventsMetric, alarmProps, disambiguator); this.usageAnnotations.push(createdAlarm.annotation); this.addAlarm(createdAlarm); } props.useCreatedAlarms?.consume(this.createdAlarms()); } summaryWidgets() { return [ this.createTitleWidget(), this.createIncomingLogsWidget(common_1.FullWidth, common_1.DefaultSummaryWidgetHeight), ]; } widgets() { if (this.pattern) { const height = this.resolveRecommendedHeight(this.limit); return [ this.createTitleWidget(), // Log Query Results new aws_cloudwatch_1.LogQueryWidget({ logGroupNames: [this.logGroupName], height, width: common_1.ThreeQuartersWidth, title: this.title ?? `Find ${this.pattern} (limit = ${this.limit})`, /** * https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CWL_QuerySyntax.html */ queryLines: [ "fields @timestamp, @logStream, @message", `filter @message like /${this.pattern}/`, "sort @timestamp desc", `limit ${this.limit}`, ], }), this.createIncomingLogsWidget(common_1.QuarterWidth, height), ]; } else { return [ this.createTitleWidget(), this.createIncomingLogsWidget(common_1.FullWidth, common_1.DefaultGraphWidgetHeight), ]; } } createTitleWidget() { return new dashboard_1.MonitoringHeaderWidget({ family: "Log Group", title: this.logGroupName, goToLinkUrl: this.logGroupUrl, }); } createIncomingLogsWidget(width, height) { return new aws_cloudwatch_1.GraphWidget({ width, height, title: "Incoming logs", left: [this.incomingLogEventsMetric], leftYAxis: common_1.CountAxisFromZero, leftAnnotations: this.usageAnnotations, }); } resolveRecommendedHeight(numRows) { const heightPerLine = 1; const recommendedHeight = heightPerLine * numRows; return Math.max(recommendedHeight, common_1.DefaultLogWidgetHeight); } } exports.LogMonitoring = LogMonitoring; _a = JSII_RTTI_SYMBOL_1; LogMonitoring[_a] = { fqn: "cdk-monitoring-constructs.LogMonitoring", version: "9.7.1" }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTG9nTW9uaXRvcmluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIkxvZ01vbml0b3JpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSwrREFLb0M7QUFFcEMsK0VBR3VDO0FBQ3ZDLHlDQWdCc0I7QUFDdEIsK0NBR3lCO0FBRXpCLE1BQU0sWUFBWSxHQUFHLEVBQUUsQ0FBQztBQTRCeEI7O0dBRUc7QUFDSCxNQUFhLGFBQWMsU0FBUSxtQkFBVTtJQWUzQyxZQUFZLEtBQXNCLEVBQUUsS0FBeUI7UUFDM0QsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRWIsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUMsWUFBWSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSzthQUNyQiwwQkFBMEIsRUFBRTthQUM1Qix3QkFBd0IsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7UUFFaEQsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDO1FBRXpCLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQztRQUM3QixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLElBQUksWUFBWSxDQUFDO1FBRXpDLE1BQU0sY0FBYyxHQUFHLElBQUksb0NBQXdCLENBQUM7WUFDbEQsR0FBRyxLQUFLO1lBQ1IscUJBQXFCLEVBQUUsSUFBSSxDQUFDLFlBQVk7U0FDekMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQ3pDLGNBQWMsQ0FBQyx3QkFBd0IsRUFBRSxDQUMxQyxDQUFDO1FBQ0YsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksMEJBQWlCLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBRWxFLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7UUFFM0IsTUFBTSxhQUFhLEdBQUcsSUFBSSx5REFB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LElBQUksNEJBQVcsQ0FBQztZQUNyQixLQUFLO1lBQ0wsTUFBTTtZQUNOLEtBQUssRUFBRSxlQUFlO1lBQ3RCLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQztZQUNwQyxTQUFTLEVBQUUsMEJBQWlCO1lBQzVCLGVBQWUsRUFBRSxJQUFJLENBQUMsZ0JBQWdCO1NBQ3ZDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFUyx3QkFBd0IsQ0FBQyxPQUFlO1FBQ2hELE1BQU0sYUFBYSxHQUFHLENBQUMsQ0FBQztRQUN4QixNQUFNLGlCQUFpQixHQUFHLGFBQWEsR0FBRyxPQUFPLENBQUM7UUFDbEQsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLGlCQUFpQixFQUFFLCtCQUFzQixDQUFDLENBQUM7SUFDN0QsQ0FBQzs7QUF0SUgsc0NBdUlDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgR3JhcGhXaWRnZXQsXG4gIEhvcml6b250YWxBbm5vdGF0aW9uLFxuICBJV2lkZ2V0LFxuICBMb2dRdWVyeVdpZGdldCxcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1jbG91ZHdhdGNoXCI7XG5cbmltcG9ydCB7XG4gIENsb3VkV2F0Y2hMb2dzTWV0cmljRmFjdG9yeSxcbiAgQ2xvdWRXYXRjaExvZ3NNZXRyaWNGYWN0b3J5UHJvcHMsXG59IGZyb20gXCIuL0Nsb3VkV2F0Y2hMb2dzTWV0cmljRmFjdG9yeVwiO1xuaW1wb3J0IHtcbiAgQWxhcm1GYWN0b3J5LFxuICBCYXNlTW9uaXRvcmluZ1Byb3BzLFxuICBDb3VudEF4aXNGcm9tWmVybyxcbiAgRGVmYXVsdEdyYXBoV2lkZ2V0SGVpZ2h0LFxuICBEZWZhdWx0TG9nV2lkZ2V0SGVpZ2h0LFxuICBEZWZhdWx0U3VtbWFyeVdpZGdldEhlaWdodCxcbiAgRnVsbFdpZHRoLFxuICBNYXhVc2FnZUNvdW50VGhyZXNob2xkLFxuICBNZXRyaWNXaXRoQWxhcm1TdXBwb3J0LFxuICBNaW5Vc2FnZUNvdW50VGhyZXNob2xkLFxuICBNb25pdG9yaW5nLFxuICBNb25pdG9yaW5nU2NvcGUsXG4gIFF1YXJ0ZXJXaWR0aCxcbiAgVGhyZWVRdWFydGVyc1dpZHRoLFxuICBVc2FnZUFsYXJtRmFjdG9yeSxcbn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtcbiAgTW9uaXRvcmluZ0hlYWRlcldpZGdldCxcbiAgTW9uaXRvcmluZ05hbWluZ1N0cmF0ZWd5LFxufSBmcm9tIFwiLi4vLi4vZGFzaGJvYXJkXCI7XG5cbmNvbnN0IERlZmF1bHRMaW1pdCA9IDEwO1xuXG5leHBvcnQgaW50ZXJmYWNlIExvZ01vbml0b3JpbmdQcm9wc1xuICBleHRlbmRzIEJhc2VNb25pdG9yaW5nUHJvcHMsXG4gICAgQ2xvdWRXYXRjaExvZ3NNZXRyaWNGYWN0b3J5UHJvcHMge1xuICAvKipcbiAgICogV2lkZ2V0IHRpdGxlXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYXV0by1nZW5lcmF0ZWQgdGl0bGUgYmFzZWQgb24gdGhlIHBhdHRlcm4gYW5kIGxpbWl0XG4gICAqL1xuICByZWFkb25seSB0aXRsZT86IHN0cmluZztcblxuICAvKipcbiAgICogUGF0dGVybiB0byBzZWFyY2ggZm9yLCBlLmcuIFwiRVJST1JcIlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0dGVybj86IHN0cmluZztcblxuICAvKipcbiAgICogTWF4aW11bSBudW1iZXIgb2YgbG9nIG1lc3NhZ2VzIHRvIHNlYXJjaCBmb3IuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gMTBcbiAgICovXG4gIHJlYWRvbmx5IGxpbWl0PzogbnVtYmVyO1xuXG4gIHJlYWRvbmx5IGFkZE1pbkluY29taW5nTG9nc0FsYXJtPzogUmVjb3JkPHN0cmluZywgTWluVXNhZ2VDb3VudFRocmVzaG9sZD47XG4gIHJlYWRvbmx5IGFkZE1heEluY29taW5nTG9nc0FsYXJtPzogUmVjb3JkPHN0cmluZywgTWF4VXNhZ2VDb3VudFRocmVzaG9sZD47XG59XG5cbi8qKlxuICogTW9uaXRvcnMgYSBDbG91ZFdhdGNoIGxvZyBncm91cCBmb3IgdmFyaW91cyBwYXR0ZXJucy5cbiAqL1xuZXhwb3J0IGNsYXNzIExvZ01vbml0b3JpbmcgZXh0ZW5kcyBNb25pdG9yaW5nIHtcbiAgcmVhZG9ubHkgbG9nR3JvdXBOYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGxvZ0dyb3VwVXJsPzogc3RyaW5nO1xuXG4gIHJlYWRvbmx5IHRpdGxlPzogc3RyaW5nO1xuXG4gIHJlYWRvbmx5IHBhdHRlcm4/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGxpbWl0OiBudW1iZXI7XG5cbiAgcmVhZG9ubHkgYWxhcm1GYWN0b3J5OiBBbGFybUZhY3Rvcnk7XG4gIHJlYWRvbmx5IHVzYWdlQWxhcm1GYWN0b3J5OiBVc2FnZUFsYXJtRmFjdG9yeTtcbiAgcmVhZG9ubHkgaW5jb21pbmdMb2dFdmVudHNNZXRyaWM6IE1ldHJpY1dpdGhBbGFybVN1cHBvcnQ7XG5cbiAgcmVhZG9ubHkgdXNhZ2VBbm5vdGF0aW9uczogSG9yaXpvbnRhbEFubm90YXRpb25bXTtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogTW9uaXRvcmluZ1Njb3BlLCBwcm9wczogTG9nTW9uaXRvcmluZ1Byb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUpO1xuXG4gICAgdGhpcy5sb2dHcm91cE5hbWUgPSBwcm9wcy5sb2dHcm91cE5hbWU7XG4gICAgdGhpcy5sb2dHcm91cFVybCA9IHNjb3BlXG4gICAgICAuY3JlYXRlQXdzQ29uc29sZVVybEZhY3RvcnkoKVxuICAgICAgLmdldENsb3VkV2F0Y2hMb2dHcm91cFVybChwcm9wcy5sb2dHcm91cE5hbWUpO1xuXG4gICAgdGhpcy50aXRsZSA9IHByb3BzLnRpdGxlO1xuXG4gICAgdGhpcy5wYXR0ZXJuID0gcHJvcHMucGF0dGVybjtcbiAgICB0aGlzLmxpbWl0ID0gcHJvcHMubGltaXQgPz8gRGVmYXVsdExpbWl0O1xuXG4gICAgY29uc3QgbmFtaW5nU3RyYXRlZ3kgPSBuZXcgTW9uaXRvcmluZ05hbWluZ1N0cmF0ZWd5KHtcbiAgICAgIC4uLnByb3BzLFxuICAgICAgZmFsbGJhY2tDb25zdHJ1Y3ROYW1lOiB0aGlzLmxvZ0dyb3VwTmFtZSxcbiAgICB9KTtcbiAgICB0aGlzLmFsYXJtRmFjdG9yeSA9IHRoaXMuY3JlYXRlQWxhcm1GYWN0b3J5KFxuICAgICAgbmFtaW5nU3RyYXRlZ3kucmVzb2x2ZUFsYXJtRnJpZW5kbHlOYW1lKCksXG4gICAgKTtcbiAgICB0aGlzLnVzYWdlQWxhcm1GYWN0b3J5ID0gbmV3IFVzYWdlQWxhcm1GYWN0b3J5KHRoaXMuYWxhcm1GYWN0b3J5KTtcblxuICAgIHRoaXMudXNhZ2VBbm5vdGF0aW9ucyA9IFtdO1xuXG4gICAgY29uc3QgbWV0cmljRmFjdG9yeSA9IG5ldyBDbG91ZFdhdGNoTG9nc01ldHJpY0ZhY3RvcnkoXG4gICAgICBzY29wZS5jcmVhdGVNZXRyaWNGYWN0b3J5KCksXG4gICAgICBwcm9wcyxcbiAgICApO1xuICAgIHRoaXMuaW5jb21pbmdMb2dFdmVudHNNZXRyaWMgPSBtZXRyaWNGYWN0b3J5Lm1ldHJpY0luY29taW5nTG9nRXZlbnRzKCk7XG5cbiAgICBmb3IgKGNvbnN0IGRpc2FtYmlndWF0b3IgaW4gcHJvcHMuYWRkTWluSW5jb21pbmdMb2dzQWxhcm0pIHtcbiAgICAgIGNvbnN0IGFsYXJtUHJvcHMgPSBwcm9wcy5hZGRNaW5JbmNvbWluZ0xvZ3NBbGFybVtkaXNhbWJpZ3VhdG9yXTtcbiAgICAgIGNvbnN0IGNyZWF0ZWRBbGFybSA9IHRoaXMudXNhZ2VBbGFybUZhY3RvcnkuYWRkTWluVXNhZ2VDb3VudEFsYXJtKFxuICAgICAgICB0aGlzLmluY29taW5nTG9nRXZlbnRzTWV0cmljLFxuICAgICAgICBhbGFybVByb3BzLFxuICAgICAgICBkaXNhbWJpZ3VhdG9yLFxuICAgICAgKTtcbiAgICAgIHRoaXMudXNhZ2VBbm5vdGF0aW9ucy5wdXNoKGNyZWF0ZWRBbGFybS5hbm5vdGF0aW9uKTtcbiAgICAgIHRoaXMuYWRkQWxhcm0oY3JlYXRlZEFsYXJtKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGRpc2FtYmlndWF0b3IgaW4gcHJvcHMuYWRkTWF4SW5jb21pbmdMb2dzQWxhcm0pIHtcbiAgICAgIGNvbnN0IGFsYXJtUHJvcHMgPSBwcm9wcy5hZGRNYXhJbmNvbWluZ0xvZ3NBbGFybVtkaXNhbWJpZ3VhdG9yXTtcbiAgICAgIGNvbnN0IGNyZWF0ZWRBbGFybSA9IHRoaXMudXNhZ2VBbGFybUZhY3RvcnkuYWRkTWF4Q291bnRBbGFybShcbiAgICAgICAgdGhpcy5pbmNvbWluZ0xvZ0V2ZW50c01ldHJpYyxcbiAgICAgICAgYWxhcm1Qcm9wcyxcbiAgICAgICAgZGlzYW1iaWd1YXRvcixcbiAgICAgICk7XG4gICAgICB0aGlzLnVzYWdlQW5ub3RhdGlvbnMucHVzaChjcmVhdGVkQWxhcm0uYW5ub3RhdGlvbik7XG4gICAgICB0aGlzLmFkZEFsYXJtKGNyZWF0ZWRBbGFybSk7XG4gICAgfVxuXG4gICAgcHJvcHMudXNlQ3JlYXRlZEFsYXJtcz8uY29uc3VtZSh0aGlzLmNyZWF0ZWRBbGFybXMoKSk7XG4gIH1cblxuICBzdW1tYXJ5V2lkZ2V0cygpOiBJV2lkZ2V0W10ge1xuICAgIHJldHVybiBbXG4gICAgICB0aGlzLmNyZWF0ZVRpdGxlV2lkZ2V0KCksXG4gICAgICB0aGlzLmNyZWF0ZUluY29taW5nTG9nc1dpZGdldChGdWxsV2lkdGgsIERlZmF1bHRTdW1tYXJ5V2lkZ2V0SGVpZ2h0KSxcbiAgICBdO1xuICB9XG5cbiAgd2lkZ2V0cygpOiBJV2lkZ2V0W10ge1xuICAgIGlmICh0aGlzLnBhdHRlcm4pIHtcbiAgICAgIGNvbnN0IGhlaWdodCA9IHRoaXMucmVzb2x2ZVJlY29tbWVuZGVkSGVpZ2h0KHRoaXMubGltaXQpO1xuXG4gICAgICByZXR1cm4gW1xuICAgICAgICB0aGlzLmNyZWF0ZVRpdGxlV2lkZ2V0KCksXG5cbiAgICAgICAgLy8gTG9nIFF1ZXJ5IFJlc3VsdHNcbiAgICAgICAgbmV3IExvZ1F1ZXJ5V2lkZ2V0KHtcbiAgICAgICAgICBsb2dHcm91cE5hbWVzOiBbdGhpcy5sb2dHcm91cE5hbWVdLFxuICAgICAgICAgIGhlaWdodCxcbiAgICAgICAgICB3aWR0aDogVGhyZWVRdWFydGVyc1dpZHRoLFxuICAgICAgICAgIHRpdGxlOiB0aGlzLnRpdGxlID8/IGBGaW5kICR7dGhpcy5wYXR0ZXJufSAobGltaXQgPSAke3RoaXMubGltaXR9KWAsXG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkV2F0Y2gvbGF0ZXN0L2xvZ3MvQ1dMX1F1ZXJ5U3ludGF4Lmh0bWxcbiAgICAgICAgICAgKi9cbiAgICAgICAgICBxdWVyeUxpbmVzOiBbXG4gICAgICAgICAgICBcImZpZWxkcyBAdGltZXN0YW1wLCBAbG9nU3RyZWFtLCBAbWVzc2FnZVwiLFxuICAgICAgICAgICAgYGZpbHRlciBAbWVzc2FnZSBsaWtlIC8ke3RoaXMucGF0dGVybn0vYCxcbiAgICAgICAgICAgIFwic29ydCBAdGltZXN0YW1wIGRlc2NcIixcbiAgICAgICAgICAgIGBsaW1pdCAke3RoaXMubGltaXR9YCxcbiAgICAgICAgICBdLFxuICAgICAgICB9KSxcblxuICAgICAgICB0aGlzLmNyZWF0ZUluY29taW5nTG9nc1dpZGdldChRdWFydGVyV2lkdGgsIGhlaWdodCksXG4gICAgICBdO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gW1xuICAgICAgICB0aGlzLmNyZWF0ZVRpdGxlV2lkZ2V0KCksXG4gICAgICAgIHRoaXMuY3JlYXRlSW5jb21pbmdMb2dzV2lkZ2V0KEZ1bGxXaWR0aCwgRGVmYXVsdEdyYXBoV2lkZ2V0SGVpZ2h0KSxcbiAgICAgIF07XG4gICAgfVxuICB9XG5cbiAgY3JlYXRlVGl0bGVXaWRnZXQoKSB7XG4gICAgcmV0dXJuIG5ldyBNb25pdG9yaW5nSGVhZGVyV2lkZ2V0KHtcbiAgICAgIGZhbWlseTogXCJMb2cgR3JvdXBcIixcbiAgICAgIHRpdGxlOiB0aGlzLmxvZ0dyb3VwTmFtZSxcbiAgICAgIGdvVG9MaW5rVXJsOiB0aGlzLmxvZ0dyb3VwVXJsLFxuICAgIH0pO1xuICB9XG5cbiAgY3JlYXRlSW5jb21pbmdMb2dzV2lkZ2V0KHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIG5ldyBHcmFwaFdpZGdldCh7XG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodCxcbiAgICAgIHRpdGxlOiBcIkluY29taW5nIGxvZ3NcIixcbiAgICAgIGxlZnQ6IFt0aGlzLmluY29taW5nTG9nRXZlbnRzTWV0cmljXSxcbiAgICAgIGxlZnRZQXhpczogQ291bnRBeGlzRnJvbVplcm8sXG4gICAgICBsZWZ0QW5ub3RhdGlvbnM6IHRoaXMudXNhZ2VBbm5vdGF0aW9ucyxcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZXNvbHZlUmVjb21tZW5kZWRIZWlnaHQobnVtUm93czogbnVtYmVyKSB7XG4gICAgY29uc3QgaGVpZ2h0UGVyTGluZSA9IDE7XG4gICAgY29uc3QgcmVjb21tZW5kZWRIZWlnaHQgPSBoZWlnaHRQZXJMaW5lICogbnVtUm93cztcbiAgICByZXR1cm4gTWF0aC5tYXgocmVjb21tZW5kZWRIZWlnaHQsIERlZmF1bHRMb2dXaWRnZXRIZWlnaHQpO1xuICB9XG59XG4iXX0=