UNPKG

@renovosolutions/cdk-library-cloudwatch-alarms

Version:

AWS CDK Construct Library to automatically create CloudWatch Alarms for resources in a CDK app based on resource type.

228 lines 39.7 kB
"use strict"; var _a, _b, _c, _d, _e; Object.defineProperty(exports, "__esModule", { value: true }); exports.ApplicationTargetGroupRecommendedAlarmsAspect = exports.ApplicationTargetGroup = exports.ApplicationTargetGroupRecommendedAlarms = exports.ApplicationTargetGroupUnHealthyHostCountAlarm = exports.ApplicationTargetGroupHealthyHostCountAlarm = exports.ApplicationTargetGroupRecommendedAlarmsMetrics = void 0; const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); const aws_cdk_lib_1 = require("aws-cdk-lib"); const constructs_1 = require("constructs"); const common_1 = require("./common"); /** * The recommended metrics for ApplicationTargetGroup alarms. */ var ApplicationTargetGroupRecommendedAlarmsMetrics; (function (ApplicationTargetGroupRecommendedAlarmsMetrics) { /** * The number of healthy targets in the target group. */ ApplicationTargetGroupRecommendedAlarmsMetrics["HEALTHY_HOST_COUNT"] = "HealthyHostCount"; /** * The number of unhealthy targets in the target group. */ ApplicationTargetGroupRecommendedAlarmsMetrics["UNHEALTHY_HOST_COUNT"] = "UnHealthyHostCount"; })(ApplicationTargetGroupRecommendedAlarmsMetrics || (exports.ApplicationTargetGroupRecommendedAlarmsMetrics = ApplicationTargetGroupRecommendedAlarmsMetrics = {})); /** * This alarm is used to detect when the number of healthy hosts in the target group falls below the threshold. * * A low number of healthy hosts can indicate service availability issues. */ class ApplicationTargetGroupHealthyHostCountAlarm extends aws_cdk_lib_1.aws_cloudwatch.Alarm { constructor(scope, id, props) { const alarmName = props.alarmName ?? `${props.targetGroup.targetGroupName} - ${ApplicationTargetGroupRecommendedAlarmsMetrics.HEALTHY_HOST_COUNT}`; const period = props.period ?? aws_cdk_lib_1.Duration.minutes(1); const evaluationPeriods = props.evaluationPeriods ?? 5; const datapointsToAlarm = props.datapointsToAlarm ?? 5; const threshold = props.threshold ?? 1; const treatMissingData = props.treatMissingData ?? aws_cdk_lib_1.aws_cloudwatch.TreatMissingData.MISSING; const alarmDescription = props.alarmDescription ?? 'This alarm is used to detect when the number of healthy hosts in the target group falls below the threshold.'; (0, common_1.validateTotalAlarmPeriod)(period, evaluationPeriods, alarmName); super(scope, id, { alarmName, metric: new aws_cdk_lib_1.aws_cloudwatch.Metric({ namespace: 'AWS/ApplicationELB', metricName: ApplicationTargetGroupRecommendedAlarmsMetrics.HEALTHY_HOST_COUNT, dimensionsMap: { TargetGroup: props.targetGroup.targetGroupFullName, LoadBalancer: props.targetGroup.firstLoadBalancerFullName, }, statistic: 'Average', period, }), threshold, evaluationPeriods, datapointsToAlarm, treatMissingData, comparisonOperator: aws_cdk_lib_1.aws_cloudwatch.ComparisonOperator.LESS_THAN_THRESHOLD, alarmDescription, }); if (props.alarmAction) this.addAlarmAction(props.alarmAction); if (props.okAction) this.addOkAction(props.okAction); if (props.insufficientDataAction) this.addInsufficientDataAction(props.insufficientDataAction); } } exports.ApplicationTargetGroupHealthyHostCountAlarm = ApplicationTargetGroupHealthyHostCountAlarm; _a = JSII_RTTI_SYMBOL_1; ApplicationTargetGroupHealthyHostCountAlarm[_a] = { fqn: "@renovosolutions/cdk-library-cloudwatch-alarms.ApplicationTargetGroupHealthyHostCountAlarm", version: "0.0.17" }; ; /** * This alarm is used to detect when the number of unhealthy hosts in the target group exceeds the threshold. * * A high number of unhealthy hosts can indicate service health issues. */ class ApplicationTargetGroupUnHealthyHostCountAlarm extends aws_cdk_lib_1.aws_cloudwatch.Alarm { constructor(scope, id, props) { const alarmName = props.alarmName ?? `${props.targetGroup.targetGroupName} - ${ApplicationTargetGroupRecommendedAlarmsMetrics.UNHEALTHY_HOST_COUNT}`; const period = props.period ?? aws_cdk_lib_1.Duration.minutes(1); const evaluationPeriods = props.evaluationPeriods ?? 5; const datapointsToAlarm = props.datapointsToAlarm ?? 5; const threshold = props.threshold ?? 0; const treatMissingData = props.treatMissingData ?? aws_cdk_lib_1.aws_cloudwatch.TreatMissingData.MISSING; const alarmDescription = props.alarmDescription ?? 'This alarm is used to detect when the number of unhealthy hosts in the target group exceeds the threshold.'; (0, common_1.validateTotalAlarmPeriod)(period, evaluationPeriods, alarmName); super(scope, id, { alarmName, metric: new aws_cdk_lib_1.aws_cloudwatch.Metric({ namespace: 'AWS/ApplicationELB', metricName: ApplicationTargetGroupRecommendedAlarmsMetrics.UNHEALTHY_HOST_COUNT, dimensionsMap: { TargetGroup: props.targetGroup.targetGroupFullName, LoadBalancer: props.targetGroup.firstLoadBalancerFullName, }, statistic: 'Average', period, }), threshold, evaluationPeriods, datapointsToAlarm, treatMissingData, comparisonOperator: aws_cdk_lib_1.aws_cloudwatch.ComparisonOperator.GREATER_THAN_THRESHOLD, alarmDescription, }); if (props.alarmAction) this.addAlarmAction(props.alarmAction); if (props.okAction) this.addOkAction(props.okAction); if (props.insufficientDataAction) this.addInsufficientDataAction(props.insufficientDataAction); } } exports.ApplicationTargetGroupUnHealthyHostCountAlarm = ApplicationTargetGroupUnHealthyHostCountAlarm; _b = JSII_RTTI_SYMBOL_1; ApplicationTargetGroupUnHealthyHostCountAlarm[_b] = { fqn: "@renovosolutions/cdk-library-cloudwatch-alarms.ApplicationTargetGroupUnHealthyHostCountAlarm", version: "0.0.17" }; ; /** * A construct that creates the recommended alarms for an ApplicationTargetGroup. * * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/elb-metricscollected.html */ class ApplicationTargetGroupRecommendedAlarms extends constructs_1.Construct { constructor(scope, id, props) { super(scope, id); if (!props.excludeAlarms?.includes(ApplicationTargetGroupRecommendedAlarmsMetrics.HEALTHY_HOST_COUNT)) { this.alarmHealthyHostCount = new ApplicationTargetGroupHealthyHostCountAlarm(this, `${props.targetGroup.node.id}_HealthyHostCount`, { targetGroup: props.targetGroup, treatMissingData: props.treatMissingData, ...props.configHealthyHostCountAlarm, }); if (props.defaultAlarmAction && !props.configHealthyHostCountAlarm?.alarmAction) { this.alarmHealthyHostCount.addAlarmAction(props.defaultAlarmAction); } if (props.defaultOkAction && !props.configHealthyHostCountAlarm?.okAction) { this.alarmHealthyHostCount.addOkAction(props.defaultOkAction); } if (props.defaultInsufficientDataAction && !props.configHealthyHostCountAlarm?.insufficientDataAction) { this.alarmHealthyHostCount.addInsufficientDataAction(props.defaultInsufficientDataAction); } } if (!props.excludeAlarms?.includes(ApplicationTargetGroupRecommendedAlarmsMetrics.UNHEALTHY_HOST_COUNT)) { this.alarmUnHealthyHostCount = new ApplicationTargetGroupUnHealthyHostCountAlarm(this, `${props.targetGroup.node.id}_UnHealthyHostCount`, { targetGroup: props.targetGroup, treatMissingData: props.treatMissingData, ...props.configUnHealthyHostCountAlarm, }); if (props.defaultAlarmAction && !props.configUnHealthyHostCountAlarm?.alarmAction) { this.alarmUnHealthyHostCount.addAlarmAction(props.defaultAlarmAction); } if (props.defaultOkAction && !props.configUnHealthyHostCountAlarm?.okAction) { this.alarmUnHealthyHostCount.addOkAction(props.defaultOkAction); } if (props.defaultInsufficientDataAction && !props.configUnHealthyHostCountAlarm?.insufficientDataAction) { this.alarmUnHealthyHostCount.addInsufficientDataAction(props.defaultInsufficientDataAction); } } } } exports.ApplicationTargetGroupRecommendedAlarms = ApplicationTargetGroupRecommendedAlarms; _c = JSII_RTTI_SYMBOL_1; ApplicationTargetGroupRecommendedAlarms[_c] = { fqn: "@renovosolutions/cdk-library-cloudwatch-alarms.ApplicationTargetGroupRecommendedAlarms", version: "0.0.17" }; /** * An extension for the ApplicationTargetGroup construct that provides methods * to create recommended alarms. */ class ApplicationTargetGroup extends aws_cdk_lib_1.aws_elasticloadbalancingv2.ApplicationTargetGroup { constructor(scope, id, props) { super(scope, id, props); } /** * Creates an alarm that monitors the healthy host count for the ApplicationTargetGroup. */ alarmHealthyHostCount(props) { return new ApplicationTargetGroupHealthyHostCountAlarm(this, 'HealthyHostCountAlarm', { targetGroup: this, ...props, }); } /** * Creates an alarm that monitors the unhealthy host count for the ApplicationTargetGroup. */ alarmUnHealthyHostCount(props) { return new ApplicationTargetGroupUnHealthyHostCountAlarm(this, 'UnHealthyHostCountAlarm', { targetGroup: this, ...props, }); } /** * Creates the recommended alarms for the ApplicationTargetGroup. * * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/elb-metricscollected.html */ applyRecommendedAlarms(props) { return new ApplicationTargetGroupRecommendedAlarms(this, 'ApplicationTargetGroupRecommendedAlarms', { targetGroup: this, ...props, }); } } exports.ApplicationTargetGroup = ApplicationTargetGroup; _d = JSII_RTTI_SYMBOL_1; ApplicationTargetGroup[_d] = { fqn: "@renovosolutions/cdk-library-cloudwatch-alarms.ApplicationTargetGroup", version: "0.0.17" }; /** * Configures the recommended alarms for an ApplicationTargetGroup. * * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/elb-metricscollected.html */ class ApplicationTargetGroupRecommendedAlarmsAspect { constructor(props) { this.props = props; } visit(node) { if (node instanceof aws_cdk_lib_1.aws_elasticloadbalancingv2.ApplicationTargetGroup) { if (this.props.excludeResources && this.props.excludeResources.includes(node.node.id)) { return; } else { const targetGroup = node; new ApplicationTargetGroupRecommendedAlarms(targetGroup, 'ApplicationTargetGroupRecommendedAlarmsFromAspect', { targetGroup, ...this.props, }); } } } } exports.ApplicationTargetGroupRecommendedAlarmsAspect = ApplicationTargetGroupRecommendedAlarmsAspect; _e = JSII_RTTI_SYMBOL_1; ApplicationTargetGroupRecommendedAlarmsAspect[_e] = { fqn: "@renovosolutions/cdk-library-cloudwatch-alarms.ApplicationTargetGroupRecommendedAlarmsAspect", version: "0.0.17" }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwbGljYXRpb250YXJnZXRncm91cC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9hcHBsaWNhdGlvbnRhcmdldGdyb3VwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsNkNBS3FCO0FBQ3JCLDJDQUFtRDtBQUNuRCxxQ0FBb0U7QUFFcEU7O0dBRUc7QUFDSCxJQUFZLDhDQVNYO0FBVEQsV0FBWSw4Q0FBOEM7SUFDeEQ7O09BRUc7SUFDSCx5RkFBdUMsQ0FBQTtJQUN2Qzs7T0FFRztJQUNILDZGQUEyQyxDQUFBO0FBQzdDLENBQUMsRUFUVyw4Q0FBOEMsOERBQTlDLDhDQUE4QyxRQVN6RDtBQXFFRDs7OztHQUlHO0FBQ0gsTUFBYSwyQ0FBNEMsU0FBUSw0QkFBVSxDQUFDLEtBQUs7SUFDL0UsWUFBWSxLQUFpQixFQUFFLEVBQVUsRUFBRSxLQUF1RDtRQUNoRyxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsU0FBUyxJQUFJLEdBQUcsS0FBSyxDQUFDLFdBQVcsQ0FBQyxlQUFlLE1BQU0sOENBQThDLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUNuSixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxJQUFJLHNCQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25ELE1BQU0saUJBQWlCLEdBQUcsS0FBSyxDQUFDLGlCQUFpQixJQUFJLENBQUMsQ0FBQztRQUN2RCxNQUFNLGlCQUFpQixHQUFHLEtBQUssQ0FBQyxpQkFBaUIsSUFBSSxDQUFDLENBQUM7UUFDdkQsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLFNBQVMsSUFBSSxDQUFDLENBQUM7UUFDdkMsTUFBTSxnQkFBZ0IsR0FBRyxLQUFLLENBQUMsZ0JBQWdCLElBQUksNEJBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUM7UUFDdkYsTUFBTSxnQkFBZ0IsR0FBRyxLQUFLLENBQUMsZ0JBQWdCLElBQUksOEdBQThHLENBQUM7UUFFbEssSUFB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RSxDQUFDO1lBQ2pELElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Z0JBQ3RGLE9BQU87WUFDVCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sTUFBTSxXQUFXLEdBQUcsSUFBb0MsQ0FBQztnQkFFekQsSUFBSSx1Q0FBdUMsQ0FBQyxXQUFXLEVBQUUsbURBQW1ELEVBQUU7b0JBQzVHLFdBQVc7b0JBQ1gsR0FBRyxJQUFJLENBQUMsS0FBSztpQkFDZCxDQUFDLENBQUM7WUFDTCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7O0FBaEJILHNHQWlCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIElBc3BlY3QsXG4gIGF3c19lbGFzdGljbG9hZGJhbGFuY2luZ3YyIGFzIGVsYnYyLFxuICBhd3NfY2xvdWR3YXRjaCBhcyBjbG91ZHdhdGNoLFxuICBEdXJhdGlvbixcbn0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHsgQ29uc3RydWN0LCBJQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBBbGFybUJhc2VQcm9wcywgdmFsaWRhdGVUb3RhbEFsYXJtUGVyaW9kIH0gZnJvbSAnLi9jb21tb24nO1xuXG4vKipcbiAqIFRoZSByZWNvbW1lbmRlZCBtZXRyaWNzIGZvciBBcHBsaWNhdGlvblRhcmdldEdyb3VwIGFsYXJtcy5cbiAqL1xuZXhwb3J0IGVudW0gQXBwbGljYXRpb25UYXJnZXRHcm91cFJlY29tbWVuZGVkQWxhcm1zTWV0cmljcyB7XG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIGhlYWx0aHkgdGFyZ2V0cyBpbiB0aGUgdGFyZ2V0IGdyb3VwLlxuICAgKi9cbiAgSEVBTFRIWV9IT1NUX0NPVU5UID0gJ0hlYWx0aHlIb3N0Q291bnQnLFxuICAvKipcbiAgICogVGhlIG51bWJlciBvZiB1bmhlYWx0aHkgdGFyZ2V0cyBpbiB0aGUgdGFyZ2V0IGdyb3VwLlxuICAgKi9cbiAgVU5IRUFMVEhZX0hPU1RfQ09VTlQgPSAnVW5IZWFsdGh5SG9zdENvdW50Jyxcbn1cblxuLyoqXG4gKiBUaGUgY29tbW9uIG9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBhbGFybXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBwbGljYXRpb25UYXJnZXRHcm91cEFsYXJtQmFzZUNvbmZpZyBleHRlbmRzIEFsYXJtQmFzZVByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBwZXJpb2Qgb3ZlciB3aGljaCB0aGUgc3BlY2lmaWVkIHN0YXRpc3RpYyBpcyBhcHBsaWVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBEdXJhdGlvbi5taW51dGVzKDEpXG4gICAqL1xuICByZWFkb25seSBwZXJpb2Q/OiBEdXJhdGlvbjtcbn1cblxuLyoqXG4gKiBUaGUgY29tbW9uIHByb3BlcnRpZXMgZm9yIHRoZSBBcHBsaWNhdGlvblRhcmdldEdyb3VwIGFsYXJtcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBcHBsaWNhdGlvblRhcmdldEdyb3VwQWxhcm1Qcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgQXBwbGljYXRpb25UYXJnZXRHcm91cCB0byBtb25pdG9yLlxuICAgKi9cbiAgcmVhZG9ubHkgdGFyZ2V0R3JvdXA6IGVsYnYyLkFwcGxpY2F0aW9uVGFyZ2V0R3JvdXA7XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgdGhlIEhlYWx0aHlIb3N0Q291bnQgYWxhcm0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBwbGljYXRpb25UYXJnZXRHcm91cEhlYWx0aHlIb3N0Q291bnRBbGFybUNvbmZpZyBleHRlbmRzIEFwcGxpY2F0aW9uVGFyZ2V0R3JvdXBBbGFybUJhc2VDb25maWcge1xuICAvKipcbiAgICogVGhlIHZhbHVlIGFnYWluc3Qgd2hpY2ggdGhlIHNwZWNpZmllZCBzdGF0aXN0aWMgaXMgY29tcGFyZWQuXG4gICAqIFlvdSBzaG91bGQgc2V0IHRoaXMgdGhyZXNob2xkIGJhc2VkIG9uIHRoZSBtaW5pbXVtIG51bWJlciBvZiBoZWFsdGh5IGhvc3RzXG4gICAqIHJlcXVpcmVkIGZvciB5b3VyIGFwcGxpY2F0aW9uIHRvIGZ1bmN0aW9uIHByb3Blcmx5LlxuICAgKlxuICAgKiBAZGVmYXVsdCAxXG4gICAqL1xuICByZWFkb25seSB0aHJlc2hvbGQ/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIHBlcmlvZHMgb3ZlciB3aGljaCBkYXRhIGlzIGNvbXBhcmVkIHRvIHRoZSBzcGVjaWZpZWQgdGhyZXNob2xkLlxuICAgKlxuICAgKiBAZGVmYXVsdCA1XG4gICAqL1xuICByZWFkb25seSBldmFsdWF0aW9uUGVyaW9kcz86IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSBudW1iZXIgb2YgZGF0YSBwb2ludHMgdGhhdCBtdXN0IGJlIGJyZWFjaGluZyB0byB0cmlnZ2VyIHRoZSBhbGFybS5cbiAgICpcbiAgICogQGRlZmF1bHQgNVxuICAgKi9cbiAgcmVhZG9ubHkgZGF0YXBvaW50c1RvQWxhcm0/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgYWxhcm0gbmFtZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSB0YXJnZXRHcm91cE5hbWUgKyAnIC0gSGVhbHRoeUhvc3RDb3VudCdcbiAgICovXG4gIHJlYWRvbmx5IGFsYXJtTmFtZT86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgYWxhcm0uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gVGhpcyBhbGFybSBpcyB1c2VkIHRvIGRldGVjdCB3aGVuIHRoZSBudW1iZXIgb2YgaGVhbHRoeSBob3N0cyBpbiB0aGUgdGFyZ2V0IGdyb3VwXG4gICAqIGZhbGxzIGJlbG93IHRoZSB0aHJlc2hvbGQuIEEgbG93IG51bWJlciBvZiBoZWFsdGh5IGhvc3RzIGNhbiBpbmRpY2F0ZSBzZXJ2aWNlIGF2YWlsYWJpbGl0eSBpc3N1ZXMuXG4gICAqL1xuICByZWFkb25seSBhbGFybURlc2NyaXB0aW9uPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBwcm9wZXJ0aWVzIGZvciB0aGUgQXBwbGljYXRpb25UYXJnZXRHcm91cEhlYWx0aHlIb3N0Q291bnRBbGFybSBjb25zdHJ1Y3QuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBwbGljYXRpb25UYXJnZXRHcm91cEhlYWx0aHlIb3N0Q291bnRBbGFybVByb3BzIGV4dGVuZHMgQXBwbGljYXRpb25UYXJnZXRHcm91cEFsYXJtUHJvcHMsXG4gIEFwcGxpY2F0aW9uVGFyZ2V0R3JvdXBIZWFsdGh5SG9zdENvdW50QWxhcm1Db25maWcge31cblxuLyoqXG4gKiBUaGlzIGFsYXJtIGlzIHVzZWQgdG8gZGV0ZWN0IHdoZW4gdGhlIG51bWJlciBvZiBoZWFsdGh5IGhvc3RzIGluIHRoZSB0YXJnZXQgZ3JvdXAgZmFsbHMgYmVsb3cgdGhlIHRocmVzaG9sZC5cbiAqXG4gKiBBIGxvdyBudW1iZXIgb2YgaGVhbHRoeSBob3N0cyBjYW4gaW5kaWNhdGUgc2VydmljZSBhdmFpbGFiaWxpdHkgaXNzdWVzLlxuICovXG5leHBvcnQgY2xhc3MgQXBwbGljYXRpb25UYXJnZXRHcm91cEhlYWx0aHlIb3N0Q291bnRBbGFybSBleHRlbmRzIGNsb3Vkd2F0Y2guQWxhcm0ge1xuICBjb25zdHJ1Y3RvcihzY29wZTogSUNvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IEFwcGxpY2F0aW9uVGFyZ2V0R3JvdXBIZWFsdGh5SG9zdENvdW50QWxhcm1Qcm9wcykge1xuICAgIGNvbnN0IGFsYXJtTmFtZSA9IHByb3BzLmFsYXJtTmFtZSA/PyBgJHtwcm9wcy50YXJnZXRHcm91cC50YXJnZXRHcm91cE5hbWV9IC0gJHtBcHBsaWNhdGlvblRhcmdldEdyb3VwUmVjb21tZW5kZWRBbGFybXNNZXRyaWNzLkhFQUxUSFlfSE9TVF9DT1VOVH1gO1xuICAgIGNvbnN0IHBlcmlvZCA9IHByb3BzLnBlcmlvZCA/PyBEdXJhdGlvbi5taW51dGVzKDEpO1xuICAgIGNvbnN0IGV2YWx1YXRpb25QZXJpb2RzID0gcHJvcHMuZXZhbHVhdGlvblBlcmlvZHMgPz8gNTtcbiAgICBjb25zdCBkYXRhcG9pbnRzVG9BbGFybSA9IHByb3BzLmRhdGFwb2ludHNUb0FsYXJtID8/IDU7XG4gICAgY29uc3QgdGhyZXNob2xkID0gcHJvcHMudGhyZXNob2xkID8/IDE7XG4gICAgY29uc3QgdHJlYXRNaXNzaW5nRGF0YSA9IHByb3BzLnRyZWF0TWlzc2luZ0RhdGEgPz8gY2xvdWR3YXRjaC5UcmVhdE1pc3NpbmdEYXRhLk1JU1NJTkc7XG4gICAgY29uc3QgYWxhcm1EZXNjcmlwdGlvbiA9IHByb3BzLmFsYXJtRGVzY3JpcHRpb24gPz8gJ1RoaXMgYWxhcm0gaXMgdXNlZCB0byBkZXRlY3Qgd2hlbiB0aGUgbnVtYmVyIG9mIGhlYWx0aHkgaG9zdHMgaW4gdGhlIHRhcmdldCBncm91cCBmYWxscyBiZWxvdyB0aGUgdGhyZXNob2xkLic7XG5cbiAgICB2YWxpZGF0ZVRvdGFsQWxhcm1QZXJpb2QocGVyaW9kLCBldmFsdWF0aW9uUGVyaW9kcywgYWxhcm1OYW1lKTtcblxuICAgIHN1cGVyKHNjb3BlLCBpZCwge1xuICAgICAgYWxhcm1OYW1lLFxuICAgICAgbWV0cmljOiBuZXcgY2xvdWR3YXRjaC5NZXRyaWMoe1xuICAgICAgICBuYW1lc3BhY2U6ICdBV1MvQXBwbGljYXRpb25FTEInLFxuICAgICAgICBtZXRyaWNOYW1lOiBBcHBsaWNhdGlvblRhcmdldEdyb3VwUmVjb21tZW5kZWRBbGFybXNNZXRyaWNzLkhFQUxUSFlfSE9TVF9DT1VOVCxcbiAgICAgICAgZGltZW5zaW9uc01hcDoge1xuICAgICAgICAgIFRhcmdldEdyb3VwOiBwcm9wcy50YXJnZXRHcm91cC50YXJnZXRHcm91cEZ1bGxOYW1lLFxuICAgICAgICAgIExvYWRCYWxhbmNlcjogcHJvcHMudGFyZ2V0R3JvdXAuZmlyc3RMb2FkQmFsYW5jZXJGdWxsTmFtZSxcbiAgICAgICAgfSxcbiAgICAgICAgc3RhdGlzdGljOiAnQXZlcmFnZScsXG4gICAgICAgIHBlcmlvZCxcbiAgICAgIH0pLFxuICAgICAgdGhyZXNob2xkLFxuICAgICAgZXZhbHVhdGlvblBlcmlvZHMsXG4gICAgICBkYXRhcG9pbnRzVG9BbGFybSxcbiAgICAgIHRyZWF0TWlzc2luZ0RhdGEsXG4gICAgICBjb21wYXJpc29uT3BlcmF0b3I6IGNsb3Vkd2F0Y2guQ29tcGFyaXNvbk9wZXJhdG9yLkxFU1NfVEhBTl9USFJFU0hPTEQsXG4gICAgICBhbGFybURlc2NyaXB0aW9uLFxuICAgIH0pO1xuXG4gICAgaWYgKHByb3BzLmFsYXJtQWN0aW9uKSB0aGlzLmFkZEFsYXJtQWN0aW9uKHByb3BzLmFsYXJtQWN0aW9uKTtcbiAgICBpZiAocHJvcHMub2tBY3Rpb24pIHRoaXMuYWRkT2tBY3Rpb24ocHJvcHMub2tBY3Rpb24pO1xuICAgIGlmIChwcm9wcy5pbnN1ZmZpY2llbnREYXRhQWN0aW9uKSB0aGlzLmFkZEluc3VmZmljaWVudERhdGFBY3Rpb24ocHJvcHMuaW5zdWZmaWNpZW50RGF0YUFjdGlvbik7XG4gIH1cbn07XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgdGhlIFVuSGVhbHRoeUhvc3RDb3VudCBhbGFybS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBcHBsaWNhdGlvblRhcmdldEdyb3VwVW5IZWFsdGh5SG9zdENvdW50QWxhcm1Db25maWcgZXh0ZW5kcyBBcHBsaWNhdGlvblRhcmdldEdyb3VwQWxhcm1CYXNlQ29uZmlnIHtcbiAgLyoqXG4gICAqIFRoZSB2YWx1ZSBhZ2FpbnN0IHdoaWNoIHRoZSBzcGVjaWZpZWQgc3RhdGlzdGljIGlzIGNvbXBhcmVkLlxuICAgKiBZb3Ugc2hvdWxkIHNldCB0aGlzIHRocmVzaG9sZCBiYXNlZCBvbiB0aGUgbWF4aW11bSBudW1iZXIgb2YgdW5oZWFsdGh5IGhvc3RzXG4gICAqIHRoYXQgeW91ciBhcHBsaWNhdGlvbiBjYW4gdG9sZXJhdGUgYmVmb3JlIHNlcnZpY2UgaXMgaW1wYWN0ZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IDBcbiAgICovXG4gIHJlYWRvbmx5IHRocmVzaG9sZD86IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSBudW1iZXIgb2YgcGVyaW9kcyBvdmVyIHdoaWNoIGRhdGEgaXMgY29tcGFyZWQgdG8gdGhlIHNwZWNpZmllZCB0aHJlc2hvbGQuXG4gICAqXG4gICAqIEBkZWZhdWx0IDVcbiAgICovXG4gIHJlYWRvbmx5IGV2YWx1YXRpb25QZXJpb2RzPzogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIG51bWJlciBvZiBkYXRhIHBvaW50cyB0aGF0IG11c3QgYmUgYnJlYWNoaW5nIHRvIHRyaWdnZXIgdGhlIGFsYXJtLlxuICAgKlxuICAgKiBAZGVmYXVsdCA1XG4gICAqL1xuICByZWFkb25seSBkYXRhcG9pbnRzVG9BbGFybT86IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSBhbGFybSBuYW1lLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHRhcmdldEdyb3VwTmFtZSArICcgLSBVbkhlYWx0aHlIb3N0Q291bnQnXG4gICAqL1xuICByZWFkb25seSBhbGFybU5hbWU/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIGFsYXJtLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIFRoaXMgYWxhcm0gaXMgdXNlZCB0byBkZXRlY3Qgd2hlbiB0aGUgbnVtYmVyIG9mIHVuaGVhbHRoeSBob3N0cyBpbiB0aGUgdGFyZ2V0IGdyb3VwXG4gICAqIGV4Y2VlZHMgdGhlIHRocmVzaG9sZC4gQSBoaWdoIG51bWJlciBvZiB1bmhlYWx0aHkgaG9zdHMgY2FuIGluZGljYXRlIHNlcnZpY2UgaGVhbHRoIGlzc3Vlcy5cbiAgICovXG4gIHJlYWRvbmx5IGFsYXJtRGVzY3JpcHRpb24/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIHByb3BlcnRpZXMgZm9yIHRoZSBBcHBsaWNhdGlvblRhcmdldEdyb3VwVW5IZWFsdGh5SG9zdENvdW50QWxhcm0gY29uc3RydWN0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwcGxpY2F0aW9uVGFyZ2V0R3JvdXBVbkhlYWx0aHlIb3N0Q291bnRBbGFybVByb3BzIGV4dGVuZHMgQXBwbGljYXRpb25UYXJnZXRHcm91cEFsYXJtUHJvcHMsXG4gIEFwcGxpY2F0aW9uVGFyZ2V0R3JvdXBVbkhlYWx0aHlIb3N0Q291bnRBbGFybUNvbmZpZyB7fVxuXG4vKipcbiAqIFRoaXMgYWxhcm0gaXMgdXNlZCB0byBkZXRlY3Qgd2hlbiB0aGUgbnVtYmVyIG9mIHVuaGVhbHRoeSBob3N0cyBpbiB0aGUgdGFyZ2V0IGdyb3VwIGV4Y2VlZHMgdGhlIHRocmVzaG9sZC5cbiAqXG4gKiBBIGhpZ2ggbnVtYmVyIG9mIHVuaGVhbHRoeSBob3N0cyBjYW4gaW5kaWNhdGUgc2VydmljZSBoZWFsdGggaXNzdWVzLlxuICovXG5leHBvcnQgY2xhc3MgQXBwbGljYXRpb25UYXJnZXRHcm91cFVuSGVhbHRoeUhvc3RDb3VudEFsYXJtIGV4dGVuZHMgY2xvdWR3YXRjaC5BbGFybSB7XG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBJQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogQXBwbGljYXRpb25UYXJnZXRHcm91cFVuSGVhbHRoeUhvc3RDb3VudEFsYXJtUHJvcHMpIHtcbiAgICBjb25zdCBhbGFybU5hbWUgPSBwcm9wcy5hbGFybU5hbWUgPz8gYCR7cHJvcHMudGFyZ2V0R3JvdXAudGFyZ2V0R3JvdXBOYW1lfSAtICR7QXBwbGljYXRpb25UYXJnZXRHcm91cFJlY29tbWVuZGVkQWxhcm1zTWV0cmljcy5VTkhFQUxUSFlfSE9TVF9DT1VOVH1gO1xuICAgIGNvbnN0IHBlcmlvZCA9IHByb3BzLnBlcmlvZCA/PyBEdXJhdGlvbi5taW51dGVzKDEpO1xuICAgIGNvbnN0IGV2YWx1YXRpb25QZXJpb2RzID0gcHJvcHMuZXZhbHVhdGlvblBlcmlvZHMgPz8gNTtcbiAgICBjb25zdCBkYXRhcG9pbnRzVG9BbGFybSA9IHByb3BzLmRhdGFwb2ludHNUb0FsYXJtID8/IDU7XG4gICAgY29uc3QgdGhyZXNob2xkID0gcHJvcHMudGhyZXNob2xkID8/IDA7XG4gICAgY29uc3QgdHJlYXRNaXNzaW5nRGF0YSA9IHByb3BzLnRyZWF0TWlzc2luZ0RhdGEgPz8gY2xvdWR3YXRjaC5UcmVhdE1pc3NpbmdEYXRhLk1JU1NJTkc7XG4gICAgY29uc3QgYWxhcm1EZXNjcmlwdGlvbiA9IHByb3BzLmFsYXJtRGVzY3JpcHRpb24gPz8gJ1RoaXMgYWxhcm0gaXMgdXNlZCB0byBkZXRlY3Qgd2hlbiB0aGUgbnVtYmVyIG9mIHVuaGVhbHRoeSBob3N0cyBpbiB0aGUgdGFyZ2V0IGdyb3VwIGV4Y2VlZHMgdGhlIHRocmVzaG9sZC4nO1xuXG4gICAgdmFsaWRhdGVUb3RhbEFsYXJtUGVyaW9kKHBlcmlvZCwgZXZhbHVhdGlvblBlcmlvZHMsIGFsYXJtTmFtZSk7XG5cbiAgICBzdXBlcihzY29wZSwgaWQsIHtcbiAgICAgIGFsYXJtTmFtZSxcbiAgICAgIG1ldHJpYzogbmV3IGNsb3Vkd2F0Y2guTWV0cmljKHtcbiAgICAgICAgbmFtZXNwYWNlOiAnQVdTL0FwcGxpY2F0aW9uRUxCJyxcbiAgICAgICAgbWV0cmljTmFtZTogQXBwbGljYXRpb25UYXJnZXRHcm91cFJlY29tbWVuZGVkQWxhcm1zTWV0cmljcy5VTkhFQUxUSFlfSE9TVF9DT1VOVCxcbiAgICAgICAgZGltZW5zaW9uc01hcDoge1xuICAgICAgICAgIFRhcmdldEdyb3VwOiBwcm9wcy50YXJnZXRHcm91cC50YXJnZXRHcm91cEZ1bGxOYW1lLFxuICAgICAgICAgIExvYWRCYWxhbmNlcjogcHJvcHMudGFyZ2V0R3JvdXAuZmlyc3RMb2FkQmFsYW5jZXJGdWxsTmFtZSxcbiAgICAgICAgfSxcbiAgICAgICAgc3RhdGlzdGljOiAnQXZlcmFnZScsXG4gICAgICAgIHBlcmlvZCxcbiAgICAgIH0pLFxuICAgICAgdGhyZXNob2xkLFxuICAgICAgZXZhbHVhdGlvblBlcmlvZHMsXG4gICAgICBkYXRhcG9pbnRzVG9BbGFybSxcbiAgICAgIHRyZWF0TWlzc2luZ0RhdGEsXG4gICAgICBjb21wYXJpc29uT3BlcmF0b3I6IGNsb3Vkd2F0Y2guQ29tcGFyaXNvbk9wZXJhdG9yLkdSRUFURVJfVEhBTl9USFJFU0hPTEQsXG4gICAgICBhbGFybURlc2NyaXB0aW9uLFxuICAgIH0pO1xuXG4gICAgaWYgKHByb3BzLmFsYXJtQWN0aW9uKSB0aGlzLmFkZEFsYXJtQWN0aW9uKHByb3BzLmFsYXJtQWN0aW9uKTtcbiAgICBpZiAocHJvcHMub2tBY3Rpb24pIHRoaXMuYWRkT2tBY3Rpb24ocHJvcHMub2tBY3Rpb24pO1xuICAgIGlmIChwcm9wcy5pbnN1ZmZpY2llbnREYXRhQWN0aW9uKSB0aGlzLmFkZEluc3VmZmljaWVudERhdGFBY3Rpb24ocHJvcHMuaW5zdWZmaWNpZW50RGF0YUFjdGlvbik7XG4gIH1cbn07XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbnMgZm9yIHRoZSByZWNvbW1lbmRlZCBhbGFybXMgZm9yIGFuIEFwcGxpY2F0aW9uVGFyZ2V0R3JvdXAuXG4gKlxuICogRGVmYXVsdCBhY3Rpb25zIGFyZSBvdmVycmlkZGVuIGJ5IHRoZSBhY3Rpb25zIHNwZWNpZmllZCBpbiB0aGVcbiAqIGluZGl2aWR1YWwgYWxhcm0gY29uZmlndXJhdGlvbnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBwbGljYXRpb25UYXJnZXRHcm91cFJlY29tbWVuZGVkQWxhcm1zQ29uZmlnIHtcbiAgLyoqXG4gICAqIFRoZSBkZWZhdWx0IGFjdGlvbiB0byB0YWtlIHdoZW4gYW4gYWxhcm0gaXMgdHJpZ2dlcmVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vbmVcbiAgICovXG4gIHJlYWRvbmx5IGRlZmF1bHRBbGFybUFjdGlvbj86IGNsb3Vkd2F0Y2guSUFsYXJtQWN0aW9uO1xuICAvKipcbiAgICogVGhlIGRlZmF1bHQgYWN0aW9uIHRvIHRha2Ugd2hlbiBhbiBhbGFybSBlbnRlcnMgdGhlIG9rIHN0YXRlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vbmVcbiAgICovXG4gIHJlYWRvbmx5IGRlZmF1bHRPa0FjdGlvbj86IGNsb3Vkd2F0Y2guSUFsYXJtQWN0aW9uO1xuICAvKipcbiAgICogVGhlIGRlZmF1bHQgYWN0aW9uIHRvIHRha2Ugd2hlbiBhbiBhbGFybSBoYXMgaW5zdWZmaWNpZW50IGRhdGEuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm9uZVxuICAgKi9cbiAgcmVhZG9ubHkgZGVmYXVsdEluc3VmZmljaWVudERhdGFBY3Rpb24/OiBjbG91ZHdhdGNoLklBbGFybUFjdGlvbjtcbiAgLyoqXG4gICAqIEhvdyB0byBoYW5kbGUgbWlzc2luZyBkYXRhIGZvciB0aGlzIGFsYXJtLlxuICAgKlxuICAgKiBAZGVmYXVsdCBUcmVhdE1pc3NpbmdEYXRhLk1JU1NJTkdcbiAgICovXG4gIHJlYWRvbmx5IHRyZWF0TWlzc2luZ0RhdGE/OiBjbG91ZHdhdGNoLlRyZWF0TWlzc2luZ0RhdGE7XG4gIC8qKlxuICAgKiBBbGFybSBtZXRyaWNzIHRvIGV4Y2x1ZGUgZnJvbSB0aGUgcmVjb21tZW5kZWQgYWxhcm1zLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vbmVcbiAgICovXG4gIHJlYWRvbmx5IGV4Y2x1ZGVBbGFybXM/OiBBcHBsaWNhdGlvblRhcmdldEdyb3VwUmVjb21tZW5kZWRBbGFybXNNZXRyaWNzW107XG4gIC8qKlxuICAgKiBUaGUgcmVzb3VyY2VzIHRvIGV4Y2x1ZGUgZnJvbSB0aGUgcmVjb21tZW5kZWQgYWxhcm1zLlxuICAgKlxuICAgKiBVc2UgYSByZXNvdXJjZXMgaWQgdG8gZXhjbHVkZSBhIHNwZWNpZmljIHJlc291cmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgZXhjbHVkZVJlc291cmNlcz86IHN0cmluZ1tdO1xuICAvKipcbiAgICogVGhlIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBIZWFsdGh5SG9zdENvdW50IGFsYXJtLlxuICAgKi9cbiAgcmVhZG9ubHkgY29uZmlnSGVhbHRoeUhvc3RDb3VudEFsYXJtPzogQXBwbGljYXRpb25UYXJnZXRHcm91cEhlYWx0aHlIb3N0Q291bnRBbGFybUNvbmZpZztcbiAgLyoqXG4gICAqIFRoZSBjb25maWd1cmF0aW9uIGZvciB0aGUgVW5IZWFsdGh5SG9zdENvdW50IGFsYXJtLlxuICAgKi9cbiAgcmVhZG9ubHkgY29uZmlnVW5IZWFsdGh5SG9zdENvdW50QWxhcm0/OiBBcHBsaWNhdGlvblRhcmdldEdyb3VwVW5IZWFsdGh5SG9zdENvdW50QWxhcm1Db25maWc7XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgdGhlIEFwcGxpY2F0aW9uVGFyZ2V0R3JvdXBSZWNvbW1lbmRlZEFsYXJtcyBjb25zdHJ1Y3QuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBwbGljYXRpb25UYXJnZXRHcm91cFJlY29tbWVuZGVkQWxhcm1zUHJvcHMgZXh0ZW5kcyBBcHBsaWNhdGlvblRhcmdldEdyb3VwUmVjb21tZW5kZWRBbGFybXNDb25maWcge1xuICAvKipcbiAgICogVGhlIEFwcGxpY2F0aW9uVGFyZ2V0R3JvdXAgdG8gbW9uaXRvci5cbiAgICovXG4gIHJlYWRvbmx5IHRhcmdldEdyb3VwOiBlbGJ2Mi5BcHBsaWNhdGlvblRhcmdldEdyb3VwO1xufVxuXG4vKipcbiAqIEEgY29uc3RydWN0IHRoYXQgY3JlYXRlcyB0aGUgcmVjb21tZW5kZWQgYWxhcm1zIGZvciBhbiBBcHBsaWNhdGlvblRhcmdldEdyb3VwLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkV2F0Y2gvbGF0ZXN0L21vbml0b3JpbmcvZWxiLW1ldHJpY3Njb2xsZWN0ZWQuaHRtbFxuICovXG5leHBvcnQgY2xhc3MgQXBwbGljYXRpb25UYXJnZXRHcm91cFJlY29tbWVuZGVkQWxhcm1zIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgLyoqXG4gICAqIFRoZSBIZWFsdGh5SG9zdENvdW50IGFsYXJtLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGFsYXJtSGVhbHRoeUhvc3RDb3VudD86IEFwcGxpY2F0aW9uVGFyZ2V0R3JvdXBIZWFsdGh5SG9zdENvdW50QWxhcm07XG5cbiAgLyoqXG4gICAqIFRoZSBVbkhlYWx0aHlIb3N0Q291bnQgYWxhcm0uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYWxhcm1VbkhlYWx0aHlIb3N0Q291bnQ/OiBBcHBsaWNhdGlvblRhcmdldEdyb3VwVW5IZWFsdGh5SG9zdENvdW50QWxhcm07XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IEFwcGxpY2F0aW9uVGFyZ2V0R3JvdXBSZWNvbW1lbmRlZEFsYXJtc1Byb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIGlmICghcHJvcHMuZXhjbHVkZUFsYXJtcz8uaW5jbHVkZXMoQXBwbGljYXRpb25UYXJnZXRHcm91cFJlY29tbWVuZGVkQWxhcm1zTWV0cmljcy5IRUFMVEhZX0hPU1RfQ09VTlQpKSB7XG4gICAgICB0aGlzLmFsYXJtSGVhbHRoeUhvc3RDb3VudCA9IG5ldyBBcHBsaWNhdGlvblRhcmdldEdyb3VwSGVhbHRoeUhvc3RDb3VudEFsYXJtKHRoaXMsIGAke3Byb3BzLnRhcmdldEdyb3VwLm5vZGUuaWR9X0hlYWx0aHlIb3N0Q291bnRgLCB7XG4gICAgICAgIHRhcmdldEdyb3VwOiBwcm9wcy50YXJnZXRHcm91cCxcbiAgICAgICAgdHJlYXRNaXNzaW5nRGF0YTogcHJvcHMudHJlYXRNaXNzaW5nRGF0YSxcbiAgICAgICAgLi4ucHJvcHMuY29uZmlnSGVhbHRoeUhvc3RDb3VudEFsYXJtLFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChwcm9wcy5kZWZhdWx0QWxhcm1BY3Rpb24gJiYgIXByb3BzLmNvbmZpZ0hlYWx0aHlIb3N0Q291bnRBbGFybT8uYWxhcm1BY3Rpb24pIHtcbiAgICAgICAgdGhpcy5hbGFybUhlYWx0aHlIb3N0Q291bnQuYWRkQWxhcm1BY3Rpb24ocHJvcHMuZGVmYXVsdEFsYXJtQWN0aW9uKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHByb3BzLmRlZmF1bHRPa0FjdGlvbiAmJiAhcHJvcHMuY29uZmlnSGVhbHRoeUhvc3RDb3VudEFsYXJtPy5va0FjdGlvbikge1xuICAgICAgICB0aGlzLmFsYXJtSGVhbHRoeUhvc3RDb3VudC5hZGRPa0FjdGlvbihwcm9wcy5kZWZhdWx0T2tBY3Rpb24pO1xuICAgICAgfVxuXG4gICAgICBpZiAocHJvcHMuZGVmYXVsdEluc3VmZmljaWVudERhdGFBY3Rpb24gJiYgIXByb3BzLmNvbmZpZ0hlYWx0aHlIb3N0Q291bnRBbGFybT8uaW5zdWZmaWNpZW50RGF0YUFjdGlvbikge1xuICAgICAgICB0aGlzLmFsYXJtSGVhbHRoeUhvc3RDb3VudC5hZGRJbnN1ZmZpY2llbnREYXRhQWN0aW9uKHByb3BzLmRlZmF1bHRJbnN1ZmZpY2llbnREYXRhQWN0aW9uKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXByb3BzLmV4Y2x1ZGVBbGFybXM/LmluY2x1ZGVzKEFwcGxpY2F0aW9uVGFyZ2V0R3JvdXBSZWNvbW1lbmRlZEFsYXJtc01ldHJpY3MuVU5IRUFMVEhZX0hPU1RfQ09VTlQpKSB7XG4gICAgICB0aGlzLmFsYXJtVW5IZWFsdGh5SG9zdENvdW50ID0gbmV3IEFwcGxpY2F0aW9uVGFyZ2V0R3JvdXBVbkhlYWx0aHlIb3N0Q291bnRBbGFybSh0aGlzLCBgJHtwcm9wcy50YXJnZXRHcm91cC5ub2RlLmlkfV9VbkhlYWx0aHlIb3N0Q291bnRgLCB7XG4gICAgICAgIHRhcmdldEdyb3VwOiBwcm9wcy50YXJnZXRHcm91cCxcbiAgICAgICAgdHJlYXRNaXNzaW5nRGF0YTogcHJvcHMudHJlYXRNaXNzaW5nRGF0YSxcbiAgICAgICAgLi4ucHJvcHMuY29uZmlnVW5IZWFsdGh5SG9zdENvdW50QWxhcm0sXG4gICAgICB9KTtcblxuICAgICAgaWYgKHByb3BzLmRlZmF1bHRBbGFybUFjdGlvbiAmJiAhcHJvcHMuY29uZmlnVW5IZWFsdGh5SG9zdENvdW50QWxhcm0/LmFsYXJtQWN0aW9uKSB7XG4gICAgICAgIHRoaXMuYWxhcm1VbkhlYWx0aHlIb3N0Q291bnQuYWRkQWxhcm1BY3Rpb24ocHJvcHMuZGVmYXVsdEFsYXJtQWN0aW9uKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHByb3BzLmRlZmF1bHRPa0FjdGlvbiAmJiAhcHJvcHMuY29uZmlnVW5IZWFsdGh5SG9zdENvdW50QWxhcm0/Lm9rQWN0aW9uKSB7XG4gICAgICAgIHRoaXMuYWxhcm1VbkhlYWx0aHlIb3N0Q291bnQuYWRkT2tBY3Rpb24ocHJvcHMuZGVmYXVsdE9rQWN0aW9uKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHByb3BzLmRlZmF1bHRJbnN1ZmZpY2llbnREYXRhQWN0aW9uICYmICFwcm9wcy5jb25maWdVbkhlYWx0aHlIb3N0Q291bnRBbGFybT8uaW5zdWZmaWNpZW50RGF0YUFjdGlvbikge1xuICAgICAgICB0aGlzLmFsYXJtVW5IZWFsdGh5SG9zdENvdW50LmFkZEluc3VmZmljaWVudERhdGFBY3Rpb24ocHJvcHMuZGVmYXVsdEluc3VmZmljaWVudERhdGFBY3Rpb24pO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEFuIGV4dGVuc2lvbiBmb3IgdGhlIEFwcGxpY2F0aW9uVGFyZ2V0R3JvdXAgY29uc3RydWN0IHRoYXQgcHJvdmlkZXMgbWV0aG9kc1xuICogdG8gY3JlYXRlIHJlY29tbWVuZGVkIGFsYXJtcy5cbiAqL1xuZXhwb3J0IGNsYXNzIEFwcGxpY2F0aW9uVGFyZ2V0R3JvdXAgZXh0ZW5kcyBlbGJ2Mi5BcHBsaWNhdGlvblRhcmdldEdyb3VwIHtcbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IGVsYnYyLkFwcGxpY2F0aW9uVGFyZ2V0R3JvdXBQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwgcHJvcHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gYWxhcm0gdGhhdCBtb25pdG9ycyB0aGUgaGVhbHRoeSBob3N0IGNvdW50IGZvciB0aGUgQXBwbGljYXRpb25UYXJnZXRHcm91cC5cbiAgICovXG4gIHB1YmxpYyBhbGFybUhlYWx0aHlIb3N0Q291bnQocHJvcHM/OiBBcHBsaWNhdGlvblRhcmdldEdyb3VwSGVhbHRoeUhvc3RDb3VudEFsYXJtQ29uZmlnKTogQXBwbGljYXRpb25UYXJnZXRHcm91cEhlYWx0aHlIb3N0Q291bnRBbGFybSB7XG4gICAgcmV0dXJuIG5ldyBBcHBsaWNhdGlvblRhcmdldEdyb3VwSGVhbHRoeUhvc3RDb3VudEFsYXJtKHRoaXMsICdIZWFsdGh5SG9zdENvdW50QWxhcm0nLCB7XG4gICAgICB0YXJnZXRHcm91cDogdGhpcyxcbiAgICAgIC4uLnByb3BzLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gYWxhcm0gdGhhdCBtb25pdG9ycyB0aGUgdW5oZWFsdGh5IGhvc3QgY291bnQgZm9yIHRoZSBBcHBsaWNhdGlvblRhcmdldEdyb3VwLlxuICAgKi9cbiAgcHVibGljIGFsYXJtVW5IZWFsdGh5SG9zdENvdW50KHByb3BzPzogQXBwbGljYXRpb25UYXJnZXRHcm91cFVuSGVhbHRoeUhvc3RDb3VudEFsYXJtQ29uZmlnKTogQXBwbGljYXRpb25UYXJnZXRHcm91cFVuSGVhbHRoeUhvc3RDb3VudEFsYXJtIHtcbiAgICByZXR1cm4gbmV3IEFwcGxpY2F0aW9uVGFyZ2V0R3JvdXBVbkhlYWx0aHlIb3N0Q291bnRBbGFybSh0aGlzLCAnVW5IZWFsdGh5SG9zdENvdW50QWxhcm0nLCB7XG4gICAgICB0YXJnZXRHcm91cDogdGhpcyxcbiAgICAgIC4uLnByb3BzLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgdGhlIHJlY29tbWVuZGVkIGFsYXJtcyBmb3IgdGhlIEFwcGxpY2F0aW9uVGFyZ2V0R3JvdXAuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkV2F0Y2gvbGF0ZXN0L21vbml0b3JpbmcvZWxiLW1ldHJpY3Njb2xsZWN0ZWQuaHRtbFxuICAgKi9cbiAgcHVibGljIGFwcGx5UmVjb21tZW5kZWRBbGFybXMocHJvcHM6IEFwcGxpY2F0aW9uVGFyZ2V0R3JvdXBSZWNvbW1lbmRlZEFsYXJtc0NvbmZpZyk6IEFwcGxpY2F0aW9uVGFyZ2V0R3JvdXBSZWNvbW1lbmRlZEFsYXJtcyB7XG4gICAgcmV0dXJuIG5ldyBBcHBsaWNhdGlvblRhcmdldEdyb3VwUmVjb21tZW5kZWRBbGFybXModGhpcywgJ0FwcGxpY2F0aW9uVGFyZ2V0R3JvdXBSZWNvbW1lbmRlZEFsYXJtcycsIHtcbiAgICAgIHRhcmdldEdyb3VwOiB0aGlzLFxuICAgICAgLi4ucHJvcHMsXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBDb25maWd1cmVzIHRoZSByZWNvbW1lbmRlZCBhbGFybXMgZm9yIGFuIEFwcGxpY2F0aW9uVGFyZ2V0R3JvdXAuXG4gKlxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRXYXRjaC9sYXRlc3QvbW9uaXRvcmluZy9lbGItbWV0cmljc2NvbGxlY3RlZC5odG1sXG4gKi9cbmV4cG9ydCBjbGFzcyBBcHBsaWNhdGlvblRhcmdldEdyb3VwUmVjb21tZW5kZWRBbGFybXNBc3BlY3QgaW1wbGVtZW50cyBJQXNwZWN0IHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBwcm9wczogQXBwbGljYXRpb25UYXJnZXRHcm91cFJlY29tbWVuZGVkQWxhcm1zQ29uZmlnKSB7fVxuXG4gIHB1YmxpYyB2aXNpdChub2RlOiBJQ29uc3RydWN0KTogdm9pZCB7XG4gICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBlbGJ2Mi5BcHBsaWNhdGlvblRhcmdldEdyb3VwKSB7XG4gICAgICBpZiAodGhpcy5wcm9wcy5leGNsdWRlUmVzb3VyY2VzICYmIHRoaXMucHJvcHMuZXhjbHVkZVJlc291cmNlcy5pbmNsdWRlcyhub2RlLm5vZGUuaWQpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHRhcmdldEdyb3VwID0gbm9kZSBhcyBlbGJ2Mi5BcHBsaWNhdGlvblRhcmdldEdyb3VwO1xuXG4gICAgICAgIG5ldyBBcHBsaWNhdGlvblRhcmdldEdyb3VwUmVjb21tZW5kZWRBbGFybXModGFyZ2V0R3JvdXAsICdBcHBsaWNhdGlvblRhcmdldEdyb3VwUmVjb21tZW5kZWRBbGFybXNGcm9tQXNwZWN0Jywge1xuICAgICAgICAgIHRhcmdldEdyb3VwLFxuICAgICAgICAgIC4uLnRoaXMucHJvcHMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxufSJdfQ==