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

299 lines 68 kB
"use strict"; var _a; Object.defineProperty(exports, "__esModule", { value: true }); exports.AlarmFactory = exports.CompositeAlarmOperator = void 0; const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); const aws_cloudwatch_1 = require("aws-cdk-lib/aws-cloudwatch"); const action_1 = require("./action"); const AlarmNamingStrategy_1 = require("./AlarmNamingStrategy"); const IAlarmAnnotationStrategy_1 = require("./IAlarmAnnotationStrategy"); const metric_adjuster_1 = require("./metric-adjuster"); const metric_1 = require("../metric"); const DefaultDatapointsToAlarm = 3; var CompositeAlarmOperator; (function (CompositeAlarmOperator) { /** * trigger only if all the alarms are triggered */ CompositeAlarmOperator[CompositeAlarmOperator["AND"] = 0] = "AND"; /** * trigger if any of the alarms is triggered */ CompositeAlarmOperator[CompositeAlarmOperator["OR"] = 1] = "OR"; })(CompositeAlarmOperator || (exports.CompositeAlarmOperator = CompositeAlarmOperator = {})); class AlarmFactory { constructor(alarmScope, props) { this.alarmScope = alarmScope; this.globalAlarmDefaults = props.globalAlarmDefaults; this.globalMetricDefaults = props.globalMetricDefaults; this.alarmNamingStrategy = props.globalAlarmDefaults.alarmNamingStrategy ?? new AlarmNamingStrategy_1.AlarmNamingStrategy(props.globalAlarmDefaults.alarmNamePrefix, props.localAlarmNamePrefix, props.globalAlarmDefaults.dedupeStringProcessor); } addAlarm(metric, props) { // adjust the metric const metricAdjuster = props.metricAdjuster ? metric_adjuster_1.CompositeMetricAdjuster.of(props.metricAdjuster, metric_adjuster_1.DefaultMetricAdjuster.INSTANCE) : metric_adjuster_1.DefaultMetricAdjuster.INSTANCE; const adjustedMetric = metricAdjuster.adjustMetric(metric, this.alarmScope, props); // metric that will be ultimately used to create the alarm let alarmMetric = adjustedMetric; // prepare primary alarm properties const actionsEnabled = this.determineActionsEnabled(props.actionsEnabled, props.disambiguator); const action = this.determineAction(props.disambiguator, props.actionOverride); const alarmNamingInput = { ...props, action, }; const alarmName = this.alarmNamingStrategy.getName(alarmNamingInput); const alarmNameSuffix = props.alarmNameSuffix; const alarmLabel = this.alarmNamingStrategy.getWidgetLabel(alarmNamingInput); const alarmDescription = this.generateDescription(props.alarmDescription, props.alarmDescriptionOverride, props.runbookLink, props.documentationLink); const dedupeString = this.alarmNamingStrategy.getDedupeString(alarmNamingInput); const evaluateLowSampleCountPercentile = props.evaluateLowSampleCountPercentile ?? true; const datapointsToAlarm = props.datapointsToAlarm ?? this.globalAlarmDefaults.datapointsToAlarm ?? DefaultDatapointsToAlarm; const evaluationPeriods = props.evaluationPeriods ?? this.globalAlarmDefaults.evaluationPeriods ?? datapointsToAlarm; if (evaluationPeriods < datapointsToAlarm) { throw new Error(`evaluationPeriods must be greater than or equal to datapointsToAlarm for ${alarmName}`); } // apply metric math for minimum metric samples if (props.minSampleCountToEvaluateDatapoint) { let label = `${adjustedMetric}`; let metricExpression; let metricSampleCountId = "sampleCount"; let usingMetrics; if (adjustedMetric instanceof aws_cloudwatch_1.MathExpression) { label = adjustedMetric.label ?? label; metricExpression = `(${adjustedMetric.expression})`; if (Object.keys(adjustedMetric.usingMetrics).length === 1) { const sampleCountMetric = adjustedMetric.usingMetrics[Object.keys(adjustedMetric.usingMetrics)[0]].with({ statistic: metric_1.MetricStatistic.N, label: "Sample count", }); usingMetrics = { ...adjustedMetric.usingMetrics, [metricSampleCountId]: sampleCountMetric, }; } else if (props.sampleCountMetricId) { usingMetrics = adjustedMetric.usingMetrics; metricSampleCountId = props.sampleCountMetricId; } else { throw new Error("sampleCountMetricId must be specified when using minSampleCountToEvaluateDatapoint with a multiple-metric MathExpression"); } } else { const metricId = "metric"; metricExpression = metricId; usingMetrics = { [metricId]: adjustedMetric, [metricSampleCountId]: adjustedMetric.with({ statistic: metric_1.MetricStatistic.N, label: "Sample count", }), }; } alarmMetric = new aws_cloudwatch_1.MathExpression({ label, expression: `IF(${metricSampleCountId} > ${props.minSampleCountToEvaluateDatapoint}, ${metricExpression})`, period: adjustedMetric.period, usingMetrics, }); } // create primary alarm const primaryAlarm = alarmMetric.createAlarm(this.alarmScope, alarmName, { alarmName, alarmDescription, threshold: props.threshold, comparisonOperator: props.comparisonOperator, treatMissingData: props.treatMissingData, // default value (undefined) means "evaluate" evaluateLowSampleCountPercentile: evaluateLowSampleCountPercentile ? undefined : "ignore", datapointsToAlarm, evaluationPeriods, actionsEnabled, }); let alarm = primaryAlarm; // create composite alarm for min metric samples (if defined) // deprecated in favour of minSampleCountToEvaluateDatapoint if (!props.minSampleCountToEvaluateDatapoint && props.minMetricSamplesToAlarm) { const metricSampleCount = adjustedMetric.with({ statistic: metric_1.MetricStatistic.N, }); const noSamplesAlarm = metricSampleCount.createAlarm(this.alarmScope, `${alarmName}-NoSamples`, { alarmName: `${alarmName}-NoSamples`, alarmDescription: `The metric (${adjustedMetric}) does not have enough samples to alarm. Must have at least ${props.minMetricSamplesToAlarm}.`, threshold: props.minMetricSamplesToAlarm, comparisonOperator: aws_cloudwatch_1.ComparisonOperator.LESS_THAN_THRESHOLD, treatMissingData: aws_cloudwatch_1.TreatMissingData.BREACHING, datapointsToAlarm: 1, evaluationPeriods: 1, actionsEnabled, }); alarm = new aws_cloudwatch_1.CompositeAlarm(this.alarmScope, `${alarmName}-WithSamples`, { actionsEnabled, compositeAlarmName: `${alarmName}-WithSamples`, alarmDescription: this.joinDescriptionParts(alarmDescription, `Min number of samples to alarm: ${props.minMetricSamplesToAlarm}`), alarmRule: aws_cloudwatch_1.AlarmRule.allOf(aws_cloudwatch_1.AlarmRule.fromAlarm(primaryAlarm, aws_cloudwatch_1.AlarmState.ALARM), aws_cloudwatch_1.AlarmRule.not(aws_cloudwatch_1.AlarmRule.fromAlarm(noSamplesAlarm, aws_cloudwatch_1.AlarmState.ALARM))), }); } // attach alarm actions action.addAlarmActions({ alarm, action, dedupeString, disambiguator: props.disambiguator, customTags: props.customTags ?? [], customParams: props.customParams ?? {}, }); // create annotation for the primary alarm const annotation = this.createAnnotation({ alarm: primaryAlarm, action, metric: adjustedMetric, evaluationPeriods, datapointsToAlarm, dedupeString, minMetricSamplesToAlarm: props.minMetricSamplesToAlarm, minSampleCountToEvaluateDatapoint: props.minSampleCountToEvaluateDatapoint, fillAlarmRange: props.fillAlarmRange ?? false, overrideAnnotationColor: props.overrideAnnotationColor, overrideAnnotationLabel: props.overrideAnnotationLabel, overrideAnnotationVisibility: props.overrideAnnotationVisibility, comparisonOperator: props.comparisonOperator, threshold: props.threshold, disambiguator: props.disambiguator, customTags: props.customTags ?? [], customParams: props.customParams ?? {}, }); // return the final result return { alarm, action, alarmName, alarmNameSuffix, alarmLabel, alarmDescription, alarmDefinition: { metric, addAlarmProps: props, datapointsToAlarm, evaluationPeriods, alarmFactory: this, }, customTags: props.customTags, customParams: props.customParams, alarmRuleWhenOk: aws_cloudwatch_1.AlarmRule.fromAlarm(alarm, aws_cloudwatch_1.AlarmState.OK), alarmRuleWhenAlarming: aws_cloudwatch_1.AlarmRule.fromAlarm(alarm, aws_cloudwatch_1.AlarmState.ALARM), alarmRuleWhenInsufficientData: aws_cloudwatch_1.AlarmRule.fromAlarm(alarm, aws_cloudwatch_1.AlarmState.INSUFFICIENT_DATA), dedupeString, annotation, disambiguator: props.disambiguator, }; } addCompositeAlarm(alarms, props) { const actionsEnabled = this.determineActionsEnabled(props?.actionsEnabled, props?.disambiguator); const action = props.actionOverride ?? this.globalAlarmDefaults.action ?? (0, action_1.noopAction)(); const namingInput = { alarmNameSuffix: "Composite", ...props }; const alarmName = this.alarmNamingStrategy.getName(namingInput); const alarmDescription = this.generateDescription(props?.alarmDescription ?? "Composite alarm", props?.alarmDescriptionOverride, props?.runbookLink, props?.documentationLink); const dedupeString = this.alarmNamingStrategy.getDedupeString(namingInput); const alarmRule = this.determineCompositeAlarmRule(alarms, props); const alarm = new aws_cloudwatch_1.CompositeAlarm(this.alarmScope, alarmName, { compositeAlarmName: alarmName, alarmDescription, alarmRule, actionsEnabled, actionsSuppressor: props?.actionsSuppressor, actionsSuppressorExtensionPeriod: props?.actionsSuppressorExtensionPeriod, actionsSuppressorWaitPeriod: props?.actionsSuppressorWaitPeriod, }); action.addAlarmActions({ alarm, action, dedupeString, disambiguator: props?.disambiguator, customTags: props?.customTags, customParams: props?.customParams, }); return alarm; } determineCompositeAlarmRule(alarms, props) { const alarmRules = alarms.map((alarm) => alarm.alarmRuleWhenAlarming); const operator = props.compositeOperator ?? CompositeAlarmOperator.OR; switch (operator) { case CompositeAlarmOperator.AND: return aws_cloudwatch_1.AlarmRule.allOf(...alarmRules); case CompositeAlarmOperator.OR: return aws_cloudwatch_1.AlarmRule.anyOf(...alarmRules); default: throw new Error(`Unsupported composite alarm operator: ${operator}`); } } determineActionsEnabled(actionsEnabled, disambiguator) { if (actionsEnabled !== undefined) { // alarm-specific override to true or false return actionsEnabled; } if (typeof this.globalAlarmDefaults.actionsEnabled === "boolean") { // global defaults: boolean value return this.globalAlarmDefaults.actionsEnabled; } if (disambiguator) { // global defaults: disambiguator based value return this.globalAlarmDefaults.actionsEnabled[disambiguator] ?? false; } return false; } determineAction(disambiguator, actionOverride) { // Explicit override if (actionOverride) { return actionOverride; } // Default by disambiugator if (disambiguator && this.globalAlarmDefaults.disambiguatorAction?.[disambiguator]) { return this.globalAlarmDefaults.disambiguatorAction[disambiguator]; } // Default global action return this.globalAlarmDefaults.action ?? (0, action_1.noopAction)(); } get shouldUseDefaultDedupeForError() { return this.globalAlarmDefaults.useDefaultDedupeForError ?? true; } get shouldUseDefaultDedupeForLatency() { return this.globalAlarmDefaults.useDefaultDedupeForLatency ?? true; } generateDescription(alarmDescription, alarmDescriptionOverride, runbookLinkOverride, documentationLinkOverride) { const parts = [alarmDescriptionOverride ?? alarmDescription]; const runbookLink = runbookLinkOverride ?? this.globalAlarmDefaults.runbookLink; const documentationLink = documentationLinkOverride ?? this.globalAlarmDefaults.documentationLink; if (runbookLink) { parts.push(`Runbook: ${runbookLink}`); } if (documentationLink) { parts.push(`Documentation: ${documentationLink}`); } return this.joinDescriptionParts(...parts); } joinDescriptionParts(...parts) { return parts.join(" \r\n"); } createAnnotation(props) { const strategy = this.globalAlarmDefaults.annotationStrategy ?? new IAlarmAnnotationStrategy_1.DefaultAlarmAnnotationStrategy(); return strategy.createAnnotation(props); } } exports.AlarmFactory = AlarmFactory; _a = JSII_RTTI_SYMBOL_1; AlarmFactory[_a] = { fqn: "cdk-monitoring-constructs.AlarmFactory", version: "10.0.0" }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWxhcm1GYWN0b3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiQWxhcm1GYWN0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQ0EsK0RBYW9DO0FBR3BDLHFDQUE0RDtBQUM1RCwrREFBNEQ7QUFDNUQseUVBSW9DO0FBR3BDLHVEQUkyQjtBQUMzQixzQ0FJbUI7QUFFbkIsTUFBTSx3QkFBd0IsR0FBRyxDQUFDLENBQUM7QUFpYW5DLElBQVksc0JBVVg7QUFWRCxXQUFZLHNCQUFzQjtJQUNoQzs7T0FFRztJQUNILGlFQUFHLENBQUE7SUFFSDs7T0FFRztJQUNILCtEQUFFLENBQUE7QUFDSixDQUFDLEVBVlcsc0JBQXNCLHNDQUF0QixzQkFBc0IsUUFVakM7QUFtR0QsTUFBYSxZQUFZO0lBTXZCLFlBQVksVUFBcUIsRUFBRSxLQUF3QjtRQUN6RCxJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztRQUM3QixJQUFJLENBQUMsbUJBQW1CLEdBQUcsS0FBSyxDQUFDLG1CQUFtQixDQUFDO1FBQ3JELElBQUksQ0FBQyxvQkFBb0IsR0FBRyxLQUFLLENBQUMsb0JBQW9CLENBQUM7UUFDdkQsSUFBSSxDQUFDLG1CQUFtQjtZQUN0QixLQUFLLENBQUMsbUJBQW1CLENBQUMsbUJBQW1CO2dCQUM3QyxJQUFJLHlDQUFtQixDQUNyQixLQUFLLENBQUMsbUJBQW1CLENBQUMsZUFBZSxFQUN6QyxLQUFLLENBQUMsb0JBQW9CLEVBQzFCLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxxQkFBcUIsQ0FDaEQsQ0FBQztJQUNOLENBQUM7SUFFRCxRQUFRLENBQ04sTUFBOEIsRUFDOUIsS0FBb0I7UUFFcEIsb0JBQW9CO1FBRXBCLE1BQU0sY0FBYyxHQUFHLEtBQUssQ0FBQyxjQUFjO1lBQ3pDLENBQUMsQ0FBQyx5Q0FBdUIsQ0FBQyxFQUFFLENBQ3hCLEtBQUssQ0FBQyxjQUFjLEVBQ3BCLHVDQUFxQixDQUFDLFFBQVEsQ0FDL0I7WUFDSCxDQUFDLENBQUMsdUNBQXFCLENBQUMsUUFBUSxDQUFDO1FBQ25DLE1BQU0sY0FBYyxHQUFHLGNBQWMsQ0FBQyxZQUFZLENBQ2hELE1BQU0sRUFDTixJQUFJLENBQUMsVUFBVSxFQUNmLEtBQUssQ0FDTixDQUFDO1FBRUYsMERBQTBEO1FBQzFELElBQUksV0FBVyxHQUEyQixjQUFjLENBQUM7UUFFekQsbUNBQW1DO1FBRW5DLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FDakQsS0FBSyxDQUFDLGNBQWMsRUFDcEIsS0FBSyxDQUFDLGFBQWEsQ0FDcEIsQ0FBQztRQUNGLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQ2pDLEtBQUssQ0FBQyxhQUFhLEVBQ25CLEtBQUssQ0FBQyxjQUFjLENBQ3JCLENBQUM7UUFDRixNQUFNLGdCQUFnQixHQUFxQjtZQUN6QyxHQUFHLEtBQUs7WUFDUixNQUFNO1NBQ1AsQ0FBQztRQUNGLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUNyRSxNQUFNLGVBQWUsR0FBRyxLQUFLLENBQUMsZUFBZSxDQUFDO1FBQzlDLE1BQU0sVUFBVSxHQUNkLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUM1RCxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FDL0MsS0FBSyxDQUFDLGdCQUFnQixFQUN0QixLQUFLLENBQUMsd0JBQXdCLEVBQzlCLEtBQUssQ0FBQyxXQUFXLEVBQ2pCLEtBQUssQ0FBQyxpQkFBaUIsQ0FDeEIsQ0FBQztRQUNGLE1BQU0sWUFBWSxHQUNoQixJQUFJLENBQUMsbUJBQW1CLENBQUMsZUFBZSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDN0QsTUFBTSxnQ0FBZ0MsR0FDcEMsS0FBSyxDQUFDLGdDQUFnQyxJQUFJLElBQUksQ0FBQztRQUVqRCxNQUFNLGlCQUFpQixHQUNyQixLQUFLLENBQUMsaUJBQWlCO1lBQ3ZCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxpQkFBaUI7WUFDMUMsd0JBQXdCLENBQUM7UUFDM0IsTUFBTSxpQkFBaUIsR0FDckIsS0FBSyxDQUFDLGlCQUFpQjtZQUN2QixJQUFJLENBQUMsbUJBQW1CLENBQUMsaUJBQWlCO1lBQzFDLGlCQUFpQixDQUFDO1FBRXBCLElBQUksaUJBQWlCLEdBQUcsaUJBQWlCLEVBQUUsQ0FBQztZQUMxQyxNQUFNLElBQUksS0FBSyxDQUNiLDRFQUE0RSxTQUFTLEVBQUUsQ0FDeEYsQ0FBQztRQUNKLENBQUM7UUFFRCwrQ0FBK0M7UUFFL0MsSUFBSSxLQUFLLENBQUMsaUNBQWlDLEVBQUUsQ0FBQztZQUM1QyxJQUFJLEtBQUssR0FBVyxHQUFHLGNBQWMsRUFBRSxDQUFDO1lBQ3hDLElBQUksZ0JBQXdCLENBQUM7WUFDN0IsSUFBSSxtQkFBbUIsR0FBVyxhQUFhLENBQUM7WUFDaEQsSUFBSSxZQUFxQyxDQUFDO1lBRTFDLElBQUksY0FBYyxZQUFZLCtCQUFjLEVBQUUsQ0FBQztnQkFDN0MsS0FBSyxHQUFHLGNBQWMsQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDO2dCQUN0QyxnQkFBZ0IsR0FBRyxJQUFJLGNBQWMsQ0FBQyxVQUFVLEdBQUcsQ0FBQztnQkFFcEQsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7b0JBQzFELE1BQU0saUJBQWlCLEdBQ3JCLGNBQWMsQ0FBQyxZQUFZLENBQ3pCLE1BQU0sQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUU5QyxDQUFDLElBQUksQ0FBQzt3QkFDTCxTQUFTLEVBQUUsd0JBQWUsQ0FBQyxDQUFDO3dCQUM1QixLQUFLLEVBQUUsY0FBYztxQkFDdEIsQ0FBQyxDQUFDO29CQUVILFlBQVksR0FBRzt3QkFDYixHQUFHLGNBQWMsQ0FBQyxZQUFZO3dCQUM5QixDQUFDLG1CQUFtQixDQUFDLEVBQUUsaUJBQWlCO3FCQUN6QyxDQUFDO2dCQUNKLENBQUM7cUJBQU0sSUFBSSxLQUFLLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztvQkFDckMsWUFBWSxHQUFHLGNBQWMsQ0FBQyxZQUFZLENBQUM7b0JBQzNDLG1CQUFtQixHQUFHLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQztnQkFDbEQsQ0FBQztxQkFBTSxDQUFDO29CQUNOLE1BQU0sSUFBSSxLQUFLLENBQ2IsMEhBQTBILENBQzNILENBQUM7Z0JBQ0osQ0FBQztZQUNILENBQUM7aUJBQU0sQ0FBQztnQkFDTixNQUFNLFFBQVEsR0FBVyxRQUFRLENBQUM7Z0JBRWxDLGdCQUFnQixHQUFHLFFBQVEsQ0FBQztnQkFDNUIsWUFBWSxHQUFHO29CQUNiLENBQUMsUUFBUSxDQUFDLEVBQUUsY0FBYztvQkFDMUIsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxJQUFJLENBQUM7d0JBQ3pDLFNBQVMsRUFBRSx3QkFBZSxDQUFDLENBQUM7d0JBQzVCLEtBQUssRUFBRSxjQUFjO3FCQUN0QixDQUFDO2lCQUNILENBQUM7WUFDSixDQUFDO1lBRUQsV0FBVyxHQUFHLElBQUksK0JBQWMsQ0FBQztnQkFDL0IsS0FBSztnQkFDTCxVQUFVLEVBQUUsTUFBTSxtQkFBbUIsTUFBTSxLQUFLLENBQUMsaUNBQWlDLEtBQUssZ0JBQWdCLEdBQUc7Z0JBQzFHLE1BQU0sRUFBRSxjQUFjLENBQUMsTUFBTTtnQkFDN0IsWUFBWTthQUNiLENBQUMsQ0FBQztRQUNMLENBQUM7UUFFRCx1QkFBdUI7UUFFdkIsTUFBTSxZQUFZLEdBQUcsV0FBVyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLFNBQVMsRUFBRTtZQUN2RSxTQUFTO1lBQ1QsZ0JBQWdCO1lBQ2hCLFNBQVMsRUFBRSxLQUFLLENBQUMsU0FBUztZQUMxQixrQkFBa0IsRUFBRSxLQUFLLENBQUMsa0JBQWtCO1lBQzVDLGdCQUFnQixFQUFFLEtBQUssQ0FBQyxnQkFBZ0I7WUFDeEMsNkNBQTZDO1lBQzdDLGdDQUFnQyxFQUFFLGdDQUFnQztnQkFDaEUsQ0FBQyxDQUFDLFNBQVM7Z0JBQ1gsQ0FBQyxDQUFDLFFBQVE7WUFDWixpQkFBaUI7WUFDakIsaUJBQWlCO1lBQ2pCLGNBQWM7U0FDZixDQUFDLENBQUM7UUFFSCxJQUFJLEtBQUssR0FBYyxZQUFZLENBQUM7UUFFcEMsNkRBQTZEO1FBQzdELDREQUE0RDtRQUU1RCxJQUNFLENBQUMsS0FBSyxDQUFDLGlDQUFpQztZQUN4QyxLQUFLLENBQUMsdUJBQXVCLEVBQzdCLENBQUM7WUFDRCxNQUFNLGlCQUFpQixHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUM7Z0JBQzVDLFNBQVMsRUFBRSx3QkFBZSxDQUFDLENBQUM7YUFDN0IsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxjQUFjLEdBQUcsaUJBQWlCLENBQUMsV0FBVyxDQUNsRCxJQUFJLENBQUMsVUFBVSxFQUNmLEdBQUcsU0FBUyxZQUFZLEVBQ3hCO2dCQUNFLFNBQVMsRUFBRSxHQUFHLFNBQVMsWUFBWTtnQkFDbkMsZ0JBQWdCLEVBQUUsZUFBZSxjQUFjLCtEQUErRCxLQUFLLENBQUMsdUJBQXVCLEdBQUc7Z0JBQzlJLFNBQVMsRUFBRSxLQUFLLENBQUMsdUJBQXVCO2dCQUN4QyxrQkFBa0IsRUFBRSxtQ0FBa0IsQ0FBQyxtQkFBbUI7Z0JBQzFELGdCQUFnQixFQUFFLGlDQUFnQixDQUFDLFNBQVM7Z0JBQzVDLGlCQUFpQixFQUFFLENBQUM7Z0JBQ3BCLGlCQUFpQixFQUFFLENBQUM7Z0JBQ3BCLGNBQWM7YUFDZixDQUNGLENBQUM7WUFDRixLQUFLLEdBQUcsSUFBSSwrQkFBYyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsR0FBRyxTQUFTLGNBQWMsRUFBRTtnQkFDdEUsY0FBYztnQkFDZCxrQkFBa0IsRUFBRSxHQUFHLFNBQVMsY0FBYztnQkFDOUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLG9CQUFvQixDQUN6QyxnQkFBZ0IsRUFDaEIsbUNBQW1DLEtBQUssQ0FBQyx1QkFBdUIsRUFBRSxDQUNuRTtnQkFDRCxTQUFTLEVBQUUsMEJBQVMsQ0FBQyxLQUFLLENBQ3hCLDBCQUFTLENBQUMsU0FBUyxDQUFDLFlBQVksRUFBRSwyQkFBVSxDQUFDLEtBQUssQ0FBQyxFQUNuRCwwQkFBUyxDQUFDLEdBQUcsQ0FBQywwQkFBUyxDQUFDLFNBQVMsQ0FBQyxjQUFjLEVBQUUsMkJBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUNyRTthQUNGLENBQUMsQ0FBQztRQUNMLENBQUM7UUFFRCx1QkFBdUI7UUFFdkIsTUFBTSxDQUFDLGVBQWUsQ0FBQztZQUNyQixLQUFLO1lBQ0wsTUFBTTtZQUNOLFlBQVk7WUFDWixhQUFhLEVBQUUsS0FBSyxDQUFDLGFBQWE7WUFDbEMsVUFBVSxFQUFFLEtBQUssQ0FBQyxVQUFVLElBQUksRUFBRTtZQUNsQyxZQUFZLEVBQUUsS0FBSyxDQUFDLFlBQVksSUFBSSxFQUFFO1NBQ3ZDLENBQUMsQ0FBQztRQUVILDBDQUEwQztRQUUxQyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7WUFDdkMsS0FBSyxFQUFFLFlBQVk7WUFDbkIsTUFBTTtZQUNOLE1BQU0sRUFBRSxjQUFjO1lBQ3RCLGlCQUFpQjtZQUNqQixpQkFBaUI7WUFDakIsWUFBWTtZQUNaLHVCQUF1QixFQUFFLEtBQUssQ0FBQyx1QkFBdUI7WUFDdEQsaUNBQWlDLEVBQy9CLEtBQUssQ0FBQyxpQ0FBaUM7WUFDekMsY0FBYyxFQUFFLEtBQUssQ0FBQyxjQUFjLElBQUksS0FBSztZQUM3Qyx1QkFBdUIsRUFBRSxLQUFLLENBQUMsdUJBQXVCO1lBQ3RELHVCQUF1QixFQUFFLEtBQUssQ0FBQyx1QkFBdUI7WUFDdEQsNEJBQTRCLEVBQUUsS0FBSyxDQUFDLDRCQUE0QjtZQUNoRSxrQkFBa0IsRUFBRSxLQUFLLENBQUMsa0JBQWtCO1lBQzVDLFNBQVMsRUFBRSxLQUFLLENBQUMsU0FBUztZQUMxQixhQUFhLEVBQUUsS0FBSyxDQUFDLGFBQWE7WUFDbEMsVUFBVSxFQUFFLEtBQUssQ0FBQyxVQUFVLElBQUksRUFBRTtZQUNsQyxZQUFZLEVBQUUsS0FBSyxDQUFDLFlBQVksSUFBSSxFQUFFO1NBQ3ZDLENBQUMsQ0FBQztRQUVILDBCQUEwQjtRQUUxQixPQUFPO1lBQ0wsS0FBSztZQUNMLE1BQU07WUFDTixTQUFTO1lBQ1QsZUFBZTtZQUNmLFVBQVU7WUFDVixnQkFBZ0I7WUFDaEIsZUFBZSxFQUFFO2dCQUNmLE1BQU07Z0JBQ04sYUFBYSxFQUFFLEtBQUs7Z0JBQ3BCLGlCQUFpQjtnQkFDakIsaUJBQWlCO2dCQUNqQixZQUFZLEVBQUUsSUFBSTthQUNuQjtZQUNELFVBQVUsRUFBRSxLQUFLLENBQUMsVUFBVTtZQUM1QixZQUFZLEVBQUUsS0FBSyxDQUFDLFlBQVk7WUFDaEMsZUFBZSxFQUFFLDBCQUFTLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSwyQkFBVSxDQUFDLEVBQUUsQ0FBQztZQUMxRCxxQkFBcUIsRUFBRSwwQkFBUyxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsMkJBQVUsQ0FBQyxLQUFLLENBQUM7WUFDbkUsNkJBQTZCLEVBQUUsMEJBQVMsQ0FBQyxTQUFTLENBQ2hELEtBQUssRUFDTCwyQkFBVSxDQUFDLGlCQUFpQixDQUM3QjtZQUNELFlBQVk7WUFDWixVQUFVO1lBQ1YsYUFBYSxFQUFFLEtBQUssQ0FBQyxhQUFhO1NBQ25DLENBQUM7SUFDSixDQUFDO0lBRUQsaUJBQWlCLENBQ2YsTUFBNkIsRUFDN0IsS0FBNkI7UUFFN0IsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUNqRCxLQUFLLEVBQUUsY0FBYyxFQUNyQixLQUFLLEVBQUUsYUFBYSxDQUNyQixDQUFDO1FBQ0YsTUFBTSxNQUFNLEdBQ1YsS0FBSyxDQUFDLGNBQWMsSUFBSSxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxJQUFJLElBQUEsbUJBQVUsR0FBRSxDQUFDO1FBQzFFLE1BQU0sV0FBVyxHQUFHLEVBQUUsZUFBZSxFQUFFLFdBQVcsRUFBRSxHQUFHLEtBQUssRUFBRSxDQUFDO1FBQy9ELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDaEUsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQy9DLEtBQUssRUFBRSxnQkFBZ0IsSUFBSSxpQkFBaUIsRUFDNUMsS0FBSyxFQUFFLHdCQUF3QixFQUMvQixLQUFLLEVBQUUsV0FBVyxFQUNsQixLQUFLLEVBQUUsaUJBQWlCLENBQ3pCLENBQUM7UUFDRixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzNFLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFbEUsTUFBTSxLQUFLLEdBQUcsSUFBSSwrQkFBYyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsU0FBUyxFQUFFO1lBQzNELGtCQUFrQixFQUFFLFNBQVM7WUFDN0IsZ0JBQWdCO1lBQ2hCLFNBQVM7WUFDVCxjQUFjO1lBQ2QsaUJBQWlCLEVBQUUsS0FBSyxFQUFFLGlCQUFpQjtZQUMzQyxnQ0FBZ0MsRUFBRSxLQUFLLEVBQUUsZ0NBQWdDO1lBQ3pFLDJCQUEyQixFQUFFLEtBQUssRUFBRSwyQkFBMkI7U0FDaEUsQ0FBQyxDQUFDO1FBRUgsTUFBTSxDQUFDLGVBQWUsQ0FBQztZQUNyQixLQUFLO1lBQ0wsTUFBTTtZQUNOLFlBQVk7WUFDWixhQUFhLEVBQUUsS0FBSyxFQUFFLGFBQWE7WUFDbkMsVUFBVSxFQUFFLEtBQUssRUFBRSxVQUFVO1lBQzdCLFlBQVksRUFBRSxLQUFLLEVBQUUsWUFBWTtTQUNsQyxDQUFDLENBQUM7UUFFSCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFUywyQkFBMkIsQ0FDbkMsTUFBNkIsRUFDN0IsS0FBNkI7UUFFN0IsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDdEUsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLGlCQUFpQixJQUFJLHNCQUFzQixDQUFDLEVBQUUsQ0FBQztRQUN0RSxRQUFRLFFBQVEsRUFBRSxDQUFDO1lBQ2pCLEtBQUssc0JBQXNCLENBQUMsR0FBRztnQkFDN0IsT0FBTywwQkFBUyxDQUFDLEtBQUssQ0FBQyxHQUFHLFVBQVUsQ0FBQyxDQUFDO1lBQ3hDLEtBQUssc0JBQXNCLENBQUMsRUFBRTtnQkFDNUIsT0FBTywwQkFBUyxDQUFDLEtBQUssQ0FBQyxHQUFHLFVBQVUsQ0FBQyxDQUFDO1lBQ3hDO2dCQUNFLE1BQU0sSUFBSSxLQUFLLENBQUMseUNBQXlDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDekUsQ0FBQztJQUNILENBQUM7SUFFUyx1QkFBdUIsQ0FDL0IsY0FBd0IsRUFDeEIsYUFBc0I7UUFFdEIsSUFBSSxjQUFjLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDakMsMkNBQTJDO1lBQzNDLE9BQU8sY0FBYyxDQUFDO1FBQ3hCLENBQUM7UUFDRCxJQUFJLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDLGNBQWMsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUNqRSxpQ0FBaUM7WUFDakMsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUMsY0FBYyxDQUFDO1FBQ2pELENBQUM7UUFDRCxJQUFJLGFBQWEsRUFBRSxDQUFDO1lBQ2xCLDZDQUE2QztZQUM3QyxPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUFDLElBQUksS0FBSyxDQUFDO1FBQ3pFLENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFUyxlQUFlLENBQ3ZCLGFBQXNCLEVBQ3RCLGNBQXFDO1FBRXJDLG9CQUFvQjtRQUNwQixJQUFJLGNBQWMsRUFBRSxDQUFDO1lBQ25CLE9BQU8sY0FBYyxDQUFDO1FBQ3hCLENBQUM7UUFFRCwyQkFBMkI7UUFDM0IsSUFDRSxhQUFhO1lBQ2IsSUFBSSxDQUFDLG1CQUFtQixDQUFDLG1CQUFtQixFQUFFLENBQUMsYUFBYSxDQUFDLEVBQzdELENBQUM7WUFDRCxPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUNyRSxDQUFDO1FBRUQsd0JBQXdCO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sSUFBSSxJQUFBLG1CQUFVLEdBQUUsQ0FBQztJQUN6RCxDQUFDO0lBRUQsSUFBSSw4QkFBOEI7UUFDaEMsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUMsd0JBQXdCLElBQUksSUFBSSxDQUFDO0lBQ25FLENBQUM7SUFFRCxJQUFJLGdDQUFnQztRQUNsQyxPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQywwQkFBMEIsSUFBSSxJQUFJLENBQUM7SUFDckUsQ0FBQztJQUVTLG1CQUFtQixDQUMzQixnQkFBd0IsRUFDeEIsd0JBQWlDLEVBQ2pDLG1CQUE0QixFQUM1Qix5QkFBa0M7UUFFbEMsTUFBTSxLQUFLLEdBQUcsQ0FBQyx3QkFBd0IsSUFBSSxnQkFBZ0IsQ0FBQyxDQUFDO1FBRTdELE1BQU0sV0FBVyxHQUNmLG1CQUFtQixJQUFJLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLENBQUM7UUFDOUQsTUFBTSxpQkFBaUIsR0FDckIseUJBQXlCLElBQUksSUFBSSxDQUFDLG1CQUFtQixDQUFDLGlCQUFpQixDQUFDO1FBRTFFLElBQUksV0FBVyxFQUFFLENBQUM7WUFDaEIsS0FBSyxDQUFDLElBQUksQ0FBQyxZQUFZLFdBQVcsRUFBRSxDQUFDLENBQUM7UUFDeEMsQ0FBQztRQUVELElBQUksaUJBQWlCLEVBQUUsQ0FBQztZQUN0QixLQUFLLENBQUMsSUFBSSxDQUFDLGtCQUFrQixpQkFBaUIsRUFBRSxDQUFDLENBQUM7UUFDcEQsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVTLG9CQUFvQixDQUFDLEdBQUcsS0FBZTtRQUMvQyxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVTLGdCQUFnQixDQUFDLEtBQW1DO1FBQzVELE1BQU0sUUFBUSxHQUNaLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxrQkFBa0I7WUFDM0MsSUFBSSx5REFBOEIsRUFBRSxDQUFDO1FBQ3ZDLE9BQU8sUUFBUSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzFDLENBQUM7O0FBaFpILG9DQWlaQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IER1cmF0aW9uIH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQge1xuICBBbGFybUJhc2UsXG4gIEFsYXJtUnVsZSxcbiAgQWxhcm1TdGF0ZSxcbiAgQ29tcGFyaXNvbk9wZXJhdG9yLFxuICBDb21wb3NpdGVBbGFybSxcbiAgSG9yaXpvbnRhbEFubm90YXRpb24sXG4gIElBbGFybSxcbiAgSUFsYXJtUnVsZSxcbiAgSU1ldHJpYyxcbiAgTWF0aEV4cHJlc3Npb24sXG4gIE1ldHJpYyxcbiAgVHJlYXRNaXNzaW5nRGF0YSxcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1jbG91ZHdhdGNoXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuXG5pbXBvcnQgeyBJQWxhcm1BY3Rpb25TdHJhdGVneSwgbm9vcEFjdGlvbiB9IGZyb20gXCIuL2FjdGlvblwiO1xuaW1wb3J0IHsgQWxhcm1OYW1pbmdTdHJhdGVneSB9IGZyb20gXCIuL0FsYXJtTmFtaW5nU3RyYXRlZ3lcIjtcbmltcG9ydCB7XG4gIEFsYXJtQW5ub3RhdGlvblN0cmF0ZWd5UHJvcHMsXG4gIERlZmF1bHRBbGFybUFubm90YXRpb25TdHJhdGVneSxcbiAgSUFsYXJtQW5ub3RhdGlvblN0cmF0ZWd5LFxufSBmcm9tIFwiLi9JQWxhcm1Bbm5vdGF0aW9uU3RyYXRlZ3lcIjtcbmltcG9ydCB7IElBbGFybURlZHVwZVN0cmluZ1Byb2Nlc3NvciB9IGZyb20gXCIuL0lBbGFybURlZHVwZVN0cmluZ1Byb2Nlc3NvclwiO1xuaW1wb3J0IHsgQWxhcm1OYW1pbmdJbnB1dCwgSUFsYXJtTmFtaW5nU3RyYXRlZ3kgfSBmcm9tIFwiLi9JQWxhcm1OYW1pbmdTdHJhdGVneVwiO1xuaW1wb3J0IHtcbiAgQ29tcG9zaXRlTWV0cmljQWRqdXN0ZXIsXG4gIERlZmF1bHRNZXRyaWNBZGp1c3RlcixcbiAgSU1ldHJpY0FkanVzdGVyLFxufSBmcm9tIFwiLi9tZXRyaWMtYWRqdXN0ZXJcIjtcbmltcG9ydCB7XG4gIE1ldHJpY0ZhY3RvcnlEZWZhdWx0cyxcbiAgTWV0cmljU3RhdGlzdGljLFxuICBNZXRyaWNXaXRoQWxhcm1TdXBwb3J0LFxufSBmcm9tIFwiLi4vbWV0cmljXCI7XG5cbmNvbnN0IERlZmF1bHREYXRhcG9pbnRzVG9BbGFybSA9IDM7XG5cbi8qKlxuICogQ29tbW9ubHkgdXNlZCBkaXNhbWJpZ3VhdG9ycy5cbiAqL1xuZXhwb3J0IHR5cGUgUHJlZGVmaW5lZEFsYXJtRGlzYW1iaWd1YXRvcnMgPSBcIldhcm5pbmdcIiB8IFwiQ3JpdGljYWxcIjtcblxuLyoqXG4gKiBNZXRhZGF0YSBvZiBhbiBhbGFybS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBbGFybU1ldGFkYXRhIHtcbiAgcmVhZG9ubHkgYWN0aW9uOiBJQWxhcm1BY3Rpb25TdHJhdGVneTtcbiAgcmVhZG9ubHkgZGVkdXBlU3RyaW5nPzogc3RyaW5nO1xuICByZWFkb25seSBkaXNhbWJpZ3VhdG9yPzogc3RyaW5nO1xuICByZWFkb25seSBjdXN0b21UYWdzPzogc3RyaW5nW107XG4gIHJlYWRvbmx5IGN1c3RvbVBhcmFtcz86IFJlY29yZDxzdHJpbmcsIGFueT47XG59XG5cbi8qKlxuICogUmVwcmVzZW50YXRpb24gb2YgYW4gYWxhcm0gd2l0aCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFsYXJtV2l0aEFubm90YXRpb24gZXh0ZW5kcyBBbGFybU1ldGFkYXRhIHtcbiAgcmVhZG9ubHkgYWxhcm06IEFsYXJtQmFzZTtcbiAgcmVhZG9ubHkgYWxhcm1OYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGFsYXJtTmFtZVN1ZmZpeDogc3RyaW5nO1xuICByZWFkb25seSBhbGFybUxhYmVsOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGFsYXJtRGVzY3JpcHRpb246IHN0cmluZztcbiAgcmVhZG9ubHkgYWxhcm1EZWZpbml0aW9uOiBBbGFybUNyZWF0ZURlZmluaXRpb247XG4gIHJlYWRvbmx5IGFsYXJtUnVsZVdoZW5PazogSUFsYXJtUnVsZTtcbiAgcmVhZG9ubHkgYWxhcm1SdWxlV2hlbkFsYXJtaW5nOiBJQWxhcm1SdWxlO1xuICByZWFkb25seSBhbGFybVJ1bGVXaGVuSW5zdWZmaWNpZW50RGF0YTogSUFsYXJtUnVsZTtcbiAgcmVhZG9ubHkgYW5ub3RhdGlvbjogSG9yaXpvbnRhbEFubm90YXRpb247XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBuZWNlc3NhcnkgdG8gY3JlYXRlIGEgc2luZ2xlIGFsYXJtIGFuZCBjb25maWd1cmUgaXQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWRkQWxhcm1Qcm9wcyB7XG4gIC8qKlxuICAgKiBBbGxvd3MgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgYWN0aW9uIHN0cmF0ZWd5LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGRlZmF1bHQgYWN0aW9uIHdpbGwgYmUgdXNlZFxuICAgKi9cbiAgcmVhZG9ubHkgYWN0aW9uT3ZlcnJpZGU/OiBJQWxhcm1BY3Rpb25TdHJhdGVneTtcblxuICAvKipcbiAgICogSWYgdGhpcyBpcyBkZWZpbmVkLCB0aGUgYWxhcm0gZGVkdXBlIHN0cmluZyBpcyBzZXQgdG8gdGhpcyBleGFjdCB2YWx1ZS5cbiAgICogUGxlYXNlIGJlIGF3YXJlIHRoYXQgeW91IG5lZWQgdG8gaGFuZGxlIGRlZHVwaW5nIGZvciBkaWZmZXJlbnQgc3RhZ2VzIChCZXRhLCBQcm9kLi4uKSBhbmQgcmVnaW9ucyAoRVUsIE5BLi4uKSBtYW51YWxseS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSB1bmRlZmluZWQgKG5vIG92ZXJyaWRlKVxuICAgKi9cbiAgcmVhZG9ubHkgZGVkdXBlU3RyaW5nT3ZlcnJpZGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIElmIHRoaXMgaXMgZGVmaW5lZCwgdGhlIGFsYXJtIG5hbWUgaXMgc2V0IHRvIHRoaXMgZXhhY3QgdmFsdWUuXG4gICAqIFBsZWFzZSBiZSBhd2FyZSB0aGF0IHlvdSBuZWVkIHRvIHNwZWNpZnkgcHJlZml4IGZvciBkaWZmZXJlbnQgc3RhZ2VzIChCZXRhLCBQcm9kLi4uKSBhbmQgcmVnaW9ucyAoRVUsIE5BLi4uKSBtYW51YWxseS5cbiAgICovXG4gIHJlYWRvbmx5IGFsYXJtTmFtZU92ZXJyaWRlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIHRleHQgaW5jbHVkZWQgaW4gdGhlIGdlbmVyYXRlZCB0aWNrZXQgZGVzY3JpcHRpb24gYm9keSwgd2hpY2ggZnVsbHkgcmVwbGFjZXMgdGhlIGdlbmVyYXRlZCB0ZXh0LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGRlZmF1bHQgYXV0by1nZW5lcmF0ZWQgY29udGVudCBvbmx5XG4gICAqL1xuICByZWFkb25seSBhbGFybURlc2NyaXB0aW9uT3ZlcnJpZGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIERpc2FtYmlndWF0b3IgaXMgYSBzdHJpbmcgdGhhdCBkaWZmZXJlbnRpYXRlcyB0aGlzIGFsYXJtIGZyb20gb3RoZXIgc2ltaWxhciBvbmVzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHVuZGVmaW5lZCAobm8gZGlzYW1iaWd1YXRvcilcbiAgICovXG4gIHJlYWRvbmx5IGRpc2FtYmlndWF0b3I/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFsYXJtIGRlc2NyaXB0aW9uIGlzIGluY2x1ZGVkIGluIHRoZSB0aWNrZXQgYW5kIHRoZXJlZm9yZSBzaG91bGQgZGVzY3JpYmUgd2hhdCBoYXBwZW5lZCwgd2l0aCBhcyBtdWNoIGNvbnRleHQgYXMgcG9zc2libGUuXG4gICAqL1xuICByZWFkb25seSBhbGFybURlc2NyaXB0aW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIG9wdGlvbmFsIGxpbmsgaW5jbHVkZWQgaW4gdGhlIGdlbmVyYXRlZCB0aWNrZXQgZGVzY3JpcHRpb24gYm9keS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBhZGRpdGlvbmFsIGxpbmsgd2lsbCBiZSBhZGRlZFxuICAgKi9cbiAgcmVhZG9ubHkgZG9jdW1lbnRhdGlvbkxpbms/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIG9wdGlvbmFsIGxpbmsgaW5jbHVkZWQgaW4gdGhlIGdlbmVyYXRlZCB0aWNrZXQgZGVzY3JpcHRpb24gYm9keS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBhZGRpdGlvbmFsIGxpbmsgd2lsbCBiZSBhZGRlZFxuICAgKi9cbiAgcmVhZG9ubHkgcnVuYm9va0xpbms/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFN1ZmZpeCBhZGRlZCB0byBiYXNlIGFsYXJtIG5hbWUuIEFsYXJtIG5hbWVzIG5lZWQgdG8gYmUgdW5pcXVlLlxuICAgKi9cbiAgcmVhZG9ubHkgYWxhcm1OYW1lU3VmZml4OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIElmIHRoaXMgaXMgZGVmaW5lZCwgdGhlIGRlZmF1bHQgcmVzb3VyY2Utc3BlY2lmaWMgYWxhcm0gZGVkdXBlIHN0cmluZyB3aWxsIGJlIHNldCBhbmQgdGhpcyB3aWxsIGJlIGFkZGVkIGFzIGEgc3VmZml4LlxuICAgKiBUaGlzIGFsbG93cyB5b3UgdG8gc3BlY2lmeSB0aGUgc2FtZSBkZWR1cGUgc3RyaW5nIGZvciBhIGZhbWlseSBvZiBhbGFybXMuXG4gICAqIENhbm5vdCBiZSBkZWZpbmVkIGF0IHRoZSBzYW1lIHRpbWUgYXMgYWxhcm1EZWR1cGVTdHJpbmdPdmVycmlkZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSB1bmRlZmluZWQgKG5vIHN1ZmZpeClcbiAgICovXG4gIHJlYWRvbmx5IGFsYXJtRGVkdXBlU3RyaW5nU3VmZml4Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBFbmFibGVzIHRoZSBjb25maWd1cmVkIENsb3VkV2F0Y2ggYWxhcm0gdGlja2V0aW5nIGFjdGlvbnMuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdGhlIHNhbWUgYXMgbW9uaXRvcmluZyBmYWNhZGUgZGVmYXVsdFxuICAgKi9cbiAgcmVhZG9ubHkgYWN0aW9uc0VuYWJsZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaHJlc2hvbGQgdG8gYWxhcm0gb24uXG4gICAqL1xuICByZWFkb25seSB0aHJlc2hvbGQ6IG51bWJlcjtcblxuICAvKipcbiAgICogQ29tcGFyaXNvbiBvcGVyYXRvciB1c2VkIHRvIGNvbXBhcmUgYWN0dWFsIHZhbHVlIGFnYWluc3QgdGhlIHRocmVzaG9sZC5cbiAgICovXG4gIHJlYWRvbmx5IGNvbXBhcmlzb25PcGVyYXRvcjogQ29tcGFyaXNvbk9wZXJhdG9yO1xuXG4gIC8qKlxuICAgKiBCZWhhdmlvdXIgaW4gY2FzZSB0aGUgbWV0cmljIGRhdGEgaXMgbWlzc2luZy5cbiAgICovXG4gIHJlYWRvbmx5IHRyZWF0TWlzc2luZ0RhdGE6IFRyZWF0TWlzc2luZ0RhdGE7XG5cbiAgLyoqXG4gICAqIE51bWJlciBvZiBicmVhY2hlcyByZXF1aXJlZCB0byB0cmFuc2l0aW9uIGludG8gYW4gQUxBUk0gc3RhdGUuXG4gICAqL1xuICByZWFkb25seSBkYXRhcG9pbnRzVG9BbGFybT86IG51bWJlcjtcblxuICAvKipcbiAgICogTnVtYmVyIG9mIHBlcmlvZHMgdG8gY29uc2lkZXIgd2hlbiBjaGVja2luZyB0aGUgbnVtYmVyIG9mIGJyZWFjaGluZyBkYXRhcG9pbnRzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIFNhbWUgYXMgZGF0YXBvaW50c1RvQWxhcm0uXG4gICAqL1xuICByZWFkb25seSBldmFsdWF0aW9uUGVyaW9kcz86IG51bWJlcjtcblxuICAvKipcbiAgICogUGVyaW9kIG92ZXJyaWRlIGZvciB0aGUgbWV0cmljIHRvIGFsYXJtIG9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHRoZSBkZWZhdWx0IHNwZWNpZmllZCBpbiBNZXRyaWNGYWN0b3J5XG4gICAqL1xuICByZWFkb25seSBwZXJpb2Q/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogVXNlZCBvbmx5IGZvciBhbGFybXMgYmFzZWQgb24gcGVyY2VudGlsZXMuXG4gICAqIElmIHlvdSBzcGVjaWZ5IDxjb2RlPmZhbHNlPC9jb2RlPiwgdGhlIGFsYXJtIHN0YXRlIGRvZXMgbm90IGNoYW5nZSBkdXJpbmcgcGVyaW9kcyB3aXRoIHRvbyBmZXcgZGF0YSBwb2ludHMgdG8gYmUgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudC5cbiAgICogSWYgeW91IHNwZWNpZnkgPGNvZGU+dHJ1ZTwvY29kZT4sIHRoZSBhbGFybSBpcyBhbHdheXMgZXZhbHVhdGVkIGFuZCBwb3NzaWJseSBjaGFuZ2VzIHN0YXRlIG5vIG1hdHRlciBob3cgbWFueSBkYXRhIHBvaW50cyBhcmUgYXZhaWxhYmxlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHRydWVcbiAgICovXG4gIHJlYWRvbmx5IGV2YWx1YXRlTG93U2FtcGxlQ291bnRQZXJjZW50aWxlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIGhvdyBtYW55IHNhbXBsZXMgKE4pIG9mIHRoZSBtZXRyaWMgaXMgbmVlZGVkIGluIGEgZGF0YXBvaW50IHRvIGJlIGV2YWx1YXRlZCBmb3IgYWxhcm1pbmcuXG4gICAqIElmIHRoaXMgcHJvcGVydHkgaXMgc3BlY2lmaWVkLCB5b3VyIG1ldHJpYyB3aWxsIGJlIHN1YmplY3QgdG8gTWF0aEV4cHJlc3Npb24gdGhhdCB3aWxsIGFkZCBhbiBJRiBjb25kaXRpb25cbiAgICogdG8geW91ciBtZXRyaWMgdG8gbWFrZSBzdXJlIHRoYXQgZWFjaCBkYXRhcG9pbnQgaXMgZXZhbHVhdGVkIG9ubHkgaWYgaXQgaGFzIHN1ZmZpY2llbnQgbnVtYmVyIG9mIHNhbXBsZXMuXG4gICAqIElmIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBpcyBub3Qgc3VmZmljaWVudCwgdGhlIGRhdGFwb2ludCB3aWxsIGJlIHRyZWF0ZWQgYXMgbWlzc2luZyBkYXRhIGFuZCB3aWxsIGJlIGV2YWx1YXRlZFxuICAgKiBhY2NvcmRpbmcgdG8gdGhlIHRyZWF0TWlzc2luZ0RhdGEgcGFyYW1ldGVyLlxuICAgKiBJZiBzcGVjaWZpZWQsIGRlcHJlY2F0ZWQgbWluTWV0cmljU2FtcGxlc1RvQWxhcm0gaGFzIG5vIGVmZmVjdC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBkZWZhdWx0IGJlaGF2aW91ciAtIG5vIGNvbmRpdGlvbiBvbiBzYW1wbGUgY291bnQgd2lsbCBiZSB1c2VkXG4gICAqL1xuICByZWFkb25seSBtaW5TYW1wbGVDb3VudFRvRXZhbHVhdGVEYXRhcG9pbnQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoaXMgcHJvcGVydHkgaXMgcmVxdWlyZWQgaW4gdGhlIGZvbGxvd2luZyBzaXR1YXRpb246XG4gICAqIDxvbD5cbiAgICogICAgIDxsaT48Y29kZT5taW5TYW1wbGVDb3VudFRvRXZhbHVhdGVEYXRhcG9pbnQ8L2NvZGU+IGlzIHNwZWNpZmllZDwvbGk+XG4gICAqICAgICA8bGk+dGhlIG1ldHJpYyB1c2VkIGZvciB0aGUgYWxhcm0gaXMgYSA8Y29kZT5NYXRoRXhwcmVzc2lvbjwvY29kZT48L2xpPlxuICAgKiAgICAgPGxpPnRoZSA8Y29kZT5NYXRoRXhwcmVzc2lvbjwvY29kZT4gaXMgY29tcG9zZWQgb2YgbW9yZSB0aGFuIG9uZSBtZXRyaWM8L2xpPlxuICAgKiA8L29sPlxuICAgKlxuICAgKiBJbiB0aGlzIHNpdHVhdGlvbiwgdGhpcyBwcm9wZXJ0eSBpbmRpY2F0ZXMgdGhlIG1ldHJpYyBJZCBpbiB0aGUgTWF0aEV4cHJlc3Npb27igJlzIDxjb2RlPnVzaW5nTWV0cmljczwvY29kZT5cbiAgICogcHJvcGVydHkgdGhhdCBzaG91bGQgYmUgdXNlZCBhcyB0aGUgc2FtcGxlQ291bnQgbWV0cmljIGZvciB0aGUgbmV3IE1hdGhFeHByZXNzaW9uIGFzIGRlc2NyaWJlZCBpbiB0aGUgZG9jdW1lbnRhdGlvblxuICAgKiBmb3IgPGNvZGU+bWluU2FtcGxlQ291bnRUb0V2YWx1YXRlRGF0YXBvaW50PC9jb2RlPi5cbiAgICovXG4gIHJlYWRvbmx5IHNhbXBsZUNvdW50TWV0cmljSWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyBob3cgbWFueSBzYW1wbGVzIChOKSBvZiB0aGUgbWV0cmljIGlzIG5lZWRlZCB0byB0cmlnZ2VyIHRoZSBhbGFybS5cbiAgICogSWYgdGhpcyBwcm9wZXJ0eSBpcyBzcGVjaWZpZWQsIGFuIGFydGlmaWNpYWwgY29tcG9zaXRlIGFsYXJtIGlzIGNyZWF0ZWQgb2YgdGhlIGZvbGxvd2luZzpcbiAgICogPHVsPlxuICAgKiA8bGk+VGhlIG9yaWdpbmFsIGFsYXJtLCBjcmVhdGVkIHdpdGhvdXQgdGhpcyBwcm9wZXJ0eSBiZWluZyB1c2VkOyB0aGlzIGFsYXJtIHdpbGwgaGF2ZSBubyBhY3Rpb25zIHNldC48L2xpPlxuICAgKiA8bGk+QSBzZWNvbmRhcnkgYWxhcm0sIHdoaWNoIHdpbGwgbW9uaXRvciB0aGUgc2FtZSBtZXRyaWMgd2l0aCB0aGUgTiAoU2FtcGxlQ291bnQpIHN0YXRpc3RpYywgY2hlY2tpbmcgdGhlIHNhbXBsZSBjb3VudC48L2xpPlxuICAgKiA8L3VsPlxuICAgKiBUaGUgbmV3bHkgY3JlYXRlZCBjb21wb3NpdGUgYWxhcm0gd2lsbCBiZSByZXR1cm5lZCBhcyBhIHJlc3VsdCwgYW5kIGl0IHdpbGwgdGFrZSB0aGUgb3JpZ2luYWwgYWxhcm0gYWN0aW9ucy5cbiAgICogQGRlZmF1bHQgLSBkZWZhdWx0IGJlaGF2aW91ciAtIG5vIGNvbmRpdGlvbiBvbiBzYW1wbGUgY291bnQgd2lsbCBiZSBhZGRlZCB0byB0aGUgYWxhcm1cbiAgICogQGRlcHJlY2F0ZWQgVXNlIG1pblNhbXBsZUNvdW50VG9FdmFsdWF0ZURhdGFwb2ludCBpbnN0ZWFkLiBtaW5NZXRyaWNTYW1wbGVzQWxhcm0gdXNlcyBkaWZmZXJlbnQgZXZhbHVhdGlvblxuICAgKiAgIHBlcmlvZCBmb3IgaXRzIGNoaWxkIGFsYXJtcywgc28gaXQgZG9lc24ndCBndWFyYW50ZWUgdGhhdCBlYWNoIGRhdGFwb2ludCBpbiB0aGUgZXZhbHVhdGlvbiBwZXJpb2QgaGFzXG4gICAqICAgc3VmZmljaWVudCBudW1iZXIgb2Ygc2FtcGxlc1xuICAgKi9cbiAgcmVhZG9ubHkgbWluTWV0cmljU2FtcGxlc1RvQWxhcm0/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoaXMgYWxsb3dzIHVzZXIgdG8gYXR0YWNoIGN1c3RvbSB2YWx1ZXMgdG8gdGhpcyBhbGFybSwgd2hpY2ggY2FuIGxhdGVyIGJlIGFjY2Vzc2VkIGZyb20gdGhlIFwidXNlQ3JlYXRlZEFsYXJtc1wiIG1ldGhvZC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyB0YWdzXG4gICAqL1xuICByZWFkb25seSBjdXN0b21UYWdzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFRoaXMgYWxsb3dzIHVzZXIgdG8gYXR0YWNoIGN1c3RvbSBwYXJhbWV0ZXJzIHRvIHRoaXMgYWxhcm0sIHdoaWNoIGNhbiBsYXRlciBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBcInVzZUNyZWF0ZWRBbGFybXNcIiBtZXRob2QuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gcGFyYW1ldGVyc1xuICAgKi9cbiAgcmVhZG9ubHkgY3VzdG9tUGFyYW1zPzogUmVjb3JkPHN0cmluZywgYW55PjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGFsYXJtaW5nIHJhbmdlIG9mIHZhbHVlcyBzaG91bGQgYmUgaGlnaGxpZ2h0ZWQgaW4gdGhlIHdpZGdldC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgZmlsbEFsYXJtUmFuZ2U/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJZiBzcGVjaWZpZWQsIGl0IG1vZGlmaWVzIHRoZSBmaW5hbCBhbGFybSBhbm5vdGF0aW9uIGNvbG9yLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIG92ZXJyaWRlIChkZWZhdWx0IGNvbG9yKVxuICAgKi9cbiAgcmVhZG9ubHkgb3ZlcnJpZGVBbm5vdGF0aW9uQ29sb3I/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIElmIHNwZWNpZmllZCwgaXQgbW9kaWZpZXMgdGhlIGZpbmFsIGFsYXJtIGFubm90YXRpb24gbGFiZWwuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gb3ZlcnJpZGUgKGRlZmF1bHQgbGFiZWwpXG4gICAqL1xuICByZWFkb25seSBvdmVycmlkZUFubm90YXRpb25MYWJlbD86IHN0cmluZztcblxuICAvKipcbiAgICogSWYgc3BlY2lmaWVkLCBpdCBtb2RpZmllcyB0aGUgZmluYWwgYWxhcm0gYW5ub3RhdGlvbiB2aXNpYmlsaXR5LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIG92ZXJyaWRlIChkZWZhdWx0IHZpc2liaWxpdHkpXG4gICAqL1xuICByZWFkb25seSBvdmVycmlkZUFubm90YXRpb25WaXNpYmlsaXR5PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSWYgc3BlY2lmaWVkLCBhZGp1c3RzIHRoZSBtZXRyaWMgYmVmb3JlIGNyZWF0aW5nIGFuIGFsYXJtIGZyb20gaXQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gYWRqdXN0ZXJcbiAgICovXG4gIHJlYWRvbmx5IG1ldHJpY0FkanVzdGVyPzogSU1ldHJpY0FkanVzdGVyO1xufVxuXG4vKipcbiAqIERlc2NyaWJlcyB0aGUgaW5wdXRzIHRvIGEgc2luZ2xlIGFsYXJtJ3MgY3JlYXRpb24gYW5kIGNvbmZpZ3VyYXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWxhcm1DcmVhdGVEZWZpbml0aW9uIHtcbiAgLyoqXG4gICAqIFRoZSBvcmlnaW5hbCwgdW5hZGp1c3RlZCBtZXRyaWMgb24gd2hpY2ggdGhlIGFsYXJtIHdhcyBjcmVhdGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgbWV0cmljOiBNZXRyaWNXaXRoQWxhcm1TdXBwb3J0O1xuXG4gIC8qKlxuICAgKiBUaGUgcmVxdWVzdGVkIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBhbGFybS5cbiAgICovXG4gIHJlYWRvbmx5IGFkZEFsYXJtUHJvcHM6IEFkZEFsYXJtUHJvcHM7XG5cbiAgLyoqXG4gICAqIE51bWJlciBvZiBicmVhY2hlcyByZXF1aXJlZCB0byB0cmFuc2l0aW9uIGludG8gYW4gQUxBUk0gc3RhdGUuXG4gICAqL1xuICByZWFkb25seSBkYXRhcG9pbnRzVG9BbGFybTogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBOdW1iZXIgb2YgcGVyaW9kcyB0byBjb25zaWRlciB3aGVuIGNoZWNraW5nIHRoZSBudW1iZXIgb2YgYnJlYWNoaW5nIGRhdGFwb2ludHMuXG4gICAqL1xuICByZWFkb25seSBldmFsdWF0aW9uUGVyaW9kczogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgYWxhcm0gZmFjdG9yeSB0aGF0IGNyZWF0ZWQgdGhlIGFsYXJtLlxuICAgKi9cbiAgcmVhZG9ubHkgYWxhcm1GYWN0b3J5OiBBbGFybUZhY3Rvcnk7XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBuZWNlc3NhcnkgdG8gY3JlYXRlIGEgY29tcG9zaXRlIGFsYXJtIGFuZCBjb25maWd1cmUgaXQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWRkQ29tcG9zaXRlQWxhcm1Qcm9wcyB7XG4gIC8qKlxuICAgKiBBbGxvd3MgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgYWN0aW9uIHN0cmF0ZWd5LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGRlZmF1bHQgYWN0aW9uIHdpbGwgYmUgdXNlZFxuICAgKi9cbiAgcmVhZG9ubHkgYWN0aW9uT3ZlcnJpZGU/OiBJQWxhcm1BY3Rpb25TdHJhdGVneTtcblxuICAvKipcbiAgICogSWYgdGhpcyBpcyBkZWZpbmVkLCB0aGUgYWxhcm0gZGVkdXBlIHN0cmluZyBpcyBzZXQgdG8gdGhpcyBleGFjdCB2YWx1ZS5cbiAgICogUGxlYXNlIGJlIGF3YXJlIHRoYXQgeW91IG5lZWQgdG8gaGFuZGxlIGRlZHVwaW5nIGZvciBkaWZmZXJlbnQgc3RhZ2VzIChCZXRhLCBQcm9kLi4uKSBhbmQgcmVhbG1zIChFVSwgTkEuLi4pIG1hbnVhbGx5LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHVuZGVmaW5lZCAobm8gb3ZlcnJpZGUpXG4gICAqL1xuICByZWFkb25seSBkZWR1cGVTdHJpbmdPdmVycmlkZT86IHN0cmluZztcblxuICAvKipcbiAgICogSWYgdGhpcyBpcyBkZWZpbmVkLCB0aGUgYWxhcm0gbmFtZSBpcyBzZXQgdG8gdGhpcyBleGFjdCB2YWx1ZS5cbiAgICogUGxlYXNlIGJlIGF3YXJlIHRoYXQgeW91IG5lZWQgdG8gc3BlY2lmeSBwcmVmaXggZm9yIGRpZmZlcmVudCBzdGFnZXMgKEJldGEsIFByb2QuLi4pIGFuZCByZWFsbXMgKEVVLCBOQS4uLikgbWFudWFsbHkuXG4gICAqL1xuICByZWFkb25seSBhbGFybU5hbWVPdmVycmlkZT86IHN0cmluZztcblxuICAvKipcbiAgICogQSB0ZXh0IGluY2x1ZGVkIGluIHRoZSBnZW5lcmF0ZWQgdGlja2V0IGRlc2NyaXB0aW9uIGJvZHksIHdoaWNoIGZ1bGx5IHJlcGxhY2VzIHRoZSBnZW5lcmF0ZWQgdGV4dC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBkZWZhdWx0IGF1dG8tZ2VuZXJhdGVkIGNvbnRlbnQgb25seVxuICAgKi9cbiAgcmVhZG9ubHkgYWxhcm1EZXNjcmlwdGlvbk92ZXJyaWRlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBEaXNhbWJpZ3VhdG9yIGlzIGEgc3RyaW5nIHRoYXQgZGlmZmVyZW50aWF0ZXMgdGhpcyBhbGFybSBmcm9tIG90aGVyIHNpbWlsYXIgb25lcy5cbiAgICovXG4gIHJlYWRvbmx5IGRpc2FtYmlndWF0b3I6IHN0cmluZztcblxuICAvKipcbiAgICogQWxhcm0gZGVzY3JpcHRpb24gaXMgaW5jbHVkZWQgaW4gdGhlIHRpY2tldCBhbmQgdGhlcmVmb3JlIHNob3VsZCBkZXNjcmliZSB3aGF0IGhhcHBlbmVkLCB3aXRoIGFzIG11Y2ggY29udGV4dCBhcyBwb3NzaWJsZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBkZXNjcmlwdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgYWxhcm1EZXNjcmlwdGlvbj86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gb3B0aW9uYWwgbGluayBpbmNsdWRlZCBpbiB0aGUgZ2VuZXJhdGVkIHRpY2tldCBkZXNjcmlwdGlvbiBib2R5LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGFkZGl0aW9uYWwgbGluayB3aWxsIGJlIGFkZGVkXG4gICAqL1xuICByZWFkb25seSBkb2N1bWVudGF0aW9uTGluaz86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gb3B0aW9uYWwgbGluayBpbmNsdWRlZCBpbiB0aGUgZ2VuZXJhdGVkIHRpY2tldCBkZXNjcmlwdGlvbiBib2R5LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGFkZGl0aW9uYWwgbGluayB3aWxsIGJlIGFkZGVkXG4gICAqL1xuICByZWFkb25seSBydW5ib29rTGluaz86IHN0cmluZztcblxuICAvKipcbiAgICogU3VmZml4IGFkZGVkIHRvIGJhc2UgYWxhcm0gbmFtZS4gQWxhcm0gbmFtZXMgbmVlZCB0byBiZSB1bmlxdWUuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gc3VmZml4XG4gICAqL1xuICByZWFkb25seSBhbGFybU5hbWVTdWZmaXg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIElmIHRoaXMgaXMgZGVmaW5lZCwgdGhlIGRlZmF1bHQgcmVzb3VyY2Utc3BlY2lmaWMgYWxhcm0gZGVkdXBlIHN0cmluZyB3aWxsIGJlIHNldCBhbmQgdGhpcyB3aWxsIGJlIGFkZGVkIGFzIGEgc3VmZml4LlxuICAgKiBUaGlzIGFsbG93cyB5b3UgdG8gc3BlY2lmeSB0aGUgc2FtZSBkZWR1cGUgc3RyaW5nIGZvciBhIGZhbWlseSBvZiBhbGFybXMuXG4gICAqIENhbm5vdCBiZSBkZWZpbmVkIGF0IHRoZSBzYW1lIHRpbWUgYXMgZGVkdXBlU3RyaW5nT3ZlcnJpZGUuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdW5kZWZpbmVkIChubyBzdWZmaXgpXG4gICAqL1xuICByZWFkb25seSBhbGFybURlZHVwZVN0cmluZ1N1ZmZpeD86IHN0cmluZztcblxuICAvKipcbiAgICogRW5hYmxlcyB0aGUgY29uZmlndXJlZCBDbG91ZFdhdGNoIGFsYXJtIHRpY2tldGluZyBhY3Rpb25zLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHRoZSBzYW1lIGFzIG1vbml0b3JpbmcgZmFjYWRlIGRlZmF1bHRcbiAgICovXG4gIHJlYWRvbmx5IGFjdGlvbnNFbmFibGVkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhpcyBhbGxvd3MgdXNlciB0byBhdHRhY2ggY3VzdG9tIHZhbHVlcyB0byB0aGlzIGFsYXJtLCB3aGljaCBjYW4gbGF0ZXIgYmUgYWNjZXNzZWQgZnJvbSB0aGUgXCJ1c2VDcmVhdGVkQWxhcm1zXCIgbWV0aG9kLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIHRhZ3NcbiAgICovXG4gIHJlYWRvbmx5IGN1c3RvbVRhZ3M/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVGhpcyBhbGxvd3MgdXNlciB0byBhdHRhY2ggY3VzdG9tIHBhcmFtZXRlcnMgdG8gdGhpcyBhbGFybSwgd2hpY2ggY2FuIGxhdGVyIGJlIGFjY2Vzc2VkIGZyb20gdGhlIFwidXNlQ3JlYXRlZEFsYXJtc1wiIG1ldGhvZC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBwYXJhbWV0ZXJzXG4gICAqL1xuICByZWFkb25seSBjdXN0b21QYXJhbXM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgYWxhcm1pbmcgcmFuZ2Ugb2YgdmFsdWVzIHNob3VsZCBiZSBoaWdobGlnaHRlZCBpbiB0aGUgd2lkZ2V0LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGZhbHNlXG4gICAqL1xuICByZWFkb25seSBmaWxsQWxhcm1SYW5nZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIExvZ2ljYWwgb3BlcmF0b3IgdXNlZCB0byBhZ2dyZWdhdGUgdGhlIHN0YXR1cyBpbmRpdmlkdWFsIGFsYXJtcy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBPUlxuICAgKi9cbiAgcmVhZG9ubHkgY29tcG9zaXRlT3BlcmF0b3I/OiBDb21wb3NpdGVBbGFybU9wZXJhdG9yO1xuXG4gIC8qKlxuICAgKiBBY3Rpb25zIHdpbGwgYmUgc3VwcHJlc3NlZCBpZiB0aGUgc3VwcHJlc3NvciBhbGFybSBpcyBpbiB0aGUgQUxBUk0gc3RhdGUuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gc3VwcHJlc3NvciBhbGFybVxuICAgKi9cbiAgcmVhZG9ubHkgYWN0aW9uc1N1cHByZXNzb3I/OiBJQWxhcm07XG5cbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIGR1cmF0aW9uIHRoYXQgdGhlIGNvbXBvc2l0ZSBhbGFybSB3YWl0cyBhZnRlciBzdXBwcmVzc29yIGFsYXJtIGdvZXMgb3V0IG9mIHRoZSBBTEFSTSBzdGF0ZS5cbiAgICogQWZ0ZXIgdGhpcyB0aW1lLCB0aGUgY29tcG9zaXRlIGFsYXJtIHBlcmZvcm1zIGl0cyBhY3Rpb25zLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIDYwIHNlY29uZHNcbiAgICovXG4gIHJlYWRvbmx5IGFjdGlvbnNTdXBwcmVzc29yRXh0ZW5zaW9uUGVyaW9kPzogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIGR1cmF0aW9uIHRoYXQgdGhlIGNvbXBvc2l0ZSBhbGFybSB3YWl0cyBmb3IgdGhlIHN1cHByZXNzb3IgYWxhcm0gdG8gZ28gaW50byB0aGUgQUxBUk0gc3RhdGUuXG4gICAqIEFmdGVyIHRoaXMgdGltZSwgdGhlIGNvbXBvc2l0ZSBhbGFybSBwZXJmb3JtcyBpdHMgYWN0aW9ucy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSA2MCBzZWNvbmRzXG4gICAqL1xuICByZWFkb25seSBhY3Rpb25zU3VwcHJlc3NvcldhaXRQZXJpb2Q/OiBEdXJhdGlvbjtcbn1cblxuLyoqXG4gKiBFbmFibGUgYWxhcm0gYWN0aW9ucyBmb3IgYWxsIHNldmVyaXRpZXMgKGJvb2xlYW4pIG9yIHByb3ZpZGUgYSBtYXBwaW5nIG9mIHRoZSBkaXNhbWJpZ3VhdG9ycyB0byBib29sZWFuc1xuICovXG5leHBvcnQgdHlwZSBBY3Rpb25zRW5hYmxlZCA9XG4gIHwgYm9vbGVhblxuICB8IFJlY29yZDxQcmVkZWZpbmVkQWxhcm1EaXNhbWJpZ3VhdG9ycyB8IHN0cmluZywgYm9vbGVhbj47XG5cbmV4cG9ydCBlbnVtIENvbXBvc2l0ZUFsYXJtT3BlcmF0b3Ige1xuICAvKipcbiAgICogdHJpZ2dlciBvbmx5IGlmIGFsbCB0aGUgYWxhcm1zIGFyZSB0cmlnZ2VyZWRcbiAgICovXG4gIEFORCxcblxuICAvKipcbiAgICogdHJpZ2dlciBpZiBhbnkgb2YgdGhlIGFsYXJtcyBpcyB0cmlnZ2VyZWRcbiAgICovXG4gIE9SLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFsYXJtRmFjdG9yeURlZmF1bHRzIHtcbiAgLyoqXG4gICAqIEVuYWJsZXMgdGhlIGNvbmZpZ3VyZWQgQ2xvdWRXYXRjaCBhbGFybSB0aWNrZXRpbmcgYWN0aW9ucyBmb3IgZWl0aGVyIGFsbCBzZXZlcml0aWVzLCBvciBwZXIgc2V2ZXJpdHkuXG4gICAqL1xuICByZWFkb25seSBhY3Rpb25zRW5hYmxlZDogQWN0aW9uc0VuYWJsZWQ7XG5cbiAgLyoqXG4gICAqIERlZmF1bHQgYWxhcm0gYWN0aW9uIHVzZWQgZm9yIGVhY2ggYWxhcm0sIHVubGVzcyBpdCBpcyBvdmVycmlkZGVuLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGFjdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IGFjdGlvbj86IElBbGFybUFjdGlvblN0cmF0ZWd5O1xuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBhbGFybSBhY3Rpb24gZm9yIGVhY2ggZGlzYW1iaWd1YXRvci5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBHbG9iYWwgYWxhcm0gYWN0aW9uIGlmIGRlZmluZWQuXG4gICAqL1xuICByZWFkb25seSBkaXNhbWJpZ3VhdG9yQWN0aW9uPzogUmVjb3JkPFxuICAgIFByZWRlZmluZWRBbGFybURpc2FtYmlndWF0b3JzIHwgc3RyaW5nLFxuICAgIElBbGFybUFjdGlvblN0cmF0ZWd5XG4gID47XG5cbiAgLyoqXG4gICAqIEN1c3RvbSBzdHJhdGVneSB0byBjcmVhdGUgYW5ub3RhdGlvbnMgZm9yIGFsYXJtcy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBkZWZhdWx0IGFubm90YXRpb25zXG4gICAqL1xuICByZWFkb25seSBhbm5vdGF0aW9uU3RyYXRlZ3k/OiBJQWxhcm1Bbm5vdGF0aW9uU3RyYXRlZ3k7XG5cbiAgLyoqXG4gICAqIEN1c3RvbSBzdHJhdGVneSB0byBwcm9jZXNzIGRlZHVwZSBzdHJpbmdzIG9mIHRoZSBhbGFybXNcbiAgICpcbiAgICogQGRlZmF1bHQgLSBkZWZhdWx0IGJlaGF2aW91ciAobm8gY2hhbmdlKVxuICAgKi9cbiAgcmVhZG9ubHkgZGVkdXBlU3RyaW5nUHJvY2Vzc29yPzogSUFsYXJtRGVkdXBlU3RyaW5nUHJvY2Vzc29yO1xuXG4gIC8qKlxuICAgKiBDdXN0b20gc3RyYXRlZ3kgdG8gbmFtZSBhbGFybXNcbiAgICpcbiAgICogQGRlZmF1bHQgLSBkZWZhdWx0IGJlaGF2aW91ciAobm8gY2hhbmdlKVxuICAgKi9cbiAgcmVhZG9ubHkgYWxhcm1OYW1pbmdTdHJhdGVneT86IElBbGFybU5hbWluZ1N0cmF0ZWd5O1xuXG4gIC8qKlxuICAgKiBOdW1iZXIgb2YgYnJlYWNoZXMgcmVxdWlyZWQgdG8gdHJhbnNpdGlvbiBpbnRvIGFuIEFMQVJNIHN0YXRlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIDNcbiAgICovXG4gIHJlYWRvbmx5IGRhdGFwb2ludHNUb0FsYXJtPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBOdW1iZXIgb2YgcGVyaW9kcyB0byBjb25zaWRlciB3aGVuIGNoZWNraW5nIHRoZSBudW1iZXIgb2YgYnJlYWNoaW5nIGRhdGFwb2ludHMuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gU2FtZSBhcyBkYXRhcG9pbnRzVG9BbGFybS5cbiAgICovXG4gIHJlYWRvbmx5IGV2YWx1YXRpb25QZXJpb2RzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBHbG9iYWwgcHJlZml4IGZvciBhbGwgYWxhcm0gbmFtZXMuIFRoaXMgc2hvdWxkIGJlIHNvbWV0aGluZyB1bmlxdWUgdG8gYXZvaWQgcG90ZW50aWFsIGNvbGxpc2lvbnMuXG4gICAqIFRoaXMgaXMgaWdub3JlZCBpZiBhbiBhbGFybSdzIGRlZHVwZVN0cmluZ092ZXJyaWRlIGlzIGRlY2xhcmVkLlxuICAgKi9cbiAgcmVhZG9ubHkgYWxhcm1OYW1lUHJlZml4OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIG9wdGlvbmFsIGxpbmsgaW5jbHVkZWQgaW4gdGhlIGdlbmVyYXRlZCB0aWNrZXQgZGVzY3JpcHRpb24gYm9keS5cbiAgICovXG4gIHJlYWRvbmx5IGRvY3VtZW50YXRpb25MaW5rPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBvcHRpb25hbCBsaW5rIGluY2x1ZGVkIGluIHRoZSBnZW5lcmF0ZWQgdGlja2V0IGRlc2NyaXB0aW9uIGJvZHkuXG4gICAqL1xuICByZWFkb25seSBydW5ib29rTGluaz86IHN0cmluZztcblxuICAvKipcbiAgICogSWYgdGhpcyBpcyBkZWZpbmVkIGFzIGZhbHNlIGFuZCBkZWR1cGVTdHJpbmdPdmVycmlkZSBpcyB1bmRlZmluZWQsIHRoZSBhbGFybSBwcmVmaXggd2lsbCBiZSBwYXJ0IG9mIHRoZSBkZWR1cGUgc3RyaW5nLlxuICAgKiBUaGlzIGVzc2VudGlhbGx5IHN0b3BzIHRoZSBkZWR1cGUgb2YgZGlmZmVyZW50IGVycm9ycyB0b2dldGhlci5cbiAgICpcbiAgICogQGRlZmF1bHQgLSB1bmRlZmluZWQgKHRydWUpXG4gICAqL1xuICByZWFkb25seSB1c2VEZWZhdWx0RGVkdXBlRm9yRXJyb3I/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJZiB0aGlzIGlzIGRlZmluZWQgYXMgZmFsc2UgYW5kIGRlZHVwZVN0cmluZ092ZXJyaWRlIGlzIHVuZGVmaW5lZCwgdGhlIGFsYXJtIHByZWZpeCB3aWxsIGJlIHBhcnQgb2YgdGhlIGRlZHVwZSBzdHJpbmcuXG4gICAqIFRoaXMgZXNzZW50aWFsbHkgc3RvcHMgdGhlIGRlZHVwZSBvZiBkaWZmZXJlbnQgbGF0ZW5jeSBpc3N1ZXMgdG9nZXRoZXIuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdW5kZWZpbmVkICh0cnVlKVxuICAgKi9cbiAgcmVhZG9ubHkgdXNlRGVmYXVsdERlZHVwZUZvckxhdGVuY3k/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFsYXJtRmFjdG9yeVByb3BzIHtcbiAgc