UNPKG

awscdk-resources-mongodbatlas

Version:

MongoDB Atlas CDK Construct Library for AWS CloudFormation Resources

314 lines 74.2 kB
"use strict"; var _a; Object.defineProperty(exports, "__esModule", { value: true }); exports.CfnCluster = exports.AdvancedRegionConfigProviderName = exports.CfnClusterPropsEncryptionAtRestProvider = void 0; exports.toJson_CfnClusterProps = toJson_CfnClusterProps; exports.toJson_ProcessArgs = toJson_ProcessArgs; exports.toJson_CfnClusterPropsBiConnector = toJson_CfnClusterPropsBiConnector; exports.toJson_ConnectionStrings = toJson_ConnectionStrings; exports.toJson_CfnClusterPropsLabels = toJson_CfnClusterPropsLabels; exports.toJson_AdvancedReplicationSpec = toJson_AdvancedReplicationSpec; exports.toJson_Tag = toJson_Tag; exports.toJson_AdvancedRegionConfig = toJson_AdvancedRegionConfig; exports.toJson_AdvancedAutoScaling = toJson_AdvancedAutoScaling; exports.toJson_Specs = toJson_Specs; exports.toJson_DiskGb = toJson_DiskGb; exports.toJson_Compute = toJson_Compute; const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); // Generated by cdk-import const cdk = require("aws-cdk-lib"); /** * Converts an object of type 'CfnClusterProps' to JSON representation. */ /* eslint-disable max-len, quote-props */ function toJson_CfnClusterProps(obj) { if (obj === undefined) { return undefined; } const result = { AdvancedSettings: toJson_ProcessArgs(obj.advancedSettings), BackupEnabled: obj.backupEnabled, BiConnector: toJson_CfnClusterPropsBiConnector(obj.biConnector), ClusterType: obj.clusterType, ConnectionStrings: toJson_ConnectionStrings(obj.connectionStrings), DiskSizeGB: obj.diskSizeGb, EncryptionAtRestProvider: obj.encryptionAtRestProvider, GlobalClusterSelfManagedSharding: obj.globalClusterSelfManagedSharding, Profile: obj.profile, ProjectId: obj.projectId, Labels: obj.labels?.map((y) => toJson_CfnClusterPropsLabels(y)), MongoDBMajorVersion: obj.mongoDbMajorVersion, Name: obj.name, Paused: obj.paused, PitEnabled: obj.pitEnabled, ReplicationSpecs: obj.replicationSpecs?.map((y) => toJson_AdvancedReplicationSpec(y)), RootCertType: obj.rootCertType, VersionReleaseSystem: obj.versionReleaseSystem, TerminationProtectionEnabled: obj.terminationProtectionEnabled, Tags: obj.tags?.map((y) => toJson_Tag(y)), }; // filter undefined values return Object.entries(result).reduce((r, i) => (i[1] === undefined ? r : { ...r, [i[0]]: i[1] }), {}); } /** * Converts an object of type 'ProcessArgs' to JSON representation. */ /* eslint-disable max-len, quote-props */ function toJson_ProcessArgs(obj) { if (obj === undefined) { return undefined; } const result = { DefaultReadConcern: obj.defaultReadConcern, DefaultWriteConcern: obj.defaultWriteConcern, FailIndexKeyTooLong: obj.failIndexKeyTooLong, JavascriptEnabled: obj.javascriptEnabled, MinimumEnabledTLSProtocol: obj.minimumEnabledTlsProtocol, TlsCipherConfigMode: obj.tlsCipherConfigMode, CustomOpensslCipherConfigTls12: obj.customOpensslCipherConfigTls12?.map((y) => y), NoTableScan: obj.noTableScan, OplogSizeMB: obj.oplogSizeMb, SampleSizeBIConnector: obj.sampleSizeBiConnector, SampleRefreshIntervalBIConnector: obj.sampleRefreshIntervalBiConnector, OplogMinRetentionHours: obj.oplogMinRetentionHours, TransactionLifetimeLimitSeconds: obj.transactionLifetimeLimitSeconds, }; // filter undefined values return Object.entries(result).reduce((r, i) => (i[1] === undefined ? r : { ...r, [i[0]]: i[1] }), {}); } /** * Converts an object of type 'CfnClusterPropsBiConnector' to JSON representation. */ /* eslint-disable max-len, quote-props */ function toJson_CfnClusterPropsBiConnector(obj) { if (obj === undefined) { return undefined; } const result = { ReadPreference: obj.readPreference, Enabled: obj.enabled, }; // filter undefined values return Object.entries(result).reduce((r, i) => (i[1] === undefined ? r : { ...r, [i[0]]: i[1] }), {}); } /** * Converts an object of type 'ConnectionStrings' to JSON representation. */ /* eslint-disable max-len, quote-props */ function toJson_ConnectionStrings(obj) { if (obj === undefined) { return undefined; } const result = { Standard: obj.standard, StandardSrv: obj.standardSrv, Private: obj.private, PrivateSrv: obj.privateSrv, PrivateEndpoints: obj.privateEndpoints?.map((y) => y), PrivateEndpointsSrv: obj.privateEndpointsSrv?.map((y) => y), SRVShardOptimizedConnectionString: obj.srvShardOptimizedConnectionString?.map((y) => y), }; // filter undefined values return Object.entries(result).reduce((r, i) => (i[1] === undefined ? r : { ...r, [i[0]]: i[1] }), {}); } /* eslint-enable max-len, quote-props */ /** * Cloud service provider that manages your customer keys to provide an additional layer of encryption at rest for the cluster. To enable customer key management for encryption at rest, the cluster replicationSpecs[n].regionConfigs[m].{type}Specs.instanceSize setting must be M10 or higher and "backupEnabled" : false or omitted entirely. * * @schema CfnClusterPropsEncryptionAtRestProvider */ var CfnClusterPropsEncryptionAtRestProvider; (function (CfnClusterPropsEncryptionAtRestProvider) { /** AWS */ CfnClusterPropsEncryptionAtRestProvider["AWS"] = "AWS"; /** GCP */ CfnClusterPropsEncryptionAtRestProvider["GCP"] = "GCP"; /** AZURE */ CfnClusterPropsEncryptionAtRestProvider["AZURE"] = "AZURE"; /** NONE */ CfnClusterPropsEncryptionAtRestProvider["NONE"] = "NONE"; })(CfnClusterPropsEncryptionAtRestProvider || (exports.CfnClusterPropsEncryptionAtRestProvider = CfnClusterPropsEncryptionAtRestProvider = {})); /** * Converts an object of type 'CfnClusterPropsLabels' to JSON representation. */ /* eslint-disable max-len, quote-props */ function toJson_CfnClusterPropsLabels(obj) { if (obj === undefined) { return undefined; } const result = { Key: obj.key, Value: obj.value, }; // filter undefined values return Object.entries(result).reduce((r, i) => (i[1] === undefined ? r : { ...r, [i[0]]: i[1] }), {}); } /** * Converts an object of type 'AdvancedReplicationSpec' to JSON representation. */ /* eslint-disable max-len, quote-props */ function toJson_AdvancedReplicationSpec(obj) { if (obj === undefined) { return undefined; } const result = { ID: obj.id, NumShards: obj.numShards, AdvancedRegionConfigs: obj.advancedRegionConfigs?.map((y) => toJson_AdvancedRegionConfig(y)), ZoneName: obj.zoneName, }; // filter undefined values return Object.entries(result).reduce((r, i) => (i[1] === undefined ? r : { ...r, [i[0]]: i[1] }), {}); } /** * Converts an object of type 'Tag' to JSON representation. */ /* eslint-disable max-len, quote-props */ function toJson_Tag(obj) { if (obj === undefined) { return undefined; } const result = { Key: obj.key, Value: obj.value, }; // filter undefined values return Object.entries(result).reduce((r, i) => (i[1] === undefined ? r : { ...r, [i[0]]: i[1] }), {}); } /** * Converts an object of type 'AdvancedRegionConfig' to JSON representation. */ /* eslint-disable max-len, quote-props */ function toJson_AdvancedRegionConfig(obj) { if (obj === undefined) { return undefined; } const result = { AnalyticsAutoScaling: toJson_AdvancedAutoScaling(obj.analyticsAutoScaling), AutoScaling: toJson_AdvancedAutoScaling(obj.autoScaling), RegionName: obj.regionName, BackingProviderName: obj.backingProviderName, ProviderName: obj.providerName, AnalyticsSpecs: toJson_Specs(obj.analyticsSpecs), ElectableSpecs: toJson_Specs(obj.electableSpecs), Priority: obj.priority, ReadOnlySpecs: toJson_Specs(obj.readOnlySpecs), }; // filter undefined values return Object.entries(result).reduce((r, i) => (i[1] === undefined ? r : { ...r, [i[0]]: i[1] }), {}); } /** * Converts an object of type 'AdvancedAutoScaling' to JSON representation. */ /* eslint-disable max-len, quote-props */ function toJson_AdvancedAutoScaling(obj) { if (obj === undefined) { return undefined; } const result = { DiskGB: toJson_DiskGb(obj.diskGb), Compute: toJson_Compute(obj.compute), }; // filter undefined values return Object.entries(result).reduce((r, i) => (i[1] === undefined ? r : { ...r, [i[0]]: i[1] }), {}); } /* eslint-enable max-len, quote-props */ /** * @schema AdvancedRegionConfigProviderName */ var AdvancedRegionConfigProviderName; (function (AdvancedRegionConfigProviderName) { /** AWS */ AdvancedRegionConfigProviderName["AWS"] = "AWS"; /** GCP */ AdvancedRegionConfigProviderName["GCP"] = "GCP"; /** AZURE */ AdvancedRegionConfigProviderName["AZURE"] = "AZURE"; /** TENANT */ AdvancedRegionConfigProviderName["TENANT"] = "TENANT"; /** FLEX */ AdvancedRegionConfigProviderName["FLEX"] = "FLEX"; })(AdvancedRegionConfigProviderName || (exports.AdvancedRegionConfigProviderName = AdvancedRegionConfigProviderName = {})); /** * Converts an object of type 'Specs' to JSON representation. */ /* eslint-disable max-len, quote-props */ function toJson_Specs(obj) { if (obj === undefined) { return undefined; } const result = { DiskIOPS: obj.diskIops, EbsVolumeType: obj.ebsVolumeType, InstanceSize: obj.instanceSize, NodeCount: obj.nodeCount, }; // filter undefined values return Object.entries(result).reduce((r, i) => (i[1] === undefined ? r : { ...r, [i[0]]: i[1] }), {}); } /** * Converts an object of type 'DiskGb' to JSON representation. */ /* eslint-disable max-len, quote-props */ function toJson_DiskGb(obj) { if (obj === undefined) { return undefined; } const result = { Enabled: obj.enabled, }; // filter undefined values return Object.entries(result).reduce((r, i) => (i[1] === undefined ? r : { ...r, [i[0]]: i[1] }), {}); } /** * Converts an object of type 'Compute' to JSON representation. */ /* eslint-disable max-len, quote-props */ function toJson_Compute(obj) { if (obj === undefined) { return undefined; } const result = { Enabled: obj.enabled, ScaleDownEnabled: obj.scaleDownEnabled, MinInstanceSize: obj.minInstanceSize, MaxInstanceSize: obj.maxInstanceSize, }; // filter undefined values return Object.entries(result).reduce((r, i) => (i[1] === undefined ? r : { ...r, [i[0]]: i[1] }), {}); } /* eslint-enable max-len, quote-props */ /** * A CloudFormation `MongoDB::Atlas::Cluster` * * @cloudformationResource MongoDB::Atlas::Cluster * @stability external */ class CfnCluster extends cdk.CfnResource { /** * Create a new `MongoDB::Atlas::Cluster`. * * @param scope - scope in which this resource is defined * @param id - scoped id of the resource * @param props - resource properties */ constructor(scope, id, props) { super(scope, id, { type: CfnCluster.CFN_RESOURCE_TYPE_NAME, properties: toJson_CfnClusterProps(props), }); this.props = props; this.attrStateName = cdk.Token.asString(this.getAtt("StateName")); this.attrMongoDBVersion = cdk.Token.asString(this.getAtt("MongoDBVersion")); this.attrCreatedDate = cdk.Token.asString(this.getAtt("CreatedDate")); this.attrId = cdk.Token.asString(this.getAtt("Id")); } } exports.CfnCluster = CfnCluster; _a = JSII_RTTI_SYMBOL_1; CfnCluster[_a] = { fqn: "awscdk-resources-mongodbatlas.CfnCluster", version: "3.13.1" }; /** * The CloudFormation resource type name for this resource class. */ CfnCluster.CFN_RESOURCE_TYPE_NAME = "MongoDB::Atlas::Cluster"; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbDEtcmVzb3VyY2VzL2NsdXN0ZXIvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQXlKQSx3REFtQ0M7QUF5R0QsZ0RBNEJDO0FBNkJELDhFQWVDO0FBK0RELDREQXFCQztBQXNDRCxvRUFlQztBQThDRCx3RUFtQkM7QUE0QkQsZ0NBZUM7QUErREQsa0VBc0JDO0FBd0JELGdFQWVDO0FBbUVELG9DQWlCQztBQXFCRCxzQ0FjQztBQTZDRCx3Q0FpQkM7O0FBbjVCRCwwQkFBMEI7QUFDMUIsbUNBQW1DO0FBb0puQzs7R0FFRztBQUNILHlDQUF5QztBQUN6QyxTQUFnQixzQkFBc0IsQ0FDcEMsR0FBZ0M7SUFFaEMsSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDdEIsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUNELE1BQU0sTUFBTSxHQUFHO1FBQ2IsZ0JBQWdCLEVBQUUsa0JBQWtCLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDO1FBQzFELGFBQWEsRUFBRSxHQUFHLENBQUMsYUFBYTtRQUNoQyxXQUFXLEVBQUUsaUNBQWlDLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQztRQUMvRCxXQUFXLEVBQUUsR0FBRyxDQUFDLFdBQVc7UUFDNUIsaUJBQWlCLEVBQUUsd0JBQXdCLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDO1FBQ2xFLFVBQVUsRUFBRSxHQUFHLENBQUMsVUFBVTtRQUMxQix3QkFBd0IsRUFBRSxHQUFHLENBQUMsd0JBQXdCO1FBQ3RELGdDQUFnQyxFQUFFLEdBQUcsQ0FBQyxnQ0FBZ0M7UUFDdEUsT0FBTyxFQUFFLEdBQUcsQ0FBQyxPQUFPO1FBQ3BCLFNBQVMsRUFBRSxHQUFHLENBQUMsU0FBUztRQUN4QixNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLDRCQUE0QixDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQy9ELG1CQUFtQixFQUFFLEdBQUcsQ0FBQyxtQkFBbUI7UUFDNUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJO1FBQ2QsTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNO1FBQ2xCLFVBQVUsRUFBRSxHQUFHLENBQUMsVUFBVTtRQUMxQixnQkFBZ0IsRUFBRSxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FDaEQsOEJBQThCLENBQUMsQ0FBQyxDQUFDLENBQ2xDO1FBQ0QsWUFBWSxFQUFFLEdBQUcsQ0FBQyxZQUFZO1FBQzlCLG9CQUFvQixFQUFFLEdBQUcsQ0FBQyxvQkFBb0I7UUFDOUMsNEJBQTRCLEVBQUUsR0FBRyxDQUFDLDRCQUE0QjtRQUM5RCxJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUMxQyxDQUFDO0lBQ0YsMEJBQTBCO0lBQzFCLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQ2xDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUMzRCxFQUFFLENBQ0gsQ0FBQztBQUNKLENBQUM7QUFxR0Q7O0dBRUc7QUFDSCx5Q0FBeUM7QUFDekMsU0FBZ0Isa0JBQWtCLENBQ2hDLEdBQTRCO0lBRTVCLElBQUksR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ3RCLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFDRCxNQUFNLE1BQU0sR0FBRztRQUNiLGtCQUFrQixFQUFFLEdBQUcsQ0FBQyxrQkFBa0I7UUFDMUMsbUJBQW1CLEVBQUUsR0FBRyxDQUFDLG1CQUFtQjtRQUM1QyxtQkFBbUIsRUFBRSxHQUFHLENBQUMsbUJBQW1CO1FBQzVDLGlCQUFpQixFQUFFLEdBQUcsQ0FBQyxpQkFBaUI7UUFDeEMseUJBQXlCLEVBQUUsR0FBRyxDQUFDLHlCQUF5QjtRQUN4RCxtQkFBbUIsRUFBRSxHQUFHLENBQUMsbUJBQW1CO1FBQzVDLDhCQUE4QixFQUFFLEdBQUcsQ0FBQyw4QkFBOEIsRUFBRSxHQUFHLENBQ3JFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQ1Q7UUFDRCxXQUFXLEVBQUUsR0FBRyxDQUFDLFdBQVc7UUFDNUIsV0FBVyxFQUFFLEdBQUcsQ0FBQyxXQUFXO1FBQzVCLHFCQUFxQixFQUFFLEdBQUcsQ0FBQyxxQkFBcUI7UUFDaEQsZ0NBQWdDLEVBQUUsR0FBRyxDQUFDLGdDQUFnQztRQUN0RSxzQkFBc0IsRUFBRSxHQUFHLENBQUMsc0JBQXNCO1FBQ2xELCtCQUErQixFQUFFLEdBQUcsQ0FBQywrQkFBK0I7S0FDckUsQ0FBQztJQUNGLDBCQUEwQjtJQUMxQixPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUNsQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFDM0QsRUFBRSxDQUNILENBQUM7QUFDSixDQUFDO0FBeUJEOztHQUVHO0FBQ0gseUNBQXlDO0FBQ3pDLFNBQWdCLGlDQUFpQyxDQUMvQyxHQUEyQztJQUUzQyxJQUFJLEdBQUcsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUN0QixPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBQ0QsTUFBTSxNQUFNLEdBQUc7UUFDYixjQUFjLEVBQUUsR0FBRyxDQUFDLGNBQWM7UUFDbEMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxPQUFPO0tBQ3JCLENBQUM7SUFDRiwwQkFBMEI7SUFDMUIsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FDbEMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQzNELEVBQUUsQ0FDSCxDQUFDO0FBQ0osQ0FBQztBQTJERDs7R0FFRztBQUNILHlDQUF5QztBQUN6QyxTQUFnQix3QkFBd0IsQ0FDdEMsR0FBa0M7SUFFbEMsSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDdEIsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUNELE1BQU0sTUFBTSxHQUFHO1FBQ2IsUUFBUSxFQUFFLEdBQUcsQ0FBQyxRQUFRO1FBQ3RCLFdBQVcsRUFBRSxHQUFHLENBQUMsV0FBVztRQUM1QixPQUFPLEVBQUUsR0FBRyxDQUFDLE9BQU87UUFDcEIsVUFBVSxFQUFFLEdBQUcsQ0FBQyxVQUFVO1FBQzFCLGdCQUFnQixFQUFFLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNyRCxtQkFBbUIsRUFBRSxHQUFHLENBQUMsbUJBQW1CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDM0QsaUNBQWlDLEVBQy9CLEdBQUcsQ0FBQyxpQ0FBaUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztLQUN2RCxDQUFDO0lBQ0YsMEJBQTBCO0lBQzFCLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQ2xDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUMzRCxFQUFFLENBQ0gsQ0FBQztBQUNKLENBQUM7QUFDRCx3Q0FBd0M7QUFFeEM7Ozs7R0FJRztBQUNILElBQVksdUNBU1g7QUFURCxXQUFZLHVDQUF1QztJQUNqRCxVQUFVO0lBQ1Ysc0RBQVcsQ0FBQTtJQUNYLFVBQVU7SUFDVixzREFBVyxDQUFBO0lBQ1gsWUFBWTtJQUNaLDBEQUFlLENBQUE7SUFDZixXQUFXO0lBQ1gsd0RBQWEsQ0FBQTtBQUNmLENBQUMsRUFUVyx1Q0FBdUMsdURBQXZDLHVDQUF1QyxRQVNsRDtBQWlCRDs7R0FFRztBQUNILHlDQUF5QztBQUN6QyxTQUFnQiw0QkFBNEIsQ0FDMUMsR0FBc0M7SUFFdEMsSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDdEIsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUNELE1BQU0sTUFBTSxHQUFHO1FBQ2IsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHO1FBQ1osS0FBSyxFQUFFLEdBQUcsQ0FBQyxLQUFLO0tBQ2pCLENBQUM7SUFDRiwwQkFBMEI7SUFDMUIsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FDbEMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQzNELEVBQUUsQ0FDSCxDQUFDO0FBQ0osQ0FBQztBQTBDRDs7R0FFRztBQUNILHlDQUF5QztBQUN6QyxTQUFnQiw4QkFBOEIsQ0FDNUMsR0FBd0M7SUFFeEMsSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDdEIsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUNELE1BQU0sTUFBTSxHQUFHO1FBQ2IsRUFBRSxFQUFFLEdBQUcsQ0FBQyxFQUFFO1FBQ1YsU0FBUyxFQUFFLEdBQUcsQ0FBQyxTQUFTO1FBQ3hCLHFCQUFxQixFQUFFLEdBQUcsQ0FBQyxxQkFBcUIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUMxRCwyQkFBMkIsQ0FBQyxDQUFDLENBQUMsQ0FDL0I7UUFDRCxRQUFRLEVBQUUsR0FBRyxDQUFDLFFBQVE7S0FDdkIsQ0FBQztJQUNGLDBCQUEwQjtJQUMxQixPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUNsQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFDM0QsRUFBRSxDQUNILENBQUM7QUFDSixDQUFDO0FBd0JEOztHQUVHO0FBQ0gseUNBQXlDO0FBQ3pDLFNBQWdCLFVBQVUsQ0FDeEIsR0FBb0I7SUFFcEIsSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDdEIsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUNELE1BQU0sTUFBTSxHQUFHO1FBQ2IsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHO1FBQ1osS0FBSyxFQUFFLEdBQUcsQ0FBQyxLQUFLO0tBQ2pCLENBQUM7SUFDRiwwQkFBMEI7SUFDMUIsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FDbEMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQzNELEVBQUUsQ0FDSCxDQUFDO0FBQ0osQ0FBQztBQTJERDs7R0FFRztBQUNILHlDQUF5QztBQUN6QyxTQUFnQiwyQkFBMkIsQ0FDekMsR0FBcUM7SUFFckMsSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDdEIsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUNELE1BQU0sTUFBTSxHQUFHO1FBQ2Isb0JBQW9CLEVBQUUsMEJBQTBCLENBQUMsR0FBRyxDQUFDLG9CQUFvQixDQUFDO1FBQzFFLFdBQVcsRUFBRSwwQkFBMEIsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDO1FBQ3hELFVBQVUsRUFBRSxHQUFHLENBQUMsVUFBVTtRQUMxQixtQkFBbUIsRUFBRSxHQUFHLENBQUMsbUJBQW1CO1FBQzVDLFlBQVksRUFBRSxHQUFHLENBQUMsWUFBWTtRQUM5QixjQUFjLEVBQUUsWUFBWSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUM7UUFDaEQsY0FBYyxFQUFFLFlBQVksQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDO1FBQ2hELFFBQVEsRUFBRSxHQUFHLENBQUMsUUFBUTtRQUN0QixhQUFhLEVBQUUsWUFBWSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUM7S0FDL0MsQ0FBQztJQUNGLDBCQUEwQjtJQUMxQixPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUNsQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFDM0QsRUFBRSxDQUNILENBQUM7QUFDSixDQUFDO0FBb0JEOztHQUVHO0FBQ0gseUNBQXlDO0FBQ3pDLFNBQWdCLDBCQUEwQixDQUN4QyxHQUFvQztJQUVwQyxJQUFJLEdBQUcsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUN0QixPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBQ0QsTUFBTSxNQUFNLEdBQUc7UUFDYixNQUFNLEVBQUUsYUFBYSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUM7UUFDakMsT0FBTyxFQUFFLGNBQWMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDO0tBQ3JDLENBQUM7SUFDRiwwQkFBMEI7SUFDMUIsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FDbEMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQzNELEVBQUUsQ0FDSCxDQUFDO0FBQ0osQ0FBQztBQUNELHdDQUF3QztBQUV4Qzs7R0FFRztBQUNILElBQVksZ0NBV1g7QUFYRCxXQUFZLGdDQUFnQztJQUMxQyxVQUFVO0lBQ1YsK0NBQVcsQ0FBQTtJQUNYLFVBQVU7SUFDViwrQ0FBVyxDQUFBO0lBQ1gsWUFBWTtJQUNaLG1EQUFlLENBQUE7SUFDZixhQUFhO0lBQ2IscURBQWlCLENBQUE7SUFDakIsV0FBVztJQUNYLGlEQUFhLENBQUE7QUFDZixDQUFDLEVBWFcsZ0NBQWdDLGdEQUFoQyxnQ0FBZ0MsUUFXM0M7QUE4Q0Q7O0dBRUc7QUFDSCx5Q0FBeUM7QUFDekMsU0FBZ0IsWUFBWSxDQUMxQixHQUFzQjtJQUV0QixJQUFJLEdBQUcsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUN0QixPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBQ0QsTUFBTSxNQUFNLEdBQUc7UUFDYixRQUFRLEVBQUUsR0FBRyxDQUFDLFFBQVE7UUFDdEIsYUFBYSxFQUFFLEdBQUcsQ0FBQyxhQUFhO1FBQ2hDLFlBQVksRUFBRSxHQUFHLENBQUMsWUFBWTtRQUM5QixTQUFTLEVBQUUsR0FBRyxDQUFDLFNBQVM7S0FDekIsQ0FBQztJQUNGLDBCQUEwQjtJQUMxQixPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUNsQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFDM0QsRUFBRSxDQUNILENBQUM7QUFDSixDQUFDO0FBaUJEOztHQUVHO0FBQ0gseUNBQXlDO0FBQ3pDLFNBQWdCLGFBQWEsQ0FDM0IsR0FBdUI7SUFFdkIsSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDdEIsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUNELE1BQU0sTUFBTSxHQUFHO1FBQ2IsT0FBTyxFQUFFLEdBQUcsQ0FBQyxPQUFPO0tBQ3JCLENBQUM7SUFDRiwwQkFBMEI7SUFDMUIsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FDbEMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQzNELEVBQUUsQ0FDSCxDQUFDO0FBQ0osQ0FBQztBQXlDRDs7R0FFRztBQUNILHlDQUF5QztBQUN6QyxTQUFnQixjQUFjLENBQzVCLEdBQXdCO0lBRXhCLElBQUksR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ3RCLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFDRCxNQUFNLE1BQU0sR0FBRztRQUNiLE9BQU8sRUFBRSxHQUFHLENBQUMsT0FBTztRQUNwQixnQkFBZ0IsRUFBRSxHQUFHLENBQUMsZ0JBQWdCO1FBQ3RDLGVBQWUsRUFBRSxHQUFHLENBQUMsZUFBZTtRQUNwQyxlQUFlLEVBQUUsR0FBRyxDQUFDLGVBQWU7S0FDckMsQ0FBQztJQUNGLDBCQUEwQjtJQUMxQixPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUNsQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFDM0QsRUFBRSxDQUNILENBQUM7QUFDSixDQUFDO0FBQ0Qsd0NBQXdDO0FBRXhDOzs7OztHQUtHO0FBQ0gsTUFBYSxVQUFXLFNBQVEsR0FBRyxDQUFDLFdBQVc7SUE0QjdDOzs7Ozs7T0FNRztJQUNILFlBQVksS0FBMkIsRUFBRSxFQUFVLEVBQUUsS0FBc0I7UUFDekUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUU7WUFDZixJQUFJLEVBQUUsVUFBVSxDQUFDLHNCQUFzQjtZQUN2QyxVQUFVLEVBQUUsc0JBQXNCLENBQUMsS0FBSyxDQUFFO1NBQzNDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBRW5CLElBQUksQ0FBQyxhQUFhLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO1FBQ2xFLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQztRQUM1RSxJQUFJLENBQUMsZUFBZSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztRQUN0RSxJQUFJLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUN0RCxDQUFDOztBQS9DSCxnQ0FnREM7OztBQS9DQzs7R0FFRztBQUNvQixpQ0FBc0IsR0FBRyx5QkFBeUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEdlbmVyYXRlZCBieSBjZGstaW1wb3J0XG5pbXBvcnQgKiBhcyBjZGsgZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgKiBhcyBjb25zdHJ1Y3RzIGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5cbi8qKlxuICogVGhlIGNsdXN0ZXIgcmVzb3VyY2UgcHJvdmlkZXMgYWNjZXNzIHRvIHlvdXIgY2x1c3RlciBjb25maWd1cmF0aW9ucy4gVGhlIHJlc291cmNlIGxldHMgeW91IGNyZWF0ZSwgZWRpdCBhbmQgZGVsZXRlIGNsdXN0ZXJzLiBUaGUgcmVzb3VyY2UgcmVxdWlyZXMgeW91ciBQcm9qZWN0IElELlxuICpcbiAqIEBzY2hlbWEgQ2ZuQ2x1c3RlclByb3BzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2ZuQ2x1c3RlclByb3BzIHtcbiAgLyoqXG4gICAqIEBzY2hlbWEgQ2ZuQ2x1c3RlclByb3BzI0FkdmFuY2VkU2V0dGluZ3NcbiAgICovXG4gIHJlYWRvbmx5IGFkdmFuY2VkU2V0dGluZ3M/OiBQcm9jZXNzQXJncztcblxuICAvKipcbiAgICogRmxhZyB0aGF0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBjbHVzdGVyIGNhbiBwZXJmb3JtIGJhY2t1cHMuIElmIHNldCB0byB0cnVlLCB0aGUgY2x1c3RlciBjYW4gcGVyZm9ybSBiYWNrdXBzLiBZb3UgbXVzdCBzZXQgdGhpcyB2YWx1ZSB0byB0cnVlIGZvciBOVk1lIGNsdXN0ZXJzLiBCYWNrdXAgdXNlcyBDbG91ZCBCYWNrdXBzIGZvciBkZWRpY2F0ZWQgY2x1c3RlcnMgYW5kIFNoYXJlZCBDbHVzdGVyIEJhY2t1cHMgZm9yIHRlbmFudCBjbHVzdGVycy4gSWYgc2V0IHRvIGZhbHNlLCB0aGUgY2x1c3RlciBkb2Vzbid0IHVzZSBiYWNrdXBzLlxuICAgKlxuICAgKiBAc2NoZW1hIENmbkNsdXN0ZXJQcm9wcyNCYWNrdXBFbmFibGVkXG4gICAqL1xuICByZWFkb25seSBiYWNrdXBFbmFibGVkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogU2V0dGluZ3MgbmVlZGVkIHRvIGNvbmZpZ3VyZSB0aGUgTW9uZ29EQiBDb25uZWN0b3IgZm9yIEJ1c2luZXNzIEludGVsbGlnZW5jZSBmb3IgdGhpcyBjbHVzdGVyLlxuICAgKlxuICAgKiBAc2NoZW1hIENmbkNsdXN0ZXJQcm9wcyNCaUNvbm5lY3RvclxuICAgKi9cbiAgcmVhZG9ubHkgYmlDb25uZWN0b3I/OiBDZm5DbHVzdGVyUHJvcHNCaUNvbm5lY3RvcjtcblxuICAvKipcbiAgICogQ29uZmlndXJhdGlvbiBvZiBub2RlcyB0aGF0IGNvbXByaXNlIHRoZSBjbHVzdGVyLlxuICAgKlxuICAgKiBAc2NoZW1hIENmbkNsdXN0ZXJQcm9wcyNDbHVzdGVyVHlwZVxuICAgKi9cbiAgcmVhZG9ubHkgY2x1c3RlclR5cGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNldCBvZiBjb25uZWN0aW9uIHN0cmluZ3MgdGhhdCB5b3VyIGFwcGxpY2F0aW9ucyB1c2UgdG8gY29ubmVjdCB0byB0aGlzIGNsdXN0ZXIuIFVzZSB0aGUgcGFyYW1ldGVycyBpbiB0aGlzIG9iamVjdCB0byBjb25uZWN0IHlvdXIgYXBwbGljYXRpb25zIHRvIHRoaXMgY2x1c3Rlci4gU2VlIHRoZSBNb25nb0RCIFtDb25uZWN0aW9uIFN0cmluZyBVUkkgRm9ybWF0XShodHRwczovL2RvY3MubW9uZ29kYi5jb20vbWFudWFsL3JlZmVyZW5jZS9jb25uZWN0aW9uLXN0cmluZy8pIHJlZmVyZW5jZSBmb3IgZnVydGhlciBkZXRhaWxzLlxuICAgKlxuICAgKiBAc2NoZW1hIENmbkNsdXN0ZXJQcm9wcyNDb25uZWN0aW9uU3RyaW5nc1xuICAgKi9cbiAgcmVhZG9ubHkgY29ubmVjdGlvblN0cmluZ3M/OiBDb25uZWN0aW9uU3RyaW5ncztcblxuICAvKipcbiAgICogU3RvcmFnZSBjYXBhY2l0eSB0aGF0IHRoZSBob3N0J3Mgcm9vdCB2b2x1bWUgcG9zc2Vzc2VzIGV4cHJlc3NlZCBpbiBnaWdhYnl0ZXMuIEluY3JlYXNlIHRoaXMgbnVtYmVyIHRvIGFkZCBjYXBhY2l0eS4gTW9uZ29EQiBDbG91ZCByZXF1aXJlcyB0aGlzIHBhcmFtZXRlciBpZiB5b3Ugc2V0IHJlcGxpY2F0aW9uU3BlY3MuIElmIHlvdSBzcGVjaWZ5IGEgZGlzayBzaXplIGJlbG93IHRoZSBtaW5pbXVtICgxMCBHQiksIHRoaXMgcGFyYW1ldGVyIGRlZmF1bHRzIHRvIHRoZSBtaW5pbXVtIGRpc2sgc2l6ZSB2YWx1ZS4gU3RvcmFnZSBjaGFyZ2UgY2FsY3VsYXRpb25zIGRlcGVuZCBvbiB3aGV0aGVyIHlvdSBjaG9vc2UgdGhlIGRlZmF1bHQgdmFsdWUgb3IgYSBjdXN0b20gdmFsdWUuIFRoZSBtYXhpbXVtIHZhbHVlIGZvciBkaXNrIHN0b3JhZ2UgY2Fubm90IGV4Y2VlZCA1MCB0aW1lcyB0aGUgbWF4aW11bSBSQU0gZm9yIHRoZSBzZWxlY3RlZCBjbHVzdGVyLiBJZiB5b3UgcmVxdWlyZSBtb3JlIHN0b3JhZ2Ugc3BhY2UsIGNvbnNpZGVyIHVwZ3JhZGluZyB5b3VyIGNsdXN0ZXIgdG8gYSBoaWdoZXIgdGllci5cbiAgICpcbiAgICogQHNjaGVtYSBDZm5DbHVzdGVyUHJvcHMjRGlza1NpemVHQlxuICAgKi9cbiAgcmVhZG9ubHkgZGlza1NpemVHYj86IG51bWJlcjtcblxuICAvKipcbiAgICogQ2xvdWQgc2VydmljZSBwcm92aWRlciB0aGF0IG1hbmFnZXMgeW91ciBjdXN0b21lciBrZXlzIHRvIHByb3ZpZGUgYW4gYWRkaXRpb25hbCBsYXllciBvZiBlbmNyeXB0aW9uIGF0IHJlc3QgZm9yIHRoZSBjbHVzdGVyLiBUbyBlbmFibGUgY3VzdG9tZXIga2V5IG1hbmFnZW1lbnQgZm9yIGVuY3J5cHRpb24gYXQgcmVzdCwgdGhlIGNsdXN0ZXIgcmVwbGljYXRpb25TcGVjc1tuXS5yZWdpb25Db25maWdzW21dLnt0eXBlfVNwZWNzLmluc3RhbmNlU2l6ZSBzZXR0aW5nIG11c3QgYmUgTTEwIG9yIGhpZ2hlciBhbmQgXCJiYWNrdXBFbmFibGVkXCIgOiBmYWxzZSBvciBvbWl0dGVkIGVudGlyZWx5LlxuICAgKlxuICAgKiBAc2NoZW1hIENmbkNsdXN0ZXJQcm9wcyNFbmNyeXB0aW9uQXRSZXN0UHJvdmlkZXJcbiAgICovXG4gIHJlYWRvbmx5IGVuY3J5cHRpb25BdFJlc3RQcm92aWRlcj86IENmbkNsdXN0ZXJQcm9wc0VuY3J5cHRpb25BdFJlc3RQcm92aWRlcjtcblxuICAvKipcbiAgICogKE9wdGlvbmFsKSBGbGFnIHRoYXQgaW5kaWNhdGVzIGlmIGNsdXN0ZXIgdXNlcyBBdGxhcy1NYW5hZ2VkIFNoYXJkaW5nIChmYWxzZSwgZGVmYXVsdCkgb3IgU2VsZi1NYW5hZ2VkIFNoYXJkaW5nICh0cnVlKS4gSXQgY2FuIG9ubHkgYmUgZW5hYmxlZCBmb3IgR2xvYmFsIENsdXN0ZXJzIChgR0VPU0hBUkRFRGApLiBJdCBjYW5ub3QgYmUgY2hhbmdlZCBvbmNlIHRoZSBjbHVzdGVyIGlzIGNyZWF0ZWQuIFVzZSB0aGlzIG1vZGUgaWYgeW91J3JlIGFuIGFkdmFuY2VkIHVzZXIgYW5kIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gaXMgdG9vIHJlc3RyaWN0aXZlIGZvciB5b3VyIHdvcmtsb2FkLiBJZiB5b3Ugc2VsZWN0IHRoaXMgb3B0aW9uLCB5b3UgbXVzdCBtYW51YWxseSBjb25maWd1cmUgdGhlIHNoYXJkaW5nIHN0cmF0ZWd5LCBtb3JlIGluZm8gW2hlcmVdKGh0dHBzOi8vd3d3Lm1vbmdvZGIuY29tL2RvY3MvYXRsYXMvdHV0b3JpYWwvY3JlYXRlLWdsb2JhbC1jbHVzdGVyLyNzZWxlY3QteW91ci1zaGFyZGluZy1jb25maWd1cmF0aW9uKS5cbiAgICpcbiAgICogQHNjaGVtYSBDZm5DbHVzdGVyUHJvcHMjR2xvYmFsQ2x1c3RlclNlbGZNYW5hZ2VkU2hhcmRpbmdcbiAgICovXG4gIHJlYWRvbmx5IGdsb2JhbENsdXN0ZXJTZWxmTWFuYWdlZFNoYXJkaW5nPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogUHJvZmlsZSB1c2VkIHRvIHByb3ZpZGUgY3JlZGVudGlhbHMgaW5mb3JtYXRpb24sIChhIHNlY3JldCB3aXRoIHRoZSBjZm4vYXRsYXMvcHJvZmlsZS97UHJvZmlsZX0sIGlzIHJlcXVpcmVkKSwgaWYgbm90IHByb3ZpZGVkIGRlZmF1bHQgaXMgdXNlZFxuICAgKlxuICAgKiBAc2NoZW1hIENmbkNsdXN0ZXJQcm9wcyNQcm9maWxlXG4gICAqL1xuICByZWFkb25seSBwcm9maWxlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBVbmlxdWUgaWRlbnRpZmllciBvZiB0aGUgcHJvamVjdCB0aGUgY2x1c3RlciBiZWxvbmdzIHRvLlxuICAgKlxuICAgKiBAc2NoZW1hIENmbkNsdXN0ZXJQcm9wcyNQcm9qZWN0SWRcbiAgICovXG4gIHJlYWRvbmx5IHByb2plY3RJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDb2xsZWN0aW9uIG9mIGtleS12YWx1ZSBwYWlycyBiZXR3ZWVuIDEgdG8gMjU1IGNoYXJhY3RlcnMgaW4gbGVuZ3RoIHRoYXQgdGFnIGFuZCBjYXRlZ29yaXplIHRoZSBjbHVzdGVyLiBUaGUgTW9uZ29EQiBDbG91ZCBjb25zb2xlIGRvZXNuJ3QgZGlzcGxheSB5b3VyIGxhYmVscy5cbiAgICpcbiAgICogQHNjaGVtYSBDZm5DbHVzdGVyUHJvcHMjTGFiZWxzXG4gICAqL1xuICByZWFkb25seSBsYWJlbHM/OiBDZm5DbHVzdGVyUHJvcHNMYWJlbHNbXTtcblxuICAvKipcbiAgICogTWFqb3IgTW9uZ29EQiB2ZXJzaW9uIG9mIHRoZSBjbHVzdGVyLiBNb25nb0RCIENsb3VkIGRlcGxveXMgdGhlIGNsdXN0ZXIgd2l0aCB0aGUgbGF0ZXN0IHN0YWJsZSByZWxlYXNlIG9mIHRoZSBzcGVjaWZpZWQgdmVyc2lvbi5cbiAgICpcbiAgICogQHNjaGVtYSBDZm5DbHVzdGVyUHJvcHMjTW9uZ29EQk1ham9yVmVyc2lvblxuICAgKi9cbiAgcmVhZG9ubHkgbW9uZ29EYk1ham9yVmVyc2lvbj86IHN0cmluZztcblxuICAvKipcbiAgICogSHVtYW4tcmVhZGFibGUgbGFiZWwgdGhhdCBpZGVudGlmaWVzIHRoZSBhZHZhbmNlZCBjbHVzdGVyLlxuICAgKlxuICAgKiBAc2NoZW1hIENmbkNsdXN0ZXJQcm9wcyNOYW1lXG4gICAqL1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEZsYWcgdGhhdCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgY2x1c3RlciBpcyBwYXVzZWQgb3Igbm90LlxuICAgKlxuICAgKiBAc2NoZW1hIENmbkNsdXN0ZXJQcm9wcyNQYXVzZWRcbiAgICovXG4gIHJlYWRvbmx5IHBhdXNlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEZsYWcgdGhhdCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgY2x1c3RlciB1c2VzIGNvbnRpbnVvdXMgY2xvdWQgYmFja3Vwcy5cbiAgICpcbiAgICogQHNjaGVtYSBDZm5DbHVzdGVyUHJvcHMjUGl0RW5hYmxlZFxuICAgKi9cbiAgcmVhZG9ubHkgcGl0RW5hYmxlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIExpc3Qgb2Ygc2V0dGluZ3MgdGhhdCBjb25maWd1cmUgeW91ciBjbHVzdGVyIHJlZ2lvbnMuIEZvciBHbG9iYWwgQ2x1c3RlcnMsIGVhY2ggb2JqZWN0IGluIHRoZSBhcnJheSByZXByZXNlbnRzIGEgem9uZSB3aGVyZSB5b3VyIGNsdXN0ZXJzIG5vZGVzIGRlcGxveS4gRm9yIG5vbi1HbG9iYWwgcmVwbGljYSBzZXRzIGFuZCBzaGFyZGVkIGNsdXN0ZXJzLCB0aGlzIGFycmF5IGhhcyBvbmUgb2JqZWN0IHJlcHJlc2VudGluZyB3aGVyZSB5b3VyIGNsdXN0ZXJzIG5vZGVzIGRlcGxveS5cbiAgICpcbiAgICogQHNjaGVtYSBDZm5DbHVzdGVyUHJvcHMjUmVwbGljYXRpb25TcGVjc1xuICAgKi9cbiAgcmVhZG9ubHkgcmVwbGljYXRpb25TcGVjcz86IEFkdmFuY2VkUmVwbGljYXRpb25TcGVjW107XG5cbiAgLyoqXG4gICAqIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IHRoYXQgTW9uZ29EQiBDbG91ZCBjbHVzdGVyIHVzZXMuIE1vbmdvREIgQ2xvdWQgc3VwcG9ydHMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAuXG4gICAqXG4gICAqIEBzY2hlbWEgQ2ZuQ2x1c3RlclByb3BzI1Jvb3RDZXJ0VHlwZVxuICAgKi9cbiAgcmVhZG9ubHkgcm9vdENlcnRUeXBlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBNZXRob2QgYnkgd2hpY2ggdGhlIGNsdXN0ZXIgbWFpbnRhaW5zIHRoZSBNb25nb0RCIHZlcnNpb25zLiBJZiB2YWx1ZSBpcyBDT05USU5VT1VTLCB5b3UgbXVzdCBub3Qgc3BlY2lmeSBtb25nb0RCTWFqb3JWZXJzaW9uXG4gICAqXG4gICAqIEBzY2hlbWEgQ2ZuQ2x1c3RlclByb3BzI1ZlcnNpb25SZWxlYXNlU3lzdGVtXG4gICAqL1xuICByZWFkb25seSB2ZXJzaW9uUmVsZWFzZVN5c3RlbT86IHN0cmluZztcblxuICAvKipcbiAgICogRmxhZyB0aGF0IGluZGljYXRlcyB3aGV0aGVyIHRlcm1pbmF0aW9uIHByb3RlY3Rpb24gaXMgZW5hYmxlZCBvbiB0aGUgY2x1c3Rlci4gSWYgc2V0IHRvIHRydWUsIE1vbmdvREIgQ2xvdWQgd29uJ3QgZGVsZXRlIHRoZSBjbHVzdGVyLiBJZiBzZXQgdG8gZmFsc2UsIE1vbmdvREIgQ2xvdWQgd2lsbCBkZWxldGUgdGhlIGNsdXN0ZXIuXG4gICAqXG4gICAqIEBzY2hlbWEgQ2ZuQ2x1c3RlclByb3BzI1Rlcm1pbmF0aW9uUHJvdGVjdGlvbkVuYWJsZWRcbiAgICovXG4gIHJlYWRvbmx5IHRlcm1pbmF0aW9uUHJvdGVjdGlvbkVuYWJsZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBMaXN0IG9mIHNldHRpbmdzIHRoYXQgY29uZmlndXJlIHlvdXIgY2x1c3RlciByZWdpb25zLiBGb3IgR2xvYmFsIENsdXN0ZXJzLCBlYWNoIG9iamVjdCBpbiB0aGUgYXJyYXkgcmVwcmVzZW50cyBhIHpvbmUgd2hlcmUgeW91ciBjbHVzdGVycyBub2RlcyBkZXBsb3kuIEZvciBub24tR2xvYmFsIHJlcGxpY2Egc2V0cyBhbmQgc2hhcmRlZCBjbHVzdGVycywgdGhpcyBhcnJheSBoYXMgb25lIG9iamVjdCByZXByZXNlbnRpbmcgd2hlcmUgeW91ciBjbHVzdGVycyBub2RlcyBkZXBsb3kuXG4gICAqXG4gICAqIEBzY2hlbWEgQ2ZuQ2x1c3RlclByb3BzI1RhZ3NcbiAgICovXG4gIHJlYWRvbmx5IHRhZ3M/OiBUYWdbXTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnQ2ZuQ2x1c3RlclByb3BzJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBxdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9DZm5DbHVzdGVyUHJvcHMoXG4gIG9iajogQ2ZuQ2x1c3RlclByb3BzIHwgdW5kZWZpbmVkXG4pOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgQWR2YW5jZWRTZXR0aW5nczogdG9Kc29uX1Byb2Nlc3NBcmdzKG9iai5hZHZhbmNlZFNldHRpbmdzKSxcbiAgICBCYWNrdXBFbmFibGVkOiBvYmouYmFja3VwRW5hYmxlZCxcbiAgICBCaUNvbm5lY3RvcjogdG9Kc29uX0NmbkNsdXN0ZXJQcm9wc0JpQ29ubmVjdG9yKG9iai5iaUNvbm5lY3RvciksXG4gICAgQ2x1c3RlclR5cGU6IG9iai5jbHVzdGVyVHlwZSxcbiAgICBDb25uZWN0aW9uU3RyaW5nczogdG9Kc29uX0Nvbm5lY3Rpb25TdHJpbmdzKG9iai5jb25uZWN0aW9uU3RyaW5ncyksXG4gICAgRGlza1NpemVHQjogb2JqLmRpc2tTaXplR2IsXG4gICAgRW5jcnlwdGlvbkF0UmVzdFByb3ZpZGVyOiBvYmouZW5jcnlwdGlvbkF0UmVzdFByb3ZpZGVyLFxuICAgIEdsb2JhbENsdXN0ZXJTZWxmTWFuYWdlZFNoYXJkaW5nOiBvYmouZ2xvYmFsQ2x1c3RlclNlbGZNYW5hZ2VkU2hhcmRpbmcsXG4gICAgUHJvZmlsZTogb2JqLnByb2ZpbGUsXG4gICAgUHJvamVjdElkOiBvYmoucHJvamVjdElkLFxuICAgIExhYmVsczogb2JqLmxhYmVscz8ubWFwKCh5KSA9PiB0b0pzb25fQ2ZuQ2x1c3RlclByb3BzTGFiZWxzKHkpKSxcbiAgICBNb25nb0RCTWFqb3JWZXJzaW9uOiBvYmoubW9uZ29EYk1ham9yVmVyc2lvbixcbiAgICBOYW1lOiBvYmoubmFtZSxcbiAgICBQYXVzZWQ6IG9iai5wYXVzZWQsXG4gICAgUGl0RW5hYmxlZDogb2JqLnBpdEVuYWJsZWQsXG4gICAgUmVwbGljYXRpb25TcGVjczogb2JqLnJlcGxpY2F0aW9uU3BlY3M/Lm1hcCgoeSkgPT5cbiAgICAgIHRvSnNvbl9BZHZhbmNlZFJlcGxpY2F0aW9uU3BlYyh5KVxuICAgICksXG4gICAgUm9vdENlcnRUeXBlOiBvYmoucm9vdENlcnRUeXBlLFxuICAgIFZlcnNpb25SZWxlYXNlU3lzdGVtOiBvYmoudmVyc2lvblJlbGVhc2VTeXN0ZW0sXG4gICAgVGVybWluYXRpb25Qcm90ZWN0aW9uRW5hYmxlZDogb2JqLnRlcm1pbmF0aW9uUHJvdGVjdGlvbkVuYWJsZWQsXG4gICAgVGFnczogb2JqLnRhZ3M/Lm1hcCgoeSkgPT4gdG9Kc29uX1RhZyh5KSksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZShcbiAgICAociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCA/IHIgOiB7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSxcbiAgICB7fVxuICApO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBxdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIEFkdmFuY2VkIGNvbmZpZ3VyYXRpb24gZGV0YWlscyB0byBhZGQgZm9yIG9uZSBjbHVzdGVyIGluIHRoZSBzcGVjaWZpZWQgcHJvamVjdC5cbiAqXG4gKiBAc2NoZW1hIHByb2Nlc3NBcmdzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc0FyZ3Mge1xuICAvKipcbiAgICogRGVmYXVsdCBsZXZlbCBvZiBhY2tub3dsZWRnbWVudCByZXF1ZXN0ZWQgZnJvbSBNb25nb0RCIGZvciByZWFkIG9wZXJhdGlvbnMgc2V0IGZvciB0aGlzIGNsdXN0ZXIuXG4gICAqXG4gICAqIEBzY2hlbWEgcHJvY2Vzc0FyZ3MjRGVmYXVsdFJlYWRDb25jZXJuXG4gICAqL1xuICByZWFkb25seSBkZWZhdWx0UmVhZENvbmNlcm4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIERlZmF1bHQgbGV2ZWwgb2YgYWNrbm93bGVkZ21lbnQgcmVxdWVzdGVkIGZyb20gTW9uZ29EQiBmb3Igd3JpdGUgb3BlcmF0aW9ucyBzZXQgZm9yIHRoaXMgY2x1c3Rlci5cbiAgICpcbiAgICogQHNjaGVtYSBwcm9jZXNzQXJncyNEZWZhdWx0V3JpdGVDb25jZXJuXG4gICAqL1xuICByZWFkb25seSBkZWZhdWx0V3JpdGVDb25jZXJuPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBGbGFnIHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgeW91IGNhbiBpbnNlcnQgb3IgdXBkYXRlIGRvY3VtZW50cyB3aGVyZSBhbGwgaW5kZXhlZCBlbnRyaWVzIGRvbid0IGV4Y2VlZCAxMDI0IGJ5dGVzLiBJZiB5b3Ugc2V0IHRoaXMgdG8gZmFsc2UsIG1vbmdvZCB3cml0ZXMgZG9jdW1lbnRzIHRoYXQgZXhjZWVkIHRoaXMgbGltaXQgYnV0IGRvZXNuJ3QgaW5kZXggdGhlbS5cbiAgICpcbiAgICogQHNjaGVtYSBwcm9jZXNzQXJncyNGYWlsSW5kZXhLZXlUb29Mb25nXG4gICAqL1xuICByZWFkb25seSBmYWlsSW5kZXhLZXlUb29Mb25nPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogRmxhZyB0aGF0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBjbHVzdGVyIGFsbG93cyBleGVjdXRpb24gb2Ygb3BlcmF0aW9ucyB0aGF0IHBlcmZvcm0gc2VydmVyLXNpZGUgZXhlY3V0aW9ucyBvZiBKYXZhU2NyaXB0LlxuICAgKlxuICAgKiBAc2NoZW1hIHByb2Nlc3NBcmdzI0phdmFzY3JpcHRFbmFibGVkXG4gICAqL1xuICByZWFkb25seSBqYXZhc2NyaXB0RW5hYmxlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIE1pbmltdW0gVHJhbnNwb3J0IExheWVyIFNlY3VyaXR5IChUTFMpIHZlcnNpb24gdGhhdCB0aGUgY2x1c3RlciBhY2NlcHRzIGZvciBpbmNvbWluZyBjb25uZWN0aW9ucy4gQ2x1c3RlcnMgdXNpbmcgVExTIDEuMCBvciAxLjEgc2hvdWxkIGNvbnNpZGVyIHNldHRpbmcgVExTIDEuMiBhcyB0aGUgbWluaW11bSBUTFMgcHJvdG9jb2wgdmVyc2lvbi5cbiAgICpcbiAgICogQHNjaGVtYSBwcm9jZXNzQXJncyNNaW5pbXVtRW5hYmxlZFRMU1Byb3RvY29sXG4gICAqL1xuICByZWFkb25seSBtaW5pbXVtRW5hYmxlZFRsc1Byb3RvY29sPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgVExTIGNpcGhlciBzdWl0ZSBjb25maWd1cmF0aW9uIG1vZGUuIFZhbGlkIHZhbHVlcyBpbmNsdWRlIGBDVVNUT01gIG9yIGBERUZBVUxUYC4gVGhlIGBERUZBVUxUYCBtb2RlIHVzZXMgdGhlIGRlZmF1bHQgY2lwaGVyIHN1aXRlcy4gVGhlIGBDVVNUT01gIG1vZGUgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IGN1c3RvbSBjaXBoZXIgc3VpdGVzIGZvciBib3RoIFRMUyAxLjIgYW5kIFRMUyAxLjMuIFRvIHVuc2V0LCB0aGlzIHNob3VsZCBiZSBzZXQgYmFjayB0byBgREVGQVVMVGAuXG4gICAqXG4gICAqIEBzY2hlbWEgcHJvY2Vzc0FyZ3MjVGxzQ2lwaGVyQ29uZmlnTW9kZVxuICAgKi9cbiAgcmVhZG9ubHkgdGxzQ2lwaGVyQ29uZmlnTW9kZT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGN1c3RvbSBPcGVuU1NMIGNpcGhlciBzdWl0ZSBsaXN0IGZvciBUTFMgMS4yLiBUaGlzIGZpZWxkIGlzIG9ubHkgdmFsaWQgd2hlbiBgdGxzX2NpcGhlcl9jb25maWdfbW9kZWAgaXMgc2V0IHRvIGBDVVNUT01gLlxuICAgKlxuICAgKiBAc2NoZW1hIHByb2Nlc3NBcmdzI0N1c3RvbU9wZW5zc2xDaXBoZXJDb25maWdUbHMxMlxuICAgKi9cbiAgcmVhZG9ubHkgY3VzdG9tT3BlbnNzbENpcGhlckNvbmZpZ1RsczEyPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEZsYWcgdGhhdCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgY2x1c3RlciBkaXNhYmxlcyBleGVjdXRpbmcgYW55IHF1ZXJ5IHRoYXQgcmVxdWlyZXMgYSBjb2xsZWN0aW9uIHNjYW4gdG8gcmV0dXJuIHJlc3VsdHMuXG4gICAqXG4gICAqIEBzY2hlbWEgcHJvY2Vzc0FyZ3MjTm9UYWJsZVNjYW5cbiAgICovXG4gIHJlYWRvbmx5IG5vVGFibGVTY2FuPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogU3RvcmFnZSBsaW1pdCBvZiBjbHVzdGVyJ3Mgb3Bsb2cgZXhwcmVzc2VkIGluIG1lZ2FieXRlcy4gQSB2YWx1ZSBvZiBudWxsIGluZGljYXRlcyB0aGF0IHRoZSBjbHVzdGVyIHVzZXMgdGhlIGRlZmF1bHQgb3Bsb2cgc2l6ZSB0aGF0IE1vbmdvREIgQ2xvdWQgY2FsY3VsYXRlcy5cbiAgICpcbiAgICogQHNjaGVtYSBwcm9jZXNzQXJncyNPcGxvZ1NpemVNQlxuICAgKi9cbiAgcmVhZG9ubHkgb3Bsb2dTaXplTWI/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEludGVydmFsIGluIHNlY29uZHMgYXQgd2hpY2ggdGhlIG1vbmdvc3FsZCBwcm9jZXNzIHJlLXNhbXBsZXMgZGF0YSB0byBjcmVhdGUgaXRzIHJlbGF0aW9uYWwgc2NoZW1hLlxuICAgKlxuICAgKiBAc2NoZW1hIHByb2Nlc3NBcmdzI1NhbXBsZVNpemVCSUNvbm5lY3RvclxuICAgKi9cbiAgcmVhZG9ubHkgc2FtcGxlU2l6ZUJpQ29ubmVjdG9yPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBOdW1iZXIgb2YgZG9jdW1lbnRzIHBlciBkYXRhYmFzZSB0byBzYW1wbGUgd2hlbiBnYXRoZXJpbmcgc2NoZW1hIGluZm9ybWF0aW9uLlxuICAgKlxuICAgKiBAc2NoZW1hIHByb2Nlc3NBcmdzI1NhbXBsZVJlZnJlc2hJbnRlcnZhbEJJQ29ubmVjdG9yXG4gICAqL1xuICByZWFkb25seSBzYW1wbGVSZWZyZXNoSW50ZXJ2YWxCaUNvbm5lY3Rvcj86IG51bWJlcjtcblxuICAvKipcbiAgICogTWluaW11bSByZXRlbnRpb24gd2luZG93IGZvciBjbHVzdGVyJ3Mgb3Bsb2cgZXhwcmVzc2VkIGluIGhvdXJzLiBBIHZhbHVlIG9mIG51bGwgaW5kaWNhdGVzIHRoYXQgdGhlIGNsdXN0ZXIgdXNlcyB0aGUgZGVmYXVsdCBtaW5pbXVtIG9wbG9nIHdpbmRvdyB0aGF0IE1vbmdvREIgQ2xvdWQgY2FsY3VsYXRlcy5cbiAgICpcbiAgICogQHNjaGVtYSBwcm9jZXNzQXJncyNPcGxvZ01pblJldGVudGlvbkhvdXJzXG4gICAqL1xuICByZWFkb25seSBvcGxvZ01pblJldGVudGlvbkhvdXJzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBMaWZldGltZSwgaW4gc2Vjb25kcywgb2YgbXVsdGktZG9jdW1lbnQgdHJhbnNhY3Rpb25zLiBBdGxhcyBjb25zaWRlcnMgdGhlIHRyYW5zYWN0aW9ucyB0aGF0IGV4Y2VlZCB0aGlzIGxpbWl0IGFzIGV4cGlyZWQgYW5kIHNvIGFib3J0cyB0aGVtIHRocm91Z2ggYSBwZXJpb2RpYyBjbGVhbnVwIHByb2Nlc3MuXG4gICAqXG4gICAqIEBzY2hlbWEgcHJvY2Vzc0FyZ3MjVHJhbnNhY3Rpb25MaWZldGltZUxpbWl0U2Vjb25kc1xuICAgKi9cbiAgcmVhZG9ubHkgdHJhbnNhY3Rpb25MaWZldGltZUxpbWl0U2Vjb25kcz86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnUHJvY2Vzc0FyZ3MnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIHF1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1Byb2Nlc3NBcmdzKFxuICBvYmo6IFByb2Nlc3NBcmdzIHwgdW5kZWZpbmVkXG4pOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgRGVmYXVsdFJlYWRDb25jZXJuOiBvYmouZGVmYXVsdFJlYWRDb25jZXJuLFxuICAgIERlZmF1bHRXcml0ZUNvbmNlcm46IG9iai5kZWZhdWx0V3JpdGVDb25jZXJuLFxuICAgIEZhaWxJbmRleEtleVRvb0xvbmc6IG9iai5mYWlsSW5kZXhLZXlUb29Mb25nLFxuICAgIEphdmFzY3JpcHRFbmFibGVkOiBvYmouamF2YXNjcmlwdEVuYWJsZWQsXG4gICAgTWluaW11bUVuYWJsZWRUTFNQcm90b2NvbDogb2JqLm1pbmltdW1FbmFibGVkVGxzUHJvdG9jb2wsXG4gICAgVGxzQ2lwaGVyQ29uZmlnTW9kZTogb2JqLnRsc0NpcGhlckNvbmZpZ01vZGUsXG4gICAgQ3VzdG9tT3BlbnNzbENpcGhlckNvbmZpZ1RsczEyOiBvYmouY3VzdG9tT3BlbnNzbENpcGhlckNvbmZpZ1RsczEyPy5tYXAoXG4gICAgICAoeSkgPT4geVxuICAgICksXG4gICAgTm9UYWJsZVNjYW46IG9iai5ub1RhYmxlU2NhbixcbiAgICBPcGxvZ1NpemVNQjogb2JqLm9wbG9nU2l6ZU1iLFxuICAgIFNhbXBsZVNpemVCSUNvbm5lY3Rvcjogb2JqLnNhbXBsZVNpemVCaUNvbm5lY3RvcixcbiAgICBTYW1wbGVSZWZyZXNoSW50ZXJ2YWxCSUNvbm5lY3Rvcjogb2JqLnNhbXBsZVJlZnJlc2hJbnRlcnZhbEJpQ29ubmVjdG9yLFxuICAgIE9wbG9nTWluUmV0ZW50aW9uSG91cnM6IG9iai5vcGxvZ01pblJldGVudGlvbkhvdXJzLFxuICAgIFRyYW5zYWN0aW9uTGlmZXRpbWVMaW1pdFNlY29uZHM6IG9iai50cmFuc2FjdGlvbkxpZmV0aW1lTGltaXRTZWNvbmRzLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoXG4gICAgKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQgPyByIDogeyAuLi5yLCBbaVswXV06IGlbMV0gfSksXG4gICAge31cbiAgKTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBTZXR0aW5ncyBuZWVkZWQgdG8gY29uZmlndXJlIHRoZSBNb25nb0RCIENvbm5lY3RvciBmb3IgQnVzaW5lc3MgSW50ZWxsaWdlbmNlIGZvciB0aGlzIGNsdXN0ZXIuXG4gKlxuICogQHNjaGVtYSBDZm5DbHVzdGVyUHJvcHNCaUNvbm5lY3RvclxuICovXG5leHBvcnQgaW50ZXJmYWNlIENmbkNsdXN0ZXJQcm9wc0JpQ29ubmVjdG9yIHtcbiAgLyoqXG4gICAqIERhdGEgc291cmNlIG5vZGUgZGVzaWduYXRlZCBmb3IgdGhlIE1vbmdvREIgQ29ubmVjdG9yIGZvciBCdXNpbmVzcyBJbnRlbGxpZ2VuY2Ugb24gTW9uZ29EQiBDbG91ZC4gVGhlIE1vbmdvREIgQ29ubmVjdG9yIGZvciBCdXNpbmVzcyBJbnRlbGxpZ2VuY2Ugb24gTW9uZ29EQiBDbG91ZCByZWFkcyBkYXRhIGZyb20gdGhlIHByaW1hcnksIHNlY29uZGFyeSwgb3IgYW5hbHl0aWNzIG5vZGUgYmFzZWQgb24geW91ciByZWFkIHByZWZlcmVuY2VzLiBEZWZhdWx0cyB0byBBTkFMWVRJQ1Mgbm9kZSwgb3IgU0VDT05EQVJZIGlmIHRoZXJlIGFyZSBubyBBTkFMWVRJQ1Mgbm9kZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IEFOQUxZVElDUyBub2RlLCBvciBTRUNPTkRBUlkgaWYgdGhlcmUgYXJlIG5vIEFOQUxZVElDUyBub2Rlcy5cbiAgICogQHNjaGVtYSBDZm5DbHVzdGVyUHJvcHNCaUNvbm5lY3RvciNSZWFkUHJlZmVyZW5jZVxuICAgKi9cbiAgcmVhZG9ubHkgcmVhZFByZWZlcmVuY2U/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEZsYWcgdGhhdCBpbmRpY2F0ZXMgd2hldGhlciBNb25nb0RCIENvbm5lY3RvciBmb3IgQnVzaW5lc3MgSW50ZWxsaWdlbmNlIGlzIGVuYWJsZWQgb24gdGhlIHNwZWNpZmllZCBjbHVzdGVyLlxuICAgKlxuICAgKiBAc2NoZW1hIENmbkNsdXN0ZXJQcm9wc0JpQ29ubmVjdG9yI0VuYWJsZWRcbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZWQ/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdDZm5DbHVzdGVyUHJvcHNCaUNvbm5lY3RvcicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fQ2ZuQ2x1c3RlclByb3BzQmlDb25uZWN0b3IoXG4gIG9iajogQ2ZuQ2x1c3RlclByb3BzQmlDb25uZWN0b3IgfCB1bmRlZmluZWRcbik6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICBSZWFkUHJlZmVyZW5jZTogb2JqLnJlYWRQcmVmZXJlbmNlLFxuICAgIEVuYWJsZWQ6IG9iai5lbmFibGVkLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoXG4gICAgKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQgPyByIDogeyAuLi5yLCBbaVswXV06IGlbMV0gfSksXG4gICAge31cbiAgKTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBDb2xsZWN0aW9uIG9mIFVuaWZvcm0gUmVzb3VyY2UgTG9jYXRvcnMgdGhhdCBwb2ludCB0byB0aGUgTW9uZ29EQiBkYXRhYmFzZS5cbiAqXG4gKiBAc2NoZW1hIGNvbm5lY3Rpb25TdHJpbmdzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29ubmVjdGlvblN0cmluZ3Mge1xuICAvKipcbiAgICogUHVibGljIGNvbm5lY3Rpb24gc3RyaW5nIHRoYXQgeW91IGNhbiB1c2UgdG8gY29ubmVjdCB0byB0aGlzIGNsdXN0ZXIuIFRoaXMgY29ubmVjdGlvbiBzdHJpbmcgdXNlcyB0aGUgbW9uZ29kYjovLyBwcm90b2NvbC5cbiAgICpcbiAgICogQHNjaGVtYSBjb25uZWN0aW9uU3RyaW5ncyNTdGFuZGFyZFxuICAgKi9cbiAgcmVhZG9ubHkgc3RhbmRhcmQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFB1YmxpYyBjb25uZWN0aW9uIHN0cmluZyB0aGF0IHlvdSBjYW4gdXNlIHRvIGNvbm5lY3QgdG8gdGhpcyBjbHVzdGVyLiBUaGlzIGNvbm5lY3Rpb24gc3RyaW5nIHVzZXMgdGhlIG1vbmdvZGIrc3J2Oi8vIHByb3RvY29sLlxuICAgKlxuICAgKiBAc2NoZW1hIGNvbm5lY3Rpb25TdHJpbmdzI1N0YW5kYXJkU3J2XG4gICAqL1xuICByZWFkb25seSBzdGFuZGFyZFNydj86IHN0cmluZztcblxuICAvKipcbiAgICogTmV0d29yayBwZWVyaW5nIGNvbm5lY3Rpb24gc3RyaW5ncyBmb3IgZWFjaCBpbnRlcmZhY2UgVmlydHVhbCBQcml2YXRlIENsb3VkIChWUEMpIGVuZHBvaW50IHRoYXQgeW91IGNvbmZpZ3VyZWQgdG8gY29ubmVjdCB0byB0aGlzIGNsdXN0ZXIuIFRoaXMgY29ubmVjdGlvbiBzdHJpbmcgdXNlcyB0aGUgbW9uZ29kYitzcnY6Ly8gcHJvdG9jb2wuIFRoZSByZXNvdXJjZSByZXR1cm5zIHRoaXMgcGFyYW1ldGVyIG9uY2Ugc29tZW9uZSBjcmVhdGVzIGEgbmV0d29yayBwZWVyaW5nIGNvbm5lY3Rpb24gdG8gdGhpcyBjbHVzdGVyLiBUaGlzIHByb3RvY29sIHRlbGxzIHRoZSBhcHBsaWNhdGlvbiB0byBsb29rIHVwIHRoZSBob3N0IHNlZWQgbGlzdCBpbiB0aGUgRG9tYWluIE5hbWUgU3lzdGVtIChETlMpLiBUaGlzIGxpc3Qgc3luY2hyb25pemVzIHdpdGggdGhlIG5vZGVzIGluIGEgY2x1c3Rlci4gSWYgdGhlIGNvbm5lY3Rpb24gc3RyaW5nIHVzZXMgdGhpcyBVbmlmb3JtIFJlc291cmNlIElkZW50aWZpZXIgKFVSSSkgZm9ybWF0LCB5b3UgZG9uJ3QgbmVlZCB0byBhcHBlbmQgdGhlIHNlZWQgbGlzdCBvciBjaGFuZ2UgdGhlIFVSSSBpZiB0aGUgbm9kZXMgY2hhbmdlLiBVc2UgdGhpcyBVUkkgZm9ybWF0IGlmIHlvdXIgZHJpdmVyIHN1cHBvcnRzIGl0LiBJZiBpdCBkb2Vzbid0LCB1c2UgY29ubmVjdGlvblN0cmluZ3MucHJpdmF0ZS4gRm9yIEFtYXpvbiBXZWIgU2VydmljZXMgKEFXUykgY2x1c3RlcnMsIHRoaXMgcmVzb3VyY2UgcmV0dXJucyB0aGlzIHBhcmFtZXRlciBvbmx5IGlmIHlvdSBlbmFibGUgY3VzdG9tIEROUy5cbiAgICpcbiAgICogQHNjaGVtYSBjb25uZWN0aW9uU3RyaW5ncyNQcml2YXRlXG4gICAqL1xuICByZWFkb25seSBwcml2YXRlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBOZXR3b3JrIHBlZXJpbmcgY29ubmVjdGlvbiBzdHJpbmdzIGZvciBlYWNoIGludGVyZmFjZSBWaXJ0dWFsIFByaXZhdGUgQ2xvdWQgKFZQQykgZW5kcG9pbnQgdGhhdCB5b3UgY29uZmlndXJlZCB0byBjb25uZWN0IHRvIHRoaXMgY2x1c3Rlci4gVGhpcyBjb25uZWN0aW9uIHN0cmluZyB1c2VzIHRoZSBtb25nb2RiK3NydjovLyBwcm90b2NvbC4gVGhlIHJlc291cmNlIHJldHVybnMgdGhpcyBwYXJhbWV0ZXIgd2hlbiBzb21lb25lIGNyZWF0ZXMgYSBuZXR3b3JrIHBlZXJpbmcgY29ubmVjdGlvbiB0byB0aGlzIGNsdXN0ZXIuIFRoaXMgcHJvdG9jb2wgdGVsbHMgdGhlIGFwcGxpY2F0aW9uIHRvIGxvb2sgdXAgdGhlIGhvc3Qgc2VlZCBsaXN0IGluIHRoZSBEb21haW4gTmFtZSBTeXN0ZW0gKEROUykuIFRoaXMgbGlzdCBzeW5jaHJvbml6ZXMgd2l0aCB0aGUgbm9kZXMgaW4gYSBjbHVzdGVyLiBJZiB0aGUgY29ubmVjdGlvbiBzdHJpbmcgdXNlcyB0aGlzIFVuaWZvcm0gUmVzb3VyY2UgSWRlbnRpZmllciAoVVJJKSBmb3JtYXQsIHlvdSBkb24ndCBuZWVkIHRvIGFwcGVuZCB0aGUgc2VlZCBsaXN0IG9yIGNoYW5nZSB0aGUgVW5pZm9ybSBSZXNvdXJjZSBJZGVudGlmaWVyIChVUkkpIGlmIHRoZSBub2RlcyBjaGFuZ2UuIFVzZSB0aGlzIFVuaWZvcm0gUmVzb3VyY2UgSWRlbnRpZmllciAoVVJJKSBmb3JtYXQgaWYgeW91ciBkcml2ZXIgc3VwcG9ydHMgaXQuIElmIGl0IGRvZXNuJ3QsIHVzZSBjb25uZWN0aW9uU3RyaW5ncy5wcml2YXRlLiBGb3IgQW1hem9uIFdlYiBTZXJ2aWNlcyAoQVdTKSBjbHVzdGVycywgdGhpcyBwYXJhbWV0ZXIgcmV0dXJucyBvbmx5IGlmIHlvdSBlbmFibGUgY3VzdG9tIEROUy5cbiAgICpcbiAgICogQHNjaGVtYSBjb25uZWN0aW9uU3RyaW5ncyNQcml2YXRlU3J2XG4gICAqL1xuICByZWFkb25seSBwcml2YXRlU3J2Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBQcml2YXRlIGVuZHBvaW50LWF3YXJlIGNvbm5lY3Rpb24gc3RyaW5ncyB0aGF0IHVzZSBBV1MtaG9zdGVkIGNsdXN0ZXJzIHdpdGggQW1hem9uIFdlYiBTZXJ2aWNlcyAoQVdTKSBQcml2YXRlTGluay4gRWFjaCBrZXkgaWRlbnRpZmllcyBhbiBBbWF6b24gV2ViIFNlcnZpY2VzIChBV1MpIGludGVyZmFjZSBlbmRwb2ludC4gRWFjaCB2YWx1ZSBpZGVudGlmaWVzIHRoZSByZWxhdGVkIG1vbmdvZGI6Ly8gY29ubmVjdGlvbiBzdHJpbmcgdGhhdCB5b3UgdXNlIHRvIGNvbm5lY3QgdG8gTW9uZ29EQiBDbG91ZCB0aHJvdWdoIHRoZSBpbnRlcmZhY2UgZW5kcG9pbnQgdGhhdCB0aGUga2V5IG5hbWVzLlxuICAgKlxuICAgKiBAc2NoZW1hIGNvbm5lY3Rpb25TdHJpbmdzI1ByaXZhdGVFbmRwb2ludHNcbiAgICovXG4gIHJlYWRvbmx5IHByaXZhdGVFbmRwb2ludHM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogUHJpdmF0ZSBlbmRwb2ludC1hd2FyZSBjb25uZWN0aW9uIHN0cmluZ3MgdGhhdCB1c2UgQVdTLWhvc3RlZCBjbHVzdGVycyB3aXRoIEFtYXpvbiBXZWIgU2VydmljZXMgKEFXUykgUHJpdmF0ZUxpbmsuIEVhY2gga2V5IGlkZW50aWZpZXMgYW4gQW1hem9uIFdlYiBTZXJ2aWNlcyAoQVdTKSBpbnRlcmZhY2UgZW5kcG9pbnQuIEVhY2ggdmFsdWUgaWRlbnRpZmllcyB0aGUgcmVsYXRlZCBtb25nb2RiOi8vIGNvbm5lY3Rpb24gc3RyaW5nIHRoYXQgeW91IHVzZSB0byBjb25uZWN0IHRvIEF0bGFzIHRocm91Z2ggdGhlIGludGVyZmFjZSBlbmRwb2ludCB0aGF0IHRoZSBrZXkgbmFtZXMuXG4gICAqXG4gICAqIEBzY2hlbWEgY29ubmVjdGlvblN0cmluZ3MjUHJpdmF0ZUVuZHBvaW50c1NydlxuICAgKi9cbiAgcmVhZG9ubHkgcHJpdmF0ZUVuZHBvaW50c1Nydj86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBQcml2YXRlIGVuZHBvaW50LWF3YXJlIGNvbm5lY3Rpb24gc3RyaW5nIG9wdGltaXplZCBmb3Igc2hhcmRlZCBjbHVzdGVycyB0aGF0IHVzZXMgdGhlIGBtb25nb2RiK3NydjovL2AgcHJvdG9jb2wgdG8gY29ubmVjdCB0byBNb25nb0RCIENsb3VkIHRocm91Z2ggYSBwcml2YXRlIGVuZHBvaW50LiBJZiB0aGUgY29ubmVjdGlvbiBzdHJpbmcgdXNlcyB0aGlzIFVuaWZvcm0gUmVzb3VyY2UgSWRlbnRpZmllciAoVVJJKSBmb3JtYXQsIHlvdSBkb24ndCBuZWVkIHRvIGNoYW5nZSB0aGUgVW5pZm9ybSBSZXNvdXJjZSBJZGVudGlmaWVyIChVUkkpIGlmIHRoZSBub2RlcyBjaGFuZ2UuIFVzZSB0aGlzIFVuaWZvcm0gUmVzb3VyY2UgSWRlbnRpZmllciAoVVJJKSBmb3JtYXQgaWYgeW91ciBhcHBsaWNhdGlvbiBhbmQgQXRsYXMgY2x1c3RlciBzdXBwb3J0cyBpdC4gSWYgaXQgZG9lc24ndCwgdXNlIGFuZCBjb25zdWx0IHRoZSBkb2N1bWVudGF0aW9uIGZvciBjb25uZWN0aW9uU3RyaW5ncy5wcml2YXRlRW5kcG9pbnRbbl0uc3J2Q29ubmVjdGlvblN0cmluZy5cbiAgICpcbiAgICogQHNjaGVtYSBjb25uZWN0aW9uU3RyaW5ncyNTUlZTaGFyZE9wdGltaXplZENvbm5lY3Rpb25TdHJpbmdcbiAgICovXG4gIHJlYWRvbmx5IHNydlNoYXJkT3B0aW1pemVkQ29ubmVjdGlvblN0cmluZz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdDb25uZWN0aW9uU3RyaW5ncycgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibG