cdk-monitoring-constructs
Version:
[](https://badge.fury.io/js/cdk-monitoring-constructs) [](https://m
299 lines • 67.8 kB
JavaScript
"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 || (exports.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 ?? 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 ?? 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: "9.13.0" };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWxhcm1GYWN0b3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiQWxhcm1GYWN0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQ0EsK0RBYW9DO0FBR3BDLHFDQUE0RDtBQUM1RCwrREFBNEQ7QUFDNUQseUVBSW9DO0FBR3BDLHVEQUkyQjtBQUMzQixzQ0FJbUI7QUFFbkIsTUFBTSx3QkFBd0IsR0FBRyxDQUFDLENBQUM7QUFpYW5DLElBQVksc0JBVVg7QUFWRCxXQUFZLHNCQUFzQjtJQUNoQzs7T0FFRztJQUNILGlFQUFHLENBQUE7SUFFSDs7T0FFRztJQUNILCtEQUFFLENBQUE7QUFDSixDQUFDLEVBVlcsc0JBQXNCLEdBQXRCLDhCQUFzQixLQUF0Qiw4QkFBc0IsUUFVakM7QUFtR0QsTUFBYSxZQUFZO0lBTXZCLFlBQVksVUFBcUIsRUFBRSxLQUF3QjtRQUN6RCxJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztRQUM3QixJQUFJLENBQUMsbUJBQW1CLEdBQUcsS0FBSyxDQUFDLG1CQUFtQixDQUFDO1FBQ3JELElBQUksQ0FBQyxvQkFBb0IsR0FBRyxLQUFLLENBQUMsb0JBQW9CLENBQUM7UUFDdkQsSUFBSSxDQUFDLG1CQUFtQjtZQUN0QixLQUFLLENBQUMsbUJBQW1CLENBQUMsbUJBQW1CO2dCQUM3QyxJQUFJLHlDQUFtQixDQUNyQixLQUFLLENBQUMsbUJBQW1CLENBQUMsZUFBZSxFQUN6QyxLQUFLLENBQUMsb0JBQW9CLEVBQzFCLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxxQkFBcUIsQ0FDaEQsQ0FBQztJQUNOLENBQUM7SUFFRCxRQUFRLENBQ04sTUFBOEIsRUFDOUIsS0FBb0I7UUFFcEIsb0JBQW9CO1FBRXBCLE1BQU0sY0FBYyxHQUFHLEtBQUssQ0FBQyxjQUFjO1lBQ3pDLENBQUMsQ0FBQyx5Q0FBdUIsQ0FBQyxFQUFFLENBQ3hCLEtBQUssQ0FBQyxjQUFjLEVBQ3BCLHVDQUFxQixDQUFDLFFBQVEsQ0FDL0I7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LENBQUM7O0FBaFpILG9DQWlaQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IER1cmF0aW9uIH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQge1xuICBBbGFybUJhc2UsXG4gIEFsYXJtUnVsZSxcbiAgQWxhcm1TdGF0ZSxcbiAgQ29tcGFyaXNvbk9wZXJhdG9yLFxuICBDb21wb3NpdGVBbGFybSxcbiAgSG9yaXpvbnRhbEFubm90YXRpb24sXG4gIElBbGFybSxcbiAgSUFsYXJtUnVsZSxcbiAgSU1ldHJpYyxcbiAgTWF0aEV4cHJlc3Npb24sXG4gIE1ldHJpYyxcbiAgVHJlYXRNaXNzaW5nRGF0YSxcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1jbG91ZHdhdGNoXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuXG5pbXBvcnQgeyBJQWxhcm1BY3Rpb25TdHJhdGVneSwgbm9vcEFjdGlvbiB9IGZyb20gXCIuL2FjdGlvblwiO1xuaW1wb3J0IHsgQWxhcm1OYW1pbmdTdHJhdGVneSB9IGZyb20gXCIuL0FsYXJtTmFtaW5nU3RyYXRlZ3lcIjtcbmltcG9ydCB7XG4gIEFsYXJtQW5ub3RhdGlvblN0cmF0ZWd5UHJvcHMsXG4gIERlZmF1bHRBbGFybUFubm90YXRpb25TdHJhdGVneSxcbiAgSUFsYXJtQW5ub3RhdGlvblN0cmF0ZWd5LFxufSBmcm9tIFwiLi9JQWxhcm1Bbm5vdGF0aW9uU3RyYXRlZ3lcIjtcbmltcG9ydCB7IElBbGFybURlZHVwZVN0cmluZ1Byb2Nlc3NvciB9IGZyb20gXCIuL0lBbGFybURlZHVwZVN0cmluZ1Byb2Nlc3NvclwiO1xuaW1wb3J0IHsgQWxhcm1OYW1pbmdJbnB1dCwgSUFsYXJtTmFtaW5nU3RyYXRlZ3kgfSBmcm9tIFwiLi9JQWxhcm1OYW1pbmdTdHJhdGVneVwiO1xuaW1wb3J0IHtcbiAgQ29tcG9zaXRlTWV0cmljQWRqdXN0ZXIsXG4gIERlZmF1bHRNZXRyaWNBZGp1c3RlcixcbiAgSU1ldHJpY0FkanVzdGVyLFxufSBmcm9tIFwiLi9tZXRyaWMtYWRqdXN0ZXJcIjtcbmltcG9ydCB7XG4gIE1ldHJpY0ZhY3RvcnlEZWZhdWx0cyxcbiAgTWV0cmljU3RhdGlzdGljLFxuICBNZXRyaWNXaXRoQWxhcm1TdXBwb3J0LFxufSBmcm9tIFwiLi4vbWV0cmljXCI7XG5cbmNvbnN0IERlZmF1bHREYXRhcG9pbnRzVG9BbGFybSA9IDM7XG5cbi8qKlxuICogQ29tbW9ubHkgdXNlZCBkaXNhbWJpZ3VhdG9ycy5cbiAqL1xuZXhwb3J0IHR5cGUgUHJlZGVmaW5lZEFsYXJtRGlzYW1iaWd1YXRvcnMgPSBcIldhcm5pbmdcIiB8IFwiQ3JpdGljYWxcIjtcblxuLyoqXG4gKiBNZXRhZGF0YSBvZiBhbiBhbGFybS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBbGFybU1ldGFkYXRhIHtcbiAgcmVhZG9ubHkgYWN0aW9uOiBJQWxhcm1BY3Rpb25TdHJhdGVneTtcbiAgcmVhZG9ubHkgZGVkdXBlU3RyaW5nPzogc3RyaW5nO1xuICByZWFkb25seSBkaXNhbWJpZ3VhdG9yPzogc3RyaW5nO1xuICByZWFkb25seSBjdXN0b21UYWdzPzogc3RyaW5nW107XG4gIHJlYWRvbmx5IGN1c3RvbVBhcmFtcz86IFJlY29yZDxzdHJpbmcsIGFueT47XG59XG5cbi8qKlxuICogUmVwcmVzZW50YXRpb24gb2YgYW4gYWxhcm0gd2l0aCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFsYXJtV2l0aEFubm90YXRpb24gZXh0ZW5kcyBBbGFybU1ldGFkYXRhIHtcbiAgcmVhZG9ubHkgYWxhcm06IEFsYXJtQmFzZTtcbiAgcmVhZG9ubHkgYWxhcm1OYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGFsYXJtTmFtZVN1ZmZpeDogc3RyaW5nO1xuICByZWFkb25seSBhbGFybUxhYmVsOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGFsYXJtRGVzY3JpcHRpb246IHN0cmluZztcbiAgcmVhZG9ubHkgYWxhcm1EZWZpbml0aW9uOiBBbGFybUNyZWF0ZURlZmluaXRpb247XG4gIHJlYWRvbmx5IGFsYXJtUnVsZVdoZW5PazogSUFsYXJtUnVsZTtcbiAgcmVhZG9ubHkgYWxhcm1SdWxlV2hlbkFsYXJtaW5nOiBJQWxhcm1SdWxlO1xuICByZWFkb25seSBhbGFybVJ1bGVXaGVuSW5zdWZmaWNpZW50RGF0YTogSUFsYXJtUnVsZTtcbiAgcmVhZG9ubHkgYW5ub3RhdGlvbjogSG9yaXpvbnRhbEFubm90YXRpb247XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBuZWNlc3NhcnkgdG8gY3JlYXRlIGEgc2luZ2xlIGFsYXJtIGFuZCBjb25maWd1cmUgaXQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWRkQWxhcm1Qcm9wcyB7XG4gIC8qKlxuICAgKiBBbGxvd3MgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgYWN0aW9uIHN0cmF0ZWd5LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGRlZmF1bHQgYWN0aW9uIHdpbGwgYmUgdXNlZFxuICAgKi9cbiAgcmVhZG9ubHkgYWN0aW9uT3ZlcnJpZGU/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/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFsYXJtRmFjdG9yeVByb3BzIHtcbiAgcmVhZG9ubHkgZ2xvYmFsQWxhcm1EZWZhdWx0czogQWxhcm1GYWN0b3J5RGVmYXVsdHM7XG4gIHJlYWRvbmx5IGdsb2JhbE1ldHJpY0RlZmF1bHRzOiBNZXRyaWNGYWN0b3J5RGVmYXVsdHM7XG4gIHJlYWRvbmx5IGxvY2FsQWxhcm1OYW1lUHJlZml4OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBBbGFybUZhY3Rvcnkge1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgYWxhcm1TY29wZTogQ29uc3RydWN0O1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZ2xvYmFsQWxhcm1EZWZhdWx0czogQWxhcm1GYWN0b3J5RGVmYXVsdHM7XG4gIHByb3RlY3RlZCByZWFkb25seSBnbG9iYWxNZXRyaWNEZWZhdWx0czogTWV0cmljRmFjdG9yeURlZmF1bHRzO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgYWxhcm1OYW1pbmdTdHJhdGVneTogSUFsYXJtTmFtaW5nU3RyYXRlZ3k7XG5cbiAgY29uc3RydWN0b3IoYWxhcm1TY29wZTogQ29uc3RydWN0LCBwcm9wczogQWxhcm1GYWN0b3J5UHJvcHMpIHtcbiAgICB0aGlzLmFsYXJtU2NvcGUgPSBhbGFybVNjb3BlO1xuICAgIHRoaXMuZ2xvYmFsQWxhcm1EZWZhdWx0cyA9IHByb3BzLmdsb2JhbEFsYXJtRGVmYXVsdHM7XG4gICAgdGhpcy5nbG9iYWxNZXRyaWNEZWZhdWx0cyA9IHByb3BzLmdsb2JhbE1ldHJpY0RlZmF1bHRzO1xuICAgIHRoaXMuYWxhcm1OYW1pbmdTdHJhdGVneSA9XG4gICAgICBwcm9wcy5nbG9iYWxBbGFybURlZmF1bHRzLmFsYXJtTmFtaW5nU3RyYXRlZ3kgPz9cbiAgICAgIG5ldyBBbGFybU5hbWluZ1N0cmF0ZWd5KFxuICAgICAgICBwcm9wcy5nbG9iYWxBbGFybURlZmF1bHRzLmFsYXJtTmFtZVByZWZpeCxcbiAgICAgICAgcHJvcHMubG9jYWxBbGFybU5hbWVQcmVmaXgsXG4gICAgICAgIHByb3BzLmdsb2JhbEFsYXJtRGVmYXVsdHMuZGVkdXBlU3RyaW5nUHJvY2Vzc29yLFxuICAgICAgKTtcbiAgfVxuXG4gIGFkZEFsYXJtKFxuICAgIG1ldHJpYzogTWV0cmljV2l0aEFsYXJtU3VwcG9ydCxcbiAgICBwcm9wczogQWRkQWxhcm1Qcm9wcyxcbiAgKTogQWxhcm1XaXRoQW5ub3RhdGlvbiB7XG4gICAgLy8gYWRqdXN0IHRoZSBtZXRyaWNcblxuICAgIGNvbnN0IG1ldHJpY0FkanVzdGVyID0gcHJvcHMubWV0cmljQWRqdXN0ZXJcbiAgICAgID8gQ29tcG9zaXRlTWV0cmljQWRqdXN0ZXIub2YoXG4gICAgICAgICAgcHJvcHMubWV0cmljQWRqdXN0ZXIsXG4gICAgICAgICAgRGVmYXVsdE1ldHJpY0FkanVzdGVyLklOU1RBTkNFLFxuICAgICAgICApXG4gICAgICA6IERlZmF1bHRNZXRyaWNBZGp1c3Rlci5JTlNUQU5DRTtcbiAgICBjb25zdCBhZGp1c3RlZE1ldHJpYyA9IG1ldHJpY0FkanVzdGVyLmFkanVzdE1ldHJpYyhcbiAgICAgIG1ldHJpYyxcbiAgICAgIHRoaXMuYWxhcm1TY29wZSxcbiAgICAgIHByb3BzLFxuICAgICk7XG5cbiAgICAvLyBtZXRyaWMgdGhhdCB3aWxsIGJlIHVsdGltYXRlbHkgdXNlZCB0byBjcmVhdGUgdGhlIGFsYXJtXG4gICAgbGV0IGFsYXJtTWV0cmljOiBNZXRyaWNXaXRoQWxhcm1TdXBwb3J0ID0gYWRqdXN0ZWRNZXRyaWM7XG5cbiAgICAvLyBwcmVwYXJlIHByaW1hcnkgYWxhcm0gcHJvcGVydGllc1xuXG4gICAgY29uc3QgYWN0aW9uc0VuYWJsZWQgPSB0aGlzLmRldGVybWluZUFjdGlvbnNFbmFibGVkKFxuICAgICAgcHJvcHMuYWN0aW9uc0VuYWJsZWQsXG4gICAgICBwcm9wcy5kaXNhbWJpZ3VhdG9yLFxuICAgICk7XG4gICAgY29uc3QgYWN0aW9uID0gdGhpcy5kZXRlcm1pbmVBY3Rpb24oXG4gICAgICBwcm9wcy5kaXNhbWJpZ3VhdG9yLFxuICAgICAgcHJvcHMuYWN0aW9uT3ZlcnJpZGUsXG4gICAgKTtcbiAgICBjb25zdCBhbGFybU5hbWluZ0lucHV0OiBBbGFybU5hbWluZ0lucHV0ID0ge1xuICAgICAgLi4ucHJvcHMsXG4gICAgICBhY3Rpb24sXG4gICAgfTtcbiAgICBjb25zdCBhbGFybU5hbWUgPSB0aGlzLmFsYXJtTmFtaW5nU3RyYXRlZ3kuZ2V0TmFtZShhbGFybU5hbWluZ0lucHV0KTtcbiAgICBjb25zdCBhbGFybU5hbWVTdWZmaXggPSBwcm9wcy5hbGFybU5hbWVTdWZmaXg7XG4gICAgY29uc3QgYWxhcm1MYWJlbCA9XG4gICAgICB0aGlzLmFsYXJtTmFtaW5nU3RyYXRlZ3kuZ2V0V2lkZ2V0TGFiZWwoYWxhcm1OYW1pbmdJbnB1dCk7XG4gICAgY29uc3QgYWxhcm1EZXNjcmlwdGlvbiA9IHRoaXMuZ2VuZXJhdGVEZXNjcmlwdGlvbihcbiAgICAgIHByb3BzLmFsYXJtRGVzY3JpcHRpb24sXG4gICAgICBwcm9wcy5hbGFybURlc2NyaXB0aW9uT3ZlcnJpZGUsXG4gICAgICBwcm9wcy5ydW5ib29rTGluayxcbiAgICAgIHByb3BzLmRvY3VtZW50YXRpb25MaW5rLFxuICAgICk7XG4gICAgY29uc3QgZGVkdXBlU3RyaW5nID1cbiAgICAgIHRoaXMuYWxhcm1OYW1pbmdTdHJhdGVneS5nZXREZWR1cGVTdHJpbmcoYWxhcm1OYW1pbmdJbnB1dCk7XG4gICAgY29uc3QgZXZhbHVhdGVMb3dTYW1wbGVDb3VudFBlcmNlbnRpbGUgPVxuICAgICAgcHJvcHMuZXZhbHVhdGVMb3dTYW1wbGVDb3VudFBlcmNlbnRpbGUgPz8gdHJ1ZTtcblxuICAgIGNvbnN0IGRhdGFwb2ludHNUb0FsYXJtID1cbiAgICAgIHByb3BzLmRhdGFwb2ludHNUb0FsYXJtID8/XG4gICAgICB0aGlzLmdsb2JhbEFsYXJtRGVmYXVsdHMuZGF0YXBvaW50c1RvQWxhcm0gPz9cbiAgICAgIERlZmF1bHREYXRhcG9pbnRzVG9BbGFybTtcbiAgICBjb25zdCBldmFsdWF0aW9uUGVyaW9kcyA9XG4gICAgICBwcm9wcy5ldmFsdWF0aW9uUGVyaW9kcyA/P1xuICAgICAgdGhpcy5nbG9iYWxBbGFybURlZmF1bHRzLmV2YWx1YXRpb25QZXJpb2RzID8/XG4gICAgICBkYXRhcG9pbnRzVG9BbGFybTtcblxuICAgIGlmIChldmFsdWF0aW9uUGVyaW9kcyA8IGRhdGFwb2ludHNUb0FsYXJtKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBldmFsdWF0aW9uUGVyaW9kcyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBkYXRhcG9pbnRzVG9BbGFybSBmb3IgJHthbGFybU5hbWV9YCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gYXBwbHkgbWV0cmljIG1hdGggZm9yIG1pbmltdW0gbWV0cmljIHNhbXBsZXNcblxuICAgIGlmIChwcm9wcy5taW5TYW1wbGVDb3VudFRvRXZhbHVhdGVEYXRhcG9pbnQpIHtcbiAgICAgIGxldCBsYWJlbDogc3RyaW5nID0gYCR7YWRqdXN0ZWRNZXRyaWN9YDtcbiAgICAgIGxldCBtZXRyaWNFeHByZXNzaW9uOiBzdHJpbmc7XG4gICAgICBsZXQgbWV0cmljU2FtcGxlQ291bnRJZDogc3RyaW5nID0gXCJzYW1wbGVDb3VudFwiO1xuICAgICAgbGV0IHVzaW5nTWV0cmljczogUmVjb3JkPHN0cmluZywgSU1ldHJpYz47XG5cbiAgICAgIGlmIChhZGp1c3RlZE1ldHJpYyBpbnN0YW5jZW9mIE1hdGhFeHByZXNzaW9uKSB7XG4gICAgICAgIGxhYmVsID0gYWRqdXN0ZWRNZXRyaWMubGFiZWwgPz8gbGFiZWw7XG4gICAgICAgIG1ldHJpY0V4cHJlc3Npb24gPSBgKCR7YWRqdXN0ZWRNZXRyaWMuZXhwcmVzc2lvbn0pYDtcblxuICAgICAgICBpZiAoT2JqZWN0LmtleXMoYWRqdXN0ZWRNZXRyaWMudXNpbmdNZXRyaWNzKS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICBjb25zdCBzYW1wbGVDb3VudE1ldHJpYyA9IChcbiAgICAgICAgICAgIGFkanVzdGVkTWV0cmljLnVzaW5nTWV0cmljc1tcbiAgICAgICAgICAgICAgT2JqZWN0LmtleXMoYWRqdXN0ZWRNZXRyaWMudXNpbmdNZXRyaWNzKVswXVxuICAgICAgICAgICAgXSBhcyBNZXRyaWNcbiAgICAgICAgICApLndpdGgoe1xuICAgICAgICAgICAgc3RhdGlzdGljOiBNZXRyaWNTdGF0aXN0aWMuTixcbiAgICAgICAgICAgIGxhYmVsOiBcIlNhbXBsZSBjb3VudFwiLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgdXNpbmdNZXRyaWNzID0ge1xuICAgICAgICAgICAgLi4uYWRqdXN0ZWRNZXRyaWMudXNpbmdNZXRyaWNzLFxuICAgICAgICAgICAgW21ldHJpY1NhbXBsZUNvdW50SWRdOiBzYW1wbGVDb3VudE1ldHJpYyxcbiAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2UgaWYgKHByb3BzLnNhbXBsZUNvdW50TWV0cmljSWQpIHtcbiAgICAgICAgICB1c2luZ01ldHJpY3MgPSBhZGp1c3RlZE1ldHJpYy51c2luZ01ldHJpY3M7XG4gICAgICAgICAgbWV0cmljU2FtcGxlQ291bnRJZCA9IHByb3BzLnNhbXBsZUNvdW50TWV0cmljSWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgXCJzYW1wbGVDb3VudE1ldHJpY0lkIG11c3QgYmUgc3BlY2lmaWVkIHdoZW4gdXNpbmcgbWluU2FtcGxlQ291bnRUb0V2YWx1YXRlRGF0YXBvaW50IHdpdGggYSBtdWx0aXBsZS1tZXRyaWMgTWF0aEV4cHJlc3Npb25cIixcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBtZXRyaWNJZDogc3RyaW5nID0gXCJtZXRyaWNcIjtcblxuICAgICAgICBtZXRyaWNFeHByZXNzaW9uID0gbWV0cmljSWQ7XG4gICAgICAgIHVzaW5nTWV0cmljcyA9IHtcbiAgICAgICAgICBbbWV0cmljSWRdOiBhZGp1c3RlZE1ldHJpYyxcbiAgICAgICAgICBbbWV0cmljU2FtcGxlQ291bnRJZF06IGFkanVzdGVkTWV0cmljLndpdGgoe1xuICAgICAgICAgICAgc3RhdGlzdGljOiBNZXRyaWNTdGF0aXN0aWMuTixcbiAgICAgICAgICAgIGxhYmVsOiBcIlNhbXBsZSBjb3VudFwiLFxuICAgICAgICAgIH0pLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBhbGFybU1ldHJpYyA9IG5ldyBNYXRoRXhwcmVzc2lvbih7XG4gICAgICAgIGxhYmVsLFxuICAgICAgICBleHByZXNzaW9uOiBgSUYoJHttZXRyaWNTYW1wbGVDb3VudElkfSA+ICR7cHJvcHMubWluU2FtcGxlQ291bnRUb0V2YWx1YXRlRGF0YXBvaW50fSwgJHttZXRyaWNFeHByZXNzaW9ufSlgLFxuICAgICAgICBwZXJpb2Q6IGFkanVzdGVkTWV0cmljLnBlcmlvZCxcbiAgICAgICAgdXNpbmdNZXRyaWNzLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gY3JlYXRlIHByaW1hcnkgYWxhcm1cblxuICAgIGNvbnN0IHByaW1hcnlBbGFybSA9IGFsYXJtTWV0cmljLmNyZWF0ZUFsYXJtKHRoaXMuYWxhcm1TY29wZSwgYWxhcm1OYW1lLCB7XG4gICAgICBhbGFybU5hbWUsXG4gICAgICBhbGFybURlc2NyaXB0aW9uLFxuICAgICAgdGhyZXNob2xkOiBwcm9wcy50aHJlc2hvbGQsXG4gICAgICBjb21wYXJpc29uT3BlcmF0b3I6IHByb3BzLmNvbXBhcmlzb25PcGVyYXRvcixcbiAgICAgIHRyZWF0TWlzc2luZ0RhdGE6IHByb3BzLnRyZWF0TWlzc2luZ0RhdGEsXG4gICAgICAvLyBkZWZhdWx0IHZhbHVlICh1bmRlZmluZWQpIG1lYW5zIFwiZXZhbHVhdGVcIlxuICAgICAgZXZhbHVhdGVMb3dTYW1wbGVDb3VudFBlcmNlbnRpbGU6IGV2YWx1YXRlTG93U2FtcGxlQ291bnRQZXJjZW50aWxlXG4gICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgIDogXCJpZ25vcmVcIixcbiAgICAgIGRhdGFwb2ludHNUb0FsYXJtLFxuICAgICAgZXZhbHVhdGlvblBlcmlvZHMsXG4gICAgICBhY3Rpb25zRW5hYmxlZCxcbiAgICB9KTtcblxuICAgIGxldCBhbGFybTogQWxhcm1CYXNlID0gcHJpbWFyeUFsYXJtO1xuXG4gICAgLy8gY3JlYXRlIGNvbXBvc2l0ZSBhbGFybSBmb3IgbWluIG1ldHJpYyBzYW1wbGVzIChpZiBkZWZpbmVkKVxuICAgIC8vIGRlcHJlY2F0ZWQgaW4gZmF2b3VyIG9mIG1pblNhbXBsZUNvdW50VG9FdmFsdWF0ZURhdGFwb2ludFxuXG4gICAgaWYgKFxuICAgICAgIXByb3BzLm1pblNhbXBsZUNvdW50VG9FdmFsdWF0ZURhdGFwb2ludCAmJlxuICAgICAgcHJvcHMubWluTWV0cmljU2FtcGxlc1RvQWxhcm1cbiAgICApIHtcbiAgICAgIGNvbnN0IG1ldHJpY1NhbXBsZUNvdW50ID0gYWRqdXN0ZWRNZXRyaWMud2l0aCh7XG4gICAgICAgIHN0YXRpc3RpYzogTWV0cmljU3RhdGlzdGljLk4sXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IG5vU2FtcGxlc0FsYXJtID0gbWV0cmljU2FtcGxlQ291bnQuY3JlYXRlQWxhcm0oXG4gICAgICAgIHRoaXMuYWxhcm1TY29wZSxcbiAgICAgICAgYCR7YWxhcm1OYW1lfS1Ob1NhbXBsZXNgLFxuICAgICAgICB7XG4gICAgICAgICAgYWxhcm1OYW1lOiBgJHthbGFybU5hbWV9LU5vU2FtcGxlc2AsXG4gICAgICAgICAgYWxhcm1EZXNjcmlwdGlvbjogYFRoZSBtZXRyaWMgKCR7YWRqdXN0ZWRNZXRyaWN9KSBkb2VzIG5vdCBoYXZlIGVub3VnaCBzYW1wbGVzIHRvIGFsYXJtLiBNdXN0IGhhdmUgYXQgbGVhc3QgJHtwcm9wcy5taW5NZXRyaWNTYW1wbGVzVG9BbGFybX0uYCxcbiAgICAgICAgICB0aHJlc2hvbGQ6IHByb3BzLm1pbk1ldHJpY1NhbXBsZXNUb0FsYXJtLFxuICAgICAgICAgIGNvbXBhcmlzb25PcGVyYXRvcjogQ29tcGFyaXNvbk9wZXJhdG9yLkxFU1NfVEhBTl9USFJFU0hPTEQsXG4gICAgICAgICAgdHJlYXRNaXNzaW5nRGF0YTogVHJlYXRNaXNzaW5nRGF0YS5CUkVBQ0hJTkcsXG4gICAgICAgICAgZGF0YXBvaW50c1RvQWxhcm06IDEsXG4gICAgICAgICAgZXZhbHVhdGlvblBlcmlvZHM6IDEsXG4gICAgICAgICAgYWN0aW9uc0VuYWJsZWQsXG4gICAgICAgIH0sXG4gICAgICApO1xuICAgICAgYWxhcm0gPSBuZXcgQ29tcG9zaXRlQWxhcm0odGhpcy5hbGFybVNjb3BlLCBgJHthbGFybU5hbWV9LVdpdGhTYW1wbGVzYCwge1xuICAgICAgICBhY3Rpb25zRW5hYmxlZCxcbiAgICAgICAgY29tcG9zaXRlQWxhcm1OYW1lOiBgJHthbGFybU5hbWV9LVdpdGhTYW1wbGVzYCxcbiAgICAgICAgYWxhcm1EZXNjcmlwdGlvbjogdGhpcy5qb2luRGVzY3JpcHRpb25QYXJ0cyhcbiAgICAgICAgICBhbGFybURlc2NyaXB0aW9uLFxuICAgICAgICAgIGBNaW4gbnVtYmVyIG9mIHNhbXBsZXMgdG8gYWxhcm06ICR7cHJvcHMubWluTWV0cmljU2FtcGxlc1RvQWxhcm19YCxcbiAgICAgICAgKSxcbiAgICAgICAgYWxhcm1SdWxlOiBBbGFybVJ1bGUuYWxsT2YoXG4gICAgICAgICAgQWxhcm1SdWxlLmZyb21BbGFybShwcmltYXJ5QWxhcm0sIEFsYXJtU3RhdGUuQUxBUk0pLFxuICAgICAgICAgIEFsYXJtUnVsZS5ub3QoQWxhcm1SdWxlLmZyb21BbGFybShub1NhbXBsZXNBbGFybSwgQWxhcm1TdGF0ZS5BTEFSTSkpLFxuICAgICAgICApLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gYXR0YWNoIGFsYXJtIGFjdGlvbnNcblxuICAgIGFjdGlvbi5hZGRBbGFybUFjdGlvbnMoe1xuICAgICAgYWxhcm0sXG4gICAgICBhY3Rpb24sXG4gICAgICBkZWR1cGVTdHJpbmcsXG4gICAgICBkaXNhbWJpZ3VhdG9yOiBwcm9wcy5kaXNhbWJpZ3VhdG9yLFxuICAgICAgY3VzdG9tVGFnczogcHJvcHMuY3VzdG9tVGFncyA/PyBbXSxcbiAgICAgIGN1c3RvbVBhcmFtczogcHJvcHMuY3VzdG9tUGFyYW1zID8/IHt9LFxuICAgIH0pO1xuXG4gICAgLy8gY3JlYXRlIGFubm90YXRpb24gZm9yIHRoZSBwcmltYXJ5IGFsYXJtXG5cbiAgICBjb25zdCBhbm5vdGF0aW9uID0gdGhpcy5jcmVhdGVBbm5vdGF0aW9uKHtcbiAgICAgIGFsYXJtOiBwcmltYXJ5QWxhcm0sXG4gICAgICBhY3Rpb24sXG4gICAgICBtZXRyaWM6IGFkanVzdGVkTWV0cmljLFxuICAgICAgZXZhbHVhdGlvblBlcmlvZHMsXG4gICAgICBkYXRhcG9pbnRzVG9BbGFybSxcbiAgICAgIGRlZHVwZVN0cmluZyxcbiAgICAgIG1pbk1ldHJpY1NhbXBsZXNUb0FsYXJtOiBwcm9wcy5taW5NZXRyaWNTYW1wbGVzVG9BbGFybSxcbiAgICAgIG1pblNhbXBsZUNvdW50VG9FdmFsdWF0ZURhdGFwb2ludDpcbiAgICAgICAgcHJvcHMubWluU2FtcGxlQ291bnRUb0V2YWx1YXRlRGF0YXBvaW50LFxuICAgICAgZmlsbEFsYXJtUmFuZ2U6IHByb3BzLmZpbGxBbGFybVJhbmdlID8/IGZhbHNlLFxuICAgICAgb3ZlcnJpZGVBbm5vdGF0aW9uQ29sb3I6IHByb3BzLm92ZXJyaWRlQW5ub3RhdGlvbkNvbG9yLFxuICAgICAgb3ZlcnJpZGVBbm5vdGF0aW9uTGFiZWw6IHByb3BzLm92ZXJyaWRlQW5ub3RhdGlvbkxhYmVsLFxuICAgICAgb3ZlcnJpZGVBbm5vdGF0aW9uVmlzaWJpbGl0eTogcHJvcHMub3ZlcnJpZGVBbm5vdGF0aW9uVmlzaWJpbGl0eSxcbiAgICAgIGNvbXBhcmlzb25PcGVyYXRvcjogcHJvcHMuY29tcGFyaXNvbk9wZXJhdG9yLFxuICAgICAgdGhyZXNob2xkOiBwcm9wcy50aHJlc2hvbGQsXG4gICAgICBkaXNhbWJpZ3VhdG9yOiBwcm9wcy5kaXNhbWJpZ3VhdG9yLFxuICAgICAgY3VzdG9tVGFnczogcHJvcHMuY3VzdG9tVGFncyA/PyBbXSxcbiAgICAgIGN1c3RvbVBhcmFtczogcHJvcHMuY3VzdG9tUGFyYW1zID8/IHt9LFxuICAgIH0pO1xuXG4gICAgLy8gcmV0dXJuIHRoZSBmaW5hbCByZXN1bHRcblxuICAgIHJldHVybiB7XG4gICAgICBhbGFybSxcbiAgICAgIGFjdGlvbixcbiAgICAgIGFsYXJtTmFtZSxcbiAgICAgIGFsYXJtTmFtZVN1ZmZpeCxcbiAgICAgIGFsYXJtTGFiZWwsXG4gICAgICBhbGFybURlc2NyaXB0aW9uLFxuICAgICAgYWxhcm1EZWZpbml0aW9uOiB7XG4gICAgICAgIG1ldHJpYyxcbiAgICAgICAgYWRkQWxhcm1Qcm9wczogcHJvcHMsXG4gICAgICAgIGRhdGFwb2ludHNUb0FsYXJtLFxuICAgICAgICBldmFsdWF0aW9uUGVyaW9kcyxcbiAgICAgICAgYWxhcm1GYWN0b3J5OiB0aGlzLFxuICAgICAgfSxcbiAgICAgIGN1c3RvbVRhZ3M6IHByb3BzLmN1c3RvbVRhZ3MsXG4gICAgICBjdXN0b21QYXJhbXM6IHByb3BzLmN1c3RvbVBhcmFtcyxcbiAgICAgIGFsYXJtUnVsZVdoZW5PazogQWxhcm1SdWxlLmZyb21BbGFybShhbGFybSwgQWxhcm1TdGF0ZS5PSyksXG4gICAgICBhbGFybVJ1bGVXaGVuQWxhcm1pbmc6IEFsYXJtUnVsZS5mcm9tQWxhcm0oYWxhcm0sIEFsYXJtU3RhdGUuQUxBUk0pLFxuICAgICAgYWxhcm1SdWxlV2hlbkluc3VmZmljaWVudERhdGE6IEFsYXJtUnVsZS5mcm9tQWxhcm0oXG4gICAgICAgIGFsYXJtLFxuICAgICAgICBBbGFybVN0YXRlLklOU1VGRklDSUVOVF9EQVRBLFxuICAgICAgKSxcbiAgICAgIGRlZHVwZVN0cmluZyxcbiAgICAgIGFubm90YXRpb24sXG4gICAgICBkaXNhbWJpZ3VhdG9yOiBwcm9wcy5kaXNhbWJpZ3VhdG9yLFxuICAgIH07XG4gIH1cblxuICBhZGRDb21wb3NpdGVBbGFybShcbiAgICBhbGFybXM6IEFsYXJtV2l0aEFubm90YXRpb25bXSxcbiAgICBwcm9wczogQWRkQ29tcG9zaXRlQWxhcm1Qcm9wcyxcbiAgKTogQ29tcG9zaXRlQWxhcm0ge1xuICAgIGNvbnN0IGFjdGlvbnNFbmFibGVkID0gdGhpcy5kZXRlcm1pbmVBY3Rpb25zRW5hYmxlZChcbiAgICAgIHByb3BzPy5hY3Rpb25zRW5hYmxlZCxcbiAgICAgIHByb3BzPy5kaXNhbWJpZ3VhdG9yLFxuICAgICk7XG4gICAgY29uc3QgYWN0aW9uID1cbiAgICAgIHByb3BzLmFjdGlvbk92ZXJyaWRlID8/IHRoaXMuZ2xvYmFsQWxhcm1EZWZhdWx0cy5hY3Rpb24gPz8gbm9vcEFjdGlvbigpO1xuICAgIGNvbnN0IG5hbWluZ0lucHV0ID0geyBhbGFybU5hbWVTdWZmaXg6IFwiQ29tcG9zaXRlXCIsIC4uLnByb3BzIH07XG4gICAgY29uc3QgYWxhcm1OYW1lID0gdGhpcy5hbGFybU5hbWluZ1N0cmF0ZWd5LmdldE5hbWUobmFtaW5nSW5wdXQpO1xuICAgIGNvbnN0IGFsYXJtRGVzY3JpcHRpb24gPSB0aGlzLmdlbmVyYXRlRGVzY3JpcHRpb24oXG4gICAgICBwcm9wcz8uYWxhcm1EZXNjcmlwdGlvbiA/PyBcIkNvbXBvc2l0ZSBhbGFybVwiLFxuICAgICAgcHJvcHM/LmFsYXJtRGVzY3JpcHRpb25PdmVycmlkZSxcbiAgICAgIHByb3BzPy5ydW5ib29rTGluayxcbiAgICAgIHByb3BzPy5kb2N1bWVudGF0aW9uTGluayxcbiAgICApO1xuICAgIGNvbnN0IGRlZHVwZVN0cmluZyA9IHRoaXMuYWxhcm1OYW1pbmdTdHJhdGVneS5nZXREZWR1cGVTdHJpbmcobmFtaW5nSW5wdXQpO1xuICAgIGNvbnN0IGFsYXJtUnVsZSA9IHRoaXMuZGV0ZXJtaW5lQ29tcG9zaXRlQWxhcm1SdWxlKGFsYXJtcywgcHJvcHMpO1xuXG4gICAgY29uc3QgYWxhcm0gPSBuZXcgQ29tcG9zaXRlQWxhcm0odGhpcy5hbGFybVNjb3BlLCBhbGFybU5hbWUsIHtcbiAgICAgIGNvbXBvc2l0ZUFsYXJtTmFtZTogYWxhcm1OYW1lLFxuICAgICAgYWxhcm1EZXNjcmlwdGlvbixcbiAgICAgIGFsYXJtUnVsZSxcbiAgICAgIGFjdGlvbnNFbmFibGVkLFxuICAgICAgYWN0aW9uc1N1cHByZXNzb3I6IHByb3BzPy5hY3Rpb25zU3VwcHJlc3NvcixcbiAgICAgIGFjdGlvbnNTdXBwcmVzc29yRXh0ZW5zaW9uUGVyaW9kOiBwcm9wcz8uYWN0aW9uc1N1cHByZXNzb3JFeHRlbnNpb25QZXJpb2QsXG4gICAgICBhY3Rpb25zU3VwcHJlc3NvcldhaXRQZXJpb2Q6IHByb3BzPy5hY3Rpb25zU3VwcHJlc3NvcldhaXRQZXJpb2QsXG4gICAgfSk7XG5cbiAgICBhY3Rpb24uYWRkQWxhcm1BY3Rpb25zKHtcbiAgICAgIGFsYXJtLFxuICAgICAgYWN0aW9uLFxuICAgICAgZGVkdXBlU3RyaW5nLFxuICAgICAgZGlzYW1iaWd1YXRvcjogcHJvcHM/LmRpc2FtYmlndWF0b3IsXG4gICAgICBjdXN0b21UYWdzOiBwcm9wcz8uY3VzdG9tVGFncyxcbiAgICAgIGN1c3RvbVBhcmFtczogcHJvcHM/LmN1c3RvbVBhcmFtcyxcbiAgICB9KTtcblxuICAgIHJldHVybiBhbGFybTtcbiAgfVxuXG4gIHByb3RlY3RlZCBkZXRlcm1pbmVDb21wb3NpdGVBbGFybVJ1bGUoXG4gICAgYWxhcm1zOiBBbGFybVdpdGhBbm5vdGF0aW9uW10sXG4gICAgcHJvcHM6IEFkZENvbXBvc2l0ZUFsYXJtUHJvcHMsXG4gICk6IElBbGFybVJ1bGUge1xuICAgIGNvbnN0IGFsYXJtUnVsZXMgPSBhbGFybXMubWFwKChhbGFybSkgPT4gYWxhcm0uYWxhcm1SdWxlV2hlbkFsYXJtaW5nKTtcbiAgICBjb25zdCBvcGVyYXRvciA9IHByb3BzLmNvbXBvc2l0ZU9wZXJhdG9yID8/IENvbXBvc2l0ZUFsYXJtT3BlcmF0b3IuT1I7XG4gICAgc3dpdGNoIChvcGVyYXRvcikge1xuICAgICAgY2FzZSBDb21wb3NpdGVBbGFybU9wZXJhdG9yLkFORDpcbiAgICAgICAgcmV0dXJuIEFsYXJtUnVsZS5hbGxPZiguLi5hbGFybVJ1bGVzKTtcbiAgICAgIGNhc2UgQ29tcG9zaXRlQWxhcm1PcGVyYXRvci5PUjpcbiAgICAgICAgcmV0dXJuIEFsYXJtUnVsZS5hbnlPZiguLi5hbGFybVJ1bGVzKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgY29tcG9zaXRlIGFsYXJtIG9wZXJhdG9yOiAke29wZXJhdG9yfWApO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBkZXRlcm1pbmVBY3Rpb25zRW5hYmxlZChcbiAgICBhY3Rpb25zRW5hYmxlZD86IGJvb2xlYW4sXG4gICAgZGlzYW1iaWd1YXRvcj86IHN0cmluZyxcbiAgKTogYm9vbGVhbiB7XG4gICAgaWYgKGFjdGlvbnNFbmFibGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIGFsYXJtLXNwZWNpZmljIG92ZXJyaWRlIHRvIHRydWUgb3IgZmFsc2VcbiAgICAgIHJldHVybiBhY3Rpb25zRW5hYmxlZDtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB0aGlzLmdsb2JhbEFsYXJtRGVmYXVsdHMuYWN0aW9uc0VuYWJsZWQgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAvLyBnbG9iYWwgZGVmYXVsdHM6IGJvb2xlYW4gdmFsdWVcbiAgICAgIHJldHVybiB0aGlzLmdsb2JhbEFsYXJtRGVmYXVsdHMuYWN0aW9uc0VuYWJsZWQ7XG4gICAgfVxuICAgIGlmIChkaXNhbWJpZ3VhdG9yKSB7XG4gICAgICAvLyBnbG9iYWwgZGVmYXVsdHM6IGRpc2FtYmlndWF0b3IgYmFzZWQgdmFsdWVcbiAgICAgIHJldHVybiB0aGlzLmdsb2JhbEFsYXJtRGVmYXVsdHMuYWN0aW9uc0VuYWJsZWRbZGlzYW1iaWd1YXRvcl0gPz8gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBkZXRlcm1pbmVBY3Rpb24oXG4gICAgZGlzYW1iaWd1YXRvcj86IHN0cmluZyxcbiAgICBhY3Rpb25PdmVycmlkZT86IElBbGFybUFjdGlvblN0cmF0ZWd5LFxuICApOiBJQWxhcm1BY3Rpb25TdHJhdGVneSB7XG4gICAgLy8gRXhwbGljaXQgb3ZlcnJpZGVcbiAgICBpZiAoYWN0aW9uT3ZlcnJpZGUpIHtcbiAgICAgIHJldHVybiBhY3Rpb25PdmVycmlkZTtcbiAgICB9XG5cbiAgICAvLyBEZWZhdWx0IGJ5IGRpc2FtYml1Z2F0b3JcbiAgICBpZiAoXG4gICAgICBkaXNhbWJpZ3VhdG9yICYmXG4gICAgICB0aGlzLmdsb2JhbEFsYXJtRGVmYXVsdHMuZGlzYW1iaWd1YXRvckFjdGlvbj8uW2Rpc2FtYmlndWF0b3JdXG4gICAgKSB7XG4gICAgICByZXR1cm4gdGhpcy5nbG9iYWxBbGFybURlZmF1bHRzLmRpc2FtYmlndWF0b3JBY3Rpb25bZGlzYW1iaWd1YXRvcl07XG4gICAgfVxuXG4gICAgLy8gRGVmYXVsdCBnbG9iYWwgYWN0aW9uXG4gICAgcmV0dXJuIHRoaXMuZ2xvYmFsQWxhcm1EZWZhdWx0cy5hY3Rpb24gPz8gbm9vcEFjdGlvbigpO1xuICB9XG5cbiAgZ2V0IHNob3VsZFVzZURlZmF1bHREZWR1cGVGb3JFcnJvcigpIHtcbiAgICByZXR1cm4gdGhpcy5nbG9iYWxBbGFybURlZmF1bHRzLnVzZURlZmF1bHREZWR1cGVGb3JFcnJvciA/PyB0cnVlO1xuICB9XG5cbiAgZ2V0IHNob3VsZFVzZURlZmF1bHREZWR1cGVGb3JMYXRlbmN5KCkge1xuICAgIHJldHVybiB0aGlzLmdsb2JhbEFsYXJtRGVmYXVsdHMudXNlRGVmYXVsdERlZHVwZUZvckxhdGVuY3kgPz8gdHJ1ZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZW5lcmF0ZURlc2NyaXB0aW9uKFxuICAgIGFsYXJtRGVzY3JpcHRpb246IHN0cmluZyxcbiAgICBhbGFybURlc2NyaXB0aW9uT3ZlcnJpZGU/OiBzdHJpbmcsXG4gICAgcnVuYm9va0xpbmtPdmVycmlkZT86IHN0cmluZyxcbiAgICBkb2N1bWVudGF0aW9uTGlua092ZXJyaWRlPzogc3RyaW5nLFxuICApIHtcbiAgICBjb25zdCBwYXJ0cyA9IFthbGFybURlc2NyaXB0aW9uT3ZlcnJpZGUgPz8gYWxhcm1EZXNjcmlwdGlvbl07XG5cbiAgICBjb25zdCBydW5ib29rTGluayA9XG4gICAgICBydW5ib29rTGlua092ZXJyaWRlID8/IHRoaXMuZ2xvYmFsQWxhcm1EZWZhdWx0cy5ydW5ib29rTGluaztcbiAgICBjb25zdCBkb2N1bWVudGF0aW9uTGluayA9XG4gICAgICBkb2N1bWVudGF0aW9uTGlua092ZXJyaWRlID8/IHRoaXMuZ2xvYmFsQWxhcm1EZWZhdWx0cy5kb2N1bWVudGF0aW9uTGluaztcblxuICAgIGlmIChydW5ib29rTGluaykge1xuICAgICAgcGFydHMucHVzaChgUnVuYm9vazogJHtydW5ib29rTGlua31gKTtcbiAgICB9XG5cbiAgICBpZiAoZG9jdW1lbnRhdGlvbkxpbmspIHtcbiAgICAgIHBhcnRzLnB1c2goYERvY3VtZW50YXRpb246ICR7ZG9jdW1lbnRhdGlvbkxpbmt9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuam9pbkRlc2NyaXB0aW9uUGFydHMoLi4ucGFydHMpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGpvaW5EZXNjcmlwdGlvblBhcnRzKC4uLnBhcnRzOiBzdHJpbmdbXSkge1xuICAgIHJldHVybiBwYXJ0cy5qb2luKFwiIFxcclxcblwiKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjcmVhdGVBbm5vdGF0aW9uKHByb3BzOiBBbGFybUFubm90YXRpb25TdHJhdGVneVByb3BzKSB7XG4gICAgY29uc3Qgc3RyYXRlZ3kgPVxuICAgICAgdGhpcy5nbG9iYWxBbGFybURlZmF1bHRzLmFubm90YXRpb25TdHJhdGVneSA/P1xuICAgICAgbmV3IERlZmF1bHRBbGFybUFubm90YXRpb25TdHJhdGVneSgpO1xuICAgIHJldHVybiBzdHJhdGVneS5jcmVhdGVBbm5vdGF0aW9uKHByb3BzKTtcbiAgfVxufVxuIl19