cdk-monitoring-constructs
Version:
[](https://badge.fury.io/js/cdk-monitoring-constructs) [](https://m
547 lines • 76.6 kB
JavaScript
"use strict";
var _a;
Object.defineProperty(exports, "__esModule", { value: true });
exports.MonitoringFacade = void 0;
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
const aws_cdk_lib_1 = require("aws-cdk-lib");
const MonitoringAspect_1 = require("./MonitoringAspect");
const common_1 = require("../common");
const dashboard_1 = require("../dashboard");
const DynamicDashboardSegment_1 = require("../dashboard/DynamicDashboardSegment");
const monitoring_1 = require("../monitoring");
/**
* An implementation of a {@link MonitoringScope}.
*
* This is a convenient main entrypoint to monitor resources.
*
* Provides methods for retrieving and creating alarms based on added segments that are subclasses of
* {@link Monitoring}.
*/
class MonitoringFacade extends common_1.MonitoringScope {
constructor(scope, id, props) {
super(scope, id);
this.metricFactoryDefaults = props?.metricFactoryDefaults ?? {};
this.alarmFactoryDefaults = props?.alarmFactoryDefaults ?? {
alarmNamePrefix: id,
actionsEnabled: true,
};
this.dashboardFactory =
props?.dashboardFactory ??
new dashboard_1.DefaultDashboardFactory(this, `${id}-Dashboards`, {
dashboardNamePrefix: id,
});
this.createdSegments = [];
this.createdComposites = [];
this.createdClones = [];
}
// FACTORIES
// =========
createAlarmFactory(alarmNamePrefix) {
return new common_1.AlarmFactory(this, {
globalAlarmDefaults: this.alarmFactoryDefaults,
globalMetricDefaults: this.metricFactoryDefaults,
localAlarmNamePrefix: alarmNamePrefix,
});
}
createAwsConsoleUrlFactory() {
const stack = aws_cdk_lib_1.Stack.of(this);
const awsAccountId = this.metricFactoryDefaults.account ?? stack.account;
const awsAccountRegion = this.metricFactoryDefaults.region ?? stack.region;
return new common_1.AwsConsoleUrlFactory({ awsAccountRegion, awsAccountId });
}
createMetricFactory() {
return new common_1.MetricFactory(this, {
globalDefaults: this.metricFactoryDefaults,
});
}
createWidgetFactory() {
return new dashboard_1.DefaultWidgetFactory();
}
// GENERIC
// =======
/**
* Adds a dashboard segment which returns dynamic content depending on dashboard type.
*
* @param segment dynamic segment to add.
*/
addDynamicSegment(segment) {
this.dashboardFactory?.addDynamicSegment(segment);
this.createdSegments.push(segment);
return this;
}
/**
* Adds a dashboard segment to go on one of the {@link DefaultDashboards}.
*
* @param segment segment to add
* @param overrideProps props to specify which default dashboards this segment is added to.
*/
addSegment(segment, overrideProps) {
const adaptedSegment = new DynamicDashboardSegment_1.StaticSegmentDynamicAdapter({
segment,
overrideProps,
});
this.dashboardFactory?.addDynamicSegment(adaptedSegment);
this.createdSegments.push(segment);
return this;
}
/**
* @deprecated - prefer calling dashboardFactory.getDashboard directly.
*
* @returns default detail dashboard
*/
createdDashboard() {
return this.dashboardFactory?.getDashboard(dashboard_1.DefaultDashboards.DETAIL);
}
/**
* @deprecated - prefer calling dashboardFactory.getDashboard directly.
*
* @returns default summary dashboard
*/
createdSummaryDashboard() {
return this.dashboardFactory?.getDashboard(dashboard_1.DefaultDashboards.SUMMARY);
}
/**
* @deprecated - prefer calling dashboardFactory.getDashboard directly.
*
* @returns default alarms dashboard
*/
createdAlarmDashboard() {
return this.dashboardFactory?.getDashboard(dashboard_1.DefaultDashboards.ALARMS);
}
/**
* Returns the created alarms across all added segments that subclass {@link Monitoring}
* added up until now.
*/
createdAlarms() {
const monitoringAlarms = this.createdMonitorings().flatMap((monitoring) => monitoring.createdAlarms());
return monitoringAlarms.concat(this.createdClones);
}
/**
* Returns a subset of created alarms that are marked by a specific custom tag.
*
* @param customTag tag to filter alarms by
*/
createdAlarmsWithTag(customTag) {
return this.createdAlarms().filter((alarm) => alarm.customTags?.includes(customTag));
}
/**
* Returns a subset of created alarms that are marked by a specific disambiguator.
*
* @param disambiguator disambiguator to filter alarms by
*/
createdAlarmsWithDisambiguator(disambiguator) {
return this.createdAlarms().filter((alarm) => alarm.disambiguator === disambiguator);
}
/**
* Returns the added composite alarms.
*/
createdCompositeAlarms() {
return this.createdComposites;
}
/**
* Returns the added segments that subclass {@link Monitoring}.
*/
createdMonitorings() {
return this.createdSegments
.filter((s) => s instanceof common_1.Monitoring)
.map((s) => s);
}
/**
* Returns all the added segments.
*/
createdDashboardSegments() {
return Array.from(this.createdSegments);
}
// COMPOSITE ALARM CREATORS
// ========================
/**
* Finds a subset of created alarms that are marked by a specific custom tag and creates a composite alarm.
* This composite alarm is created with an 'OR' condition, so it triggers with any child alarm.
* NOTE: This composite alarm is not added among other alarms, so it is not returned by createdAlarms() calls.
*
* @param customTag tag to filter alarms by
* @param props customization options
*/
createCompositeAlarmUsingTag(customTag, props) {
const alarms = this.createdAlarmsWithTag(customTag);
if (alarms.length > 0) {
const disambiguator = props?.disambiguator ?? customTag;
const alarmFactory = this.createAlarmFactory("Composite");
const composite = alarmFactory.addCompositeAlarm(alarms, {
...(props ?? {}),
disambiguator,
});
this.createdComposites.push(composite);
return composite;
}
return undefined;
}
/**
* Finds a subset of created alarms that are marked by a specific disambiguator and creates a composite alarm.
* This composite alarm is created with an 'OR' condition, so it triggers with any child alarm.
* NOTE: This composite alarm is not added among other alarms, so it is not returned by createdAlarms() calls.
*
* @param alarmDisambiguator disambiguator to filter alarms by
* @param props customization options
*/
createCompositeAlarmUsingDisambiguator(alarmDisambiguator, props) {
const alarms = this.createdAlarmsWithDisambiguator(alarmDisambiguator);
if (alarms.length > 0) {
const disambiguator = props?.disambiguator ?? alarmDisambiguator;
const alarmFactory = this.createAlarmFactory("Composite");
const composite = alarmFactory.addCompositeAlarm(alarms, {
...(props ?? {}),
disambiguator,
});
this.createdComposites.push(composite);
return composite;
}
return undefined;
}
// CLONE ALARMS
// ============
/**
* Applies a cloning function to each of the given alarms, creating a new collection of alarms
* that are adjusted by the function.
*
* @param sourceAlarms The alarms that should be used as sources for the clones.
* @param cloneFunction A function that will accept a source alarm and determine whether and how a new alarm should be cloned from it.
* @returns The list of clone alarms.
*/
cloneAlarms(sourceAlarms, cloneFunction) {
const cloned = [];
sourceAlarms.forEach((alarm) => {
const cloneAlarmProps = cloneFunction(alarm);
if (cloneAlarmProps) {
cloned.push(alarm.alarmDefinition.alarmFactory.addAlarm(alarm.alarmDefinition.metric, cloneAlarmProps));
}
});
this.createdClones.push(...cloned);
return cloned;
}
// BASIC WIDGETS
// =============
addLargeHeader(text, addToSummary, addToAlarm) {
this.addWidget(new dashboard_1.HeaderWidget(text, dashboard_1.HeaderLevel.LARGE), addToSummary ?? false, addToAlarm ?? false);
return this;
}
addMediumHeader(text, addToSummary, addToAlarm) {
this.addWidget(new dashboard_1.HeaderWidget(text, dashboard_1.HeaderLevel.MEDIUM), addToSummary ?? false, addToAlarm ?? false);
return this;
}
addSmallHeader(text, addToSummary, addToAlarm) {
this.addWidget(new dashboard_1.HeaderWidget(text, dashboard_1.HeaderLevel.SMALL), addToSummary ?? false, addToAlarm ?? false);
return this;
}
addWidget(widget, addToSummary, addToAlarm) {
this.addSegment(new dashboard_1.SingleWidgetDashboardSegment(widget), {
addToAlarmDashboard: addToAlarm ?? true,
addToSummaryDashboard: addToSummary ?? true,
addToDetailDashboard: true,
});
return this;
}
// RESOURCE MONITORING
// ===================
/**
* Uses an aspect to automatically monitor all resources in the given scope.
*
* @param scope Scope with resources to monitor.
* @param aspectProps Optional configuration.
*
* @experimental
*/
monitorScope(scope, aspectProps) {
const aspect = new MonitoringAspect_1.MonitoringAspect(this, aspectProps);
aws_cdk_lib_1.Aspects.of(scope).add(aspect);
return this;
}
monitorApiGateway(props) {
const segment = new monitoring_1.ApiGatewayMonitoring(this, props);
this.addSegment(segment, props);
return this;
}
monitorApiGatewayV2HttpApi(props) {
const segment = new monitoring_1.ApiGatewayV2HttpApiMonitoring(this, props);
this.addSegment(segment, props);
return this;
}
monitorAppSyncApi(props) {
const segment = new monitoring_1.AppSyncMonitoring(this, props);
this.addSegment(segment, props);
return this;
}
monitorAuroraCluster(props) {
const segment = new monitoring_1.AuroraClusterMonitoring(this, props);
this.addSegment(segment, props);
return this;
}
monitorCertificate(props) {
const segment = new monitoring_1.CertificateManagerMonitoring(this, props);
this.addSegment(segment, props);
return this;
}
monitorCloudFrontDistribution(props) {
const segment = new monitoring_1.CloudFrontDistributionMonitoring(this, props);
this.addSegment(segment, props);
return this;
}
monitorCodeBuildProject(props) {
const segment = new monitoring_1.CodeBuildProjectMonitoring(this, props);
this.addSegment(segment, props);
return this;
}
monitorDocumentDbCluster(props) {
const segment = new monitoring_1.DocumentDbMonitoring(this, props);
this.addSegment(segment, props);
return this;
}
monitorDynamoTable(props) {
const segment = new monitoring_1.DynamoTableMonitoring(this, props);
this.addSegment(segment, props);
return this;
}
monitorDynamoTableGlobalSecondaryIndex(props) {
const segment = new monitoring_1.DynamoTableGlobalSecondaryIndexMonitoring(this, props);
this.addSegment(segment, props);
return this;
}
monitorEC2Instances(props) {
const segment = new monitoring_1.EC2Monitoring(this, props);
this.addSegment(segment, props);
return this;
}
monitorElasticsearchCluster(props) {
const segment = new monitoring_1.OpenSearchClusterMonitoring(this, props);
this.addSegment(segment, props);
return this;
}
monitorOpenSearchCluster(props) {
const segment = new monitoring_1.OpenSearchClusterMonitoring(this, props);
this.addSegment(segment, props);
return this;
}
monitorElastiCacheCluster(props) {
const segment = new monitoring_1.ElastiCacheClusterMonitoring(this, props);
this.addSegment(segment, props);
return this;
}
monitorGlueJob(props) {
const segment = new monitoring_1.GlueJobMonitoring(this, props);
this.addSegment(segment, props);
return this;
}
monitorFargateService(props) {
const segment = new monitoring_1.FargateServiceMonitoring(this, {
...props,
fargateService: props.fargateService.service,
loadBalancer: props.fargateService.loadBalancer,
targetGroup: props.fargateService.targetGroup,
});
this.addSegment(segment, props);
return this;
}
monitorSimpleFargateService(props) {
const segment = new monitoring_1.FargateServiceMonitoring(this, {
...props,
fargateService: props.fargateService,
});
this.addSegment(segment, props);
return this;
}
monitorFargateNetworkLoadBalancer(props) {
const segment = new monitoring_1.FargateServiceMonitoring(this, {
...props,
fargateService: props.fargateService,
loadBalancer: props.networkLoadBalancer,
targetGroup: props.networkTargetGroup,
});
this.addSegment(segment, props);
return this;
}
monitorFargateApplicationLoadBalancer(props) {
const segment = new monitoring_1.FargateServiceMonitoring(this, {
...props,
fargateService: props.fargateService,
loadBalancer: props.applicationLoadBalancer,
targetGroup: props.applicationTargetGroup,
});
this.addSegment(segment, props);
return this;
}
monitorEc2Service(props) {
const segment = new monitoring_1.Ec2ServiceMonitoring(this, {
...props,
ec2Service: props.ec2Service.service,
loadBalancer: props.ec2Service.loadBalancer,
targetGroup: props.ec2Service.targetGroup,
});
this.addSegment(segment, props);
return this;
}
monitorSimpleEc2Service(props) {
const segment = new monitoring_1.Ec2ServiceMonitoring(this, {
...props,
ec2Service: props.ec2Service,
});
this.addSegment(segment, props);
return this;
}
monitorEc2NetworkLoadBalancer(props) {
const segment = new monitoring_1.Ec2ServiceMonitoring(this, {
...props,
ec2Service: props.ec2Service,
loadBalancer: props.networkLoadBalancer,
targetGroup: props.networkTargetGroup,
});
this.addSegment(segment, props);
return this;
}
monitorEc2ApplicationLoadBalancer(props) {
const segment = new monitoring_1.Ec2ServiceMonitoring(this, {
...props,
ec2Service: props.ec2Service,
loadBalancer: props.applicationLoadBalancer,
targetGroup: props.applicationTargetGroup,
});
this.addSegment(segment, props);
return this;
}
monitorQueueProcessingFargateService(props) {
monitoring_1.getQueueProcessingFargateServiceMonitoring(this, props).forEach((segment) => this.addSegment(segment));
return this;
}
monitorQueueProcessingEc2Service(props) {
monitoring_1.getQueueProcessingEc2ServiceMonitoring(this, props).forEach((segment) => this.addSegment(segment));
return this;
}
monitorAutoScalingGroup(props) {
const segment = new monitoring_1.AutoScalingGroupMonitoring(this, props);
this.addSegment(segment, props);
return this;
}
monitorKinesisFirehose(props) {
const segment = new monitoring_1.KinesisFirehoseMonitoring(this, props);
this.addSegment(segment, props);
return this;
}
monitorKinesisDataStream(props) {
const segment = new monitoring_1.KinesisDataStreamMonitoring(this, props);
this.addSegment(segment, props);
return this;
}
monitorKinesisDataAnalytics(props) {
const segment = new monitoring_1.KinesisDataAnalyticsMonitoring(this, props);
this.addSegment(segment, props);
return this;
}
monitorLambdaFunction(props) {
const segment = new monitoring_1.LambdaFunctionMonitoring(this, props);
this.addSegment(segment, props);
return this;
}
monitorNetworkLoadBalancer(props) {
const segment = new monitoring_1.NetworkLoadBalancerMonitoring(this, props);
this.addSegment(segment, props);
return this;
}
monitorRdsCluster(props) {
const segment = new monitoring_1.RdsClusterMonitoring(this, props);
this.addSegment(segment, props);
return this;
}
monitorRdsInstance(props) {
const segment = new monitoring_1.RdsInstanceMonitoring(this, props);
this.addSegment(segment, props);
return this;
}
monitorRedshiftCluster(props) {
const segment = new monitoring_1.RedshiftClusterMonitoring(this, props);
this.addSegment(segment, props);
return this;
}
monitorSecretsManager(props) {
const segment = new monitoring_1.SecretsManagerMonitoring(this, props);
this.addSegment(segment, props);
return this;
}
monitorSecretsManagerSecret(props) {
const segment = new monitoring_1.SecretsManagerSecretMonitoring(this, props);
this.addSegment(segment, props);
return this;
}
monitorSnsTopic(props) {
const segment = new monitoring_1.SnsTopicMonitoring(this, props);
this.addSegment(segment, props);
return this;
}
monitorSqsQueue(props) {
const segment = new monitoring_1.SqsQueueMonitoring(this, props);
this.addSegment(segment, props);
return this;
}
monitorSqsQueueWithDlq(props) {
const segment = new monitoring_1.SqsQueueMonitoringWithDlq(this, props);
this.addSegment(segment, props);
return this;
}
monitorStepFunction(props) {
const segment = new monitoring_1.StepFunctionMonitoring(this, props);
this.addSegment(segment, props);
return this;
}
monitorStepFunctionActivity(props) {
const segment = new monitoring_1.StepFunctionActivityMonitoring(this, props);
this.addSegment(segment, props);
return this;
}
monitorStepFunctionLambdaIntegration(props) {
const segment = new monitoring_1.StepFunctionLambdaIntegrationMonitoring(this, props);
this.addSegment(segment, props);
return this;
}
monitorStepFunctionServiceIntegration(props) {
const segment = new monitoring_1.StepFunctionServiceIntegrationMonitoring(this, props);
this.addSegment(segment, props);
return this;
}
monitorS3Bucket(props) {
const segment = new monitoring_1.S3BucketMonitoring(this, props);
this.addSegment(segment, props);
return this;
}
monitorLog(props) {
const segment = new monitoring_1.LogMonitoring(this, props);
this.addSegment(segment, props);
return this;
}
monitorSyntheticsCanary(props) {
const segment = new monitoring_1.SyntheticsCanaryMonitoring(this, props);
this.addSegment(segment, props);
return this;
}
monitorWebApplicationFirewallAclV2(props) {
const segment = new monitoring_1.WafV2Monitoring(this, props);
this.addSegment(segment, props);
return this;
}
monitorBilling(props) {
const segment = new monitoring_1.BillingMonitoring(this, props ?? {});
this.addSegment(segment, props);
return this;
}
monitorCustom(props) {
const segment = new monitoring_1.CustomMonitoring(this, props);
this.addSegment(segment, props);
return this;
}
monitorFluentBit(props) {
const segment = new monitoring_1.FluentBitMonitoring(this, props);
this.addSegment(segment, props);
return this;
}
}
exports.MonitoringFacade = MonitoringFacade;
_a = JSII_RTTI_SYMBOL_1;
MonitoringFacade[_a] = { fqn: "cdk-monitoring-constructs.MonitoringFacade", version: "9.13.0" };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTW9uaXRvcmluZ0ZhY2FkZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIk1vbml0b3JpbmdGYWNhZGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw2Q0FBNkM7QUFLN0MseURBQXNEO0FBQ3RELHNDQVdtQjtBQUNuQiw0Q0FVc0I7QUFDdEIsa0ZBRzhDO0FBRTlDLDhDQTZGdUI7QUFxQ3ZCOzs7Ozs7O0dBT0c7QUFDSCxNQUFhLGdCQUFpQixTQUFRLHdCQUFlO0lBV25ELFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBNkI7UUFDckUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixJQUFJLENBQUMscUJBQXFCLEdBQUcsS0FBSyxFQUFFLHFCQUFxQixJQUFJLEVBQUUsQ0FBQztRQUNoRSxJQUFJLENBQUMsb0JBQW9CLEdBQUcsS0FBSyxFQUFFLG9CQUFvQixJQUFJO1lBQ3pELGVBQWUsRUFBRSxFQUFFO1lBQ25CLGNBQWMsRUFBRSxJQUFJO1NBQ3JCLENBQUM7UUFDRixJQUFJLENBQUMsZ0JBQWdCO1lBQ25CLEtBQUssRUFBRSxnQkFBZ0I7Z0JBQ3ZCLElBQUksbUNBQXVCLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxhQUFhLEVBQUU7b0JBQ3BELG1CQUFtQixFQUFFLEVBQUU7aUJBQ3hCLENBQUMsQ0FBQztRQUVMLElBQUksQ0FBQyxlQUFlLEdBQUcsRUFBRSxDQUFDO1FBQzFCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxFQUFFLENBQUM7UUFDNUIsSUFBSSxDQUFDLGFBQWEsR0FBRyxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVELFlBQVk7SUFDWixZQUFZO0lBRVosa0JBQWtCLENBQUMsZUFBdUI7UUFDeEMsT0FBTyxJQUFJLHFCQUFZLENBQUMsSUFBSSxFQUFFO1lBQzVCLG1CQUFtQixFQUFFLElBQUksQ0FBQyxvQkFBb0I7WUFDOUMsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLHFCQUFxQjtZQUNo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LElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ2hDLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELGFBQWEsQ0FBQyxLQUE0QjtRQUN4QyxNQUFNLE9BQU8sR0FBRyxJQUFJLDZCQUFnQixDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNsRCxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNoQyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxLQUErQjtRQUM5QyxNQUFNLE9BQU8sR0FBRyxJQUFJLGdDQUFtQixDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNyRCxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNoQyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7O0FBeHJCSCw0Q0F5ckJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXNwZWN0cywgU3RhY2sgfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7IENvbXBvc2l0ZUFsYXJtLCBEYXNoYm9hcmQsIElXaWRnZXQgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWNsb3Vkd2F0Y2hcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5cbmltcG9ydCB7IE1vbml0b3JpbmdBc3BlY3RQcm9wcyB9IGZyb20gXCIuL0lNb25pdG9yaW5nQXNwZWN0XCI7XG5pbXBvcnQgeyBNb25pdG9yaW5nQXNwZWN0IH0gZnJvbSBcIi4vTW9uaXRvcmluZ0FzcGVjdFwiO1xuaW1wb3J0IHtcbiAgQWRkQWxhcm1Qcm9wcyxcbiAgQWRkQ29tcG9zaXRlQWxhcm1Qcm9wcyxcbiAgQWxhcm1GYWN0b3J5LFxuICBBbGFybUZhY3RvcnlEZWZhdWx0cyxcbiAgQWxhcm1XaXRoQW5ub3RhdGlvbixcbiAgQXdzQ29uc29sZVVybEZhY3RvcnksXG4gIE1ldHJpY0ZhY3RvcnksXG4gIE1ldHJpY0ZhY3RvcnlEZWZhdWx0cyxcbiAgTW9uaXRvcmluZyxcbiAgTW9uaXRvcmluZ1Njb3BlLFxufSBmcm9tIFwiLi4vY29tbW9uXCI7XG5pbXBvcnQge1xuICBEZWZhdWx0RGFzaGJvYXJkRmFjdG9yeSxcbiAgRGVmYXVsdERhc2hib2FyZHMsXG4gIERlZmF1bHRXaWRnZXRGYWN0b3J5LFxuICBIZWFkZXJMZXZlbCxcbiAgSGVhZGVyV2lkZ2V0LFxuICBJRGFzaGJvYXJkU2VnbWVudCxcbiAgSVdpZGdldEZhY3RvcnksXG4gIE1vbml0b3JpbmdEYXNoYm9hcmRzT3ZlcnJpZGVQcm9wcyxcbiAgU2luZ2xlV2lkZ2V0RGFzaGJvYXJkU2VnbWVudCxcbn0gZnJvbSBcIi4uL2Rhc2hib2FyZFwiO1xuaW1wb3J0IHtcbiAgSUR5bmFtaWNEYXNoYm9hcmRTZWdtZW50LFxuICBTdGF0aWNTZWdtZW50RHluYW1pY0FkYXB0ZXIsXG59IGZyb20gXCIuLi9kYXNoYm9hcmQvRHluYW1pY0Rhc2hib2FyZFNlZ21lbnRcIjtcbmltcG9ydCB7IElEeW5hbWljRGFzaGJvYXJkRmFjdG9yeSB9IGZyb20gXCIuLi9kYXNoYm9hcmQvSUR5bmFtaWNEYXNoYm9hcmRGYWN0b3J5XCI7XG5pbXBvcnQge1xuICBBcGlHYXRld2F5TW9uaXRvcmluZyxcbiAgQXBpR2F0ZXdheU1vbml0b3JpbmdQcm9wcyxcbiAgQXBpR2F0ZXdheVYySHR0cEFwaU1vbml0b3JpbmcsXG4gIEFwaUdhdGV3YXlWMkh0dHBBcGlNb25pdG9yaW5nUHJvcHMsXG4gIEFwcFN5bmNNb25pdG9yaW5nLFxuICBBcHBTeW5jTW9uaXRvcmluZ1Byb3BzLFxuICBBdXJvcmFDbHVzdGVyTW9uaXRvcmluZyxcbiAgQXVyb3JhQ2x1c3Rlck1vbml0b3JpbmdQcm9wcyxcbiAgQXV0b1NjYWxpbmdHcm91cE1vbml0b3JpbmcsXG4gIEF1dG9TY2FsaW5nR3JvdXBNb25pdG9yaW5nUHJvcHMsXG4gIEJpbGxpbmdNb25pdG9yaW5nLFxuICBCaWxsaW5nTW9uaXRvcmluZ1Byb3BzLFxuICBDZXJ0aWZpY2F0ZU1hbmFnZXJNb25pdG9yaW5nLFxuICBDZXJ0aWZpY2F0ZU1hbmFnZXJNb25pdG9yaW5nUHJvcHMsXG4gIENsb3VkRnJvbnREaXN0cmlidXRpb25Nb25pdG9yaW5nLFxuICBDbG91ZEZyb250RGlzdHJpYnV0aW9uTW9uaXRvcmluZ1Byb3BzLFxuICBDb2RlQnVpbGRQcm9qZWN0TW9uaXRvcmluZyxcbiAgQ29kZUJ1aWxkUHJvamVjdE1vbml0b3JpbmdQcm9wcyxcbiAgQ3VzdG9tTW9uaXRvcmluZyxcbiAgQ3VzdG9tTW9uaXRvcmluZ1Byb3BzLFxuICBEb2N1bWVudERiTW9uaXRvcmluZyxcbiAgRG9jdW1lbnREYk1vbml0b3JpbmdQcm9wcyxcbiAgRHluYW1vVGFibGVHbG9iYWxTZWNvbmRhcnlJbmRleE1vbml0b3JpbmcsXG4gIER5bmFtb1RhYmxlR2xvYmFsU2Vjb25kYXJ5SW5kZXhNb25pdG9yaW5nUHJvcHMsXG4gIER5bmFtb1RhYmxlTW9uaXRvcmluZyxcbiAgRHluYW1vVGFibGVNb25pdG9yaW5nUHJvcHMsXG4gIEVjMkFwcGxpY2F0aW9uTG9hZEJhbGFuY2VyTW9uaXRvcmluZ1Byb3BzLFxuICBFQzJNb25pdG9yaW5nLFxuICBFQzJNb25pdG9yaW5nUHJvcHMsXG4gIEVjMk5ldHdvcmtMb2FkQmFsYW5jZXJNb25pdG9yaW5nUHJvcHMsXG4gIEVjMlNlcnZpY2VNb25pdG9yaW5nLFxuICBFYzJTZXJ2aWNlTW9uaXRvcmluZ1Byb3BzLFxuICBFbGFzdGlDYWNoZUNsdXN0ZXJNb25pdG9yaW5nLFxuICBFbGFzdGlDYWNoZUNsdXN0ZXJNb25pdG9yaW5nUHJvcHMsXG4gIEZhcmdhdGVBcHBsaWNhdGlvbkxvYWRCYWxhbmNlck1vbml0b3JpbmdQcm9wcyxcbiAgRmFyZ2F0ZU5ldHdvcmtMb2FkQmFsYW5jZXJNb25pdG9yaW5nUHJvcHMsXG4gIEZhcmdhdGVTZXJ2aWNlTW9uaXRvcmluZyxcbiAgRmFyZ2F0ZVNlcnZpY2VNb25pdG9yaW5nUHJvcHMsXG4gIEZsdWVudEJpdE1vbml0b3JpbmcsXG4gIEZsdWVudEJpdE1vbml0b3JpbmdQcm9wcyxcbiAgZ2V0UXVldWVQcm9jZXNzaW5nRWMyU2VydmljZU1vbml0b3JpbmcsXG4gIGdldFF1ZXVlUHJvY2Vzc2luZ0ZhcmdhdGVTZXJ2aWNlTW9uaXRvcmluZyxcbiAgR2x1ZUpvYk1vbml0b3JpbmcsXG4gIEdsdWVKb2JNb25pdG9yaW5nUHJvcHMsXG4gIEtpbmVzaXNEYXRhQW5hbHl0aWNzTW9uaXRvcmluZyxcbiAgS2luZXNpc0RhdGFBbmFseXRpY3NNb25pdG9yaW5nUHJvcHMsXG4gIEtpbmVzaXNEYXRhU3RyZWFtTW9uaXRvcmluZyxcbiAgS2luZXNpc0RhdGFTdHJlYW1Nb25pdG9yaW5nUHJvcHMsXG4gIEtpbmVzaXNGaXJlaG9zZU1vbml0b3JpbmcsXG4gIEtpbmVzaXNGaXJlaG9zZU1vbml0b3JpbmdQcm9wcyxcbiAgTGFtYmRhRnVuY3Rpb25Nb25pdG9yaW5nLFxuICBMYW1iZGFGdW5jdGlvbk1vbml0b3JpbmdQcm9wcyxcbiAgTG9nTW9uaXRvcmluZyxcbiAgTG9nTW9uaXRvcmluZ1Byb3BzLFxuICBOZXR3b3JrTG9hZEJhbGFuY2VyTW9uaXRvcmluZyxcbiAgTmV0d29ya0xvYWRCYWxhbmNlck1vbml0b3JpbmdQcm9wcyxcbiAgT3BlblNlYXJjaENsdXN0ZXJNb25pdG9yaW5nLFxuICBPcGVuU2VhcmNoQ2x1c3Rlck1vbml0b3JpbmdQcm9wcyxcbiAgUXVldWVQcm9jZXNzaW5nRWMyU2VydmljZU1vbml0b3JpbmdQcm9wcyxcbiAgUXVldWVQcm9jZXNzaW5nRmFyZ2F0ZVNlcnZpY2VNb25pdG9yaW5nUHJvcHMsXG4gIFJkc0NsdXN0ZXJNb25pdG9yaW5nLFxuICBSZHNDbHVzdGVyTW9uaXRvcmluZ1Byb3BzLFxuICBSZHNJbnN0YW5jZU1vbml0b3JpbmcsXG4gIFJkc0luc3RhbmNlTW9uaXRvcmluZ1Byb3BzLFxuICBSZWRzaGlmdENsdXN0ZXJNb25pdG9yaW5nLFxuICBSZWRzaGlmdENsdXN0ZXJNb25pdG9yaW5nUHJvcHMsXG4gIFMzQnVja2V0TW9uaXRvcmluZyxcbiAgUzNCdWNrZXRNb25pdG9yaW5nUHJvcHMsXG4gIFNlY3JldHNNYW5hZ2VyTW9uaXRvcmluZyxcbiAgU2VjcmV0c01hbmFnZXJNb25pdG9yaW5nUHJvcHMsXG4gIFNlY3JldHNNYW5hZ2VyU2VjcmV0TW9uaXRvcmluZyxcbiAgU2VjcmV0c01hbmFnZXJTZWNyZXRNb25pdG9yaW5nUHJvcHMsXG4gIFNpbXBsZUVjMlNlcnZpY2VNb25pdG9yaW5nUHJvcHMsXG4gIFNpbXBsZUZhcmdhdGVTZXJ2aWNlTW9uaXRvcmluZ1Byb3BzLFxuICBTbnNUb3BpY01vbml0b3JpbmcsXG4gIFNuc1RvcGljTW9uaXRvcmluZ1Byb3BzLFxuICBTcXNRdWV1ZU1vbml0b3JpbmcsXG4gIFNxc1F1ZXVlTW9uaXRvcmluZ1Byb3BzLFxuICBTcXNRdWV1ZU1vbml0b3JpbmdXaXRoRGxxLFxuICBTcXNRdWV1ZU1vbml0b3JpbmdXaXRoRGxxUHJvcHMsXG4gIFN0ZXBGdW5jdGlvbkFjdGl2aXR5TW9uaXRvcmluZyxcbiAgU3RlcEZ1bmN0aW9uQWN0aXZpdHlNb25pdG9yaW5nUHJvcHMsXG4gIFN0ZXBGdW5jdGlvbkxhbWJkYUludGVncmF0aW9uTW9uaXRvcmluZyxcbiAgU3RlcEZ1bmN0aW9uTGFtYmRhSW50ZWdyYXRpb25Nb25pdG9yaW5nUHJvcHMsXG4gIFN0ZXBGdW5jdGlvbk1vbml0b3JpbmcsXG4gIFN0ZXBGdW5jdGlvbk1vbml0b3JpbmdQcm9wcyxcbiAgU3RlcEZ1bmN0aW9uU2VydmljZUludGVncmF0aW9uTW9uaXRvcmluZyxcbiAgU3RlcEZ1bmN0aW9uU2VydmljZUludGVncmF0aW9uTW9uaXRvcmluZ1Byb3BzLFxuICBTeW50aGV0aWNzQ2FuYXJ5TW9uaXRvcmluZyxcbiAgU3ludGhldGljc0NhbmFyeU1vbml0b3JpbmdQcm9wcyxcbiAgV2FmVjJNb25pdG9yaW5nLFxuICBXYWZWMk1vbml0b3JpbmdQcm9wcyxcbn0gZnJvbSBcIi4uL21vbml0b3JpbmdcIjtcblxuLyoqXG4gKiBBIGZ1bmN0aW9uIHRoYXQsIHdoZW4gZ2l2ZW4gYW4gYWxhcm0sIHJldHVybnMgbW9kaWZpZWQgaW5wdXRzIHRoYXRcbiAqIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBhZGRpdGlvbmFsIGFsYXJtcywgc2xpZ2h0bHkgYWRqdXN0ZWQgZnJvbSB0aGUgb3JpZ2luYWwgb25lLlxuICogVGhlIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGNsb25lIGFsYXJtcy5cbiAqXG4gKiBJbXBsZW1lbnRlcnMgb2YgdGhpcyBmdW5jdGlvbiBjYW4gdXNlIHRoZSBvcmlnaW5hbCBhbGFybSBjb25maWd1cmF0aW9uIHRvIHNwZWNpZnkgYSBuZXcgYWxhcm0sXG4gKiBvciB0aGV5IGNhbiByZXR1cm4gdW5kZWZpbmVkIHRvIHNraXAgdGhlIGNyZWF0aW9uIG9mIGFuIGFsYXJtLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFsYXJtQ2xvbmVGdW5jdGlvbiB7XG4gIChhbGFybTogQWxhcm1XaXRoQW5ub3RhdGlvbik6IEFkZEFsYXJtUHJvcHMgfCB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTW9uaXRvcmluZ0ZhY2FkZVByb3BzIHtcbiAgLyoqXG4gICAqIERlZmF1bHRzIGZvciBtZXRyaWMgZmFjdG9yeS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBlbXB0eSAobm8gcHJlZmVyZW5jZXMpXG4gICAqL1xuICByZWFkb25seSBtZXRyaWNGYWN0b3J5RGVmYXVsdHM/OiBNZXRyaWNGYWN0b3J5RGVmYXVsdHM7XG5cbiAgLyoqXG4gICAqIERlZmF1bHRzIGZvciBhbGFybSBmYWN0b3J5LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGFjdGlvbnMgZW5hYmxlZCwgZmFjYWRlIGxvZ2ljYWwgSUQgdXNlZCBhcyBkZWZhdWx0IGFsYXJtIG5hbWUgcHJlZml4XG4gICAqL1xuICByZWFkb25seSBhbGFybUZhY3RvcnlEZWZhdWx0cz86IEFsYXJtRmFjdG9yeURlZmF1bHRzO1xuXG4gIC8qKlxuICAgKiBEZWZhdWx0cyBmb3IgZGFzaGJvYXJkIGZhY3RvcnkuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIER5bmFtaWNEYXNoYm9hcmRGYWN0b3J5fTsgZmFjYWRlIGxvZ2ljYWwgSUQgdXNlZCBhcyBkZWZhdWx0IG5hbWVcbiAgICovXG4gIHJlYWRvbmx5IGRhc2hib2FyZEZhY3Rvcnk/OiBJRHluYW1pY0Rhc2hib2FyZEZhY3Rvcnk7XG59XG5cbi8qKlxuICogQW4gaW1wbGVtZW50YXRpb24gb2YgYSB7QGxpbmsgTW9uaXRvcmluZ1Njb3BlfS5cbiAqXG4gKiBUaGlzIGlzIGEgY29udmVuaWVudCBtYWluIGVudHJ5cG9pbnQgdG8gbW9uaXRvciByZXNvdXJjZXMuXG4gKlxuICogUHJvdmlkZXMgbWV0aG9kcyBmb3IgcmV0cmlldmluZyBhbmQgY3JlYXRpbmcgYWxhcm1zIGJhc2VkIG9uIGFkZGVkIHNlZ21lbnRzIHRoYXQgYXJlIHN1YmNsYXNzZXMgb2ZcbiAqIHtAbGluayBNb25pdG9yaW5nfS5cbiAqL1xuZXhwb3J0IGNsYXNzIE1vbml0b3JpbmdGYWNhZGUgZXh0ZW5kcyBNb25pdG9yaW5nU2NvcGUge1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgbWV0cmljRmFjdG9yeURlZmF1bHRzOiBNZXRyaWNGYWN0b3J5RGVmYXVsdHM7XG4gIHByb3RlY3RlZCByZWFkb25seSBhbGFybUZhY3RvcnlEZWZhdWx0czogQWxhcm1GYWN0b3J5RGVmYXVsdHM7XG4gIHB1YmxpYyByZWFkb25seSBkYXNoYm9hcmRGYWN0b3J5PzogSUR5bmFtaWNEYXNoYm9hcmRGYWN0b3J5O1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgY3JlYXRlZFNlZ21lbnRzOiAoXG4gICAgfCBJRGFzaGJvYXJkU2VnbWVudFxuICAgIHwgSUR5bmFtaWNEYXNoYm9hcmRTZWdtZW50XG4gIClbXTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGNyZWF0ZWRDb21wb3NpdGVzOiBDb21wb3NpdGVBbGFybVtdO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgY3JlYXRlZENsb25lczogQWxhcm1XaXRoQW5ub3RhdGlvbltdO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzPzogTW9uaXRvcmluZ0ZhY2FkZVByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIHRoaXMubWV0cmljRmFjdG9yeURlZmF1bHRzID0gcHJvcHM/Lm1ldHJpY0ZhY3RvcnlEZWZhdWx0cyA/PyB7fTtcbiAgICB0aGlzLmFsYXJtRmFjdG9yeURlZmF1bHRzID0gcHJvcHM/LmFsYXJtRmFjdG9yeURlZmF1bHRzID8/IHtcbiAgICAgIGFsYXJtTmFtZVByZWZpeDogaWQsXG4gICAgICBhY3Rpb25zRW5hYmxlZDogdHJ1ZSxcbiAgICB9O1xuICAgIHRoaXMuZGFzaGJvYXJkRmFjdG9yeSA9XG4gICAgICBwcm9wcz8uZGFzaGJvYXJkRmFjdG9yeSA/P1xuICAgICAgbmV3IERlZmF1bHREYXNoYm9hcmRGYWN0b3J5KHRoaXMsIGAke2lkfS1EYXNoYm9hcmRzYCwge1xuICAgICAgICBkYXNoYm9hcmROYW1lUHJlZml4OiBpZCxcbiAgICAgIH0pO1xuXG4gICAgdGhpcy5jcmVhdGVkU2VnbWVudHMgPSBbXTtcbiAgICB0aGlzLmNyZWF0ZWRDb21wb3NpdGVzID0gW107XG4gICAgdGhpcy5jcmVhdGVkQ2xvbmVzID0gW107XG4gIH1cblxuICAvLyBGQUNUT1JJRVNcbiAgLy8gPT09PT09PT09XG5cbiAgY3JlYXRlQWxhcm1GYWN0b3J5KGFsYXJtTmFtZVByZWZpeDogc3RyaW5nKTogQWxhcm1GYWN0b3J5IHtcbiAgICByZXR1cm4gbmV3IEFsYXJtRmFjdG9yeSh0aGlzLCB7XG4gICAgICBnbG9iYWxBbGFybURlZmF1bHRzOiB0aGlzLmFsYXJtRmFjdG9yeURlZmF1bHRzLFxuICAgICAgZ2xvYmFsTWV0cmljRGVmYXVsdHM6IHRoaXMubWV0cmljRmFjdG9yeURlZmF1bHRzLFxuICAgICAgbG9jYWxBbGFybU5hbWVQcmVmaXg6IGFsYXJtTmFtZVByZWZpeCxcbiAgICB9KTtcbiAgfVxuXG4gIGNyZWF0ZUF3c0NvbnNvbGVVcmxGYWN0b3J5KCk6IEF3c0NvbnNvbGVVcmxGYWN0b3J5IHtcbiAgICBjb25zdCBzdGFjayA9IFN0YWNrLm9mKHRoaXMpO1xuICAgIGNvbnN0IGF3c0FjY291bnRJZCA9IHRoaXMubWV0cmljRmFjdG9yeURlZmF1bHRzLmFjY291bnQgPz8gc3RhY2suYWNjb3VudDtcbiAgICBjb25zdCBhd3NBY2NvdW50UmVnaW9uID0gdGhpcy5tZXRyaWNGYWN0b3J5RGVmYXVsdHMucmVnaW9uID8/IHN0YWNrLnJlZ2lvbjtcbiAgICByZXR1cm4gbmV3IEF3c0NvbnNvbGVVcmxGYWN0b3J5KHsgYXdzQWNjb3VudFJlZ2lvbiwgYXdzQWNjb3VudElkIH0pO1xuICB9XG5cbiAgY3JlYXRlTWV0cmljRmFjdG9yeSgpOiBNZXRyaWNGYWN0b3J5IHtcbiAgICByZXR1cm4gbmV3IE1ldHJpY0ZhY3RvcnkodGhpcywge1xuICAgICAgZ2xvYmFsRGVmYXVsdHM6IHRoaXMubWV0cmljRmFjdG9yeURlZmF1bHRzLFxuICAgIH0pO1xuICB9XG5cbiAgY3JlYXRlV2lkZ2V0RmFjdG9yeSgpOiBJV2lkZ2V0RmFjdG9yeSB7XG4gICAgcmV0dXJuIG5ldyBEZWZhdWx0V2lkZ2V0RmFjdG9yeSgpO1xuICB9XG5cbiAgLy8gR0VORVJJQ1xuICAvLyA9PT09PT09XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBkYXNoYm9hcmQgc2VnbWVudCB3aGljaCByZXR1cm5zIGR5bmFtaWMgY29udGVudCBkZXBlbmRpbmcgb24gZGFzaGJvYXJkIHR5cGUuXG4gICAqXG4gICAqIEBwYXJhbSBzZWdtZW50IGR5bmFtaWMgc2VnbWVudCB0byBhZGQuXG4gICAqL1xuICBhZGREeW5hbWljU2VnbWVudChzZWdtZW50OiBJRHluYW1pY0Rhc2hib2FyZFNlZ21lbnQpOiB0aGlzIHtcbiAgICB0aGlzLmRhc2hib2FyZEZhY3Rvcnk/LmFkZER5bmFtaWNTZWdtZW50KHNlZ21lbnQpO1xuICAgIHRoaXMuY3JlYXRlZFNlZ21lbnRzLnB1c2goc2VnbWVudCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIGRhc2hib2FyZCBzZWdtZW50IHRvIGdvIG9uIG9uZSBvZiB0aGUge0BsaW5rIERlZmF1bHREYXNoYm9hcmRzfS5cbiAgICpcbiAgICogQHBhcmFtIHNlZ21lbnQgc2VnbWVudCB0byBhZGRcbiAgICogQHBhcmFtIG92ZXJyaWRlUHJvcHMgcHJvcHMgdG8gc3BlY2lmeSB3aGljaCBkZWZhdWx0IGRhc2hib2FyZHMgdGhpcyBzZWdtZW50IGlzIGFkZGVkIHRvLlxuICAgKi9cbiAgYWRkU2VnbWVudChcbiAgICBzZWdtZW50OiBJRGFzaGJvYXJkU2VnbWVudCxcbiAgICBvdmVycmlkZVByb3BzPzogTW9uaXRvcmluZ0Rhc2hib2FyZHNPdmVycmlkZVByb3BzLFxuICApOiB0aGlzIHtcbiAgICBjb25zdCBhZGFwdGVkU2VnbWVudCA9IG5ldyBTdGF0aWNTZWdtZW50RHluYW1pY0FkYXB0ZXIoe1xuICAgICAgc2VnbWVudCxcbiAgICAgIG92ZXJyaWRlUHJvcHMsXG4gICAgfSk7XG4gICAgdGhpcy5kYXNoYm9hcmRGYWN0b3J5Py5hZGREeW5hbWljU2VnbWVudChhZGFwdGVkU2VnbWVudCk7XG4gICAgdGhpcy5jcmVhdGVkU2VnbWVudHMucHVzaChzZWdtZW50KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCAtIHByZWZlciBjYWxsaW5nIGRhc2hib2FyZEZhY3RvcnkuZ2V0RGFzaGJvYXJkIGRpcmVjdGx5LlxuICAgKlxuICAgKiBAcmV0dXJucyBkZWZhdWx0IGRldGFpbCBkYXNoYm9hcmRcbiAgICovXG4gIGNyZWF0ZWREYXNoYm9hcmQoKTogRGFzaGJvYXJkIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5kYXNoYm9hcmRGYWN0b3J5Py5nZXREYXNoYm9hcmQoRGVmYXVsdERhc2hib2FyZHMuREVUQUlMKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCAtIHByZWZlciBjYWxsaW5nIGRhc2hib2FyZEZhY3RvcnkuZ2V0RGFzaGJvYXJkIGRpcmVjdGx5LlxuICAgKlxuICAgKiBAcmV0dXJucyBkZWZhdWx0IHN1bW1hcnkgZGFzaGJvYXJkXG4gICAqL1xuICBjcmVhdGVkU3VtbWFyeURhc2hib2FyZCgpOiBEYXNoYm9hcmQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmRhc2hib2FyZEZhY3Rvcnk/LmdldERhc2hib2FyZChEZWZhdWx0RGFzaGJvYXJkcy5TVU1NQVJZKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCAtIHByZWZlciBjYWxsaW5nIGRhc2hib2FyZEZhY3RvcnkuZ2V0RGFzaGJvYXJkIGRpcmVjdGx5LlxuICAgKlxuICAgKiBAcmV0dXJucyBkZWZhdWx0IGFsYXJtcyBkYXNoYm9hcmRcbiAgICovXG4gIGNyZWF0ZWRBbGFybURhc2hib2FyZCgpOiBEYXNoYm9hcmQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmRhc2hib2FyZEZhY3Rvcnk/LmdldERhc2hib2FyZChEZWZhdWx0RGFzaGJvYXJkcy5BTEFSTVMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGNyZWF0ZWQgYWxhcm1zIGFjcm9zcyBhbGwgYWRkZWQgc2VnbWVudHMgdGhhdCBzdWJjbGFzcyB7QGxpbmsgTW9uaXRvcmluZ31cbiAgICogYWRkZWQgdXAgdW50aWwgbm93LlxuICAgKi9cbiAgY3JlYXRlZEFsYXJtcygpOiBBbGFybVdpdGhBbm5vdGF0aW9uW10ge1xuICAgIGNvbnN0IG1vbml0b3JpbmdBbGFybXMgPSB0aGlzLmNyZWF0ZWRNb25pdG9yaW5ncygpLmZsYXRNYXAoKG1vbml0b3JpbmcpID0+XG4gICAgICBtb25pdG9yaW5nLmNyZWF0ZWRBbGFybXMoKSxcbiAgICApO1xuICAgIHJldHVybiBtb25pdG9yaW5nQWxhcm1zLmNvbmNhdCh0aGlzLmNyZWF0ZWRDbG9uZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBzdWJzZXQgb2YgY3JlYXRlZCBhbGFybXMgdGhhdCBhcmUgbWFya2VkIGJ5IGEgc3BlY2lmaWMgY3VzdG9tIHRhZy5cbiAgICpcbiAgICogQHBhcmFtIGN1c3RvbVRhZyB0YWcgdG8gZmlsdGVyIGFsYXJtcyBieVxuICAgKi9cbiAgY3JlYXRlZEFsYXJtc1dpdGhUYWcoY3VzdG9tVGFnOiBzdHJpbmcpOiBBbGFybVdpdGhBbm5vdGF0aW9uW10ge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZWRBbGFybXMoKS5maWx0ZXIoKGFsYXJtKSA9PlxuICAgICAgYWxhcm0uY3VzdG9tVGFncz8uaW5jbHVkZXMoY3VzdG9tVGFnKSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBzdWJzZXQgb2YgY3JlYXRlZCBhbGFybXMgdGhhdCBhcmUgbWFya2VkIGJ5IGEgc3BlY2lmaWMgZGlzYW1iaWd1YXRvci5cbiAgICpcbiAgICogQHBhcmFtIGRpc2FtYmlndWF0b3IgZGlzYW1iaWd1YXRvciB0byBmaWx0ZXIgYWxhcm1zIGJ5XG4gICAqL1xuICBjcmVhdGVkQWxhcm1zV2l0aERpc2FtYmlndWF0b3IoZGlzYW1iaWd1YXRvcjogc3RyaW5nKTogQWxhcm1XaXRoQW5ub3RhdGlvbltdIHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVkQWxhcm1zKCkuZmlsdGVyKFxuICAgICAgKGFsYXJtKSA9PiBhbGFybS5kaXNhbWJpZ3VhdG9yID09PSBkaXNhbWJpZ3VhdG9yLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgYWRkZWQgY29tcG9zaXRlIGFsYXJtcy5cbiAgICovXG4gIGNyZWF0ZWRDb21wb3NpdGVBbGFybXMoKTogQ29tcG9zaXRlQWxhcm1bXSB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlZENvbXBvc2l0ZXM7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgYWRkZWQgc2VnbWVudHMgdGhhdCBzdWJjbGFzcyB7QGxpbmsgTW9uaXRvcmluZ30uXG4gICAqL1xuICBjcmVhdGVkTW9uaXRvcmluZ3MoKTogTW9uaXRvcmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVkU2VnbWVudHNcbiAgICAgIC5maWx0ZXIoKHMpID0+IHMgaW5zdGFuY2VvZiBNb25pdG9yaW5nKVxuICAgICAgLm1hcCgocykgPT4gcyBhcyBNb25pdG9yaW5nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFsbCB0aGUgYWRkZWQgc2VnbWVudHMuXG4gICAqL1xuICBjcmVhdGVkRGFzaGJvYXJkU2VnbWVudHMoKTogKElEYXNoYm9hcmRTZWdtZW50IHwgSUR5bmFtaWNEYXNoYm9hcmRTZWdtZW50KVtdIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmNyZWF0ZWRTZWdtZW50cyk7XG4gIH1cblxuICAvLyBDT01QT1NJVEUgQUxBUk0gQ1JFQVRPUlNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEZpbmRzIGEgc3Vic2V0IG9mIGNyZWF0ZWQgYWxhcm1zIHRoYXQgYXJlIG1hcmtlZCBieSBhIHNwZWNpZmljIGN1c3RvbSB0YWcgYW5kIGNyZWF0ZXMgYSBjb21wb3NpdGUgYWxhcm0uXG4gICAqIFRoaXMgY29tcG9zaXRlIGFsYXJtIGlzIGNyZWF0ZWQgd2l0aCBhbiAnT1InIGNvbmRpdGlvbiwgc28gaXQgdHJpZ2dlcnMgd2l0aCBhbnkgY2hpbGQgYWxhcm0uXG4gICAqIE5PVEU6IFRoaXMgY29tcG9zaXRlIGFsYXJtIGlzIG5vdCBhZGRlZCBhbW9uZyBvdGhlciBhbGFybXMsIHNvIGl0IGlzIG5vdCByZXR1cm5lZCBieSBjcmVhdGVkQWxhcm1zKCkgY2FsbHMuXG4gICAqXG4gICAqIEBwYXJhbSBjdXN0b21UYWcgdGFnIHRvIGZpbHRlciBhbGFybXMgYnlcbiAgICogQHBhcmFtIHByb3BzIGN1c3RvbWl6YXRpb24gb3B0aW9uc1xuICAgKi9cbiAgY3JlYXRlQ29tcG9zaXRlQWxhcm1Vc2luZ1RhZyhcbiAgICBjdXN0b21UYWc6IHN0cmluZyxcbiAgICBwcm9wcz86IEFkZENvbXBvc2l0ZUFsYXJtUHJvcHMsXG4gICk6IENvbXBvc2l0ZUFsYXJtIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBhbGFybXMgPSB0aGlzLmNyZWF0ZWRBbGFybXNXaXRoVGFnKGN1c3RvbVRhZyk7XG4gICAgaWYgKGFsYXJtcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBkaXNhbWJpZ3VhdG9yID0gcHJvcHM/LmRpc2FtYmlndWF0b3IgPz8gY3VzdG9tVGFnO1xuICAgICAgY29uc3QgYWxhcm1GYWN0b3J5ID0gdGhpcy5jcmVhdGVBbGFybUZhY3RvcnkoXCJDb21wb3NpdGVcIik7XG4gICAgICBjb25zdCBjb21wb3NpdGUgPSBhbGFybUZhY3RvcnkuYWRkQ29tcG9zaXRlQWxhcm0oYWxhcm1zLCB7XG4gICAgICAgIC4uLihwcm9wcyA/PyB7fSksXG4gICAgICAgIGRpc2FtYmlndWF0b3IsXG4gICAgICB9KTtcbiAgICAgIHRoaXMuY3JlYXRlZENvbXBvc2l0ZXMucHVzaChjb21wb3NpdGUpO1xuICAgICAgcmV0dXJuIGNvbXBvc2l0ZTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBhIHN1YnNldCBvZiBjcmVhdGVkIGFsYXJtcyB0aGF0IGFyZSBtYXJrZWQgYnkgYSBzcGVjaWZpYyBkaXNhbWJpZ3VhdG9yIGFuZCBjcmVhdGVzIGEgY29tcG9zaXRlIGFsYXJtLlxuICAgKiBUaGlzIGNvbXBvc2l0ZSBhbGFybSBpcyBjcmVhdGVkIHdpdGggYW4gJ09SJyBjb25kaXRpb24sIHNvIGl0IHRyaWdnZXJzIHdpdGggYW55IGNoaWxkIGFsYXJtLlxuICAgKiBOT1RFOiBUaGlzIGNvbXBvc2l0ZSBhbGFybSBpcyBub3QgYWRkZWQgYW1vbmcgb3RoZXIgYWxhcm1zLCBzbyBpdCBpcyBub3QgcmV0dXJuZWQgYnkgY3JlYXRlZEFsYXJtcygpIGNhbGxzLlxuICAgKlxuICAgKiBAcGFyYW0gYWxhcm1EaXNhbWJpZ3VhdG9yIGRpc2FtYmlndWF0b3IgdG8gZmlsdGVyIGFsYXJtcyBieVxuICAgKiBAcGFyYW0gcHJvcHMgY3VzdG9taXphdGlvbiBvcHRpb25zXG4gICAqL1xuICBjcmVhdGVDb21wb3NpdGVBbGFybVVzaW5nRGlzYW1iaWd1YXRvcihcbiAgICBhbGFybURpc2FtYmlndWF0b3I6IHN0cmluZyxcbiAgICBwcm9wcz86IEFkZENvbXBvc2l0ZUFsYXJtUHJvcHMsXG4gICk6IENvbXBvc2l0ZUFsYXJtIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBhbGFybXMgPSB0aGlzLmNyZWF0ZWRBbGFybXNXaXRoRGlzYW1iaWd1YXRvcihhbGFybURpc2FtYmlndWF0b3IpO1xuICAgIGlmIChhbGFybXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgZGlzYW1iaWd1YXRvciA9IHByb3BzPy5kaXNhbWJpZ3VhdG9yID8/IGFsYXJtRGlzYW1iaWd1YXRvcjtcbiAgICAgIGNvbnN0IGFsYXJtRmFjdG9yeSA9IHRoaXMuY3JlYXRlQWxhcm1GYWN0b3J5KFwiQ29tcG9zaXRlXCIpO1xuICAgICAgY29uc3QgY29tcG9zaXRlID0gYWxhcm1GYWN0b3J5LmFkZENvbXBvc2l0ZUFsYXJtKGFsYXJtcywge1xuICAgICAgICAuLi4ocHJvcHMgPz8ge30pLFxuICAgICAgICBkaXNhbWJpZ3VhdG9yLFxuICAgICAgfSk7XG4gICAgICB0aGlzLmNyZWF0ZWRDb21wb3NpdGVzLnB1c2goY29tcG9zaXRlKTtcbiAgICAgIHJldHVybiBjb21wb3NpdGU7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvLyBDTE9ORSBBTEFSTVNcbiAgLy8gPT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEFwcGxpZXMgYSBjbG9uaW5nIGZ1bmN0aW9uIHRvIGVhY2ggb2YgdGhlIGdpdmVuIGFsYXJtcywgY3JlYXRpbmcgYSBuZXcgY29sbGVjdGlvbiBvZiBhbGFybXNcbiAgICogdGhhdCBhcmUgYWRqdXN0ZWQgYnkgdGhlIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gc291cmNlQWxhcm1zIFRoZSBhbGFybXMgdGhhdCBzaG91bGQgYmUgdXNlZCBhcyBzb3VyY2VzIGZvciB0aGUgY2xvbmVzLlxuICAgKiBAcGFyYW0gY2xvbmVGdW5jdGlvbiBBIGZ1bmN0aW9uIHRoYXQgd2lsbCBhY2NlcHQgYSBzb3VyY2UgYWxhcm0gYW5kIGRldGVybWluZSB3aGV0aGVyIGFuZCBob3cgYSBuZXcgYWxhcm0gc2hvdWxkIGJlIGNsb25lZCBmcm9tIGl0LlxuICAgKiBAcmV0dXJucyBUaGUgbGlzdCBvZiBjbG9uZSBhbGFybXMuXG4gICAqL1xuICBjbG9uZUFsYXJtcyhcbiAgICBzb3VyY2VBbGFybXM6IEFsYXJtV2l0aEFubm90YXRpb25bXSxcbiAgICBjbG9uZUZ1bmN0aW9uOiBBbGFybUNsb25lRnVuY3Rpb24sXG4gICk6IEFsYXJtV2l0aEFubm90YXRpb25bXSB7XG4gICAgY29uc3QgY2xvbmVkOiBBbGFybVdpdGhBbm5vdGF0aW9uW10gPSBbXTtcbiAgICBzb3VyY2VBbGFybXMuZm9yRWFjaCgoYWxhcm0pID0+IHtcbiAgICAgIGNvbnN0IGNsb25lQWxhcm1Qcm9wcyA9IGNsb25lRnVuY3Rpb24oYWxhcm0pO1xuICAgICAgaWYgKGNsb25lQWxhcm1Qcm9wcykge1xuICAgICAgICBjbG9uZWQucHVzaChcbiAgICAgICAgICBhbGFybS5hbGFybURlZmluaXRpb24uYWxhcm1GYWN0b3J5LmFkZEFsYXJtKFxuICAgICAgICAgICAgYWxhcm0uYWxhcm1EZWZpbml0aW9uLm1ldHJpYyxcbiAgICAgICAgICAgIGNsb25lQWxhcm1Qcm9wcyxcbiAgICAgICAgICApLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuY3JlYXRlZENsb25lcy5wdXNoKC4uLmNsb25lZCk7XG4gICAgcmV0dXJuIGNsb25lZDtcbiAgfVxuXG4gIC8vIEJBU0lDIFdJREdFVFNcbiAgLy8gPT09PT09PT09PT09PVxuXG4gIGFkZExhcmdlSGVhZGVyKFxuICAgIHRleHQ6IHN0cmluZyxcbiAgICBhZGRUb1N1bW1hcnk/OiBib29sZWFuLFxuICAgIGFkZFRvQWxhcm0/OiBib29sZWFuLFxuICApOiB0aGlzIHtcbiAgICB0aGlzLmFkZFdpZGdldChcbiAgICAgIG5ldyBIZWFkZXJXaWRnZXQodGV4dCwgSGVhZGVyTGV2ZWwuTEFSR0UpLFxuICAgICAgYWRkVG9TdW1tYXJ5ID8/IGZhbHNlLFxuICAgICAgYWRkVG9BbGFybSA/PyBmYWxzZSxcbiAgICApO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgYWRkTWVkaXVtSGVhZGVyKFxuICAgIHRleHQ6IHN0cmluZyxcbiAgICBhZGRUb1N1bW1hcnk/OiBib29sZWFuLFxuICAgIGFkZFRvQWxhcm0/OiBib29sZWFuLFxuICApOiB0aGlzIHtcbiAgICB0aGlzLmFkZFdpZGdldChcbiAgICAgIG5ldyBIZWFkZXJXaWRnZXQodGV4dCwgSGVhZGVyTGV2ZWwuTUVESVVNKSxcbiAgICAgIGFkZFRvU3VtbWFyeSA/PyBmYWxzZSxcbiAgICAgIGFkZFRvQWxhcm0gPz8gZmFsc2UsXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGFkZFNtYWxsSGVhZGVyKFxuICAgIHRleHQ6IHN0cmluZyxcbiAgICBhZGRUb1N1bW1hcnk/OiBib29sZWFuLFxuICAgIGFkZFRvQWxhcm0/OiBib29sZWFuLFxuICApOiB0aGlzIHtcbiAgICB0aGlzLmFkZFdpZGdldChcbiAgICAgIG5ldyBIZWFkZXJXaWRnZXQodGV4dCwgSGVhZGVyTGV2ZWwuU01BTEwpLFxuICAgICAgYWRkVG9TdW1tYXJ5ID8/IGZhbHNlLFxuICAgICAgYWRkVG9BbGFybSA/PyBmYWxzZSxcbiAgICApO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgYWRkV2lkZ2V0KFxuICAgIHdpZGdldDogSVdpZGdldCxcbiAgICBhZGRUb1N1bW1hcnk/OiBib29sZWFuLFxuICAgIGFkZFRvQWxhcm0/OiBib29sZWFuLFxuICApOiB0aGlzIHtcbiAgICB0aGlzLmFkZFNlZ21lbnQobmV3IFNpbmdsZVdpZGdldERhc2hib2FyZFNlZ21lbnQod2lkZ2V0KSwge1xuICAgICAgYWRkVG9BbGFybURhc2hib2FyZDogYWRkVG9BbGFybSA/PyB0cnVlLFxuICAgICAgYWRkVG9TdW1tYXJ5RGFzaGJvYXJkOiBhZGRUb1N1bW1hcnkgPz8gdHJ1ZSxcbiAgICAgIGFkZFRvRGV0YWlsRGFzaGJvYXJkOiB0cnVlLFxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gUkVTT1VSQ0UgTU9OSVRPUklOR1xuICAvLyA9PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIFVzZXMgYW4gYXNwZWN0IHRvIGF1dG9tYXRpY2FsbHkgbW9uaXRvciBhbGwgcmVzb3VyY2VzIGluIHRoZSBnaXZlbiBzY29wZS5cbiAgICpcbiAgICogQHBhcmFtIHNjb3BlIFNjb3BlIHdpdGggcmVzb3VyY2VzIHRvIG1vbml0b3IuXG4gICAqIEBwYXJhbSBhc3BlY3RQcm9wcyBPcHRpb25hbCBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBAZXhwZXJpbWVudGFsXG4gICAqL1xuICBtb25pdG9yU2NvcGUoc2NvcGU6IENvbnN0cnVjdCwgYXNwZWN0UHJvcHM/OiBNb25pdG9yaW5nQXNwZWN0UHJvcHMpOiB0aGlzIHtcbiAgICBjb25zdCBhc3BlY3QgPSBuZXcgTW9uaXRvcmluZ0FzcGVjdCh0aGlzLCBhc3BlY3RQcm9wcyk7XG4gICAgQXNwZWN0cy5vZihzY29wZSkuYWRkKGFzcGVjdCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBtb25pdG9yQXBpR2F0ZXdheShwcm9wczogQXBpR2F0ZXdheU1vbml0b3JpbmdQcm9wcyk6IHRoaXMge1xuICAgIGNvbnN0IHNlZ21lbnQgPSBuZXcgQXBpR2F0ZXdheU1vbml0b3JpbmcodGhpcywgcHJvcHMpO1xuICAgIHRoaXMuYWRkU2VnbWVudChzZWdtZW50LCBwcm9wcyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBtb25pdG9yQXBpR2F0ZXdheVYySHR0cEFwaShwcm9wczogQXBpR2F0ZXdheVYySHR0cEFwaU1vbml0b3JpbmdQcm9wcyk6IHRoaXMge1xuICAgIGNvbnN0IHNlZ21lbnQgPSBuZXcgQXBpR2F0ZXdheVYySHR0cEFwaU1vbml0b3JpbmcodGhpcywgcHJvcHMpO1xuICAgIHRoaXMuYWRkU2VnbWVudChzZWdtZW50LCBwcm9wcyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBtb25pdG9yQXBwU3luY0FwaShwcm9wczogQXBwU3luY01vbml0b3JpbmdQcm9wcyk6IHRoaXMge1xuICAgIGNvbnN0IHNlZ21lbnQgPSBuZXcgQXBwU3luY01vbml0b3JpbmcodGhpcywgcHJvcHMpO1xuICAgIHRoaXMuYWRkU2VnbWVudChzZWdtZW50LCBwcm9wcyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBtb25pdG9yQXVyb3JhQ2x1c3Rlcihwcm9wczogQXVyb3JhQ2x1c3Rlck1vbml0b3JpbmdQcm9wcyk6IHRoaXMge1xuICAgIGNvbnN0IHNlZ21lbnQgPSBuZXcgQXVyb3JhQ2x1c3Rlck1vbml0b3JpbmcodGhpcywgcHJvcHMpO1xuICAgIHRoaXMuYWRkU2VnbWVudChzZWdtZW50LCBwcm9wcyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBtb25pdG9yQ2VydGlmaWNhdGUocHJvcHM6IENlcnRpZmljYXRlTWFuYWdlck1vbml0b3JpbmdQcm9wcyk6IHRoaXMge1xuICAgIGNvbnN0IHNlZ21lbnQgPSBuZXcgQ2VydGlmaWNhdGVNYW5hZ2VyTW9uaXRvcmluZyh0aGlzLCBwcm9wcyk7XG4gICAgdGhpcy5hZGRTZWdtZW50KHNlZ21lbnQsIHByb3BzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIG1vbml0b3JDbG91ZEZyb250RGlzdHJpYnV0aW9uKFxuICAgIHByb3BzOiBDbG91ZEZyb250RGlzdHJpYnV0aW9uTW9uaXRvcmluZ1Byb3BzLFxuICApOiB0aGlzIHtcbiAgICBjb25zdCBzZWdtZW50ID0gbmV3IENsb3VkRnJvbnREaXN0cmlidXRpb25Nb25pdG9yaW5nKHRoaXMsIHByb3BzKTtcbiAgICB0aGlzLmFkZFNlZ21lbnQoc2VnbWVudCwgcHJvcHMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgbW9uaXRvckNvZGVCdWlsZFByb2plY3QocHJvcHM6IENvZGVCdWlsZFByb2plY3RNb25pdG9yaW5nUHJvcHMpOiB0aGlzIHtcbiAgICBjb25zdCBzZWdtZW50ID0gbmV3IENvZGVCdWlsZFByb2plY3RNb25pdG9yaW5nKHRoaXMsIHByb3BzKTtcbiAgICB0aGlzLmFkZFNlZ21lbnQoc2VnbWVudCwgcHJvcHMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgbW9uaXRvckRvY3VtZW50RGJDbHVzdGVyKHByb3BzOiBEb2N1bWVudERiTW9uaXRvcmluZ1Byb3BzKTogdGhpcyB7XG4gICAgY29uc3Qgc2VnbWVudCA9IG5ldyBEb2N1bWVudERiTW9uaXRvcmluZyh0aGlzLCBwcm9wcyk7XG4gICAgdGhpcy5hZGRTZWdtZW50KHNlZ21lbnQsIHByb3BzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIG1vbml0b3JEeW5hbW9UYWJsZShwcm9wczogRHluYW1vVGFibGVNb25pdG9yaW5nUHJvcHMpOiB0aGlzIHtcbiAgICBjb25zdCBzZWdtZW50ID0gbmV3IER5bmFtb1RhYmxlTW9uaXRvcmluZyh0aGlzLCBwcm9wcyk7XG4gICAgdGhpcy5hZGRTZWdtZW50KHNlZ21lbnQsIHByb3BzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIG1vbml0b3JEeW5hbW9UYWJsZUdsb2JhbFNlY29uZGFyeUluZGV4KFxuICAgIHByb3BzOiBEeW5hbW9UYWJsZUdsb2JhbFNlY29uZGFyeUluZGV4TW9uaXRvcmluZ1Byb3BzLFxuICApIHtcbiAgICBjb25zdCBzZWdtZW50ID0gbmV3IER5bmFtb1RhYmxlR2xvYmFsU2Vjb25kYXJ5SW5kZXhNb25pdG9yaW5nKHRoaXMsIHByb3BzKTtcbiAgICB0aGlzLmFkZFNlZ21lbnQoc2VnbWVudCwgcHJvcHMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgbW9uaXRvckVDMkluc3RhbmNlcyhwcm9wczogRUMyTW9uaXRvcmluZ1Byb3BzKTogdGhpcyB7XG4gICAgY29uc3Qgc2VnbWVudCA9IG5ldyBFQzJNb25pdG9yaW5nKHRoaXMsIHByb3BzKTtcbiAgICB0aGlzLmFkZFNlZ21lbnQoc2VnbWVudCwgcHJvcHMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgbW9uaXRvckVsYXN0aWNzZWFyY2hDbHVzdGVyKHByb3BzOiBPcGVuU2VhcmNoQ2x1c3Rlck1vbml0b3JpbmdQcm9wcyk6IHRoaXMge1xuICAgIGNvbnN0IHNlZ21lbnQgPSBuZXcgT3BlblNlYXJjaENsdXN0ZXJNb25pdG9yaW5nKHRoaXMsIHByb3BzKTtcbiAgICB0aGlzLmFkZFNlZ21lbnQoc2VnbWVudCwgcHJvcHMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgbW9uaXRvck9wZW5TZWFyY2hDbHVzdGVyKHByb3BzOiBPcGVuU2VhcmNoQ2x1c3Rlck1vbml0b3JpbmdQcm9wcyk6IHRoaXMge1xuICAgIGNvbnN0IHNlZ21lbnQgPSBuZXcgT3BlblNlYXJjaENsdXN0ZXJNb25pdG9yaW5nKHRoaXMsIHByb3BzKTtcbiAgICB0aGlzLmFkZFNlZ21lbnQoc2VnbWVudCwgcHJvcHMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgbW9uaXRvckVsYXN0aUNhY2hlQ2x1c3Rlcihwcm9wczogRWxhc3RpQ2FjaGVDbHVzdGVyTW9uaXRvcmluZ1Byb3BzKTogdGhpcyB7XG4gICAgY29uc3Qgc2VnbWVudCA9IG5ldyBFbGFzdGlDYWNoZUNsdXN0ZXJNb25pdG9yaW5nKHRoaXMsIHByb3BzKTtcbiAgICB0aGlzLmFkZFNlZ21lbnQoc2VnbWVudCwgcHJvcHMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgbW9uaXRvckdsdWVKb2IocHJvcHM6IEdsdWVKb2JNb25pdG9yaW5nUHJvcHMpOiB0aGlzIHtcbiAgICBjb25zdCBzZWdtZW50ID0gbmV3IEdsdWVKb2JNb25pdG9yaW5nKHRoaXMsIHByb3BzKTtcbiAgICB0aGlzLmFkZFNlZ21lbnQoc2VnbWVudCwgcHJvcHMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgbW9uaXRvckZhcmdhdGVTZXJ2aWNlKHByb3BzOiBGYXJnYXRlU2VydmljZU1vbml0b3JpbmdQcm9wcyk6IHRoaXMge1xuICAgIGNvbnN0IHNlZ21lbnQgPSBuZXcgRmFyZ2F0ZVNlcnZpY2VNb25pdG9yaW5nKHRoaXMsIHtcbiAgICAgIC4uLnByb3BzLFxuICAgICAgZmFyZ2F0ZVNlcnZpY2U6IHByb3BzLmZhcmdhdGVTZXJ2aWNlLnNlcnZpY2UsXG4gICAgICBsb2FkQmFsYW5jZXI6IHByb3BzLmZhcmdhdGVTZXJ2aWNlLmxvYWRCYWxhbmNlcixcbiAgICAgIHRhcmdldEdyb3VwOiBwcm9wcy5mYXJnYXRlU2VydmljZS50YXJnZXRHcm91cCxcbiAgICB9KTtcbiAgICB0aGlzLmFkZFNlZ21lbnQoc2VnbWVudCwgcHJvcHMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgbW9uaXRvclNpbXBsZUZhcmdhdGVTZXJ2aWNlKFxuICAgIHByb3BzOiBTaW1wbGVGYXJnYXRlU2VydmljZU1vbml0b3JpbmdQcm9wcyxcbiAgKTogdGhpcyB7XG4gICAgY29uc3Qgc2VnbWVudCA9IG5ldyBGYXJnYXRlU2VydmljZU1vbml0b3JpbmcodGhpcywge1xuICAgICAgLi4ucHJvcHMsXG4gICAgICBmYXJnYXRlU2VydmljZTogcHJvcHMuZmFyZ2F0ZVNlcnZpY2UsXG4gICAgfSk7XG4gICAgdGhpcy5hZGRTZWdtZW50KHNlZ21lbnQsIHByb3BzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIG1vbml0b3JGYXJnYXRlTmV0d29ya0xvYWRCYWxhbmNlcihcbiAgICBwcm9wczogRmFyZ2F0ZU5ldHdvcmtMb2FkQmFsYW5jZXJNb25pdG9yaW5nUHJvcHMsXG4gICk6IHRoaXMge1xuICAgIGNvbnN0IHNlZ21lbnQgPSBuZXcgRmFyZ2F0ZVNlcnZpY2VNb25pdG9yaW5nKHRoaXMsIHtcbiAgICAgIC4uLnByb3BzLFxuICAgICAgZmFyZ2F0ZVNlcnZpY2U6IHByb3BzLmZhcmdhdGVTZXJ2aWNlLFxuICAgICAgbG9hZEJhbGFuY2VyOiBwcm9wcy5uZXR3b3JrTG9hZEJhbGFuY2VyLFxuICAgICAgdGFyZ2V0R3JvdXA6IHByb3BzLm5ldHdvcmtUYXJnZXRHcm91cCxcbiAgICB9KTtcbiAgICB0aGlzLmFkZFNlZ21lbnQoc2VnbWVudCwgcHJvcHMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgbW9uaXRvckZhcmdhdGVBcHBsaWNhdGlvbkxvYWRCYWxhbmNlcihcbiAgICBwcm9wczogRmFyZ2F0ZUFwcGxpY2F0aW9uTG9hZEJhbGFuY2VyTW9uaXRvcmluZ1Byb3BzLFxuICApOiB0aGlzIHtcbiAgICBjb25zdCBzZWdtZW50ID0gbmV3IEZhcmdhdGVTZXJ2aWNlTW9uaXRvcmluZyh0aGlzLCB7XG4gICAgICAuLi5wcm9wcyxcbiAgICAgIGZhcmdhdGVTZXJ2aWNlOiBwcm9wcy5mYXJnYXRlU2VydmljZSxcbiAgICAgIGxvYWRCYWxhbmNlcjogcHJvcHMuYXBwbGljYXRpb25Mb2FkQmFsYW5jZXIsXG4gICAgICB0YXJnZXRHcm91cDogcHJvcHMuYXBwbGljYXRpb25UYXJnZXRHcm91cCxcbiAgICB9KTtcbiAgICB0aGlzLmFkZFNlZ21lbnQoc2VnbWVudCwgcHJvcHMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgbW9uaXRvckVjMlNlcnZpY2UocHJvcHM6IEVjMlNlcnZpY2VNb25pdG9yaW5nUHJvcHMpOiB0aGlzIHtcbiAgICBjb25zdCBzZWdtZW50ID0gbmV3IEVjMlNlcnZpY2VNb25pdG9yaW5nKHRoaXMsIHtcbiAgICAgIC4uLnByb3BzLFxuICAgICAgZWMyU2VydmljZTogcHJvcHMuZWMyU2VydmljZS5zZXJ2aWNlLFxuICAgICAgbG9hZEJhbGFuY2VyOiBwcm9wcy5lYzJTZXJ2aWNlLmxvYWRCYWxhbmNlcixcbiAgICAgIHRhcmdldEdyb3VwOiBwcm9wcy5lYzJTZXJ2aWNlLnRhcmdldEdyb3VwLFxuICAgIH0pO1xuICAgIHRoaXMuYWRkU2VnbWVudChzZWdtZW50LCBwcm9wcyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBtb25pdG9yU2ltcGxlRWMyU2VydmljZShwcm9wczogU2ltcGxlRWMyU2VydmljZU1vbml0b3JpbmdQcm9wcyk6IHRoaXMge1xuICAgIGNvbnN0IHNlZ21lbnQgPSBuZXcgRWMyU2VydmljZU1vbml0b3JpbmcodGhpcywge1xuICAgICAgLi4ucHJvcHMsXG4gICAgICBlYzJTZXJ2aWNlOiBwcm9wcy5lYzJTZXJ2aWNlLFxuICAgIH0pO1xuICAgIHRoaXMuYWRkU2VnbWVudChzZWdtZW50LCBwcm9wcyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBtb25pdG9yRWMyTmV0d29ya0xvYWRCYWxhbmNlcihcbiAgICBwcm9wczogRWMyTmV0d29ya0xvYWRCYWxhbmNlck1vbml0b3JpbmdQcm9wcyxcbiAgKTogdGhpcyB7XG4gICAgY29uc3Qgc2VnbWVudCA9IG5ldyBFYzJTZXJ2aWNlTW9uaXRvcmluZyh0aGlzLCB7XG4gICAgICAuLi5wcm9wcyxcbiAgICAgIGVjMlNlcnZpY2U6IHByb3BzLmVjMlNlcnZpY2UsXG4gICAgICBsb2FkQmFsYW5jZXI6IHByb3BzLm5ldHdvcmtMb2FkQmFsYW5jZXIsXG4gICAgICB0YXJnZXRHcm91cDogcHJvcHMubmV0d29ya1RhcmdldEdyb3VwLFxuICAgIH0pO1xuICAgIHRoaXMuYWRkU2VnbWVudChzZWdtZW50LCBwcm9wcyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBtb25pdG9yRWMyQXBwbGljYXRpb25Mb2FkQmFsYW5jZXIoXG4gICAgcHJvcHM6IEVjMkFwcGxpY2F0aW9uTG9hZEJhbGFuY2VyTW9uaXRvcmluZ1Byb3BzLFxuICApOiB0aGlzIHtcbiAgICBjb25zdCBzZWdtZW50ID0gbmV3IEVjMlNlcnZpY2VNb25pdG9yaW5nKHRoaXMsIHtcbiAgICAgIC4uLnByb3BzLFxuICAgICAgZWMyU2VydmljZTogcHJvcHMuZWMyU2VydmljZSxcbiAgICAgIGxvYWRCYWxhbmNlcjogcHJvcHMuYXBwbGljYXRpb25Mb2FkQmFsYW5jZXIsXG4gICAgICB0YXJnZXRHcm91cDogcHJvcHMuYXBwbGljYXRpb25UYXJnZXRHcm91cCxcbiAgICB9KTtcbiAgICB0aGlzLmFkZFNlZ21lbnQoc2VnbWVudCwgcHJvcHMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgbW9uaXRvclF1ZXVlUHJvY2Vzc2luZ0ZhcmdhdGVTZXJ2aWNlKFxuICAgIHByb3BzOiBRdWV1ZVByb2Nlc3NpbmdGYXJnYXRlU2VydmljZU1vbml0b3JpbmdQcm9wcyxcbiAgKTogdGhpcyB7XG4gICAgZ2V0UXVldWVQcm9jZXNzaW5nRmFyZ2F0ZVNlcnZpY2VNb25pdG9yaW5nKHRoaXMsIHByb3BzKS5mb3JFYWNoKChzZWdtZW50KSA9PlxuICAgICAgdGhpcy5hZGRTZWdtZW50KHNlZ21lbnQpLFxuICAgICk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBtb25pdG9yUXVldWVQcm9jZXNzaW5nRWMyU2VydmljZShcbiAgICBwcm9wczogUXVldWVQcm9jZXNzaW5nRWMyU2VydmljZU1vbml0b3JpbmdQcm9wcyxcbiAgKTogdGhpcyB7XG4gICAgZ2V0UXVldWVQcm9jZXNzaW5nRWMyU2VydmljZU1vbml0b3JpbmcodGhpcywgcHJvcHMpLmZvckVhY2goKHNlZ21lbnQpID0+XG4gICAgICB0aGlzLmFkZFNlZ21lbnQoc2VnbWVudCksXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIG1vbml0b3JBdXRvU2NhbGluZ0dyb3VwKHByb3BzOiBBdXRvU2NhbGluZ0dyb3VwTW9uaXRvcmluZ1Byb3BzKTogdGhpcyB7XG4gICAgY29uc3Qgc2VnbWVudCA9IG5ldyBBdXRvU2NhbGluZ0dyb3VwTW9uaXRvcmluZyh0aGlzLCBwcm9wcyk7XG4gICAgdGhpcy5hZGRTZWdtZW50KHNlZ21lbnQsIHByb3BzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIG1vbml0b3JLaW5lc2lzRmlyZWhvc2UocHJvcHM6IEtpbmVzaXNGaXJlaG9zZU1vbml0b3JpbmdQcm9wcyk6IHRoaXMge1xuICAgIGNvbnN0IHNlZ21lbnQgPSBuZXcgS2luZXNpc0ZpcmVob3NlTW9uaXRvcmluZyh0aGlzLCBwcm9wcyk7XG4gICAgdGhpcy5hZGRTZWdtZW50KHNlZ21lbnQsIHByb3BzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIG1vbml0b3JLaW5lc2lzRGF0YVN0cmVhbShwcm9wczogS2luZXNpc0RhdGFTdHJlYW1Nb25pdG9yaW5nUHJvcHMpOiB0aGlzIHtcbiAgICBjb25zdCBzZWdtZW50ID0gbmV3IEtpbmVzaXNEYXRhU3RyZWFtTW9uaXRvcmluZyh0aGlzLCBwcm9wcyk7XG4gICAgdGhpcy5hZGRTZWdtZW50KHNlZ21lbnQsIHByb3BzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIG1vbml0b3JLaW5lc2lzRGF0YUFuYWx5dGljcyhcbiAgICBwcm9wczogS2luZXNpc0RhdGFBbmFseXRpY3NNb25pdG9yaW5nUHJvcHMsXG4gICk6IHRoaXMge1xuICAgIGNvbnN0IHNlZ21lbnQgPSBuZXcgS2luZXNpc0RhdGFBbmFseXRpY3NNb25pdG9yaW5nKHRoaXMsIHByb3BzKTtcbiAgICB0aGlzLmFkZFNlZ21lbnQoc2VnbWVudCwgcHJvcHMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgbW9uaXRvckxhbWJkYUZ1bmN0aW9uKHByb3BzOiBMYW1iZGFGdW5jdGlvbk1vbml0b3JpbmdQcm9wcyk6IHRoaXMge1xuICAgIGNvbnN0IHNlZ21lbnQgPSBuZXcgTGFtYmRhRnVuY3Rpb25Nb25pdG9yaW5nKHRoaXMsIHByb3BzKTtcbiAgICB0aGlzLmFkZFNlZ21lbnQoc2VnbWVudCwgcHJvcHMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgbW9uaXRvck5ldHdvcmtMb2FkQmFsYW5jZXIocHJvcHM6IE5ldHdvcmtMb2FkQmFsYW5jZXJNb25pdG9yaW5nUHJvcHMpOiB0aGlzIHtcbiAgICBjb25zdCBzZWdtZW50ID0gbmV3IE5ldHdvcmtMb2FkQmFsYW5jZXJNb25pdG9yaW5nKHRoaXMsIHByb3BzKTtcbiAgICB0aGlzLmFkZFNlZ21lbnQoc2VnbWVudCwgcHJvcHMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgbW9uaXRvclJkc0NsdXN0ZXIocHJvcHM6IFJkc0NsdXN0ZXJNb25pdG9yaW5nUHJvcHMpOiB0aGlzIHtcbiAgICBjb25zdCBzZWdtZW50ID0gbmV3IFJkc0NsdXN0ZXJNb25pdG9yaW5nKHRoaXMsIHByb3BzKTtcbiAgICB0aGlzLmFkZFNlZ21lbnQoc2VnbWVudCwgcHJvcHMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgbW9uaXRvclJkc0luc3RhbmNlKHByb3BzOiBSZHNJbnN0YW5jZU1vbml0b3JpbmdQcm9wcyk6IHRoaXMge1xuICAgIGNvbnN0IHNlZ21lbnQgPSBuZXcgUmRzSW5zdGFuY2VNb25pdG9yaW5nKHRoaXMsIHByb3BzKTtcbiAgICB0aGlzLmFkZFNlZ21lbnQoc2VnbWVudCwgcHJvcHMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgbW9uaXRvclJlZHNoaWZ0Q2x1c3Rlcihwcm9wczogUmVkc2hpZnRDbHVzdGVyTW9uaXRvcmluZ1Byb3BzKTogdGhpcyB7XG4gICAgY29uc3Qgc2VnbWVudCA9IG5ldyBSZWRzaGlmdENsdXN0ZXJNb25pdG9yaW5nKHRoaXMsIHByb3BzKTtcbiAgICB0aGlzLmFkZFNlZ21lbnQoc2VnbWVudCwgcHJvcHMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgbW9uaXRvclNlY3JldHNNYW5hZ2VyKHByb3BzOiBTZWNyZXRzTWFuYWdlck1vbml0b3JpbmdQcm9wcyk6IHRoaXMge1xuICAgIGNvbnN0IHNlZ21lbnQgPSBuZXcgU2VjcmV0c01hbmFnZXJNb25pdG9yaW5nKHRoaXMsIHByb3BzKTtcbiAgICB0aGlzLmFkZFNlZ21lbnQoc2VnbWVudCwgcHJvcHMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgbW9uaXRvclNlY3JldHNNYW5hZ2VyU2VjcmV0KFxuICAgIHByb3BzOiBTZWNyZXRzTWFuYWdlclNlY3JldE1vbml0b3JpbmdQcm9wcyxcbiAgKTogdGhpcyB7XG4gICAgY29uc3Qgc2VnbWVudCA9IG5ldyBTZWNyZXRzTWFuYWdlclNlY3JldE1vbml0b3JpbmcodGhpcywgcHJvcHMpO1xuICAgIHRoaXMuYWRkU2VnbWVudChzZWdtZW50LCBwcm9wcyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBtb25pdG9yU25zVG9waWMocHJvcHM6IFNuc1RvcGljTW9uaXRvcmluZ1Byb3BzKTogdGhpcyB7XG4gICAgY29uc3Qgc2VnbWVudCA9IG5ldyBTbnNUb3BpY01vbml0b3JpbmcodGhpcywgcHJvcHMpO1xuICAgIHRoaXMuYWRkU2VnbWVudChzZWdtZW50LCBwcm9wcyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBtb25pdG9yU3FzUXVldWUocHJvcHM6IFNxc1F1ZXVlTW9uaXRvcmluZ1Byb3BzKTogdGhpcyB7XG4gICAgY29uc3Qgc2VnbWVudCA9IG5ldyBTcXNRdWV1ZU1vbml0b3JpbmcodGhpcywgcHJvcHMpO1xuICAgIHRoaXMuYWRkU2VnbWVudChzZWdtZW50LCBwcm9wcyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBtb25pdG9yU3FzUXVldWVXaXRoRGxxKHByb3BzOiBTcXNRdWV1ZU1vbml0b3JpbmdXaXRoRGxxUHJvcHMpOiB0aGlzIHtcbiAgICBjb25zdCBzZWdtZW50ID0gbmV3IFNxc1F1ZXVlTW9uaXRvcmluZ1dpdGhEbHEodGhpcywgcHJvcHMpO1xuICAgIHRoaXMuYWRkU2VnbWVudChzZWdtZW50LCBwcm9wcyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBtb25pdG9yU3RlcEZ1bmN0aW9uKHByb3BzOiBTdGVwRnVuY3Rpb25Nb25pdG9yaW5nUHJvcHMpOiB0aGlzIHtcbiAgICBjb25zdCBzZWdtZW50ID0gbmV3IFN0ZXBGdW5jdGlvbk1vbml0b3JpbmcodGhpcywgcHJvcHMpO1xuICAgIHRoaXMuYWRkU2VnbWVudChzZWdtZW50LCBwcm9wcyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBtb25pdG9yU3RlcEZ1bmN0aW9uQWN0aXZpdHkoXG4gICAgcHJvcHM6IFN0ZXBGdW5jdGlvbkFjdGl2aXR5TW9uaXRvcmluZ1Byb3BzLFxuICApOiB0aGlzIHtcbiAgICBjb25zdCBzZWdtZW50ID0gbmV3IFN0ZXBGdW5jdGlvbkFjdGl2aXR5TW9uaXRvcmluZyh0aGlzLCBwcm9wcyk7XG4gICAgdGhpcy5hZGRTZWdtZW50KHNlZ21lbnQsIHByb3BzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIG1vbml0b3JTdGVwRnVuY3Rpb25MYW1iZGFJbnRlZ3JhdGlvbihcbiAgICBwcm9wczogU3RlcEZ1bmN0aW9uTGFtYmRhSW50ZWdyYXRpb25Nb25pdG9yaW5nUHJvcHMsXG4gICk6IHRoaXMge1xuICAgIGNvbnN0IHNlZ21lbnQgPSBuZXcgU3RlcEZ1bmN0aW9uTGFtYmRhSW50ZWdyYXRpb25Nb25pdG9yaW5nKHRoaXMsIHByb3BzKTtcbiAgICB0aGlzLmFkZFNlZ21lbnQoc2VnbWVudCwgcHJvcHMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgbW9uaXRvclN0ZXBGdW5jdGlvblNlcnZpY2VJbnRlZ3JhdGlvbihcbiAgICBwcm9wczogU3RlcEZ1bmN0aW9uU2VydmljZUludGVncmF0aW9uTW9uaXRvcmluZ1Byb3BzLFxuICApOiB0aGlzIHtcbiAgICBjb25zdCBzZWdtZW50ID0gbmV3IFN0ZXBGdW5jdGlvblNlcnZpY2VJbnRlZ3JhdGlvbk1vbml0b3JpbmcodGhpcywgcHJvcHMpO1xuICAgIHRoaXMuYWRkU2VnbWVudChzZWdtZW50LCBwcm9wcyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBtb25pdG9yUzNCdWNrZXQocHJvcHM6IFMzQnVja2V0TW9uaXRvcmluZ1Byb3BzKTogdGhpcyB7XG4gICAgY29uc3Qgc2VnbWVudCA9IG5ldyBTM0J1Y2tldE1vbml0b3JpbmcodGhpcywgcHJvcHMpO1xuICAgIHRoaXMuYWRkU2VnbWVudChzZWdtZW50LCBwcm9wcyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBtb25pdG9yTG9nKHByb3BzOiBMb2dNb25pdG9yaW5nUHJvcHMpOiB0aGlzIHtcbiAgICBjb25zdCBzZWdtZW50ID0gbmV3IExvZ01vbml0b3JpbmcodGhpcywgcHJvcHMpO1xuICAgIHRoaXMuYWRkU2VnbWVudChzZWdtZW50LCBwcm9wcyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBtb25pdG9yU3ludGhldGljc0NhbmFyeShwcm9wczogU3ludGhldGljc0NhbmFyeU1vbml0b3JpbmdQcm9wcyk6IHRoaXMge1xuICAgIGNvbnN0IHNlZ21lbnQgPSBuZXcgU3ludGhldGljc0NhbmFyeU1vbml0b3JpbmcodGhpcywgcHJvcHMpO1xuICAgIHRoaXMuYWRkU2VnbWVudChzZWdtZW50LCBwcm9wcyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBtb25pdG9yV2ViQXBwbGljYXRpb25GaXJld2FsbEFjbFYyKHByb3BzOiBXYWZWMk1vbml0b3JpbmdQcm9wcyk6IHRoaXMge1xuICAgIGNvbnN0IHNlZ21lbnQgPSBuZXcgV2FmVjJNb25pdG9yaW5nKHRoaXMsIHByb3BzKTtcbiAgICB0aGlzLmFkZFNlZ21lbnQoc2VnbWVudCwgcHJvcHMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgbW9uaXRvckJpbGxpbmcocHJvcHM/OiBCaWxsaW5nTW9uaXRvcmluZ1Byb3BzKTogdGhpcyB7XG4gICAgY29uc3Qgc2VnbWVudCA9IG5ldyBCaWxsaW5nTW9uaXRvcmluZyh0aGlzLCBwcm9wcyA/PyB7fSk7XG4gICAgdGhpcy5hZGRTZWdtZW50KHNlZ21lbnQsIHByb3BzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIG1vbml0b3JDdXN0b20ocHJvcHM6IEN1c3RvbU1vbml0b3JpbmdQcm9wcyk6IHRoaXMge1xuICAgIGNvbnN0IHNlZ21lbnQgPSBuZXcgQ3VzdG9tTW9uaXRvcmluZyh0aGlzLCBwcm9wcyk7XG4gICAgdGhpcy5hZGRTZWdtZW50KHNlZ21lbnQsIHByb3BzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIG1vbml0b3JGbHVlbnRCaXQocHJvcHM6IEZsdWVudEJpdE1vbml0b3JpbmdQcm9wcyk6IHRoaXMge1xuICAgIGNvbnN0IHNlZ21lbnQgPSBuZXcgRmx1ZW50Qml0TW9uaXRvcmluZyh0aGlzLCBwcm9wcyk7XG4gICAgdGhpcy5hZGRTZWdtZW50KHNlZ21lbnQsIHByb3BzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuIl19