@cdktf/provider-google
Version:
Prebuilt google Provider for Terraform CDK (cdktf)
3,196 lines • 485 kB
JavaScript
"use strict";
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t;
Object.defineProperty(exports, "__esModule", { value: true });
exports.ComputeRegionBackendService = exports.ComputeRegionBackendServiceTimeoutsOutputReference = exports.computeRegionBackendServiceTimeoutsToHclTerraform = exports.computeRegionBackendServiceTimeoutsToTerraform = exports.ComputeRegionBackendServiceOutlierDetectionOutputReference = exports.computeRegionBackendServiceOutlierDetectionToHclTerraform = exports.computeRegionBackendServiceOutlierDetectionToTerraform = exports.ComputeRegionBackendServiceOutlierDetectionIntervalOutputReference = exports.computeRegionBackendServiceOutlierDetectionIntervalToHclTerraform = exports.computeRegionBackendServiceOutlierDetectionIntervalToTerraform = exports.ComputeRegionBackendServiceOutlierDetectionBaseEjectionTimeOutputReference = exports.computeRegionBackendServiceOutlierDetectionBaseEjectionTimeToHclTerraform = exports.computeRegionBackendServiceOutlierDetectionBaseEjectionTimeToTerraform = exports.ComputeRegionBackendServiceLogConfigOutputReference = exports.computeRegionBackendServiceLogConfigToHclTerraform = exports.computeRegionBackendServiceLogConfigToTerraform = exports.ComputeRegionBackendServiceIapOutputReference = exports.computeRegionBackendServiceIapToHclTerraform = exports.computeRegionBackendServiceIapToTerraform = exports.ComputeRegionBackendServiceFailoverPolicyOutputReference = exports.computeRegionBackendServiceFailoverPolicyToHclTerraform = exports.computeRegionBackendServiceFailoverPolicyToTerraform = exports.ComputeRegionBackendServiceConsistentHashOutputReference = exports.computeRegionBackendServiceConsistentHashToHclTerraform = exports.computeRegionBackendServiceConsistentHashToTerraform = exports.ComputeRegionBackendServiceConsistentHashHttpCookieOutputReference = exports.computeRegionBackendServiceConsistentHashHttpCookieToHclTerraform = exports.computeRegionBackendServiceConsistentHashHttpCookieToTerraform = exports.ComputeRegionBackendServiceConsistentHashHttpCookieTtlOutputReference = exports.computeRegionBackendServiceConsistentHashHttpCookieTtlToHclTerraform = exports.computeRegionBackendServiceConsistentHashHttpCookieTtlToTerraform = exports.ComputeRegionBackendServiceCircuitBreakersOutputReference = exports.computeRegionBackendServiceCircuitBreakersToHclTerraform = exports.computeRegionBackendServiceCircuitBreakersToTerraform = exports.ComputeRegionBackendServiceCdnPolicyOutputReference = exports.computeRegionBackendServiceCdnPolicyToHclTerraform = exports.computeRegionBackendServiceCdnPolicyToTerraform = exports.ComputeRegionBackendServiceCdnPolicyNegativeCachingPolicyList = exports.ComputeRegionBackendServiceCdnPolicyNegativeCachingPolicyOutputReference = exports.computeRegionBackendServiceCdnPolicyNegativeCachingPolicyToHclTerraform = exports.computeRegionBackendServiceCdnPolicyNegativeCachingPolicyToTerraform = exports.ComputeRegionBackendServiceCdnPolicyCacheKeyPolicyOutputReference = exports.computeRegionBackendServiceCdnPolicyCacheKeyPolicyToHclTerraform = exports.computeRegionBackendServiceCdnPolicyCacheKeyPolicyToTerraform = exports.ComputeRegionBackendServiceBackendList = exports.ComputeRegionBackendServiceBackendOutputReference = exports.computeRegionBackendServiceBackendToHclTerraform = exports.computeRegionBackendServiceBackendToTerraform = void 0;
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
const cdktf = require("cdktf");
function computeRegionBackendServiceBackendToTerraform(struct) {
if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
return struct;
}
if (cdktf.isComplexElement(struct)) {
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
}
return {
balancing_mode: cdktf.stringToTerraform(struct.balancingMode),
capacity_scaler: cdktf.numberToTerraform(struct.capacityScaler),
description: cdktf.stringToTerraform(struct.description),
failover: cdktf.booleanToTerraform(struct.failover),
group: cdktf.stringToTerraform(struct.group),
max_connections: cdktf.numberToTerraform(struct.maxConnections),
max_connections_per_endpoint: cdktf.numberToTerraform(struct.maxConnectionsPerEndpoint),
max_connections_per_instance: cdktf.numberToTerraform(struct.maxConnectionsPerInstance),
max_rate: cdktf.numberToTerraform(struct.maxRate),
max_rate_per_endpoint: cdktf.numberToTerraform(struct.maxRatePerEndpoint),
max_rate_per_instance: cdktf.numberToTerraform(struct.maxRatePerInstance),
max_utilization: cdktf.numberToTerraform(struct.maxUtilization),
};
}
exports.computeRegionBackendServiceBackendToTerraform = computeRegionBackendServiceBackendToTerraform;
function computeRegionBackendServiceBackendToHclTerraform(struct) {
if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
return struct;
}
if (cdktf.isComplexElement(struct)) {
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
}
const attrs = {
balancing_mode: {
value: cdktf.stringToHclTerraform(struct.balancingMode),
isBlock: false,
type: "simple",
storageClassType: "string",
},
capacity_scaler: {
value: cdktf.numberToHclTerraform(struct.capacityScaler),
isBlock: false,
type: "simple",
storageClassType: "number",
},
description: {
value: cdktf.stringToHclTerraform(struct.description),
isBlock: false,
type: "simple",
storageClassType: "string",
},
failover: {
value: cdktf.booleanToHclTerraform(struct.failover),
isBlock: false,
type: "simple",
storageClassType: "boolean",
},
group: {
value: cdktf.stringToHclTerraform(struct.group),
isBlock: false,
type: "simple",
storageClassType: "string",
},
max_connections: {
value: cdktf.numberToHclTerraform(struct.maxConnections),
isBlock: false,
type: "simple",
storageClassType: "number",
},
max_connections_per_endpoint: {
value: cdktf.numberToHclTerraform(struct.maxConnectionsPerEndpoint),
isBlock: false,
type: "simple",
storageClassType: "number",
},
max_connections_per_instance: {
value: cdktf.numberToHclTerraform(struct.maxConnectionsPerInstance),
isBlock: false,
type: "simple",
storageClassType: "number",
},
max_rate: {
value: cdktf.numberToHclTerraform(struct.maxRate),
isBlock: false,
type: "simple",
storageClassType: "number",
},
max_rate_per_endpoint: {
value: cdktf.numberToHclTerraform(struct.maxRatePerEndpoint),
isBlock: false,
type: "simple",
storageClassType: "number",
},
max_rate_per_instance: {
value: cdktf.numberToHclTerraform(struct.maxRatePerInstance),
isBlock: false,
type: "simple",
storageClassType: "number",
},
max_utilization: {
value: cdktf.numberToHclTerraform(struct.maxUtilization),
isBlock: false,
type: "simple",
storageClassType: "number",
},
};
// remove undefined attributes
return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
}
exports.computeRegionBackendServiceBackendToHclTerraform = computeRegionBackendServiceBackendToHclTerraform;
class ComputeRegionBackendServiceBackendOutputReference extends cdktf.ComplexObject {
/**
* @param terraformResource The parent resource
* @param terraformAttribute The attribute on the parent resource this class is referencing
* @param complexObjectIndex the index of this item in the list
* @param complexObjectIsFromSet whether the list is wrapping a set (will add tolist() to be able to access an item via an index)
*/
constructor(terraformResource, terraformAttribute, complexObjectIndex, complexObjectIsFromSet) {
super(terraformResource, terraformAttribute, complexObjectIsFromSet, complexObjectIndex);
this.isEmptyObject = false;
}
get internalValue() {
if (this.resolvableValue) {
return this.resolvableValue;
}
let hasAnyValues = this.isEmptyObject;
const internalValueResult = {};
if (this._balancingMode !== undefined) {
hasAnyValues = true;
internalValueResult.balancingMode = this._balancingMode;
}
if (this._capacityScaler !== undefined) {
hasAnyValues = true;
internalValueResult.capacityScaler = this._capacityScaler;
}
if (this._description !== undefined) {
hasAnyValues = true;
internalValueResult.description = this._description;
}
if (this._failover !== undefined) {
hasAnyValues = true;
internalValueResult.failover = this._failover;
}
if (this._group !== undefined) {
hasAnyValues = true;
internalValueResult.group = this._group;
}
if (this._maxConnections !== undefined) {
hasAnyValues = true;
internalValueResult.maxConnections = this._maxConnections;
}
if (this._maxConnectionsPerEndpoint !== undefined) {
hasAnyValues = true;
internalValueResult.maxConnectionsPerEndpoint = this._maxConnectionsPerEndpoint;
}
if (this._maxConnectionsPerInstance !== undefined) {
hasAnyValues = true;
internalValueResult.maxConnectionsPerInstance = this._maxConnectionsPerInstance;
}
if (this._maxRate !== undefined) {
hasAnyValues = true;
internalValueResult.maxRate = this._maxRate;
}
if (this._maxRatePerEndpoint !== undefined) {
hasAnyValues = true;
internalValueResult.maxRatePerEndpoint = this._maxRatePerEndpoint;
}
if (this._maxRatePerInstance !== undefined) {
hasAnyValues = true;
internalValueResult.maxRatePerInstance = this._maxRatePerInstance;
}
if (this._maxUtilization !== undefined) {
hasAnyValues = true;
internalValueResult.maxUtilization = this._maxUtilization;
}
return hasAnyValues ? internalValueResult : undefined;
}
set internalValue(value) {
if (value === undefined) {
this.isEmptyObject = false;
this.resolvableValue = undefined;
this._balancingMode = undefined;
this._capacityScaler = undefined;
this._description = undefined;
this._failover = undefined;
this._group = undefined;
this._maxConnections = undefined;
this._maxConnectionsPerEndpoint = undefined;
this._maxConnectionsPerInstance = undefined;
this._maxRate = undefined;
this._maxRatePerEndpoint = undefined;
this._maxRatePerInstance = undefined;
this._maxUtilization = undefined;
}
else if (cdktf.Tokenization.isResolvable(value)) {
this.isEmptyObject = false;
this.resolvableValue = value;
}
else {
this.isEmptyObject = Object.keys(value).length === 0;
this.resolvableValue = undefined;
this._balancingMode = value.balancingMode;
this._capacityScaler = value.capacityScaler;
this._description = value.description;
this._failover = value.failover;
this._group = value.group;
this._maxConnections = value.maxConnections;
this._maxConnectionsPerEndpoint = value.maxConnectionsPerEndpoint;
this._maxConnectionsPerInstance = value.maxConnectionsPerInstance;
this._maxRate = value.maxRate;
this._maxRatePerEndpoint = value.maxRatePerEndpoint;
this._maxRatePerInstance = value.maxRatePerInstance;
this._maxUtilization = value.maxUtilization;
}
}
get balancingMode() {
return this.getStringAttribute('balancing_mode');
}
set balancingMode(value) {
this._balancingMode = value;
}
resetBalancingMode() {
this._balancingMode = undefined;
}
// Temporarily expose input value. Use with caution.
get balancingModeInput() {
return this._balancingMode;
}
get capacityScaler() {
return this.getNumberAttribute('capacity_scaler');
}
set capacityScaler(value) {
this._capacityScaler = value;
}
resetCapacityScaler() {
this._capacityScaler = undefined;
}
// Temporarily expose input value. Use with caution.
get capacityScalerInput() {
return this._capacityScaler;
}
get description() {
return this.getStringAttribute('description');
}
set description(value) {
this._description = value;
}
resetDescription() {
this._description = undefined;
}
// Temporarily expose input value. Use with caution.
get descriptionInput() {
return this._description;
}
get failover() {
return this.getBooleanAttribute('failover');
}
set failover(value) {
this._failover = value;
}
resetFailover() {
this._failover = undefined;
}
// Temporarily expose input value. Use with caution.
get failoverInput() {
return this._failover;
}
get group() {
return this.getStringAttribute('group');
}
set group(value) {
this._group = value;
}
// Temporarily expose input value. Use with caution.
get groupInput() {
return this._group;
}
get maxConnections() {
return this.getNumberAttribute('max_connections');
}
set maxConnections(value) {
this._maxConnections = value;
}
resetMaxConnections() {
this._maxConnections = undefined;
}
// Temporarily expose input value. Use with caution.
get maxConnectionsInput() {
return this._maxConnections;
}
get maxConnectionsPerEndpoint() {
return this.getNumberAttribute('max_connections_per_endpoint');
}
set maxConnectionsPerEndpoint(value) {
this._maxConnectionsPerEndpoint = value;
}
resetMaxConnectionsPerEndpoint() {
this._maxConnectionsPerEndpoint = undefined;
}
// Temporarily expose input value. Use with caution.
get maxConnectionsPerEndpointInput() {
return this._maxConnectionsPerEndpoint;
}
get maxConnectionsPerInstance() {
return this.getNumberAttribute('max_connections_per_instance');
}
set maxConnectionsPerInstance(value) {
this._maxConnectionsPerInstance = value;
}
resetMaxConnectionsPerInstance() {
this._maxConnectionsPerInstance = undefined;
}
// Temporarily expose input value. Use with caution.
get maxConnectionsPerInstanceInput() {
return this._maxConnectionsPerInstance;
}
get maxRate() {
return this.getNumberAttribute('max_rate');
}
set maxRate(value) {
this._maxRate = value;
}
resetMaxRate() {
this._maxRate = undefined;
}
// Temporarily expose input value. Use with caution.
get maxRateInput() {
return this._maxRate;
}
get maxRatePerEndpoint() {
return this.getNumberAttribute('max_rate_per_endpoint');
}
set maxRatePerEndpoint(value) {
this._maxRatePerEndpoint = value;
}
resetMaxRatePerEndpoint() {
this._maxRatePerEndpoint = undefined;
}
// Temporarily expose input value. Use with caution.
get maxRatePerEndpointInput() {
return this._maxRatePerEndpoint;
}
get maxRatePerInstance() {
return this.getNumberAttribute('max_rate_per_instance');
}
set maxRatePerInstance(value) {
this._maxRatePerInstance = value;
}
resetMaxRatePerInstance() {
this._maxRatePerInstance = undefined;
}
// Temporarily expose input value. Use with caution.
get maxRatePerInstanceInput() {
return this._maxRatePerInstance;
}
get maxUtilization() {
return this.getNumberAttribute('max_utilization');
}
set maxUtilization(value) {
this._maxUtilization = value;
}
resetMaxUtilization() {
this._maxUtilization = undefined;
}
// Temporarily expose input value. Use with caution.
get maxUtilizationInput() {
return this._maxUtilization;
}
}
exports.ComputeRegionBackendServiceBackendOutputReference = ComputeRegionBackendServiceBackendOutputReference;
_a = JSII_RTTI_SYMBOL_1;
ComputeRegionBackendServiceBackendOutputReference[_a] = { fqn: "@cdktf/provider-google.computeRegionBackendService.ComputeRegionBackendServiceBackendOutputReference", version: "14.3.0" };
class ComputeRegionBackendServiceBackendList extends cdktf.ComplexList {
/**
* @param terraformResource The parent resource
* @param terraformAttribute The attribute on the parent resource this class is referencing
* @param wrapsSet whether the list is wrapping a set (will add tolist() to be able to access an item via an index)
*/
constructor(terraformResource, terraformAttribute, wrapsSet) {
super(terraformResource, terraformAttribute, wrapsSet);
this.terraformResource = terraformResource;
this.terraformAttribute = terraformAttribute;
this.wrapsSet = wrapsSet;
}
/**
* @param index the index of the item to return
*/
get(index) {
return new ComputeRegionBackendServiceBackendOutputReference(this.terraformResource, this.terraformAttribute, index, this.wrapsSet);
}
}
exports.ComputeRegionBackendServiceBackendList = ComputeRegionBackendServiceBackendList;
_b = JSII_RTTI_SYMBOL_1;
ComputeRegionBackendServiceBackendList[_b] = { fqn: "@cdktf/provider-google.computeRegionBackendService.ComputeRegionBackendServiceBackendList", version: "14.3.0" };
function computeRegionBackendServiceCdnPolicyCacheKeyPolicyToTerraform(struct) {
if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
return struct;
}
if (cdktf.isComplexElement(struct)) {
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
}
return {
include_host: cdktf.booleanToTerraform(struct.includeHost),
include_named_cookies: cdktf.listMapper(cdktf.stringToTerraform, false)(struct.includeNamedCookies),
include_protocol: cdktf.booleanToTerraform(struct.includeProtocol),
include_query_string: cdktf.booleanToTerraform(struct.includeQueryString),
query_string_blacklist: cdktf.listMapper(cdktf.stringToTerraform, false)(struct.queryStringBlacklist),
query_string_whitelist: cdktf.listMapper(cdktf.stringToTerraform, false)(struct.queryStringWhitelist),
};
}
exports.computeRegionBackendServiceCdnPolicyCacheKeyPolicyToTerraform = computeRegionBackendServiceCdnPolicyCacheKeyPolicyToTerraform;
function computeRegionBackendServiceCdnPolicyCacheKeyPolicyToHclTerraform(struct) {
if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
return struct;
}
if (cdktf.isComplexElement(struct)) {
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
}
const attrs = {
include_host: {
value: cdktf.booleanToHclTerraform(struct.includeHost),
isBlock: false,
type: "simple",
storageClassType: "boolean",
},
include_named_cookies: {
value: cdktf.listMapperHcl(cdktf.stringToHclTerraform, false)(struct.includeNamedCookies),
isBlock: false,
type: "list",
storageClassType: "stringList",
},
include_protocol: {
value: cdktf.booleanToHclTerraform(struct.includeProtocol),
isBlock: false,
type: "simple",
storageClassType: "boolean",
},
include_query_string: {
value: cdktf.booleanToHclTerraform(struct.includeQueryString),
isBlock: false,
type: "simple",
storageClassType: "boolean",
},
query_string_blacklist: {
value: cdktf.listMapperHcl(cdktf.stringToHclTerraform, false)(struct.queryStringBlacklist),
isBlock: false,
type: "set",
storageClassType: "stringList",
},
query_string_whitelist: {
value: cdktf.listMapperHcl(cdktf.stringToHclTerraform, false)(struct.queryStringWhitelist),
isBlock: false,
type: "set",
storageClassType: "stringList",
},
};
// remove undefined attributes
return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
}
exports.computeRegionBackendServiceCdnPolicyCacheKeyPolicyToHclTerraform = computeRegionBackendServiceCdnPolicyCacheKeyPolicyToHclTerraform;
class ComputeRegionBackendServiceCdnPolicyCacheKeyPolicyOutputReference extends cdktf.ComplexObject {
/**
* @param terraformResource The parent resource
* @param terraformAttribute The attribute on the parent resource this class is referencing
*/
constructor(terraformResource, terraformAttribute) {
super(terraformResource, terraformAttribute, false, 0);
this.isEmptyObject = false;
}
get internalValue() {
let hasAnyValues = this.isEmptyObject;
const internalValueResult = {};
if (this._includeHost !== undefined) {
hasAnyValues = true;
internalValueResult.includeHost = this._includeHost;
}
if (this._includeNamedCookies !== undefined) {
hasAnyValues = true;
internalValueResult.includeNamedCookies = this._includeNamedCookies;
}
if (this._includeProtocol !== undefined) {
hasAnyValues = true;
internalValueResult.includeProtocol = this._includeProtocol;
}
if (this._includeQueryString !== undefined) {
hasAnyValues = true;
internalValueResult.includeQueryString = this._includeQueryString;
}
if (this._queryStringBlacklist !== undefined) {
hasAnyValues = true;
internalValueResult.queryStringBlacklist = this._queryStringBlacklist;
}
if (this._queryStringWhitelist !== undefined) {
hasAnyValues = true;
internalValueResult.queryStringWhitelist = this._queryStringWhitelist;
}
return hasAnyValues ? internalValueResult : undefined;
}
set internalValue(value) {
if (value === undefined) {
this.isEmptyObject = false;
this._includeHost = undefined;
this._includeNamedCookies = undefined;
this._includeProtocol = undefined;
this._includeQueryString = undefined;
this._queryStringBlacklist = undefined;
this._queryStringWhitelist = undefined;
}
else {
this.isEmptyObject = Object.keys(value).length === 0;
this._includeHost = value.includeHost;
this._includeNamedCookies = value.includeNamedCookies;
this._includeProtocol = value.includeProtocol;
this._includeQueryString = value.includeQueryString;
this._queryStringBlacklist = value.queryStringBlacklist;
this._queryStringWhitelist = value.queryStringWhitelist;
}
}
get includeHost() {
return this.getBooleanAttribute('include_host');
}
set includeHost(value) {
this._includeHost = value;
}
resetIncludeHost() {
this._includeHost = undefined;
}
// Temporarily expose input value. Use with caution.
get includeHostInput() {
return this._includeHost;
}
get includeNamedCookies() {
return this.getListAttribute('include_named_cookies');
}
set includeNamedCookies(value) {
this._includeNamedCookies = value;
}
resetIncludeNamedCookies() {
this._includeNamedCookies = undefined;
}
// Temporarily expose input value. Use with caution.
get includeNamedCookiesInput() {
return this._includeNamedCookies;
}
get includeProtocol() {
return this.getBooleanAttribute('include_protocol');
}
set includeProtocol(value) {
this._includeProtocol = value;
}
resetIncludeProtocol() {
this._includeProtocol = undefined;
}
// Temporarily expose input value. Use with caution.
get includeProtocolInput() {
return this._includeProtocol;
}
get includeQueryString() {
return this.getBooleanAttribute('include_query_string');
}
set includeQueryString(value) {
this._includeQueryString = value;
}
resetIncludeQueryString() {
this._includeQueryString = undefined;
}
// Temporarily expose input value. Use with caution.
get includeQueryStringInput() {
return this._includeQueryString;
}
get queryStringBlacklist() {
return cdktf.Fn.tolist(this.getListAttribute('query_string_blacklist'));
}
set queryStringBlacklist(value) {
this._queryStringBlacklist = value;
}
resetQueryStringBlacklist() {
this._queryStringBlacklist = undefined;
}
// Temporarily expose input value. Use with caution.
get queryStringBlacklistInput() {
return this._queryStringBlacklist;
}
get queryStringWhitelist() {
return cdktf.Fn.tolist(this.getListAttribute('query_string_whitelist'));
}
set queryStringWhitelist(value) {
this._queryStringWhitelist = value;
}
resetQueryStringWhitelist() {
this._queryStringWhitelist = undefined;
}
// Temporarily expose input value. Use with caution.
get queryStringWhitelistInput() {
return this._queryStringWhitelist;
}
}
exports.ComputeRegionBackendServiceCdnPolicyCacheKeyPolicyOutputReference = ComputeRegionBackendServiceCdnPolicyCacheKeyPolicyOutputReference;
_c = JSII_RTTI_SYMBOL_1;
ComputeRegionBackendServiceCdnPolicyCacheKeyPolicyOutputReference[_c] = { fqn: "@cdktf/provider-google.computeRegionBackendService.ComputeRegionBackendServiceCdnPolicyCacheKeyPolicyOutputReference", version: "14.3.0" };
function computeRegionBackendServiceCdnPolicyNegativeCachingPolicyToTerraform(struct) {
if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
return struct;
}
if (cdktf.isComplexElement(struct)) {
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
}
return {
code: cdktf.numberToTerraform(struct.code),
};
}
exports.computeRegionBackendServiceCdnPolicyNegativeCachingPolicyToTerraform = computeRegionBackendServiceCdnPolicyNegativeCachingPolicyToTerraform;
function computeRegionBackendServiceCdnPolicyNegativeCachingPolicyToHclTerraform(struct) {
if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
return struct;
}
if (cdktf.isComplexElement(struct)) {
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
}
const attrs = {
code: {
value: cdktf.numberToHclTerraform(struct.code),
isBlock: false,
type: "simple",
storageClassType: "number",
},
};
// remove undefined attributes
return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
}
exports.computeRegionBackendServiceCdnPolicyNegativeCachingPolicyToHclTerraform = computeRegionBackendServiceCdnPolicyNegativeCachingPolicyToHclTerraform;
class ComputeRegionBackendServiceCdnPolicyNegativeCachingPolicyOutputReference extends cdktf.ComplexObject {
/**
* @param terraformResource The parent resource
* @param terraformAttribute The attribute on the parent resource this class is referencing
* @param complexObjectIndex the index of this item in the list
* @param complexObjectIsFromSet whether the list is wrapping a set (will add tolist() to be able to access an item via an index)
*/
constructor(terraformResource, terraformAttribute, complexObjectIndex, complexObjectIsFromSet) {
super(terraformResource, terraformAttribute, complexObjectIsFromSet, complexObjectIndex);
this.isEmptyObject = false;
}
get internalValue() {
if (this.resolvableValue) {
return this.resolvableValue;
}
let hasAnyValues = this.isEmptyObject;
const internalValueResult = {};
if (this._code !== undefined) {
hasAnyValues = true;
internalValueResult.code = this._code;
}
return hasAnyValues ? internalValueResult : undefined;
}
set internalValue(value) {
if (value === undefined) {
this.isEmptyObject = false;
this.resolvableValue = undefined;
this._code = undefined;
}
else if (cdktf.Tokenization.isResolvable(value)) {
this.isEmptyObject = false;
this.resolvableValue = value;
}
else {
this.isEmptyObject = Object.keys(value).length === 0;
this.resolvableValue = undefined;
this._code = value.code;
}
}
get code() {
return this.getNumberAttribute('code');
}
set code(value) {
this._code = value;
}
resetCode() {
this._code = undefined;
}
// Temporarily expose input value. Use with caution.
get codeInput() {
return this._code;
}
}
exports.ComputeRegionBackendServiceCdnPolicyNegativeCachingPolicyOutputReference = ComputeRegionBackendServiceCdnPolicyNegativeCachingPolicyOutputReference;
_d = JSII_RTTI_SYMBOL_1;
ComputeRegionBackendServiceCdnPolicyNegativeCachingPolicyOutputReference[_d] = { fqn: "@cdktf/provider-google.computeRegionBackendService.ComputeRegionBackendServiceCdnPolicyNegativeCachingPolicyOutputReference", version: "14.3.0" };
class ComputeRegionBackendServiceCdnPolicyNegativeCachingPolicyList extends cdktf.ComplexList {
/**
* @param terraformResource The parent resource
* @param terraformAttribute The attribute on the parent resource this class is referencing
* @param wrapsSet whether the list is wrapping a set (will add tolist() to be able to access an item via an index)
*/
constructor(terraformResource, terraformAttribute, wrapsSet) {
super(terraformResource, terraformAttribute, wrapsSet);
this.terraformResource = terraformResource;
this.terraformAttribute = terraformAttribute;
this.wrapsSet = wrapsSet;
}
/**
* @param index the index of the item to return
*/
get(index) {
return new ComputeRegionBackendServiceCdnPolicyNegativeCachingPolicyOutputReference(this.terraformResource, this.terraformAttribute, index, this.wrapsSet);
}
}
exports.ComputeRegionBackendServiceCdnPolicyNegativeCachingPolicyList = ComputeRegionBackendServiceCdnPolicyNegativeCachingPolicyList;
_e = JSII_RTTI_SYMBOL_1;
ComputeRegionBackendServiceCdnPolicyNegativeCachingPolicyList[_e] = { fqn: "@cdktf/provider-google.computeRegionBackendService.ComputeRegionBackendServiceCdnPolicyNegativeCachingPolicyList", version: "14.3.0" };
function computeRegionBackendServiceCdnPolicyToTerraform(struct) {
if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
return struct;
}
if (cdktf.isComplexElement(struct)) {
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
}
return {
cache_mode: cdktf.stringToTerraform(struct.cacheMode),
client_ttl: cdktf.numberToTerraform(struct.clientTtl),
default_ttl: cdktf.numberToTerraform(struct.defaultTtl),
max_ttl: cdktf.numberToTerraform(struct.maxTtl),
negative_caching: cdktf.booleanToTerraform(struct.negativeCaching),
serve_while_stale: cdktf.numberToTerraform(struct.serveWhileStale),
signed_url_cache_max_age_sec: cdktf.numberToTerraform(struct.signedUrlCacheMaxAgeSec),
cache_key_policy: computeRegionBackendServiceCdnPolicyCacheKeyPolicyToTerraform(struct.cacheKeyPolicy),
negative_caching_policy: cdktf.listMapper(computeRegionBackendServiceCdnPolicyNegativeCachingPolicyToTerraform, true)(struct.negativeCachingPolicy),
};
}
exports.computeRegionBackendServiceCdnPolicyToTerraform = computeRegionBackendServiceCdnPolicyToTerraform;
function computeRegionBackendServiceCdnPolicyToHclTerraform(struct) {
if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
return struct;
}
if (cdktf.isComplexElement(struct)) {
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
}
const attrs = {
cache_mode: {
value: cdktf.stringToHclTerraform(struct.cacheMode),
isBlock: false,
type: "simple",
storageClassType: "string",
},
client_ttl: {
value: cdktf.numberToHclTerraform(struct.clientTtl),
isBlock: false,
type: "simple",
storageClassType: "number",
},
default_ttl: {
value: cdktf.numberToHclTerraform(struct.defaultTtl),
isBlock: false,
type: "simple",
storageClassType: "number",
},
max_ttl: {
value: cdktf.numberToHclTerraform(struct.maxTtl),
isBlock: false,
type: "simple",
storageClassType: "number",
},
negative_caching: {
value: cdktf.booleanToHclTerraform(struct.negativeCaching),
isBlock: false,
type: "simple",
storageClassType: "boolean",
},
serve_while_stale: {
value: cdktf.numberToHclTerraform(struct.serveWhileStale),
isBlock: false,
type: "simple",
storageClassType: "number",
},
signed_url_cache_max_age_sec: {
value: cdktf.numberToHclTerraform(struct.signedUrlCacheMaxAgeSec),
isBlock: false,
type: "simple",
storageClassType: "number",
},
cache_key_policy: {
value: computeRegionBackendServiceCdnPolicyCacheKeyPolicyToHclTerraform(struct.cacheKeyPolicy),
isBlock: true,
type: "list",
storageClassType: "ComputeRegionBackendServiceCdnPolicyCacheKeyPolicyList",
},
negative_caching_policy: {
value: cdktf.listMapperHcl(computeRegionBackendServiceCdnPolicyNegativeCachingPolicyToHclTerraform, true)(struct.negativeCachingPolicy),
isBlock: true,
type: "list",
storageClassType: "ComputeRegionBackendServiceCdnPolicyNegativeCachingPolicyList",
},
};
// remove undefined attributes
return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
}
exports.computeRegionBackendServiceCdnPolicyToHclTerraform = computeRegionBackendServiceCdnPolicyToHclTerraform;
class ComputeRegionBackendServiceCdnPolicyOutputReference extends cdktf.ComplexObject {
/**
* @param terraformResource The parent resource
* @param terraformAttribute The attribute on the parent resource this class is referencing
*/
constructor(terraformResource, terraformAttribute) {
super(terraformResource, terraformAttribute, false, 0);
this.isEmptyObject = false;
// cache_key_policy - computed: false, optional: true, required: false
this._cacheKeyPolicy = new ComputeRegionBackendServiceCdnPolicyCacheKeyPolicyOutputReference(this, "cache_key_policy");
// negative_caching_policy - computed: false, optional: true, required: false
this._negativeCachingPolicy = new ComputeRegionBackendServiceCdnPolicyNegativeCachingPolicyList(this, "negative_caching_policy", false);
}
get internalValue() {
let hasAnyValues = this.isEmptyObject;
const internalValueResult = {};
if (this._cacheMode !== undefined) {
hasAnyValues = true;
internalValueResult.cacheMode = this._cacheMode;
}
if (this._clientTtl !== undefined) {
hasAnyValues = true;
internalValueResult.clientTtl = this._clientTtl;
}
if (this._defaultTtl !== undefined) {
hasAnyValues = true;
internalValueResult.defaultTtl = this._defaultTtl;
}
if (this._maxTtl !== undefined) {
hasAnyValues = true;
internalValueResult.maxTtl = this._maxTtl;
}
if (this._negativeCaching !== undefined) {
hasAnyValues = true;
internalValueResult.negativeCaching = this._negativeCaching;
}
if (this._serveWhileStale !== undefined) {
hasAnyValues = true;
internalValueResult.serveWhileStale = this._serveWhileStale;
}
if (this._signedUrlCacheMaxAgeSec !== undefined) {
hasAnyValues = true;
internalValueResult.signedUrlCacheMaxAgeSec = this._signedUrlCacheMaxAgeSec;
}
if (this._cacheKeyPolicy?.internalValue !== undefined) {
hasAnyValues = true;
internalValueResult.cacheKeyPolicy = this._cacheKeyPolicy?.internalValue;
}
if (this._negativeCachingPolicy?.internalValue !== undefined) {
hasAnyValues = true;
internalValueResult.negativeCachingPolicy = this._negativeCachingPolicy?.internalValue;
}
return hasAnyValues ? internalValueResult : undefined;
}
set internalValue(value) {
if (value === undefined) {
this.isEmptyObject = false;
this._cacheMode = undefined;
this._clientTtl = undefined;
this._defaultTtl = undefined;
this._maxTtl = undefined;
this._negativeCaching = undefined;
this._serveWhileStale = undefined;
this._signedUrlCacheMaxAgeSec = undefined;
this._cacheKeyPolicy.internalValue = undefined;
this._negativeCachingPolicy.internalValue = undefined;
}
else {
this.isEmptyObject = Object.keys(value).length === 0;
this._cacheMode = value.cacheMode;
this._clientTtl = value.clientTtl;
this._defaultTtl = value.defaultTtl;
this._maxTtl = value.maxTtl;
this._negativeCaching = value.negativeCaching;
this._serveWhileStale = value.serveWhileStale;
this._signedUrlCacheMaxAgeSec = value.signedUrlCacheMaxAgeSec;
this._cacheKeyPolicy.internalValue = value.cacheKeyPolicy;
this._negativeCachingPolicy.internalValue = value.negativeCachingPolicy;
}
}
get cacheMode() {
return this.getStringAttribute('cache_mode');
}
set cacheMode(value) {
this._cacheMode = value;
}
resetCacheMode() {
this._cacheMode = undefined;
}
// Temporarily expose input value. Use with caution.
get cacheModeInput() {
return this._cacheMode;
}
get clientTtl() {
return this.getNumberAttribute('client_ttl');
}
set clientTtl(value) {
this._clientTtl = value;
}
resetClientTtl() {
this._clientTtl = undefined;
}
// Temporarily expose input value. Use with caution.
get clientTtlInput() {
return this._clientTtl;
}
get defaultTtl() {
return this.getNumberAttribute('default_ttl');
}
set defaultTtl(value) {
this._defaultTtl = value;
}
resetDefaultTtl() {
this._defaultTtl = undefined;
}
// Temporarily expose input value. Use with caution.
get defaultTtlInput() {
return this._defaultTtl;
}
get maxTtl() {
return this.getNumberAttribute('max_ttl');
}
set maxTtl(value) {
this._maxTtl = value;
}
resetMaxTtl() {
this._maxTtl = undefined;
}
// Temporarily expose input value. Use with caution.
get maxTtlInput() {
return this._maxTtl;
}
get negativeCaching() {
return this.getBooleanAttribute('negative_caching');
}
set negativeCaching(value) {
this._negativeCaching = value;
}
resetNegativeCaching() {
this._negativeCaching = undefined;
}
// Temporarily expose input value. Use with caution.
get negativeCachingInput() {
return this._negativeCaching;
}
get serveWhileStale() {
return this.getNumberAttribute('serve_while_stale');
}
set serveWhileStale(value) {
this._serveWhileStale = value;
}
resetServeWhileStale() {
this._serveWhileStale = undefined;
}
// Temporarily expose input value. Use with caution.
get serveWhileStaleInput() {
return this._serveWhileStale;
}
get signedUrlCacheMaxAgeSec() {
return this.getNumberAttribute('signed_url_cache_max_age_sec');
}
set signedUrlCacheMaxAgeSec(value) {
this._signedUrlCacheMaxAgeSec = value;
}
resetSignedUrlCacheMaxAgeSec() {
this._signedUrlCacheMaxAgeSec = undefined;
}
// Temporarily expose input value. Use with caution.
get signedUrlCacheMaxAgeSecInput() {
return this._signedUrlCacheMaxAgeSec;
}
get cacheKeyPolicy() {
return this._cacheKeyPolicy;
}
putCacheKeyPolicy(value) {
this._cacheKeyPolicy.internalValue = value;
}
resetCacheKeyPolicy() {
this._cacheKeyPolicy.internalValue = undefined;
}
// Temporarily expose input value. Use with caution.
get cacheKeyPolicyInput() {
return this._cacheKeyPolicy.internalValue;
}
get negativeCachingPolicy() {
return this._negativeCachingPolicy;
}
putNegativeCachingPolicy(value) {
this._negativeCachingPolicy.internalValue = value;
}
resetNegativeCachingPolicy() {
this._negativeCachingPolicy.internalValue = undefined;
}
// Temporarily expose input value. Use with caution.
get negativeCachingPolicyInput() {
return this._negativeCachingPolicy.internalValue;
}
}
exports.ComputeRegionBackendServiceCdnPolicyOutputReference = ComputeRegionBackendServiceCdnPolicyOutputReference;
_f = JSII_RTTI_SYMBOL_1;
ComputeRegionBackendServiceCdnPolicyOutputReference[_f] = { fqn: "@cdktf/provider-google.computeRegionBackendService.ComputeRegionBackendServiceCdnPolicyOutputReference", version: "14.3.0" };
function computeRegionBackendServiceCircuitBreakersToTerraform(struct) {
if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
return struct;
}
if (cdktf.isComplexElement(struct)) {
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
}
return {
max_connections: cdktf.numberToTerraform(struct.maxConnections),
max_pending_requests: cdktf.numberToTerraform(struct.maxPendingRequests),
max_requests: cdktf.numberToTerraform(struct.maxRequests),
max_requests_per_connection: cdktf.numberToTerraform(struct.maxRequestsPerConnection),
max_retries: cdktf.numberToTerraform(struct.maxRetries),
};
}
exports.computeRegionBackendServiceCircuitBreakersToTerraform = computeRegionBackendServiceCircuitBreakersToTerraform;
function computeRegionBackendServiceCircuitBreakersToHclTerraform(struct) {
if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
return struct;
}
if (cdktf.isComplexElement(struct)) {
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
}
const attrs = {
max_connections: {
value: cdktf.numberToHclTerraform(struct.maxConnections),
isBlock: false,
type: "simple",
storageClassType: "number",
},
max_pending_requests: {
value: cdktf.numberToHclTerraform(struct.maxPendingRequests),
isBlock: false,
type: "simple",
storageClassType: "number",
},
max_requests: {
value: cdktf.numberToHclTerraform(struct.maxRequests),
isBlock: false,
type: "simple",
storageClassType: "number",
},
max_requests_per_connection: {
value: cdktf.numberToHclTerraform(struct.maxRequestsPerConnection),
isBlock: false,
type: "simple",
storageClassType: "number",
},
max_retries: {
value: cdktf.numberToHclTerraform(struct.maxRetries),
isBlock: false,
type: "simple",
storageClassType: "number",
},
};
// remove undefined attributes
return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
}
exports.computeRegionBackendServiceCircuitBreakersToHclTerraform = computeRegionBackendServiceCircuitBreakersToHclTerraform;
class ComputeRegionBackendServiceCircuitBreakersOutputReference extends cdktf.ComplexObject {
/**
* @param terraformResource The parent resource
* @param terraformAttribute The attribute on the parent resource this class is referencing
*/
constructor(terraformResource, terraformAttribute) {
super(terraformResource, terraformAttribute, false, 0);
this.isEmptyObject = false;
}
get internalValue() {
let hasAnyValues = this.isEmptyObject;
const internalValueResult = {};
if (this._maxConnections !== undefined) {
hasAnyValues = true;
internalValueResult.maxConnections = this._maxConnections;
}
if (this._maxPendingRequests !== undefined) {
hasAnyValues = true;
internalValueResult.maxPendingRequests = this._maxPendingRequests;
}
if (this._maxRequests !== undefined) {
hasAnyValues = true;
internalValueResult.maxRequests = this._maxRequests;
}
if (this._maxRequestsPerConnection !== undefined) {
hasAnyValues = true;
internalValueResult.maxRequestsPerConnection = this._maxRequestsPerConnection;
}
if (this._maxRetries !== undefined) {
hasAnyValues = true;
internalValueResult.maxRetries = this._maxRetries;
}
return hasAnyValues ? internalValueResult : undefined;
}
set internalValue(value) {
if (value === undefined) {
this.isEmptyObject = false;
this._maxConnections = undefined;
this._maxPendingRequests = undefined;
this._maxRequests = undefined;
this._maxRequestsPerConnection = undefined;
this._maxRetries = undefined;
}
else {
this.isEmptyObject = Object.keys(value).length === 0;
this._maxConnections = value.maxConnections;
this._maxPendingRequests = value.maxPendingRequests;
this._maxRequests = value.maxRequests;
this._maxRequestsPerConnection = value.maxRequestsPerConnection;
this._maxRetries = value.maxRetries;
}
}
get maxConnections() {
return this.getNumberAttribute('max_connections');
}
set maxConnections(value) {
this._maxConnections = value;
}
resetMaxConnections() {
this._maxConnections = undefined;
}
// Temporarily expose input value. Use with caution.
get maxConnectionsInput() {
return this._maxConnections;
}
get maxPendingRequests() {
return this.getNumberAttribute('max_pending_requests');
}
set maxPendingRequests(value) {
this._maxPendingRequests = value;
}
resetMaxPendingRequests() {
this._maxPendingRequests = undefined;
}
// Temporarily expose input value. Use with caution.
get maxPendingRequestsInput() {
return this._maxPendingRequests;
}
get maxRequests() {
return this.getNumberAttribute('max_requests');
}
set maxRequests(value) {
this._maxRequests = value;
}
resetMaxRequests() {
this._maxRequests = undefined;
}
// Temporarily expose input value. Use with caution.
get maxRequestsInput() {
return this._maxRequests;
}
get maxRequestsPerConnection() {
return this.getNumberAttribute('max_requests_per_connection');
}
set maxRequestsPerConnection(value) {
this._maxRequestsPerConnection = value;
}
resetMaxRequestsPerConnection() {
this._maxRequestsPerConnection = undefined;
}
// Temporarily expose input value. Use with caution.
get maxRequestsPerConnectionInput() {
return this._maxRequestsPerConnection;
}
get maxRetries() {
return this.getNumberAttribute('max_retries');
}
set maxRetries(value) {
this._maxRetries = value;
}
resetMaxRetries() {
this._maxRetries = undefined;
}
// Temporarily expose input value. Use with caution.
get maxRetriesInput() {
return this._maxRetries;
}
}
exports.ComputeRegionBackendServiceCircuitBreakersOutputReference = ComputeRegionBackendServiceCircuitBreakersOutputReference;
_g = JSII_RTTI_SYMBOL_1;
ComputeRegionBackendServiceCircuitBreakersOutputReference[_g] = { fqn: "@cdktf/provider-google.computeRegionBackendService.ComputeRegionBackendServiceCircuitBreakersOutputReference", version: "14.3.0" };
function computeRegionBackendServiceConsistentHashHttpCookieTtlToTerraform(struct) {
if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
return struct;
}
if (cdktf.isComplexElement(struct)) {
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
}
return {
nanos: cdktf.numberToTerraform(struct.nanos),
seconds: cdktf.numberToTerraform(struct.seconds),
};
}
exports.computeRegionBackendServiceConsistentHashHttpCookieTtlToTerraform = computeRegionBackendServiceConsistentHashHttpCookieTtlToTerraform;
function computeRegionBackendServiceConsistentHashHttpCookieTtlToHclTerraform(struct) {
if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
return struct;
}
if (cdktf.isComplexElement(struct)) {
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
}
const attrs = {
nanos: {
value: cdktf.numberToHclTerraform(struct.nanos),
isBlock: false,
type: "simple",
storageClassType: "number",
},
seconds: {
value: cdktf.numberToHclTerraform(struct.seconds),
isBlock: false,
type: "simple",
storageClassType: "number",
},
};
// remove undefined attributes
return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
}
exports.computeRegionBackendServiceConsistentHashHttpCookieTtlToHclTerraform = computeRegionBackendServiceConsistentHashHttpCookieTtlToHclTerraform;
class ComputeRegionBackendServiceConsistentHashHttpCookieTtlOutputReference extends cdktf.ComplexObject {
/**
* @param terraformResource The parent resource
* @param terraformAttribute The attribute on the parent resource this class is referencing
*/
constructor(terraformResource, terraformAttribute) {
super(terraformResource, terraformAttribute, false, 0);
this.isEmptyObject = false;
}
get internalValue() {
let hasAnyValues = this.isEmptyObject;
const internalValueResult = {};
if (this._nanos !== undefined) {
hasAnyValues = true;
internalValueResult.nanos = this._nanos;
}
if (this._seconds !== undefined) {
hasAnyValues = true;
internalValueResult.seconds = this._seconds;
}
return hasAnyValues ? internalValueResult : undefined;
}
set internalValue(value) {
if (value === undefined) {
this.isEmptyObject = false;
this._nanos = undefined;
this._seconds = undefined;
}
else {
this.isEmptyObject = Object.keys(value).length === 0;
this._nanos = value.nanos;
this._seconds = value.seconds;
}
}
get nanos() {
return this.getNumberAttribute('nanos');
}
set nanos(value) {
this._nanos = value;
}
resetNanos() {
this._nanos = undefined;
}
// Temporarily expose input value. Use with caution.
get nanosInput() {
return this._nanos;
}
get seconds() {
return this.getNumberAttribute('seconds');
}
set seconds(value) {
this._seconds = value;
}
// Temporarily expose input value. Use with caution.
get secondsInput() {
return this._seconds;
}
}
exports.ComputeRegionBackendServiceConsistentHashHttpCookieTtlOutputReference = ComputeRegionBackendServiceConsistentHashHttpCookieTtlOutputReference;
_h = JSII_RTTI_SYMBOL_1;
ComputeRegionBackendServiceConsistentHashHttpCookieTtlOutputReference[_h] = { fqn: "@cdktf/provider-google.computeRegionBackendService.ComputeRegionBackendServiceConsistentHashHttpCookieTtlOutputReference", version: "14.3.0" };
function computeRegionBackendServiceConsistentHashHttpCookieToTerraform(struct) {
if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
return struct;
}
if (cdktf.isComplexElement(struct)) {
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
}
return {
name: cdktf.stringToTerraform(struct.name),
path: cdktf.stringToTerraform(struct.path),
ttl: computeRegionBackendServiceConsistentHashHttpCookieTtlToTerraform(struct.ttl),
};
}
exports.computeRegionBackendServiceConsistentHashHttpCookieToTerraform = computeRegionBackendServiceConsistentHashHttpCookieToTerraform;
function computeRegionBackendServiceConsistentHashHttpCookieToHclTerraform(struct) {
if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
return struct;
}
if (cdktf.isComplexElement(struct)) {
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
}
const attrs = {
name: {
value: cdktf.stringToHclTerraform(struct.name),
isBlock: false,
type: "simple",
storageClassType: "string",
},
path: {
value: cdktf.stringToHclTerraform(struct.path),
isBlock: false,
type: "simple",
storageClassType: "string",
},
ttl: {
value: computeRegionBackendServiceConsistentHashHttpCookieTtlToHclTerraform(struct.ttl),
isBlock: true,
type: "list",
storageClassType: "ComputeRegionBackendServiceConsistentHashHttpCookieTtlList",
},
};
// remove undefined attributes
return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
}
exports.computeRegionBackendServiceConsistentHashHttpCookieToHclTerraform = computeRegionBackendServiceConsistentHashHttpCookieToHclTerraform;
class ComputeRegionBackendServiceConsistentHashHttpCookieOutputReference extends cdktf.ComplexObject {
/**
* @param terraformResource The parent resource
* @param terraformAttribute The attribute on the parent resource this class is referencing
*/
constructor(terraformResource, terraformAttribute) {
super(terraformResource, terraformAttribute, false, 0);
this.isEmptyObject = false;
// ttl - computed: false, optional: true, required: false
this._ttl = new ComputeRegionBackendServiceConsistentHashHttpCookieTtlOutputReference(this, "ttl");
}
get internalValue() {
let hasAnyValues = this.isEmptyObject;
const internalValueResult = {};
if (this._name !== undefined) {
hasAnyValues = true;
internalValueResult.name = this._name;
}
if (this._path !== undefined) {
hasAnyValues = true;
internalValueResult.path = this._path;
}
if (this._ttl?.internalValue !== undefined) {
hasAnyValues = true;
internalValueResult.ttl = this._ttl?.internalValue;
}
return hasAnyValues ? internalValueResult : undefined;
}
set internalValue(value) {
if (value === undefined) {
this.isEmptyObject = false;
this._name = undefined;
this._path = undefined;
this._ttl.internalValue = undefined;
}
else {
this.isEmptyObject = Object.keys(value).length === 0;
this._name = value.name;
this._path = value.path;
this._ttl.internalValue = value.ttl;
}
}
get name() {
return this.getStringAttribute('name');
}
set name(value) {
this._name = value;
}
resetName() {
this._name = undefined;
}
// Temporarily expose input value. Use with caution.
get nameInput() {
return this._name;
}
get path() {
return this.getStringAttribute('path');
}
set path(value) {
this._path = value;
}
resetPath() {
this._path = undefined;
}
// Temporarily expose input value. Use with caution.
get pathInput() {
return this._path;
}
get ttl() {
return this._ttl;
}
putTtl(value) {
this._ttl.internalValue = value;
}
resetTtl() {
this._ttl.internalValue = undefined;
}
// Temporarily expose input value. Use with caution.
get ttlInput() {
return this._ttl.internalValue;
}
}
exports.ComputeRegionBackendServiceConsistentHashHttpCookieOutputReference = ComputeRegionBackendServiceConsistentHashHttpCookieOutputReference;
_j = JSII_RTTI_SYMBOL_1;
ComputeRegionBackendServiceConsistentHashHttpCookieOutputReference[_j] = { fqn: "@cdktf/provider-google.computeRegionBackendService.ComputeRegionBackendServiceConsistentHashHttpCookieOutputReference", version: "14.3.0" };
function computeRegionBackendServiceConsistentHashToTerraform(struct) {
if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
return struct;
}
if (cdktf.isComplexElement(struct)) {
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
}
return {
http_header_name: cdktf.stringToTerraform(struct.httpHeaderName),
minimum_ring_size: cdktf.numberToTerraform(struct.minimumRingSize),
http_cookie: computeRegionBackendServiceConsistentHashHttpCookieToTerraform(struct.httpCookie),
};
}
exports.computeRegionBackendServiceConsistentHashToTerraform = computeRegionBackendServiceConsistentHashToTerraform;
function computeRegionBackendServiceConsistentHashToHclTerraform(struct) {
if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
return struct;
}
if (cdktf.isComplexElement(struct)) {
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
}
const attrs = {
http_header_name: {
value: cdktf.stringToHclTerraform(struct.httpHeaderName),
isBlock: false,
type: "simple",
storageClassType: "string",
},
minimum_ring_size: {
value: cdktf.numberToHclTerraform(struct.minimumRingSize),
isBlock: false,
type: "simple",
storageClassType: "number",
},
http_cookie: {
value: computeRegionBackendServiceConsistentHashHttpCookieToHclTerraform(struct.httpCookie),
isBlock: true,
type: "list",
storageClassType: "ComputeRegionBackendServiceConsistentHashHttpCookieList",
},
};
// remove undefined attributes
return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
}
exports.computeRegionBackendServiceConsistentHashToHclTerraform = computeRegionBackendServiceConsistentHashToHclTerraform;
class ComputeRegionBackendServiceConsistentHashOutputReference extends cdktf.ComplexObject {
/**
* @param terraformResource The parent resource
* @param terraformAttribute The attribute on the parent resource this class is referencing
*/
constructor(terraformResource, terraformAttribute) {
super(terraformResource, terraformAttribute, false, 0);
this.isEmptyObject = false;
// http_cookie - computed: false, optional: true, required: false
this._httpCookie = new ComputeRegionBackendServiceConsistentHashHttpCookieOutputReference(this, "http_cookie");
}
get internalValue() {
let hasAnyValues = this.isEmptyObject;
const internalValueResult = {};
if (this._httpHeaderName !== undefined) {
hasAnyValues = true;
internalValueResult.httpHeaderName = this._httpHeaderName;
}
if (this._minimumRingSize !== undefined) {
hasAnyValues = true;
internalValueResult.minimumRingSize = this._minimumRingSize;
}
if (this._httpCookie?.internalValue !== undefined) {
hasAnyValues = true;
internalValueResult.httpCookie = this._httpCookie?.internalValue;
}
return hasAnyValues ? internalValueResult : undefined;
}
set internalValue(value) {
if (value === undefined) {
this.isEmptyObject = false;
this._httpHeaderName = undefined;
this._minimumRingSize = undefined;
this._httpCookie.internalValue = undefined;
}
else {
this.isEmptyObject = Object.keys(value).length === 0;
this._httpHeaderName = value.httpHeaderName;
this._minimumRingSize = value.minimumRingSize;
this._httpCookie.internalValue = value.httpCookie;
}
}
get httpHeaderName() {
return this.getStringAttribute('http_header_name');
}
set httpHeaderName(value) {
this._httpHeaderName = value;
}
resetHttpHeaderName() {
this._httpHeaderName = undefined;
}
// Temporarily expose input value. Use with caution.
get httpHeaderNameInput() {
return this._httpHeaderName;
}
get minimumRingSize() {
return this.getNumberAttribute('minimum_ring_size');
}
set minimumRingSize(value) {
this._minimumRingSize = value;
}
resetMinimumRingSize() {
this._minimumRingSize = undefined;
}
// Temporarily expose input value. Use with caution.
get minimumRingSizeInput() {
return this._minimumRingSize;
}
get httpCookie() {
return this._httpCookie;
}
putHttpCookie(value) {
this._httpCookie.internalValue = value;
}
resetHttpCookie() {
this._httpCookie.internalValue = undefined;
}
// Temporarily expose input value. Use with caution.
get httpCookieInput() {
return this._httpCookie.internalValue;
}
}
exports.ComputeRegionBackendServiceConsistentHashOutputReference = ComputeRegionBackendServiceConsistentHashOutputReference;
_k = JSII_RTTI_SYMBOL_1;
ComputeRegionBackendServiceConsistentHashOutputReference[_k] = { fqn: "@cdktf/provider-google.computeRegionBackendService.ComputeRegionBackendServiceConsistentHashOutputReference", version: "14.3.0" };
function computeRegionBackendServiceFailoverPolicyToTerraform(struct) {
if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
return struct;
}
if (cdktf.isComplexElement(struct)) {
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
}
return {
disable_connection_drain_on_failover: cdktf.booleanToTerraform(struct.disableConnectionDrainOnFailover),
drop_traffic_if_unhealthy: cdktf.booleanToTerraform(struct.dropTrafficIfUnhealthy),
failover_ratio: cdktf.numberToTerraform(struct.failoverRatio),
};
}
exports.computeRegionBackendServiceFailoverPolicyToTerraform = computeRegionBackendServiceFailoverPolicyToTerraform;
function computeRegionBackendServiceFailoverPolicyToHclTerraform(struct) {
if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
return struct;
}
if (cdktf.isComplexElement(struct)) {
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
}
const attrs = {
disable_connection_drain_on_failover: {
value: cdktf.booleanToHclTerraform(struct.disableConnectionDrainOnFailover),
isBlock: false,
type: "simple",
storageClassType: "boolean",
},
drop_traffic_if_unhealthy: {
value: cdktf.booleanToHclTerraform(struct.dropTrafficIfUnhealthy),
isBlock: false,
type: "simple",
storageClassType: "boolean",
},
failover_ratio: {
value: cdktf.numberToHclTerraform(struct.failoverRatio),
isBlock: false,
type: "simple",
storageClassType: "number",
},
};
// remove undefined attributes
return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
}
exports.computeRegionBackendServiceFailoverPolicyToHclTerraform = computeRegionBackendServiceFailoverPolicyToHclTerraform;
class ComputeRegionBackendServiceFailoverPolicyOutputReference extends cdktf.ComplexObject {
/**
* @param terraformResource The parent resource
* @param terraformAttribute The attribute on the parent resource this class is referencing
*/
constructor(terraformResource, terraformAttribute) {
super(terraformResource, terraformAttribute, false, 0);
this.isEmptyObject = false;
}
get internalValue() {
let hasAnyValues = this.isEmptyObject;
const internalValueResult = {};
if (this._disableConnectionDrainOnFailover !== undefined) {
hasAnyValues = true;
internalValueResult.disableConnectionDrainOnFailover = this._disableConnectionDrainOnFailover;
}
if (this._dropTrafficIfUnhealthy !== undefined) {
hasAnyValues = true;
internalValueResult.dropTrafficIfUnhealthy = this._dropTrafficIfUnhealthy;
}
if (this._failoverRatio !== undefined) {
hasAnyValues = true;
internalValueResult.failoverRatio = this._failoverRatio;
}
return hasAnyValues ? internalValueResult : undefined;
}
set internalValue(value) {
if (value === undefined) {
this.isEmptyObject = false;
this._disableConnectionDrainOnFailover = undefined;
this._dropTrafficIfUnhealthy = undefined;
this._failoverRatio = undefined;
}
else {
this.isEmptyObject = Object.keys(value).length === 0;
this._disableConnectionDrainOnFailover = value.disableConnectionDrainOnFailover;
this._dropTrafficIfUnhealthy = value.dropTrafficIfUnhealthy;
this._failoverRatio = value.failoverRatio;
}
}
get disableConnectionDrainOnFailover() {
return this.getBooleanAttribute('disable_connection_drain_on_failover');
}
set disableConnectionDrainOnFailover(value) {
this._disableConnectionDrainOnFailover = value;
}
resetDisableConnectionDrainOnFailover() {
this._disableConnectionDrainOnFailover = undefined;
}
// Temporarily expose input value. Use with caution.
get disableConnectionDrainOnFailoverInput() {
return this._disableConnectionDrainOnFailover;
}
get dropTrafficIfUnhealthy() {
return this.getBooleanAttribute('drop_traffic_if_unhealthy');
}
set dropTrafficIfUnhealthy(value) {
this._dropTrafficIfUnhealthy = value;
}
resetDropTrafficIfUnhealthy() {
this._dropTrafficIfUnhealthy = undefined;
}
// Temporarily expose input value. Use with caution.
get dropTrafficIfUnhealthyInput() {
return this._dropTrafficIfUnhealthy;
}
get failoverRatio() {
return this.getNumberAttribute('failover_ratio');
}
set failoverRatio(value) {
this._failoverRatio = value;
}
resetFailoverRatio() {
this._failoverRatio = undefined;
}
// Temporarily expose input value. Use with caution.
get failoverRatioInput() {
return this._failoverRatio;
}
}
exports.ComputeRegionBackendServiceFailoverPolicyOutputReference = ComputeRegionBackendServiceFailoverPolicyOutputReference;
_l = JSII_RTTI_SYMBOL_1;
ComputeRegionBackendServiceFailoverPolicyOutputReference[_l] = { fqn: "@cdktf/provider-google.computeRegionBackendService.ComputeRegionBackendServiceFailoverPolicyOutputReference", version: "14.3.0" };
function computeRegionBackendServiceIapToTerraform(struct) {
if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
return struct;
}
if (cdktf.isComplexElement(struct)) {
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
}
return {
enabled: cdktf.booleanToTerraform(struct.enabled),
oauth2_client_id: cdktf.stringToTerraform(struct.oauth2ClientId),
oauth2_client_secret: cdktf.stringToTerraform(struct.oauth2ClientSecret),
};
}
exports.computeRegionBackendServiceIapToTerraform = computeRegionBackendServiceIapToTerraform;
function computeRegionBackendServiceIapToHclTerraform(struct) {
if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
return struct;
}
if (cdktf.isComplexElement(struct)) {
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
}
const attrs = {
enabled: {
value: cdktf.booleanToHclTerraform(struct.enabled),
isBlock: false,
type: "simple",
storageClassType: "boolean",
},
oauth2_client_id: {
value: cdktf.stringToHclTerraform(struct.oauth2ClientId),
isBlock: false,
type: "simple",
storageClassType: "string",
},
oauth2_client_secret: {
value: cdktf.stringToHclTerraform(struct.oauth2ClientSecret),
isBlock: false,
type: "simple",
storageClassType: "string",
},
};
// remove undefined attributes
return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
}
exports.computeRegionBackendServiceIapToHclTerraform = computeRegionBackendServiceIapToHclTerraform;
class ComputeRegionBackendServiceIapOutputReference extends cdktf.ComplexObject {
/**
* @param terraformResource The parent resource
* @param terraformAttribute The attribute on the parent resource this class is referencing
*/
constructor(terraformResource, terraformAttribute) {
super(terraformResource, terraformAttribute, false, 0);
this.isEmptyObject = false;
}
get internalValue() {
let hasAnyValues = this.isEmptyObject;
const internalValueResult = {};
if (this._enabled !== undefined) {
hasAnyValues = true;
internalValueResult.enabled = this._enabled;
}
if (this._oauth2ClientId !== undefined) {
hasAnyValues = true;
internalValueResult.oauth2ClientId = this._oauth2ClientId;
}
if (this._oauth2ClientSecret !== undefined) {
hasAnyValues = true;
internalValueResult.oauth2ClientSecret = this._oauth2ClientSecret;
}
return hasAnyValues ? internalValueResult : undefined;
}
set internalValue(value) {
if (value === undefined) {
this.isEmptyObject = false;
this._enabled = undefined;
this._oauth2ClientId = undefined;
this._oauth2ClientSecret = undefined;
}
else {
this.isEmptyObject = Object.keys(value).length === 0;
this._enabled = value.enabled;
this._oauth2ClientId = value.oauth2ClientId;
this._oauth2ClientSecret = value.oauth2ClientSecret;
}
}
get enabled() {
return this.getBooleanAttribute('enabled');
}
set enabled(value) {
this._enabled = value;
}
// Temporarily expose input value. Use with caution.
get enabledInput() {
return this._enabled;
}
get oauth2ClientId() {
return this.getStringAttribute('oauth2_client_id');
}
set oauth2ClientId(value) {
this._oauth2ClientId = value;
}
resetOauth2ClientId() {
this._oauth2ClientId = undefined;
}
// Temporarily expose input value. Use with caution.
get oauth2ClientIdInput() {
return this._oauth2ClientId;
}
get oauth2ClientSecret() {
return this.getStringAttribute('oauth2_client_secret');
}
set oauth2ClientSecret(value) {
this._oauth2ClientSecret = value;
}
resetOauth2ClientSecret() {
this._oauth2ClientSecret = undefined;
}
// Temporarily expose input value. Use with caution.
get oauth2ClientSecretInput() {
return this._oauth2ClientSecret;
}
// oauth2_client_secret_sha256 - computed: true, optional: false, required: false
get oauth2ClientSecretSha256() {
return this.getStringAttribute('oauth2_client_secret_sha256');
}
}
exports.ComputeRegionBackendServiceIapOutputReference = ComputeRegionBackendServiceIapOutputReference;
_m = JSII_RTTI_SYMBOL_1;
ComputeRegionBackendServiceIapOutputReference[_m] = { fqn: "@cdktf/provider-google.computeRegionBackendService.ComputeRegionBackendServiceIapOutputReference", version: "14.3.0" };
function computeRegionBackendServiceLogConfigToTerraform(struct) {
if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
return struct;
}
if (cdktf.isComplexElement(struct)) {
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
}
return {
enable: cdktf.booleanToTerraform(struct.enable),
sample_rate: cdktf.numberToTerraform(struct.sampleRate),
};
}
exports.computeRegionBackendServiceLogConfigToTerraform = computeRegionBackendServiceLogConfigToTerraform;
function computeRegionBackendServiceLogConfigToHclTerraform(struct) {
if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
return struct;
}
if (cdktf.isComplexElement(struct)) {
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
}
const attrs = {
enable: {
value: cdktf.booleanToHclTerraform(struct.enable),
isBlock: false,
type: "simple",
storageClassType: "boolean",
},
sample_rate: {
value: cdktf.numberToHclTerraform(struct.sampleRate),
isBlock: false,
type: "simple",
storageClassType: "number",
},
};
// remove undefined attributes
return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
}
exports.computeRegionBackendServiceLogConfigToHclTerraform = computeRegionBackendServiceLogConfigToHclTerraform;
class ComputeRegionBackendServiceLogConfigOutputReference extends cdktf.ComplexObject {
/**
* @param terraformResource The parent resource
* @param terraformAttribute The attribute on the parent resource this class is referencing
*/
constructor(terraformResource, terraformAttribute) {
super(terraformResource, terraformAttribute, false, 0);
this.isEmptyObject = false;
}
get internalValue() {
let hasAnyValues = this.isEmptyObject;
const internalValueResult = {};
if (this._enable !== undefined) {
hasAnyValues = true;
internalValueResult.enable = this._enable;
}
if (this._sampleRate !== undefined) {
hasAnyValues = true;
internalValueResult.sampleRate = this._sampleRate;
}
return hasAnyValues ? internalValueResult : undefined;
}
set internalValue(value) {
if (value === undefined) {
this.isEmptyObject = false;
this._enable = undefined;
this._sampleRate = undefined;
}
else {
this.isEmptyObject = Object.keys(value).length === 0;
this._enable = value.enable;
this._sampleRate = value.sampleRate;
}
}
get enable() {
return this.getBooleanAttribute('enable');
}
set enable(value) {
this._enable = value;
}
resetEnable() {
this._enable = undefined;
}
// Temporarily expose input value. Use with caution.
get enableInput() {
return this._enable;
}
get sampleRate() {
return this.getNumberAttribute('sample_rate');
}
set sampleRate(value) {
this._sampleRate = value;
}
resetSampleRate() {
this._sampleRate = undefined;
}
// Temporarily expose input value. Use with caution.
get sampleRateInput() {
return this._sampleRate;
}
}
exports.ComputeRegionBackendServiceLogConfigOutputReference = ComputeRegionBackendServiceLogConfigOutputReference;
_o = JSII_RTTI_SYMBOL_1;
ComputeRegionBackendServiceLogConfigOutputReference[_o] = { fqn: "@cdktf/provider-google.computeRegionBackendService.ComputeRegionBackendServiceLogConfigOutputReference", version: "14.3.0" };
function computeRegionBackendServiceOutlierDetectionBaseEjectionTimeToTerraform(struct) {
if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
return struct;
}
if (cdktf.isComplexElement(struct)) {
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
}
return {
nanos: cdktf.numberToTerraform(struct.nanos),
seconds: cdktf.numberToTerraform(struct.seconds),
};
}
exports.computeRegionBackendServiceOutlierDetectionBaseEjectionTimeToTerraform = computeRegionBackendServiceOutlierDetectionBaseEjectionTimeToTerraform;
function computeRegionBackendServiceOutlierDetectionBaseEjectionTimeToHclTerraform(struct) {
if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
return struct;
}
if (cdktf.isComplexElement(struct)) {
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
}
const attrs = {
nanos: {
value: cdktf.numberToHclTerraform(struct.nanos),
isBlock: false,
type: "simple",
storageClassType: "number",
},
seconds: {
value: cdktf.numberToHclTerraform(struct.seconds),
isBlock: false,
type: "simple",
storageClassType: "number",
},
};
// remove undefined attributes
return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
}
exports.computeRegionBackendServiceOutlierDetectionBaseEjectionTimeToHclTerraform = computeRegionBackendServiceOutlierDetectionBaseEjectionTimeToHclTerraform;
class ComputeRegionBackendServiceOutlierDetectionBaseEjectionTimeOutputReference extends cdktf.ComplexObject {
/**
* @param terraformResource The parent resource
* @param terraformAttribute The attribute on the parent resource this class is referencing
*/
constructor(terraformResource, terraformAttribute) {
super(terraformResource, terraformAttribute, false, 0);
this.isEmptyObject = false;
}
get internalValue() {
let hasAnyValues = this.isEmptyObject;
const internalValueResult = {};
if (this._nanos !== undefined) {
hasAnyValues = true;
internalValueResult.nanos = this._nanos;
}
if (this._seconds !== undefined) {
hasAnyValues = true;
internalValueResult.seconds = this._seconds;
}
return hasAnyValues ? internalValueResult : undefined;
}
set internalValue(value) {
if (value === undefined) {
this.isEmptyObject = false;
this._nanos = undefined;
this._seconds = undefined;
}
else {
this.isEmptyObject = Object.keys(value).length === 0;
this._nanos = value.nanos;
this._seconds = value.seconds;
}
}
get nanos() {
return this.getNumberAttribute('nanos');
}
set nanos(value) {
this._nanos = value;
}
resetNanos() {
this._nanos = undefined;
}
// Temporarily expose input value. Use with caution.
get nanosInput() {
return this._nanos;
}
get seconds() {
return this.getNumberAttribute('seconds');
}
set seconds(value) {
this._seconds = value;
}
// Temporarily expose input value. Use with caution.
get secondsInput() {
return this._seconds;
}
}
exports.ComputeRegionBackendServiceOutlierDetectionBaseEjectionTimeOutputReference = ComputeRegionBackendServiceOutlierDetectionBaseEjectionTimeOutputReference;
_p = JSII_RTTI_SYMBOL_1;
ComputeRegionBackendServiceOutlierDetectionBaseEjectionTimeOutputReference[_p] = { fqn: "@cdktf/provider-google.computeRegionBackendService.ComputeRegionBackendServiceOutlierDetectionBaseEjectionTimeOutputReference", version: "14.3.0" };
function computeRegionBackendServiceOutlierDetectionIntervalToTerraform(struct) {
if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
return struct;
}
if (cdktf.isComplexElement(struct)) {
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
}
return {
nanos: cdktf.numberToTerraform(struct.nanos),
seconds: cdktf.numberToTerraform(struct.seconds),
};
}
exports.computeRegionBackendServiceOutlierDetectionIntervalToTerraform = computeRegionBackendServiceOutlierDetectionIntervalToTerraform;
function computeRegionBackendServiceOutlierDetectionIntervalToHclTerraform(struct) {
if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
return struct;
}
if (cdktf.isComplexElement(struct)) {
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
}
const attrs = {
nanos: {
value: cdktf.numberToHclTerraform(struct.nanos),
isBlock: false,
type: "simple",
storageClassType: "number",
},
seconds: {
value: cdktf.numberToHclTerraform(struct.seconds),
isBlock: false,
type: "simple",
storageClassType: "number",
},
};
// remove undefined attributes
return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
}
exports.computeRegionBackendServiceOutlierDetectionIntervalToHclTerraform = computeRegionBackendServiceOutlierDetectionIntervalToHclTerraform;
class ComputeRegionBackendServiceOutlierDetectionIntervalOutputReference extends cdktf.ComplexObject {
/**
* @param terraformResource The parent resource
* @param terraformAttribute The attribute on the parent resource this class is referencing
*/
constructor(terraformResource, terraformAttribute) {
super(terraformResource, terraformAttribute, false, 0);
this.isEmptyObject = false;
}
get internalValue() {
let hasAnyValues = this.isEmptyObject;
const internalValueResult = {};
if (this._nanos !== undefined) {
hasAnyValues = true;
internalValueResult.nanos = this._nanos;
}
if (this._seconds !== undefined) {
hasAnyValues = true;
internalValueResult.seconds = this._seconds;
}
return hasAnyValues ? internalValueResult : undefined;
}
set internalValue(value) {
if (value === undefined) {
this.isEmptyObject = false;
this._nanos = undefined;
this._seconds = undefined;
}
else {
this.isEmptyObject = Object.keys(value).length === 0;
this._nanos = value.nanos;
this._seconds = value.seconds;
}
}
get nanos() {
return this.getNumberAttribute('nanos');
}
set nanos(value) {
this._nanos = value;
}
resetNanos() {
this._nanos = undefined;
}
// Temporarily expose input value. Use with caution.
get nanosInput() {
return this._nanos;
}
get seconds() {
return this.getNumberAttribute('seconds');
}
set seconds(value) {
this._seconds = value;
}
// Temporarily expose input value. Use with caution.
get secondsInput() {
return this._seconds;
}
}
exports.ComputeRegionBackendServiceOutlierDetectionIntervalOutputReference = ComputeRegionBackendServiceOutlierDetectionIntervalOutputReference;
_q = JSII_RTTI_SYMBOL_1;
ComputeRegionBackendServiceOutlierDetectionIntervalOutputReference[_q] = { fqn: "@cdktf/provider-google.computeRegionBackendService.ComputeRegionBackendServiceOutlierDetectionIntervalOutputReference", version: "14.3.0" };
function computeRegionBackendServiceOutlierDetectionToTerraform(struct) {
if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
return struct;
}
if (cdktf.isComplexElement(struct)) {
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
}
return {
consecutive_errors: cdktf.numberToTerraform(struct.consecutiveErrors),
consecutive_gateway_failure: cdktf.numberToTerraform(struct.consecutiveGatewayFailure),
enforcing_consecutive_errors: cdktf.numberToTerraform(struct.enforcingConsecutiveErrors),
enforcing_consecutive_gateway_failure: cdktf.numberToTerraform(struct.enforcingConsecutiveGatewayFailure),
enforcing_success_rate: cdktf.numberToTerraform(struct.enforcingSuccessRate),
max_ejection_percent: cdktf.numberToTerraform(struct.maxEjectionPercent),
success_rate_minimum_hosts: cdktf.numberToTerraform(struct.successRateMinimumHosts),
success_rate_request_volume: cdktf.numberToTerraform(struct.successRateRequestVolume),
success_rate_stdev_factor: cdktf.numberToTerraform(struct.successRateStdevFactor),
base_ejection_time: computeRegionBackendServiceOutlierDetectionBaseEjectionTimeToTerraform(struct.baseEjectionTime),
interval: computeRegionBackendServiceOutlierDetectionIntervalToTerraform(struct.interval),
};
}
exports.computeRegionBackendServiceOutlierDetectionToTerraform = computeRegionBackendServiceOutlierDetectionToTerraform;
function computeRegionBackendServiceOutlierDetectionToHclTerraform(struct) {
if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
return struct;
}
if (cdktf.isComplexElement(struct)) {
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
}
const attrs = {
consecutive_errors: {
value: cdktf.numberToHclTerraform(struct.consecutiveErrors),
isBlock: false,
type: "simple",
storageClassType: "number",
},
consecutive_gateway_failure: {
value: cdktf.numberToHclTerraform(struct.consecutiveGatewayFailure),
isBlock: false,
type: "simple",
storageClassType: "number",
},
enforcing_consecutive_errors: {
value: cdktf.numberToHclTerraform(struct.enforcingConsecutiveErrors),
isBlock: false,
type: "simple",
storageClassType: "number",
},
enforcing_consecutive_gateway_failure: {
value: cdktf.numberToHclTerraform(struct.enforcingConsecutiveGatewayFailure),
isBlock: false,
type: "simple",
storageClassType: "number",
},
enforcing_success_rate: {
value: cdktf.numberToHclTerraform(struct.enforcingSuccessRate),
isBlock: false,
type: "simple",
storageClassType: "number",
},
max_ejection_percent: {
value: cdktf.numberToHclTerraform(struct.maxEjectionPercent),
isBlock: false,
type: "simple",
storageClassType: "number",
},
success_rate_minimum_hosts: {
value: cdktf.numberToHclTerraform(struct.successRateMinimumHosts),
isBlock: false,
type: "simple",
storageClassType: "number",
},
success_rate_request_volume: {
value: cdktf.numberToHclTerraform(struct.successRateRequestVolume),
isBlock: false,
type: "simple",
storageClassType: "number",
},
success_rate_stdev_factor: {
value: cdktf.numberToHclTerraform(struct.successRateStdevFactor),
isBlock: false,
type: "simple",
storageClassType: "number",
},
base_ejection_time: {
value: computeRegionBackendServiceOutlierDetectionBaseEjectionTimeToHclTerraform(struct.baseEjectionTime),
isBlock: true,
type: "list",
storageClassType: "ComputeRegionBackendServiceOutlierDetectionBaseEjectionTimeList",
},
interval: {
value: computeRegionBackendServiceOutlierDetectionIntervalToHclTerraform(struct.interval),
isBlock: true,
type: "list",
storageClassType: "ComputeRegionBackendServiceOutlierDetectionIntervalList",
},
};
// remove undefined attributes
return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
}
exports.computeRegionBackendServiceOutlierDetectionToHclTerraform = computeRegionBackendServiceOutlierDetectionToHclTerraform;
class ComputeRegionBackendServiceOutlierDetectionOutputReference extends cdktf.ComplexObject {
/**
* @param terraformResource The parent resource
* @param terraformAttribute The attribute on the parent resource this class is referencing
*/
constructor(terraformResource, terraformAttribute) {
super(terraformResource, terraformAttribute, false, 0);
this.isEmptyObject = false;
// base_ejection_time - computed: false, optional: true, required: false
this._baseEjectionTime = new ComputeRegionBackendServiceOutlierDetectionBaseEjectionTimeOutputReference(this, "base_ejection_time");
// interval - computed: false, optional: true, required: false
this._interval = new ComputeRegionBackendServiceOutlierDetectionIntervalOutputReference(this, "interval");
}
get internalValue() {
let hasAnyValues = this.isEmptyObject;
const internalValueResult = {};
if (this._consecutiveErrors !== undefined) {
hasAnyValues = true;
internalValueResult.consecutiveErrors = this._consecutiveErrors;
}
if (this._consecutiveGatewayFailure !== undefined) {
hasAnyValues = true;
internalValueResult.consecutiveGatewayFailure = this._consecutiveGatewayFailure;
}
if (this._enforcingConsecutiveErrors !== undefined) {
hasAnyValues = true;
internalValueResult.enforcingConsecutiveErrors = this._enforcingConsecutiveErrors;
}
if (this._enforcingConsecutiveGatewayFailure !== undefined) {
hasAnyValues = true;
internalValueResult.enforcingConsecutiveGatewayFailure = this._enforcingConsecutiveGatewayFailure;
}
if (this._enforcingSuccessRate !== undefined) {
hasAnyValues = true;
internalValueResult.enforcingSuccessRate = this._enforcingSuccessRate;
}
if (this._maxEjectionPercent !== undefined) {
hasAnyValues = true;
internalValueResult.maxEjectionPercent = this._maxEjectionPercent;
}
if (this._successRateMinimumHosts !== undefined) {
hasAnyValues = true;
internalValueResult.successRateMinimumHosts = this._successRateMinimumHosts;
}
if (this._successRateRequestVolume !== undefined) {
hasAnyValues = true;
internalValueResult.successRateRequestVolume = this._successRateRequestVolume;
}
if (this._successRateStdevFactor !== undefined) {
hasAnyValues = true;
internalValueResult.successRateStdevFactor = this._successRateStdevFactor;
}
if (this._baseEjectionTime?.internalValue !== undefined) {
hasAnyValues = true;
internalValueResult.baseEjectionTime = this._baseEjectionTime?.internalValue;
}
if (this._interval?.internalValue !== undefined) {
hasAnyValues = true;
internalValueResult.interval = this._interval?.internalValue;
}
return hasAnyValues ? internalValueResult : undefined;
}
set internalValue(value) {
if (value === undefined) {
this.isEmptyObject = false;
this._consecutiveErrors = undefined;
this._consecutiveGatewayFailure = undefined;
this._enforcingConsecutiveErrors = undefined;
this._enforcingConsecutiveGatewayFailure = undefined;
this._enforcingSuccessRate = undefined;
this._maxEjectionPercent = undefined;
this._successRateMinimumHosts = undefined;
this._successRateRequestVolume = undefined;
this._successRateStdevFactor = undefined;
this._baseEjectionTime.internalValue = undefined;
this._interval.internalValue = undefined;
}
else {
this.isEmptyObject = Object.keys(value).length === 0;
this._consecutiveErrors = value.consecutiveErrors;
this._consecutiveGatewayFailure = value.consecutiveGatewayFailure;
this._enforcingConsecutiveErrors = value.enforcingConsecutiveErrors;
this._enforcingConsecutiveGatewayFailure = value.enforcingConsecutiveGatewayFailure;
this._enforcingSuccessRate = value.enforcingSuccessRate;
this._maxEjectionPercent = value.maxEjectionPercent;
this._successRateMinimumHosts = value.successRateMinimumHosts;
this._successRateRequestVolume = value.successRateRequestVolume;
this._successRateStdevFactor = value.successRateStdevFactor;
this._baseEjectionTime.internalValue = value.baseEjectionTime;
this._interval.internalValue = value.interval;
}
}
get consecutiveErrors() {
return this.getNumberAttribute('consecutive_errors');
}
set consecutiveErrors(value) {
this._consecutiveErrors = value;
}
resetConsecutiveErrors() {
this._consecutiveErrors = undefined;
}
// Temporarily expose input value. Use with caution.
get consecutiveErrorsInput() {
return this._consecutiveErrors;
}
get consecutiveGatewayFailure() {
return this.getNumberAttribute('consecutive_gateway_failure');
}
set consecutiveGatewayFailure(value) {
this._consecutiveGatewayFailure = value;
}
resetConsecutiveGatewayFailure() {
this._consecutiveGatewayFailure = undefined;
}
// Temporarily expose input value. Use with caution.
get consecutiveGatewayFailureInput() {
return this._consecutiveGatewayFailure;
}
get enforcingConsecutiveErrors() {
return this.getNumberAttribute('enforcing_consecutive_errors');
}
set enforcingConsecutiveErrors(value) {
this._enforcingConsecutiveErrors = value;
}
resetEnforcingConsecutiveErrors() {
this._enforcingConsecutiveErrors = undefined;
}
// Temporarily expose input value. Use with caution.
get enforcingConsecutiveErrorsInput() {
return this._enforcingConsecutiveErrors;
}
get enforcingConsecutiveGatewayFailure() {
return this.getNumberAttribute('enforcing_consecutive_gateway_failure');
}
set enforcingConsecutiveGatewayFailure(value) {
this._enforcingConsecutiveGatewayFailure = value;
}
resetEnforcingConsecutiveGatewayFailure() {
this._enforcingConsecutiveGatewayFailure = undefined;
}
// Temporarily expose input value. Use with caution.
get enforcingConsecutiveGatewayFailureInput() {
return this._enforcingConsecutiveGatewayFailure;
}
get enforcingSuccessRate() {
return this.getNumberAttribute('enforcing_success_rate');
}
set enforcingSuccessRate(value) {
this._enforcingSuccessRate = value;
}
resetEnforcingSuccessRate() {
this._enforcingSuccessRate = undefined;
}
// Temporarily expose input value. Use with caution.
get enforcingSuccessRateInput() {
return this._enforcingSuccessRate;
}
get maxEjectionPercent() {
return this.getNumberAttribute('max_ejection_percent');
}
set maxEjectionPercent(value) {
this._maxEjectionPercent = value;
}
resetMaxEjectionPercent() {
this._maxEjectionPercent = undefined;
}
// Temporarily expose input value. Use with caution.
get maxEjectionPercentInput() {
return this._maxEjectionPercent;
}
get successRateMinimumHosts() {
return this.getNumberAttribute('success_rate_minimum_hosts');
}
set successRateMinimumHosts(value) {
this._successRateMinimumHosts = value;
}
resetSuccessRateMinimumHosts() {
this._successRateMinimumHosts = undefined;
}
// Temporarily expose input value. Use with caution.
get successRateMinimumHostsInput() {
return this._successRateMinimumHosts;
}
get successRateRequestVolume() {
return this.getNumberAttribute('success_rate_request_volume');
}
set successRateRequestVolume(value) {
this._successRateRequestVolume = value;
}
resetSuccessRateRequestVolume() {
this._successRateRequestVolume = undefined;
}
// Temporarily expose input value. Use with caution.
get successRateRequestVolumeInput() {
return this._successRateRequestVolume;
}
get successRateStdevFactor() {
return this.getNumberAttribute('success_rate_stdev_factor');
}
set successRateStdevFactor(value) {
this._successRateStdevFactor = value;
}
resetSuccessRateStdevFactor() {
this._successRateStdevFactor = undefined;
}
// Temporarily expose input value. Use with caution.
get successRateStdevFactorInput() {
return this._successRateStdevFactor;
}
get baseEjectionTime() {
return this._baseEjectionTime;
}
putBaseEjectionTime(value) {
this._baseEjectionTime.internalValue = value;
}
resetBaseEjectionTime() {
this._baseEjectionTime.internalValue = undefined;
}
// Temporarily expose input value. Use with caution.
get baseEjectionTimeInput() {
return this._baseEjectionTime.internalValue;
}
get interval() {
return this._interval;
}
putInterval(value) {
this._interval.internalValue = value;
}
resetInterval() {
this._interval.internalValue = undefined;
}
// Temporarily expose input value. Use with caution.
get intervalInput() {
return this._interval.internalValue;
}
}
exports.ComputeRegionBackendServiceOutlierDetectionOutputReference = ComputeRegionBackendServiceOutlierDetectionOutputReference;
_r = JSII_RTTI_SYMBOL_1;
ComputeRegionBackendServiceOutlierDetectionOutputReference[_r] = { fqn: "@cdktf/provider-google.computeRegionBackendService.ComputeRegionBackendServiceOutlierDetectionOutputReference", version: "14.3.0" };
function computeRegionBackendServiceTimeoutsToTerraform(struct) {
if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
return struct;
}
if (cdktf.isComplexElement(struct)) {
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
}
return {
create: cdktf.stringToTerraform(struct.create),
delete: cdktf.stringToTerraform(struct.delete),
update: cdktf.stringToTerraform(struct.update),
};
}
exports.computeRegionBackendServiceTimeoutsToTerraform = computeRegionBackendServiceTimeoutsToTerraform;
function computeRegionBackendServiceTimeoutsToHclTerraform(struct) {
if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
return struct;
}
if (cdktf.isComplexElement(struct)) {
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
}
const attrs = {
create: {
value: cdktf.stringToHclTerraform(struct.create),
isBlock: false,
type: "simple",
storageClassType: "string",
},
delete: {
value: cdktf.stringToHclTerraform(struct.delete),
isBlock: false,
type: "simple",
storageClassType: "string",
},
update: {
value: cdktf.stringToHclTerraform(struct.update),
isBlock: false,
type: "simple",
storageClassType: "string",
},
};
// remove undefined attributes
return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
}
exports.computeRegionBackendServiceTimeoutsToHclTerraform = computeRegionBackendServiceTimeoutsToHclTerraform;
class ComputeRegionBackendServiceTimeoutsOutputReference extends cdktf.ComplexObject {
/**
* @param terraformResource The parent resource
* @param terraformAttribute The attribute on the parent resource this class is referencing
*/
constructor(terraformResource, terraformAttribute) {
super(terraformResource, terraformAttribute, false);
this.isEmptyObject = false;
}
get internalValue() {
if (this.resolvableValue) {
return this.resolvableValue;
}
let hasAnyValues = this.isEmptyObject;
const internalValueResult = {};
if (this._create !== undefined) {
hasAnyValues = true;
internalValueResult.create = this._create;
}
if (this._delete !== undefined) {
hasAnyValues = true;
internalValueResult.delete = this._delete;
}
if (this._update !== undefined) {
hasAnyValues = true;
internalValueResult.update = this._update;
}
return hasAnyValues ? internalValueResult : undefined;
}
set internalValue(value) {
if (value === undefined) {
this.isEmptyObject = false;
this.resolvableValue = undefined;
this._create = undefined;
this._delete = undefined;
this._update = undefined;
}
else if (cdktf.Tokenization.isResolvable(value)) {
this.isEmptyObject = false;
this.resolvableValue = value;
}
else {
this.isEmptyObject = Object.keys(value).length === 0;
this.resolvableValue = undefined;
this._create = value.create;
this._delete = value.delete;
this._update = value.update;
}
}
get create() {
return this.getStringAttribute('create');
}
set create(value) {
this._create = value;
}
resetCreate() {
this._create = undefined;
}
// Temporarily expose input value. Use with caution.
get createInput() {
return this._create;
}
get delete() {
return this.getStringAttribute('delete');
}
set delete(value) {
this._delete = value;
}
resetDelete() {
this._delete = undefined;
}
// Temporarily expose input value. Use with caution.
get deleteInput() {
return this._delete;
}
get update() {
return this.getStringAttribute('update');
}
set update(value) {
this._update = value;
}
resetUpdate() {
this._update = undefined;
}
// Temporarily expose input value. Use with caution.
get updateInput() {
return this._update;
}
}
exports.ComputeRegionBackendServiceTimeoutsOutputReference = ComputeRegionBackendServiceTimeoutsOutputReference;
_s = JSII_RTTI_SYMBOL_1;
ComputeRegionBackendServiceTimeoutsOutputReference[_s] = { fqn: "@cdktf/provider-google.computeRegionBackendService.ComputeRegionBackendServiceTimeoutsOutputReference", version: "14.3.0" };
/**
* Represents a {@link https://registry.terraform.io/providers/hashicorp/google/6.4.0/docs/resources/compute_region_backend_service google_compute_region_backend_service}
*/
class ComputeRegionBackendService extends cdktf.TerraformResource {
// ==============
// STATIC Methods
// ==============
/**
* Generates CDKTF code for importing a ComputeRegionBackendService resource upon running "cdktf plan <stack-name>"
* @param scope The scope in which to define this construct
* @param importToId The construct id used in the generated config for the ComputeRegionBackendService to import
* @param importFromId The id of the existing ComputeRegionBackendService that should be imported. Refer to the {@link https://registry.terraform.io/providers/hashicorp/google/6.4.0/docs/resources/compute_region_backend_service#import import section} in the documentation of this resource for the id to use
* @param provider? Optional instance of the provider where the ComputeRegionBackendService to import is found
*/
static generateConfigForImport(scope, importToId, importFromId, provider) {
return new cdktf.ImportableResource(scope, importToId, { terraformResourceType: "google_compute_region_backend_service", importId: importFromId, provider });
}
// ===========
// INITIALIZER
// ===========
/**
* Create a new {@link https://registry.terraform.io/providers/hashicorp/google/6.4.0/docs/resources/compute_region_backend_service google_compute_region_backend_service} Resource
*
* @param scope The scope in which to define this construct
* @param id The scoped construct ID. Must be unique amongst siblings in the same scope
* @param options ComputeRegionBackendServiceConfig
*/
constructor(scope, id, config) {
super(scope, id, {
terraformResourceType: 'google_compute_region_backend_service',
terraformGeneratorMetadata: {
providerName: 'google',
providerVersion: '6.4.0',
providerVersionConstraint: '~> 6.0'
},
provider: config.provider,
dependsOn: config.dependsOn,
count: config.count,
lifecycle: config.lifecycle,
provisioners: config.provisioners,
connection: config.connection,
forEach: config.forEach
});
// backend - computed: false, optional: true, required: false
this._backend = new ComputeRegionBackendServiceBackendList(this, "backend", true);
// cdn_policy - computed: false, optional: true, required: false
this._cdnPolicy = new ComputeRegionBackendServiceCdnPolicyOutputReference(this, "cdn_policy");
// circuit_breakers - computed: false, optional: true, required: false
this._circuitBreakers = new ComputeRegionBackendServiceCircuitBreakersOutputReference(this, "circuit_breakers");
// consistent_hash - computed: false, optional: true, required: false
this._consistentHash = new ComputeRegionBackendServiceConsistentHashOutputReference(this, "consistent_hash");
// failover_policy - computed: false, optional: true, required: false
this._failoverPolicy = new ComputeRegionBackendServiceFailoverPolicyOutputReference(this, "failover_policy");
// iap - computed: false, optional: true, required: false
this._iap = new ComputeRegionBackendServiceIapOutputReference(this, "iap");
// log_config - computed: false, optional: true, required: false
this._logConfig = new ComputeRegionBackendServiceLogConfigOutputReference(this, "log_config");
// outlier_detection - computed: false, optional: true, required: false
this._outlierDetection = new ComputeRegionBackendServiceOutlierDetectionOutputReference(this, "outlier_detection");
// timeouts - computed: false, optional: true, required: false
this._timeouts = new ComputeRegionBackendServiceTimeoutsOutputReference(this, "timeouts");
this._affinityCookieTtlSec = config.affinityCookieTtlSec;
this._connectionDrainingTimeoutSec = config.connectionDrainingTimeoutSec;
this._description = config.description;
this._enableCdn = config.enableCdn;
this._healthChecks = config.healthChecks;
this._id = config.id;
this._loadBalancingScheme = config.loadBalancingScheme;
this._localityLbPolicy = config.localityLbPolicy;
this._name = config.name;
this._network = config.network;
this._portName = config.portName;
this._project = config.project;
this._protocol = config.protocol;
this._region = config.region;
this._sessionAffinity = config.sessionAffinity;
this._timeoutSec = config.timeoutSec;
this._backend.internalValue = config.backend;
this._cdnPolicy.internalValue = config.cdnPolicy;
this._circuitBreakers.internalValue = config.circuitBreakers;
this._consistentHash.internalValue = config.consistentHash;
this._failoverPolicy.internalValue = config.failoverPolicy;
this._iap.internalValue = config.iap;
this._logConfig.internalValue = config.logConfig;
this._outlierDetection.internalValue = config.outlierDetection;
this._timeouts.internalValue = config.timeouts;
}
get affinityCookieTtlSec() {
return this.getNumberAttribute('affinity_cookie_ttl_sec');
}
set affinityCookieTtlSec(value) {
this._affinityCookieTtlSec = value;
}
resetAffinityCookieTtlSec() {
this._affinityCookieTtlSec = undefined;
}
// Temporarily expose input value. Use with caution.
get affinityCookieTtlSecInput() {
return this._affinityCookieTtlSec;
}
get connectionDrainingTimeoutSec() {
return this.getNumberAttribute('connection_draining_timeout_sec');
}
set connectionDrainingTimeoutSec(value) {
this._connectionDrainingTimeoutSec = value;
}
resetConnectionDrainingTimeoutSec() {
this._connectionDrainingTimeoutSec = undefined;
}
// Temporarily expose input value. Use with caution.
get connectionDrainingTimeoutSecInput() {
return this._connectionDrainingTimeoutSec;
}
// creation_timestamp - computed: true, optional: false, required: false
get creationTimestamp() {
return this.getStringAttribute('creation_timestamp');
}
get description() {
return this.getStringAttribute('description');
}
set description(value) {
this._description = value;
}
resetDescription() {
this._description = undefined;
}
// Temporarily expose input value. Use with caution.
get descriptionInput() {
return this._description;
}
get enableCdn() {
return this.getBooleanAttribute('enable_cdn');
}
set enableCdn(value) {
this._enableCdn = value;
}
resetEnableCdn() {
this._enableCdn = undefined;
}
// Temporarily expose input value. Use with caution.
get enableCdnInput() {
return this._enableCdn;
}
// fingerprint - computed: true, optional: false, required: false
get fingerprint() {
return this.getStringAttribute('fingerprint');
}
// generated_id - computed: true, optional: false, required: false
get generatedId() {
return this.getNumberAttribute('generated_id');
}
get healthChecks() {
return cdktf.Fn.tolist(this.getListAttribute('health_checks'));
}
set healthChecks(value) {
this._healthChecks = value;
}
resetHealthChecks() {
this._healthChecks = undefined;
}
// Temporarily expose input value. Use with caution.
get healthChecksInput() {
return this._healthChecks;
}
get id() {
return this.getStringAttribute('id');
}
set id(value) {
this._id = value;
}
resetId() {
this._id = undefined;
}
// Temporarily expose input value. Use with caution.
get idInput() {
return this._id;
}
get loadBalancingScheme() {
return this.getStringAttribute('load_balancing_scheme');
}
set loadBalancingScheme(value) {
this._loadBalancingScheme = value;
}
resetLoadBalancingScheme() {
this._loadBalancingScheme = undefined;
}
// Temporarily expose input value. Use with caution.
get loadBalancingSchemeInput() {
return this._loadBalancingScheme;
}
get localityLbPolicy() {
return this.getStringAttribute('locality_lb_policy');
}
set localityLbPolicy(value) {
this._localityLbPolicy = value;
}
resetLocalityLbPolicy() {
this._localityLbPolicy = undefined;
}
// Temporarily expose input value. Use with caution.
get localityLbPolicyInput() {
return this._localityLbPolicy;
}
get name() {
return this.getStringAttribute('name');
}
set name(value) {
this._name = value;
}
// Temporarily expose input value. Use with caution.
get nameInput() {
return this._name;
}
get network() {
return this.getStringAttribute('network');
}
set network(value) {
this._network = value;
}
resetNetwork() {
this._network = undefined;
}
// Temporarily expose input value. Use with caution.
get networkInput() {
return this._network;
}
get portName() {
return this.getStringAttribute('port_name');
}
set portName(value) {
this._portName = value;
}
resetPortName() {
this._portName = undefined;
}
// Temporarily expose input value. Use with caution.
get portNameInput() {
return this._portName;
}
get project() {
return this.getStringAttribute('project');
}
set project(value) {
this._project = value;
}
resetProject() {
this._project = undefined;
}
// Temporarily expose input value. Use with caution.
get projectInput() {
return this._project;
}
get protocol() {
return this.getStringAttribute('protocol');
}
set protocol(value) {
this._protocol = value;
}
resetProtocol() {
this._protocol = undefined;
}
// Temporarily expose input value. Use with caution.
get protocolInput() {
return this._protocol;
}
get region() {
return this.getStringAttribute('region');
}
set region(value) {
this._region = value;
}
resetRegion() {
this._region = undefined;
}
// Temporarily expose input value. Use with caution.
get regionInput() {
return this._region;
}
// self_link - computed: true, optional: false, required: false
get selfLink() {
return this.getStringAttribute('self_link');
}
get sessionAffinity() {
return this.getStringAttribute('session_affinity');
}
set sessionAffinity(value) {
this._sessionAffinity = value;
}
resetSessionAffinity() {
this._sessionAffinity = undefined;
}
// Temporarily expose input value. Use with caution.
get sessionAffinityInput() {
return this._sessionAffinity;
}
get timeoutSec() {
return this.getNumberAttribute('timeout_sec');
}
set timeoutSec(value) {
this._timeoutSec = value;
}
resetTimeoutSec() {
this._timeoutSec = undefined;
}
// Temporarily expose input value. Use with caution.
get timeoutSecInput() {
return this._timeoutSec;
}
get backend() {
return this._backend;
}
putBackend(value) {
this._backend.internalValue = value;
}
resetBackend() {
this._backend.internalValue = undefined;
}
// Temporarily expose input value. Use with caution.
get backendInput() {
return this._backend.internalValue;
}
get cdnPolicy() {
return this._cdnPolicy;
}
putCdnPolicy(value) {
this._cdnPolicy.internalValue = value;
}
resetCdnPolicy() {
this._cdnPolicy.internalValue = undefined;
}
// Temporarily expose input value. Use with caution.
get cdnPolicyInput() {
return this._cdnPolicy.internalValue;
}
get circuitBreakers() {
return this._circuitBreakers;
}
putCircuitBreakers(value) {
this._circuitBreakers.internalValue = value;
}
resetCircuitBreakers() {
this._circuitBreakers.internalValue = undefined;
}
// Temporarily expose input value. Use with caution.
get circuitBreakersInput() {
return this._circuitBreakers.internalValue;
}
get consistentHash() {
return this._consistentHash;
}
putConsistentHash(value) {
this._consistentHash.internalValue = value;
}
resetConsistentHash() {
this._consistentHash.internalValue = undefined;
}
// Temporarily expose input value. Use with caution.
get consistentHashInput() {
return this._consistentHash.internalValue;
}
get failoverPolicy() {
return this._failoverPolicy;
}
putFailoverPolicy(value) {
this._failoverPolicy.internalValue = value;
}
resetFailoverPolicy() {
this._failoverPolicy.internalValue = undefined;
}
// Temporarily expose input value. Use with caution.
get failoverPolicyInput() {
return this._failoverPolicy.internalValue;
}
get iap() {
return this._iap;
}
putIap(value) {
this._iap.internalValue = value;
}
resetIap() {
this._iap.internalValue = undefined;
}
// Temporarily expose input value. Use with caution.
get iapInput() {
return this._iap.internalValue;
}
get logConfig() {
return this._logConfig;
}
putLogConfig(value) {
this._logConfig.internalValue = value;
}
resetLogConfig() {
this._logConfig.internalValue = undefined;
}
// Temporarily expose input value. Use with caution.
get logConfigInput() {
return this._logConfig.internalValue;
}
get outlierDetection() {
return this._outlierDetection;
}
putOutlierDetection(value) {
this._outlierDetection.internalValue = value;
}
resetOutlierDetection() {
this._outlierDetection.internalValue = undefined;
}
// Temporarily expose input value. Use with caution.
get outlierDetectionInput() {
return this._outlierDetection.internalValue;
}
get timeouts() {
return this._timeouts;
}
putTimeouts(value) {
this._timeouts.internalValue = value;
}
resetTimeouts() {
this._timeouts.internalValue = undefined;
}
// Temporarily expose input value. Use with caution.
get timeoutsInput() {
return this._timeouts.internalValue;
}
// =========
// SYNTHESIS
// =========
synthesizeAttributes() {
return {
affinity_cookie_ttl_sec: cdktf.numberToTerraform(this._affinityCookieTtlSec),
connection_draining_timeout_sec: cdktf.numberToTerraform(this._connectionDrainingTimeoutSec),
description: cdktf.stringToTerraform(this._description),
enable_cdn: cdktf.booleanToTerraform(this._enableCdn),
health_checks: cdktf.listMapper(cdktf.stringToTerraform, false)(this._healthChecks),
id: cdktf.stringToTerraform(this._id),
load_balancing_scheme: cdktf.stringToTerraform(this._loadBalancingScheme),
locality_lb_policy: cdktf.stringToTerraform(this._localityLbPolicy),
name: cdktf.stringToTerraform(this._name),
network: cdktf.stringToTerraform(this._network),
port_name: cdktf.stringToTerraform(this._portName),
project: cdktf.stringToTerraform(this._project),
protocol: cdktf.stringToTerraform(this._protocol),
region: cdktf.stringToTerraform(this._region),
session_affinity: cdktf.stringToTerraform(this._sessionAffinity),
timeout_sec: cdktf.numberToTerraform(this._timeoutSec),
backend: cdktf.listMapper(computeRegionBackendServiceBackendToTerraform, true)(this._backend.internalValue),
cdn_policy: computeRegionBackendServiceCdnPolicyToTerraform(this._cdnPolicy.internalValue),
circuit_breakers: computeRegionBackendServiceCircuitBreakersToTerraform(this._circuitBreakers.internalValue),
consistent_hash: computeRegionBackendServiceConsistentHashToTerraform(this._consistentHash.internalValue),
failover_policy: computeRegionBackendServiceFailoverPolicyToTerraform(this._failoverPolicy.internalValue),
iap: computeRegionBackendServiceIapToTerraform(this._iap.internalValue),
log_config: computeRegionBackendServiceLogConfigToTerraform(this._logConfig.internalValue),
outlier_detection: computeRegionBackendServiceOutlierDetectionToTerraform(this._outlierDetection.internalValue),
timeouts: computeRegionBackendServiceTimeoutsToTerraform(this._timeouts.internalValue),
};
}
synthesizeHclAttributes() {
const attrs = {
affinity_cookie_ttl_sec: {
value: cdktf.numberToHclTerraform(this._affinityCookieTtlSec),
isBlock: false,
type: "simple",
storageClassType: "number",
},
connection_draining_timeout_sec: {
value: cdktf.numberToHclTerraform(this._connectionDrainingTimeoutSec),
isBlock: false,
type: "simple",
storageClassType: "number",
},
description: {
value: cdktf.stringToHclTerraform(this._description),
isBlock: false,
type: "simple",
storageClassType: "string",
},
enable_cdn: {
value: cdktf.booleanToHclTerraform(this._enableCdn),
isBlock: false,
type: "simple",
storageClassType: "boolean",
},
health_checks: {
value: cdktf.listMapperHcl(cdktf.stringToHclTerraform, false)(this._healthChecks),
isBlock: false,
type: "set",
storageClassType: "stringList",
},
id: {
value: cdktf.stringToHclTerraform(this._id),
isBlock: false,
type: "simple",
storageClassType: "string",
},
load_balancing_scheme: {
value: cdktf.stringToHclTerraform(this._loadBalancingScheme),
isBlock: false,
type: "simple",
storageClassType: "string",
},
locality_lb_policy: {
value: cdktf.stringToHclTerraform(this._localityLbPolicy),
isBlock: false,
type: "simple",
storageClassType: "string",
},
name: {
value: cdktf.stringToHclTerraform(this._name),
isBlock: false,
type: "simple",
storageClassType: "string",
},
network: {
value: cdktf.stringToHclTerraform(this._network),
isBlock: false,
type: "simple",
storageClassType: "string",
},
port_name: {
value: cdktf.stringToHclTerraform(this._portName),
isBlock: false,
type: "simple",
storageClassType: "string",
},
project: {
value: cdktf.stringToHclTerraform(this._project),
isBlock: false,
type: "simple",
storageClassType: "string",
},
protocol: {
value: cdktf.stringToHclTerraform(this._protocol),
isBlock: false,
type: "simple",
storageClassType: "string",
},
region: {
value: cdktf.stringToHclTerraform(this._region),
isBlock: false,
type: "simple",
storageClassType: "string",
},
session_affinity: {
value: cdktf.stringToHclTerraform(this._sessionAffinity),
isBlock: false,
type: "simple",
storageClassType: "string",
},
timeout_sec: {
value: cdktf.numberToHclTerraform(this._timeoutSec),
isBlock: false,
type: "simple",
storageClassType: "number",
},
backend: {
value: cdktf.listMapperHcl(computeRegionBackendServiceBackendToHclTerraform, true)(this._backend.internalValue),
isBlock: true,
type: "set",
storageClassType: "ComputeRegionBackendServiceBackendList",
},
cdn_policy: {
value: computeRegionBackendServiceCdnPolicyToHclTerraform(this._cdnPolicy.internalValue),
isBlock: true,
type: "list",
storageClassType: "ComputeRegionBackendServiceCdnPolicyList",
},
circuit_breakers: {
value: computeRegionBackendServiceCircuitBreakersToHclTerraform(this._circuitBreakers.internalValue),
isBlock: true,
type: "list",
storageClassType: "ComputeRegionBackendServiceCircuitBreakersList",
},
consistent_hash: {
value: computeRegionBackendServiceConsistentHashToHclTerraform(this._consistentHash.internalValue),
isBlock: true,
type: "list",
storageClassType: "ComputeRegionBackendServiceConsistentHashList",
},
failover_policy: {
value: computeRegionBackendServiceFailoverPolicyToHclTerraform(this._failoverPolicy.internalValue),
isBlock: true,
type: "list",
storageClassType: "ComputeRegionBackendServiceFailoverPolicyList",
},
iap: {
value: computeRegionBackendServiceIapToHclTerraform(this._iap.internalValue),
isBlock: true,
type: "list",
storageClassType: "ComputeRegionBackendServiceIapList",
},
log_config: {
value: computeRegionBackendServiceLogConfigToHclTerraform(this._logConfig.internalValue),
isBlock: true,
type: "list",
storageClassType: "ComputeRegionBackendServiceLogConfigList",
},
outlier_detection: {
value: computeRegionBackendServiceOutlierDetectionToHclTerraform(this._outlierDetection.internalValue),
isBlock: true,
type: "list",
storageClassType: "ComputeRegionBackendServiceOutlierDetectionList",
},
timeouts: {
value: computeRegionBackendServiceTimeoutsToHclTerraform(this._timeouts.internalValue),
isBlock: true,
type: "struct",
storageClassType: "ComputeRegionBackendServiceTimeouts",
},
};
// remove undefined attributes
return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
}
}
exports.ComputeRegionBackendService = ComputeRegionBackendService;
_t = JSII_RTTI_SYMBOL_1;
ComputeRegionBackendService[_t] = { fqn: "@cdktf/provider-google.computeRegionBackendService.ComputeRegionBackendService", version: "14.3.0" };
// =================
// STATIC PROPERTIES
// =================
ComputeRegionBackendService.tfResourceType = "google_compute_region_backend_service";
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tcHV0ZS1yZWdpb24tYmFja2VuZC1zZXJ2aWNlL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBU0EsK0JBQStCO0FBb1kvQixTQUFnQiw2Q0FBNkMsQ0FBQyxNQUErRDtJQUMzSCxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQUMsT0FBTyxNQUFNLENBQUM7SUFBQyxDQUFDO0lBQzVGLElBQUksS0FBSyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDbkMsTUFBTSxJQUFJLEtBQUssQ0FBQyxvSEFBb0gsQ0FBQyxDQUFDO0lBQ3hJLENBQUM7SUFDRCxPQUFPO1FBQ0wsY0FBYyxFQUFFLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxNQUFPLENBQUMsYUFBYSxDQUFDO1FBQzlELGVBQWUsRUFBRSxLQUFLLENBQUMsaUJBQWlCLENBQUMsTUFBTyxDQUFDLGNBQWMsQ0FBQztRQUNoRSxXQUFXLEVBQUUsS0FBSyxDQUFDLGlCQUFpQixDQUFDLE1BQU8sQ0FBQyxXQUFXLENBQUM7UUFDekQsUUFBUSxFQUFFLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxNQUFPLENBQUMsUUFBUSxDQUFDO1FBQ3BELEtBQUssRUFBRSxLQUFLLENBQUMsaUJBQWlCLENBQUMsTUFBTyxDQUFDLEtBQUssQ0FBQztRQUM3QyxlQUFlLEVBQUUsS0FBSyxDQUFDLGlCQUFpQixDQUFDLE1BQU8sQ0FBQyxjQUFjLENBQUM7UUFDaEUsNEJBQTRCLEVBQUUsS0FBSyxDQUFDLGlCQUFpQixDQUFDLE1BQU8sQ0FBQyx5QkFBeUIsQ0FBQztRQUN4Riw0QkFBNEIsRUFBRSxLQUFLLENBQUMsaUJBQWlCLENBQUMsTUFBTyxDQUFDLHlCQUF5QixDQUFD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QkM7OztBQTdxQkMsb0JBQW9CO0FBQ3BCLG9CQUFvQjtBQUNwQixvQkFBb0I7QUFDRywwQ0FBYyxHQUFHLHVDQUF1QyxBQUExQyxDQUEyQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChjKSBIYXNoaUNvcnAsIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNUEwtMi4wXG4gKi9cblxuLy8gaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9nb29nbGUvNi40LjAvZG9jcy9yZXNvdXJjZXMvY29tcHV0ZV9yZWdpb25fYmFja2VuZF9zZXJ2aWNlXG4vLyBnZW5lcmF0ZWQgZnJvbSB0ZXJyYWZvcm0gcmVzb3VyY2Ugc2NoZW1hXG5cbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0ICogYXMgY2RrdGYgZnJvbSAnY2RrdGYnO1xuXG4vLyBDb25maWd1cmF0aW9uXG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlQ29uZmlnIGV4dGVuZHMgY2RrdGYuVGVycmFmb3JtTWV0YUFyZ3VtZW50cyB7XG4gIC8qKlxuICAqIExpZmV0aW1lIG9mIGNvb2tpZXMgaW4gc2Vjb25kcyBpZiBzZXNzaW9uX2FmZmluaXR5IGlzXG4gICogR0VORVJBVEVEX0NPT0tJRS4gSWYgc2V0IHRvIDAsIHRoZSBjb29raWUgaXMgbm9uLXBlcnNpc3RlbnQgYW5kIGxhc3RzXG4gICogb25seSB1bnRpbCB0aGUgZW5kIG9mIHRoZSBicm93c2VyIHNlc3Npb24gKG9yIGVxdWl2YWxlbnQpLiBUaGVcbiAgKiBtYXhpbXVtIGFsbG93ZWQgdmFsdWUgZm9yIFRUTCBpcyBvbmUgZGF5LlxuICAqIFxuICAqIFdoZW4gdGhlIGxvYWQgYmFsYW5jaW5nIHNjaGVtZSBpcyBJTlRFUk5BTCwgdGhpcyBmaWVsZCBpcyBub3QgdXNlZC5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9nb29nbGUvNi40LjAvZG9jcy9yZXNvdXJjZXMvY29tcHV0ZV9yZWdpb25fYmFja2VuZF9zZXJ2aWNlI2FmZmluaXR5X2Nvb2tpZV90dGxfc2VjIENvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZSNhZmZpbml0eV9jb29raWVfdHRsX3NlY31cbiAgKi9cbiAgcmVhZG9ubHkgYWZmaW5pdHlDb29raWVUdGxTZWM/OiBudW1iZXI7XG4gIC8qKlxuICAqIFRpbWUgZm9yIHdoaWNoIGluc3RhbmNlIHdpbGwgYmUgZHJhaW5lZCAobm90IGFjY2VwdCBuZXdcbiAgKiBjb25uZWN0aW9ucywgYnV0IHN0aWxsIHdvcmsgdG8gZmluaXNoIHN0YXJ0ZWQpLlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2dvb2dsZS82LjQuMC9kb2NzL3Jlc291cmNlcy9jb21wdXRlX3JlZ2lvbl9iYWNrZW5kX3NlcnZpY2UjY29ubmVjdGlvbl9kcmFpbmluZ190aW1lb3V0X3NlYyBDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2UjY29ubmVjdGlvbl9kcmFpbmluZ190aW1lb3V0X3NlY31cbiAgKi9cbiAgcmVhZG9ubHkgY29ubmVjdGlvbkRyYWluaW5nVGltZW91dFNlYz86IG51bWJlcjtcbiAgLyoqXG4gICogQW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gb2YgdGhpcyByZXNvdXJjZS5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9nb29nbGUvNi40LjAvZG9jcy9yZXNvdXJjZXMvY29tcHV0ZV9yZWdpb25fYmFja2VuZF9zZXJ2aWNlI2Rlc2NyaXB0aW9uIENvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZSNkZXNjcmlwdGlvbn1cbiAgKi9cbiAgcmVhZG9ubHkgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIC8qKlxuICAqIElmIHRydWUsIGVuYWJsZSBDbG91ZCBDRE4gZm9yIHRoaXMgUmVnaW9uQmFja2VuZFNlcnZpY2UuXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvZ29vZ2xlLzYuNC4wL2RvY3MvcmVzb3VyY2VzL2NvbXB1dGVfcmVnaW9uX2JhY2tlbmRfc2VydmljZSNlbmFibGVfY2RuIENvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZSNlbmFibGVfY2RufVxuICAqL1xuICByZWFkb25seSBlbmFibGVDZG4/OiBib29sZWFuIHwgY2RrdGYuSVJlc29sdmFibGU7XG4gIC8qKlxuICAqIFRoZSBzZXQgb2YgVVJMcyB0byBIZWFsdGhDaGVjayByZXNvdXJjZXMgZm9yIGhlYWx0aCBjaGVja2luZ1xuICAqIHRoaXMgUmVnaW9uQmFja2VuZFNlcnZpY2UuIEN1cnJlbnRseSBhdCBtb3N0IG9uZSBoZWFsdGhcbiAgKiBjaGVjayBjYW4gYmUgc3BlY2lmaWVkLlxuICAqIFxuICAqIEEgaGVhbHRoIGNoZWNrIG11c3QgYmUgc3BlY2lmaWVkIHVubGVzcyB0aGUgYmFja2VuZCBzZXJ2aWNlIHVzZXMgYW4gaW50ZXJuZXRcbiAgKiBvciBzZXJ2ZXJsZXNzIE5FRyBhcyBhIGJhY2tlbmQuXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvZ29vZ2xlLzYuNC4wL2RvY3MvcmVzb3VyY2VzL2NvbXB1dGVfcmVnaW9uX2JhY2tlbmRfc2VydmljZSNoZWFsdGhfY2hlY2tzIENvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZSNoZWFsdGhfY2hlY2tzfVxuICAqL1xuICByZWFkb25seSBoZWFsdGhDaGVja3M/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2dvb2dsZS82LjQuMC9kb2NzL3Jlc291cmNlcy9jb21wdXRlX3JlZ2lvbl9iYWNrZW5kX3NlcnZpY2UjaWQgQ29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlI2lkfVxuICAqXG4gICogUGxlYXNlIGJlIGF3YXJlIHRoYXQgdGhlIGlkIGZpZWxkIGlzIGF1dG9tYXRpY2FsbHkgYWRkZWQgdG8gYWxsIHJlc291cmNlcyBpbiBUZXJyYWZvcm0gcHJvdmlkZXJzIHVzaW5nIGEgVGVycmFmb3JtIHByb3ZpZGVyIFNESyB2ZXJzaW9uIGJlbG93IDIuXG4gICogSWYgeW91IGV4cGVyaWVuY2UgcHJvYmxlbXMgc2V0dGluZyB0aGlzIHZhbHVlIGl0IG1pZ2h0IG5vdCBiZSBzZXR0YWJsZS4gUGxlYXNlIHRha2UgYSBsb29rIGF0IHRoZSBwcm92aWRlciBkb2N1bWVudGF0aW9uIHRvIGVuc3VyZSBpdCBzaG91bGQgYmUgc2V0dGFibGUuXG4gICovXG4gIHJlYWRvbmx5IGlkPzogc3RyaW5nO1xuICAvKipcbiAgKiBJbmRpY2F0ZXMgd2hhdCBraW5kIG9mIGxvYWQgYmFsYW5jaW5nIHRoaXMgcmVnaW9uYWwgYmFja2VuZCBzZXJ2aWNlXG4gICogd2lsbCBiZSB1c2VkIGZvci4gQSBiYWNrZW5kIHNlcnZpY2UgY3JlYXRlZCBmb3Igb25lIHR5cGUgb2YgbG9hZFxuICAqIGJhbGFuY2luZyBjYW5ub3QgYmUgdXNlZCB3aXRoIHRoZSBvdGhlcihzKS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHJlZmVyIHRvXG4gICogW0Nob29zaW5nIGEgbG9hZCBiYWxhbmNlcl0oaHR0cHM6Ly9jbG91ZC5nb29nbGUuY29tL2xvYWQtYmFsYW5jaW5nL2RvY3MvYmFja2VuZC1zZXJ2aWNlKS4gRGVmYXVsdCB2YWx1ZTogXCJJTlRFUk5BTFwiIFBvc3NpYmxlIHZhbHVlczogW1wiRVhURVJOQUxcIiwgXCJFWFRFUk5BTF9NQU5BR0VEXCIsIFwiSU5URVJOQUxcIiwgXCJJTlRFUk5BTF9NQU5BR0VEXCJdXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvZ29vZ2xlLzYuNC4wL2RvY3MvcmVzb3VyY2VzL2NvbXB1dGVfcmVnaW9uX2JhY2tlbmRfc2VydmljZSNsb2FkX2JhbGFuY2luZ19zY2hlbWUgQ29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlI2xvYWRfYmFsYW5jaW5nX3NjaGVtZX1cbiAgKi9cbiAgcmVhZG9ubHkgbG9hZEJhbGFuY2luZ1NjaGVtZT86IHN0cmluZztcbiAgLyoqXG4gICogVGhlIGxvYWQgYmFsYW5jaW5nIGFsZ29yaXRobSB1c2VkIHdpdGhpbiB0aGUgc2NvcGUgb2YgdGhlIGxvY2FsaXR5LlxuICAqIFRoZSBwb3NzaWJsZSB2YWx1ZXMgYXJlOlxuICAqIFxuICAqICogJ1JPVU5EX1JPQklOJzogVGhpcyBpcyBhIHNpbXBsZSBwb2xpY3kgaW4gd2hpY2ggZWFjaCBoZWFsdGh5IGJhY2tlbmRcbiAgKiAgICAgICAgICAgICAgICAgIGlzIHNlbGVjdGVkIGluIHJvdW5kIHJvYmluIG9yZGVyLlxuICAqIFxuICAqICogJ0xFQVNUX1JFUVVFU1QnOiBBbiBPKDEpIGFsZ29yaXRobSB3aGljaCBzZWxlY3RzIHR3byByYW5kb20gaGVhbHRoeVxuICAqICAgICAgICAgICAgICAgICAgICBob3N0cyBhbmQgcGlja3MgdGhlIGhvc3Qgd2hpY2ggaGFzIGZld2VyIGFjdGl2ZSByZXF1ZXN0cy5cbiAgKiBcbiAgKiAqICdSSU5HX0hBU0gnOiBUaGUgcmluZy9tb2R1bG8gaGFzaCBsb2FkIGJhbGFuY2VyIGltcGxlbWVudHMgY29uc2lzdGVudFxuICAqICAgICAgICAgICAgICAgIGhhc2hpbmcgdG8gYmFja2VuZHMuIFRoZSBhbGdvcml0aG0gaGFzIHRoZSBwcm9wZXJ0eSB0aGF0IHRoZVxuICAqICAgICAgICAgICAgICAgIGFkZGl0aW9uL3JlbW92YWwgb2YgYSBob3N0IGZyb20gYSBzZXQgb2YgTiBob3N0cyBvbmx5IGFmZmVjdHNcbiAgKiAgICAgICAgICAgICAgICAxL04gb2YgdGhlIHJlcXVlc3RzLlxuICAqIFxuICAqICogJ1JBTkRPTSc6IFRoZSBsb2FkIGJhbGFuY2VyIHNlbGVjdHMgYSByYW5kb20gaGVhbHRoeSBob3N0LlxuICAqIFxuICAqICogJ09SSUdJTkFMX0RFU1RJTkFUSU9OJzogQmFja2VuZCBob3N0IGlzIHNlbGVjdGVkIGJhc2VkIG9uIHRoZSBjbGllbnRcbiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24gbWV0YWRhdGEsIGkuZS4sIGNvbm5lY3Rpb25zIGFyZSBvcGVuZWRcbiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHRoZSBzYW1lIGFkZHJlc3MgYXMgdGhlIGRlc3RpbmF0aW9uIGFkZHJlc3Mgb2ZcbiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBpbmNvbWluZyBjb25uZWN0aW9uIGJlZm9yZSB0aGUgY29ubmVjdGlvblxuICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FzIHJlZGlyZWN0ZWQgdG8gdGhlIGxvYWQgYmFsYW5jZXIuXG4gICogXG4gICogKiAnTUFHTEVWJzogdXNlZCBhcyBhIGRyb3AgaW4gcmVwbGFjZW1lbnQgZm9yIHRoZSByaW5nIGhhc2ggbG9hZCBiYWxhbmNlci5cbiAgKiAgICAgICAgICAgICBNYWdsZXYgaXMgbm90IGFzIHN0YWJsZSBhcyByaW5nIGhhc2ggYnV0IGhhcyBmYXN0ZXIgdGFibGUgbG9va3VwXG4gICogICAgICAgICAgICAgYnVpbGQgdGltZXMgYW5kIGhvc3Qgc2VsZWN0aW9uIHRpbWVzLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dFxuICAqICAgICAgICAgICAgIE1hZ2xldiwgcmVmZXIgdG8gaHR0cHM6Ly9haS5nb29nbGUvcmVzZWFyY2gvcHVicy9wdWI0NDgyNFxuICAqIFxuICAqICogJ1dFSUdIVEVEX01BR0xFVic6IFBlci1pbnN0YW5jZSB3ZWlnaHRlZCBMb2FkIEJhbGFuY2luZyB2aWEgaGVhbHRoIGNoZWNrXG4gICogICAgICAgICAgICAgICAgICAgICAgcmVwb3J0ZWQgd2VpZ2h0cy4gT25seSBhcHBsaWNhYmxlIHRvIGxvYWRCYWxhbmNpbmdTY2hlbWVcbiAgKiAgICAgICAgICAgICAgICAgICAgICBFWFRFUk5BTC4gSWYgc2V0LCB0aGUgQmFja2VuZCBTZXJ2aWNlIG11c3RcbiAgKiAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmUgYSBub24gbGVnYWN5IEhUVFAtYmFzZWQgSGVhbHRoIENoZWNrLCBhbmRcbiAgKiAgICAgICAgICAgICAgICAgICAgICBoZWFsdGggY2hlY2sgcmVwbGllcyBhcmUgZXhwZWN0ZWQgdG8gY29udGFpblxuICAqICAgICAgICAgICAgICAgICAgICAgIG5vbi1zdGFuZGFyZCBIVFRQIHJlc3BvbnNlIGhlYWRlciBmaWVsZFxuICAqICAgICAgICAgICAgICAgICAgICAgIFgtTG9hZC1CYWxhbmNpbmctRW5kcG9pbnQtV2VpZ2h0IHRvIHNwZWNpZnkgdGhlXG4gICogICAgICAgICAgICAgICAgICAgICAgcGVyLWluc3RhbmNlIHdlaWdodHMuIElmIHNldCwgTG9hZCBCYWxhbmNpbmcgaXMgd2VpZ2h0XG4gICogICAgICAgICAgICAgICAgICAgICAgYmFzZWQgb24gdGhlIHBlci1pbnN0YW5jZSB3ZWlnaHRzIHJlcG9ydGVkIGluIHRoZSBsYXN0XG4gICogICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2VkIGhlYWx0aCBjaGVjayByZXBsaWVzLCBhcyBsb25nIGFzIGV2ZXJ5XG4gICogICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UgZWl0aGVyIHJlcG9ydGVkIGEgdmFsaWQgd2VpZ2h0IG9yIGhhZFxuICAqICAgICAgICAgICAgICAgICAgICAgIFVOQVZBSUxBQkxFX1dFSUdIVC4gT3RoZXJ3aXNlLCBMb2FkIEJhbGFuY2luZyByZW1haW5zXG4gICogICAgICAgICAgICAgICAgICAgICAgZXF1YWwtd2VpZ2h0LlxuICAqIFxuICAqIGxvY2FsaXR5X2xiX3BvbGljeSBpcyBhcHBsaWNhYmxlIHRvIGVpdGhlcjpcbiAgKiBcbiAgKiAqIEEgcmVnaW9uYWwgYmFja2VuZCBzZXJ2aWNlIHdpdGggdGhlIHNlcnZpY2VfcHJvdG9jb2wgc2V0IHRvIEhUVFAsIEhUVFBTLCBvciBIVFRQMixcbiAgKiAgIGFuZCBsb2FkQmFsYW5jaW5nU2NoZW1lIHNldCB0byBJTlRFUk5BTF9NQU5BR0VELlxuICAqICogQSBnbG9iYWwgYmFja2VuZCBzZXJ2aWNlIHdpdGggdGhlIGxvYWRfYmFsYW5jaW5nX3NjaGVtZSBzZXQgdG8gSU5URVJOQUxfU0VMRl9NQU5BR0VELlxuICAqICogQSByZWdpb25hbCBiYWNrZW5kIHNlcnZpY2Ugd2l0aCBsb2FkQmFsYW5jaW5nU2NoZW1lIHNldCB0byBFWFRFUk5BTCAoRXh0ZXJuYWwgTmV0d29ya1xuICAqICAgTG9hZCBCYWxhbmNpbmcpLiBPbmx5IE1BR0xFViBhbmQgV0VJR0hURURfTUFHTEVWIHZhbHVlcyBhcmUgcG9zc2libGUgZm9yIEV4dGVybmFsXG4gICogICBOZXR3b3JrIExvYWQgQmFsYW5jaW5nLiBUaGUgZGVmYXVsdCBpcyBNQUdMRVYuXG4gICogXG4gICogSWYgc2Vzc2lvbl9hZmZpbml0eSBpcyBub3QgTk9ORSwgYW5kIGxvY2FsaXR5X2xiX3BvbGljeSBpcyBub3Qgc2V0IHRvIE1BR0xFViwgV0VJR0hURURfTUFHTEVWLFxuICAqIG9yIFJJTkdfSEFTSCwgc2Vzc2lvbiBhZmZpbml0eSBzZXR0aW5ncyB3aWxsIG5vdCB0YWtlIGVmZmVjdC5cbiAgKiBcbiAgKiBPbmx5IFJPVU5EX1JPQklOIGFuZCBSSU5HX0hBU0ggYXJlIHN1cHBvcnRlZCB3aGVuIHRoZSBiYWNrZW5kIHNlcnZpY2UgaXMgcmVmZXJlbmNlZFxuICAqIGJ5IGEgVVJMIG1hcCB0aGF0IGlzIGJvdW5kIHRvIHRhcmdldCBnUlBDIHByb3h5IHRoYXQgaGFzIHZhbGlkYXRlX2Zvcl9wcm94eWxlc3NcbiAgKiBmaWVsZCBzZXQgdG8gdHJ1ZS4gUG9zc2libGUgdmFsdWVzOiBbXCJST1VORF9ST0JJTlwiLCBcIkxFQVNUX1JFUVVFU1RcIiwgXCJSSU5HX0hBU0hcIiwgXCJSQU5ET01cIiwgXCJPUklHSU5BTF9ERVNUSU5BVElPTlwiLCBcIk1BR0xFVlwiLCBcIldFSUdIVEVEX01BR0xFVlwiXVxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2dvb2dsZS82LjQuMC9kb2NzL3Jlc291cmNlcy9jb21wdXRlX3JlZ2lvbl9iYWNrZW5kX3NlcnZpY2UjbG9jYWxpdHlfbGJfcG9saWN5IENvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZSNsb2NhbGl0eV9sYl9wb2xpY3l9XG4gICovXG4gIHJlYWRvbmx5IGxvY2FsaXR5TGJQb2xpY3k/OiBzdHJpbmc7XG4gIC8qKlxuICAqIE5hbWUgb2YgdGhlIHJlc291cmNlLiBQcm92aWRlZCBieSB0aGUgY2xpZW50IHdoZW4gdGhlIHJlc291cmNlIGlzXG4gICogY3JlYXRlZC4gVGhlIG5hbWUgbXVzdCBiZSAxLTYzIGNoYXJhY3RlcnMgbG9uZywgYW5kIGNvbXBseSB3aXRoXG4gICogUkZDMTAzNS4gU3BlY2lmaWNhbGx5LCB0aGUgbmFtZSBtdXN0IGJlIDEtNjMgY2hhcmFjdGVycyBsb25nIGFuZCBtYXRjaFxuICAqIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gJ1thLXpdKFstYS16MC05XSpbYS16MC05XSk/JyB3aGljaCBtZWFucyB0aGVcbiAgKiBmaXJzdCBjaGFyYWN0ZXIgbXVzdCBiZSBhIGxvd2VyY2FzZSBsZXR0ZXIsIGFuZCBhbGwgZm9sbG93aW5nXG4gICogY2hhcmFjdGVycyBtdXN0IGJlIGEgZGFzaCwgbG93ZXJjYXNlIGxldHRlciwgb3IgZGlnaXQsIGV4Y2VwdCB0aGUgbGFzdFxuICAqIGNoYXJhY3Rlciwgd2hpY2ggY2Fubm90IGJlIGEgZGFzaC5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9nb29nbGUvNi40LjAvZG9jcy9yZXNvdXJjZXMvY29tcHV0ZV9yZWdpb25fYmFja2VuZF9zZXJ2aWNlI25hbWUgQ29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlI25hbWV9XG4gICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgLyoqXG4gICogVGhlIFVSTCBvZiB0aGUgbmV0d29yayB0byB3aGljaCB0aGlzIGJhY2tlbmQgc2VydmljZSBiZWxvbmdzLlxuICAqIFRoaXMgZmllbGQgY2FuIG9ubHkgYmUgc3BlY2lmaWVkIHdoZW4gdGhlIGxvYWQgYmFsYW5jaW5nIHNjaGVtZSBpcyBzZXQgdG8gSU5URVJOQUwuXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvZ29vZ2xlLzYuNC4wL2RvY3MvcmVzb3VyY2VzL2NvbXB1dGVfcmVnaW9uX2JhY2tlbmRfc2VydmljZSNuZXR3b3JrIENvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZSNuZXR3b3JrfVxuICAqL1xuICByZWFkb25seSBuZXR3b3JrPzogc3RyaW5nO1xuICAvKipcbiAgKiBBIG5hbWVkIHBvcnQgb24gYSBiYWNrZW5kIGluc3RhbmNlIGdyb3VwIHJlcHJlc2VudGluZyB0aGUgcG9ydCBmb3JcbiAgKiBjb21tdW5pY2F0aW9uIHRvIHRoZSBiYWNrZW5kIFZNcyBpbiB0aGF0IGdyb3VwLiBSZXF1aXJlZCB3aGVuIHRoZVxuICAqIGxvYWRCYWxhbmNpbmdTY2hlbWUgaXMgRVhURVJOQUwsIEVYVEVSTkFMX01BTkFHRUQsIElOVEVSTkFMX01BTkFHRUQsIG9yIElOVEVSTkFMX1NFTEZfTUFOQUdFRFxuICAqIGFuZCB0aGUgYmFja2VuZHMgYXJlIGluc3RhbmNlIGdyb3Vwcy4gVGhlIG5hbWVkIHBvcnQgbXVzdCBiZSBkZWZpbmVkIG9uIGVhY2hcbiAgKiBiYWNrZW5kIGluc3RhbmNlIGdyb3VwLiBUaGlzIHBhcmFtZXRlciBoYXMgbm8gbWVhbmluZyBpZiB0aGUgYmFja2VuZHMgYXJlIE5FR3MuIEFQSSBzZXRzIGFcbiAgKiBkZWZhdWx0IG9mIFwiaHR0cFwiIGlmIG5vdCBnaXZlbi5cbiAgKiBNdXN0IGJlIG9taXR0ZWQgd2hlbiB0aGUgbG9hZEJhbGFuY2luZ1NjaGVtZSBpcyBJTlRFUk5BTCAoSW50ZXJuYWwgVENQL1VEUCBMb2FkIEJhbGFuY2luZykuXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvZ29vZ2xlLzYuNC4wL2RvY3MvcmVzb3VyY2VzL2NvbXB1dGVfcmVnaW9uX2JhY2tlbmRfc2VydmljZSNwb3J0X25hbWUgQ29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlI3BvcnRfbmFtZX1cbiAgKi9cbiAgcmVhZG9ubHkgcG9ydE5hbWU/OiBzdHJpbmc7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9nb29nbGUvNi40LjAvZG9jcy9yZXNvdXJjZXMvY29tcHV0ZV9yZWdpb25fYmFja2VuZF9zZXJ2aWNlI3Byb2plY3QgQ29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlI3Byb2plY3R9XG4gICovXG4gIHJlYWRvbmx5IHByb2plY3Q/OiBzdHJpbmc7XG4gIC8qKlxuICAqIFRoZSBwcm90b2NvbCB0aGlzIFJlZ2lvbkJhY2tlbmRTZXJ2aWNlIHVzZXMgdG8gY29tbXVuaWNhdGUgd2l0aCBiYWNrZW5kcy5cbiAgKiBUaGUgZGVmYXVsdCBpcyBIVFRQLiAqKk5PVEUqKjogSFRUUDIgaXMgb25seSB2YWxpZCBmb3IgYmV0YSBIVFRQLzIgbG9hZCBiYWxhbmNlclxuICAqIHR5cGVzIGFuZCBtYXkgcmVzdWx0IGluIGVycm9ycyBpZiB1c2VkIHdpdGggdGhlIEdBIEFQSS4gUG9zc2libGUgdmFsdWVzOiBbXCJIVFRQXCIsIFwiSFRUUFNcIiwgXCJIVFRQMlwiLCBcIlNTTFwiLCBcIlRDUFwiLCBcIlVEUFwiLCBcIkdSUENcIiwgXCJVTlNQRUNJRklFRFwiXVxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2dvb2dsZS82LjQuMC9kb2NzL3Jlc291cmNlcy9jb21wdXRlX3JlZ2lvbl9iYWNrZW5kX3NlcnZpY2UjcHJvdG9jb2wgQ29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlI3Byb3RvY29sfVxuICAqL1xuICByZWFkb25seSBwcm90b2NvbD86IHN0cmluZztcbiAgLyoqXG4gICogVGhlIFJlZ2lvbiBpbiB3aGljaCB0aGUgY3JlYXRlZCBiYWNrZW5kIHNlcnZpY2Ugc2hvdWxkIHJlc2lkZS5cbiAgKiBJZiBpdCBpcyBub3QgcHJvdmlkZWQsIHRoZSBwcm92aWRlciByZWdpb24gaXMgdXNlZC5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9nb29nbGUvNi40LjAvZG9jcy9yZXNvdXJjZXMvY29tcHV0ZV9yZWdpb25fYmFja2VuZF9zZXJ2aWNlI3JlZ2lvbiBDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2UjcmVnaW9ufVxuICAqL1xuICByZWFkb25seSByZWdpb24/OiBzdHJpbmc7XG4gIC8qKlxuICAqIFR5cGUgb2Ygc2Vzc2lvbiBhZmZpbml0eSB0byB1c2UuIFRoZSBkZWZhdWx0IGlzIE5PTkUuIFNlc3Npb24gYWZmaW5pdHkgaXNcbiAgKiBub3QgYXBwbGljYWJsZSBpZiB0aGUgcHJvdG9jb2wgaXMgVURQLiBQb3NzaWJsZSB2YWx1ZXM6IFtcIk5PTkVcIiwgXCJDTElFTlRfSVBcIiwgXCJDTElFTlRfSVBfUE9SVF9QUk9UT1wiLCBcIkNMSUVOVF9JUF9QUk9UT1wiLCBcIkdFTkVSQVRFRF9DT09LSUVcIiwgXCJIRUFERVJfRklFTERcIiwgXCJIVFRQX0NPT0tJRVwiLCBcIkNMSUVOVF9JUF9OT19ERVNUSU5BVElPTlwiXVxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2dvb2dsZS82LjQuMC9kb2NzL3Jlc291cmNlcy9jb21wdXRlX3JlZ2lvbl9iYWNrZW5kX3NlcnZpY2Ujc2Vzc2lvbl9hZmZpbml0eSBDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2Ujc2Vzc2lvbl9hZmZpbml0eX1cbiAgKi9cbiAgcmVhZG9ubHkgc2Vzc2lvbkFmZmluaXR5Pzogc3RyaW5nO1xuICAvKipcbiAgKiBUaGUgYmFja2VuZCBzZXJ2aWNlIHRpbWVvdXQgaGFzIGEgZGlmZmVyZW50IG1lYW5pbmcgZGVwZW5kaW5nIG9uIHRoZSB0eXBlIG9mIGxvYWQgYmFsYW5jZXIuXG4gICogRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlLCBbQmFja2VuZCBzZXJ2aWNlIHNldHRpbmdzXShodHRwczovL2Nsb3VkLmdvb2dsZS5jb20vY29tcHV0ZS9kb2NzL3JlZmVyZW5jZS9yZXN0L3YxL2JhY2tlbmRTZXJ2aWNlcykuXG4gICogVGhlIGRlZmF1bHQgaXMgMzAgc2Vjb25kcy5cbiAgKiBUaGUgZnVsbCByYW5nZSBvZiB0aW1lb3V0IHZhbHVlcyBhbGxvd2VkIGdvZXMgZnJvbSAxIHRocm91Z2ggMiwxNDcsNDgzLDY0NyBzZWNvbmRzLlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2dvb2dsZS82LjQuMC9kb2NzL3Jlc291cmNlcy9jb21wdXRlX3JlZ2lvbl9iYWNrZW5kX3NlcnZpY2UjdGltZW91dF9zZWMgQ29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlI3RpbWVvdXRfc2VjfVxuICAqL1xuICByZWFkb25seSB0aW1lb3V0U2VjPzogbnVtYmVyO1xuICAvKipcbiAgKiBiYWNrZW5kIGJsb2NrXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvZ29vZ2xlLzYuNC4wL2RvY3MvcmVzb3VyY2VzL2NvbXB1dGVfcmVnaW9uX2JhY2tlbmRfc2VydmljZSNiYWNrZW5kIENvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZSNiYWNrZW5kfVxuICAqL1xuICByZWFkb25seSBiYWNrZW5kPzogQ29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlQmFja2VuZFtdIHwgY2RrdGYuSVJlc29sdmFibGU7XG4gIC8qKlxuICAqIGNkbl9wb2xpY3kgYmxvY2tcbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9nb29nbGUvNi40LjAvZG9jcy9yZXNvdXJjZXMvY29tcHV0ZV9yZWdpb25fYmFja2VuZF9zZXJ2aWNlI2Nkbl9wb2xpY3kgQ29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlI2Nkbl9wb2xpY3l9XG4gICovXG4gIHJlYWRvbmx5IGNkblBvbGljeT86IENvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZUNkblBvbGljeTtcbiAgLyoqXG4gICogY2lyY3VpdF9icmVha2VycyBibG9ja1xuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2dvb2dsZS82LjQuMC9kb2NzL3Jlc291cmNlcy9jb21wdXRlX3JlZ2lvbl9iYWNrZW5kX3NlcnZpY2UjY2lyY3VpdF9icmVha2VycyBDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2UjY2lyY3VpdF9icmVha2Vyc31cbiAgKi9cbiAgcmVhZG9ubHkgY2lyY3VpdEJyZWFrZXJzPzogQ29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlQ2lyY3VpdEJyZWFrZXJzO1xuICAvKipcbiAgKiBjb25zaXN0ZW50X2hhc2ggYmxvY2tcbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9nb29nbGUvNi40LjAvZG9jcy9yZXNvdXJjZXMvY29tcHV0ZV9yZWdpb25fYmFja2VuZF9zZXJ2aWNlI2NvbnNpc3RlbnRfaGFzaCBDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2UjY29uc2lzdGVudF9oYXNofVxuICAqL1xuICByZWFkb25seSBjb25zaXN0ZW50SGFzaD86IENvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZUNvbnNpc3RlbnRIYXNoO1xuICAvKipcbiAgKiBmYWlsb3Zlcl9wb2xpY3kgYmxvY2tcbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9nb29nbGUvNi40LjAvZG9jcy9yZXNvdXJjZXMvY29tcHV0ZV9yZWdpb25fYmFja2VuZF9zZXJ2aWNlI2ZhaWxvdmVyX3BvbGljeSBDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2UjZmFpbG92ZXJfcG9saWN5fVxuICAqL1xuICByZWFkb25seSBmYWlsb3ZlclBvbGljeT86IENvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZUZhaWxvdmVyUG9saWN5O1xuICAvKipcbiAgKiBpYXAgYmxvY2tcbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9nb29nbGUvNi40LjAvZG9jcy9yZXNvdXJjZXMvY29tcHV0ZV9yZWdpb25fYmFja2VuZF9zZXJ2aWNlI2lhcCBDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2UjaWFwfVxuICAqL1xuICByZWFkb25seSBpYXA/OiBDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VJYXA7XG4gIC8qKlxuICAqIGxvZ19jb25maWcgYmxvY2tcbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9nb29nbGUvNi40LjAvZG9jcy9yZXNvdXJjZXMvY29tcHV0ZV9yZWdpb25fYmFja2VuZF9zZXJ2aWNlI2xvZ19jb25maWcgQ29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlI2xvZ19jb25maWd9XG4gICovXG4gIHJlYWRvbmx5IGxvZ0NvbmZpZz86IENvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZUxvZ0NvbmZpZztcbiAgLyoqXG4gICogb3V0bGllcl9kZXRlY3Rpb24gYmxvY2tcbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9nb29nbGUvNi40LjAvZG9jcy9yZXNvdXJjZXMvY29tcHV0ZV9yZWdpb25fYmFja2VuZF9zZXJ2aWNlI291dGxpZXJfZGV0ZWN0aW9uIENvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZSNvdXRsaWVyX2RldGVjdGlvbn1cbiAgKi9cbiAgcmVhZG9ubHkgb3V0bGllckRldGVjdGlvbj86IENvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZU91dGxpZXJEZXRlY3Rpb247XG4gIC8qKlxuICAqIHRpbWVvdXRzIGJsb2NrXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvZ29vZ2xlLzYuNC4wL2RvY3MvcmVzb3VyY2VzL2NvbXB1dGVfcmVnaW9uX2JhY2tlbmRfc2VydmljZSN0aW1lb3V0cyBDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2UjdGltZW91dHN9XG4gICovXG4gIHJlYWRvbmx5IHRpbWVvdXRzPzogQ29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlVGltZW91dHM7XG59XG5leHBvcnQgaW50ZXJmYWNlIENvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZUJhY2tlbmQge1xuICAvKipcbiAgKiBTcGVjaWZpZXMgdGhlIGJhbGFuY2luZyBtb2RlIGZvciB0aGlzIGJhY2tlbmQuXG4gICogXG4gICogU2VlIHRoZSBbQmFja2VuZCBTZXJ2aWNlcyBPdmVydmlld10oaHR0cHM6Ly9jbG91ZC5nb29nbGUuY29tL2xvYWQtYmFsYW5jaW5nL2RvY3MvYmFja2VuZC1zZXJ2aWNlI2JhbGFuY2luZy1tb2RlKVxuICAqIGZvciBhbiBleHBsYW5hdGlvbiBvZiBsb2FkIGJhbGFuY2luZyBtb2Rlcy4gRGVmYXVsdCB2YWx1ZTogXCJVVElMSVpBVElPTlwiIFBvc3NpYmxlIHZhbHVlczogW1wiVVRJTElaQVRJT05cIiwgXCJSQVRFXCIsIFwiQ09OTkVDVElPTlwiXVxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2dvb2dsZS82LjQuMC9kb2NzL3Jlc291cmNlcy9jb21wdXRlX3JlZ2lvbl9iYWNrZW5kX3NlcnZpY2UjYmFsYW5jaW5nX21vZGUgQ29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlI2JhbGFuY2luZ19tb2RlfVxuICAqL1xuICByZWFkb25seSBiYWxhbmNpbmdNb2RlPzogc3RyaW5nO1xuICAvKipcbiAgKiBBIG11bHRpcGxpZXIgYXBwbGllZCB0byB0aGUgZ3JvdXAncyBtYXhpbXVtIHNlcnZpY2luZyBjYXBhY2l0eVxuICAqIChiYXNlZCBvbiBVVElMSVpBVElPTiwgUkFURSBvciBDT05ORUNUSU9OKS5cbiAgKiBcbiAgKiB+PioqTk9URSoqOiBUaGlzIGZpZWxkIGNhbm5vdCBiZSBzZXQgZm9yXG4gICogSU5URVJOQUwgcmVnaW9uIGJhY2tlbmQgc2VydmljZXMgKGRlZmF1bHQgbG9hZEJhbGFuY2luZ1NjaGVtZSksXG4gICogYnV0IGlzIHJlcXVpcmVkIGZvciBub24tSU5URVJOQUwgYmFja2VuZCBzZXJ2aWNlLiBUaGUgdG90YWxcbiAgKiBjYXBhY2l0eV9zY2FsZXIgZm9yIGFsbCBiYWNrZW5kcyBtdXN0IGJlIG5vbi16ZXJvLlxuICAqIFxuICAqIEEgc2V0dGluZyBvZiAwIG1lYW5zIHRoZSBncm91cCBpcyBjb21wbGV0ZWx5IGRyYWluZWQsIG9mZmVyaW5nXG4gICogMCUgb2YgaXRzIGF2YWlsYWJsZSBDYXBhY2l0eS4gVmFsaWQgcmFuZ2UgaXMgWzAuMCwxLjBdLlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2dvb2dsZS82LjQuMC9kb2NzL3Jlc291cmNlcy9jb21wdXRlX3JlZ2lvbl9iYWNrZW5kX3NlcnZpY2UjY2FwYWNpdHlfc2NhbGVyIENvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZSNjYXBhY2l0eV9zY2FsZXJ9XG4gICovXG4gIHJlYWRvbmx5IGNhcGFjaXR5U2NhbGVyPzogbnVtYmVyO1xuICAvKipcbiAgKiBBbiBvcHRpb25hbCBkZXNjcmlwdGlvbiBvZiB0aGlzIHJlc291cmNlLlxuICAqIFByb3ZpZGUgdGhpcyBwcm9wZXJ0eSB3aGVuIHlvdSBjcmVhdGUgdGhlIHJlc291cmNlLlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2dvb2dsZS82LjQuMC9kb2NzL3Jlc291cmNlcy9jb21wdXRlX3JlZ2lvbl9iYWNrZW5kX3NlcnZpY2UjZGVzY3JpcHRpb24gQ29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlI2Rlc2NyaXB0aW9ufVxuICAqL1xuICByZWFkb25seSBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgLyoqXG4gICogVGhpcyBmaWVsZCBkZXNpZ25hdGVzIHdoZXRoZXIgdGhpcyBpcyBhIGZhaWxvdmVyIGJhY2tlbmQuIE1vcmVcbiAgKiB0aGFuIG9uZSBmYWlsb3ZlciBiYWNrZW5kIGNhbiBiZSBjb25maWd1cmVkIGZvciBhIGdpdmVuIFJlZ2lvbkJhY2tlbmRTZXJ2aWNlLlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2dvb2dsZS82LjQuMC9kb2NzL3Jlc291cmNlcy9jb21wdXRlX3JlZ2lvbl9iYWNrZW5kX3NlcnZpY2UjZmFpbG92ZXIgQ29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlI2ZhaWxvdmVyfVxuICAqL1xuICByZWFkb25seSBmYWlsb3Zlcj86IGJvb2xlYW4gfCBjZGt0Zi5JUmVzb2x2YWJsZTtcbiAgLyoqXG4gICogVGhlIGZ1bGx5LXF1YWxpZmllZCBVUkwgb2YgYW4gSW5zdGFuY2UgR3JvdXAgb3IgTmV0d29yayBFbmRwb2ludFxuICAqIEdyb3VwIHJlc291cmNlLiBJbiBjYXNlIG9mIGluc3RhbmNlIGdyb3VwIHRoaXMgZGVmaW5lcyB0aGUgbGlzdFxuICAqIG9mIGluc3RhbmNlcyB0aGF0IHNlcnZlIHRyYWZmaWMuIE1lbWJlciB2aXJ0dWFsIG1hY2hpbmVcbiAgKiBpbnN0YW5jZXMgZnJvbSBlYWNoIGluc3RhbmNlIGdyb3VwIG11c3QgbGl2ZSBpbiB0aGUgc2FtZSB6b25lIGFzXG4gICogdGhlIGluc3RhbmNlIGdyb3VwIGl0c2VsZi4gTm8gdHdvIGJhY2tlbmRzIGluIGEgYmFja2VuZCBzZXJ2aWNlXG4gICogYXJlIGFsbG93ZWQgdG8gdXNlIHNhbWUgSW5zdGFuY2UgR3JvdXAgcmVzb3VyY2UuXG4gICogXG4gICogRm9yIE5ldHdvcmsgRW5kcG9pbnQgR3JvdXBzIHRoaXMgZGVmaW5lcyBsaXN0IG9mIGVuZHBvaW50cy4gQWxsXG4gICogZW5kcG9pbnRzIG9mIE5ldHdvcmsgRW5kcG9pbnQgR3JvdXAgbXVzdCBiZSBob3N0ZWQgb24gaW5zdGFuY2VzXG4gICogbG9jYXRlZCBpbiB0aGUgc2FtZSB6b25lIGFzIHRoZSBOZXR3b3JrIEVuZHBvaW50IEdyb3VwLlxuICAqIFxuICAqIEJhY2tlbmQgc2VydmljZXMgY2Fubm90IG1peCBJbnN0YW5jZSBHcm91cCBhbmRcbiAgKiBOZXR3b3JrIEVuZHBvaW50IEdyb3VwIGJhY2tlbmRzLlxuICAqIFxuICAqIFdoZW4gdGhlICdsb2FkX2JhbGFuY2luZ19zY2hlbWUnIGlzIElOVEVSTkFMLCBvbmx5IGluc3RhbmNlIGdyb3Vwc1xuICAqIGFyZSBzdXBwb3J0ZWQuXG4gICogXG4gICogTm90ZSB0aGF0IHlvdSBtdXN0IHNwZWNpZnkgYW4gSW5zdGFuY2UgR3JvdXAgb3IgTmV0d29yayBFbmRwb2ludFxuICAqIEdyb3VwIHJlc291cmNlIHVzaW5nIHRoZSBmdWxseS1xdWFsaWZpZWQgVVJMLCByYXRoZXIgdGhhbiBhXG4gICogcGFydGlhbCBVUkwuXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvZ29vZ2xlLzYuNC4wL2RvY3MvcmVzb3VyY2VzL2NvbXB1dGVfcmVnaW9uX2JhY2tlbmRfc2VydmljZSNncm91cCBDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2UjZ3JvdXB9XG4gICovXG4gIHJlYWRvbmx5IGdyb3VwOiBzdHJpbmc7XG4gIC8qKlxuICAqIFRoZSBtYXggbnVtYmVyIG9mIHNpbXVsdGFuZW91cyBjb25uZWN0aW9ucyBmb3IgdGhlIGdyb3VwLiBDYW5cbiAgKiBiZSB1c2VkIHdpdGggZWl0aGVyIENPTk5FQ1RJT04gb3IgVVRJTElaQVRJT04gYmFsYW5jaW5nIG1vZGVzLlxuICAqIENhbm5vdCBiZSBzZXQgZm9yIElOVEVSTkFMIGJhY2tlbmQgc2VydmljZXMuXG4gICogXG4gICogRm9yIENPTk5FQ1RJT04gbW9kZSwgZWl0aGVyIG1heENvbm5lY3Rpb25zIG9yIG9uZVxuICAqIG9mIG1heENvbm5lY3Rpb25zUGVySW5zdGFuY2Ugb3IgbWF4Q29ubmVjdGlvbnNQZXJFbmRwb2ludCxcbiAgKiBhcyBhcHByb3ByaWF0ZSBmb3IgZ3JvdXAgdHlwZSwgbXVzdCBiZSBzZXQuXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvZ29vZ2xlLzYuNC4wL2RvY3MvcmVzb3VyY2VzL2NvbXB1dGVfcmVnaW9uX2JhY2tlbmRfc2VydmljZSNtYXhfY29ubmVjdGlvbnMgQ29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlI21heF9jb25uZWN0aW9uc31cbiAgKi9cbiAgcmVhZG9ubHkgbWF4Q29ubmVjdGlvbnM/OiBudW1iZXI7XG4gIC8qKlxuICAqIFRoZSBtYXggbnVtYmVyIG9mIHNpbXVsdGFuZW91cyBjb25uZWN0aW9ucyB0aGF0IGEgc2luZ2xlIGJhY2tlbmRcbiAgKiBuZXR3b3JrIGVuZHBvaW50IGNhbiBoYW5kbGUuIENhbm5vdCBiZSBzZXRcbiAgKiBmb3IgSU5URVJOQUwgYmFja2VuZCBzZXJ2aWNlcy5cbiAgKiBcbiAgKiBUaGlzIGlzIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBjYXBhY2l0eSBvZiB0aGUgZ3JvdXAuIENhbiBiZVxuICAqIHVzZWQgaW4gZWl0aGVyIENPTk5FQ1RJT04gb3IgVVRJTElaQVRJT04gYmFsYW5jaW5nIG1vZGVzLiBGb3JcbiAgKiBDT05ORUNUSU9OIG1vZGUsIGVpdGhlciBtYXhDb25uZWN0aW9ucyBvclxuICAqIG1heENvbm5lY3Rpb25zUGVyRW5kcG9pbnQgbXVzdCBiZSBzZXQuXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvZ29vZ2xlLzYuNC4wL2RvY3MvcmVzb3VyY2VzL2NvbXB1dGVfcmVnaW9uX2JhY2tlbmRfc2VydmljZSNtYXhfY29ubmVjdGlvbnNfcGVyX2VuZHBvaW50IENvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZSNtYXhfY29ubmVjdGlvbnNfcGVyX2VuZHBvaW50fVxuICAqL1xuICByZWFkb25seSBtYXhDb25uZWN0aW9uc1BlckVuZHBvaW50PzogbnVtYmVyO1xuICAvKipcbiAgKiBUaGUgbWF4IG51bWJlciBvZiBzaW11bHRhbmVvdXMgY29ubmVjdGlvbnMgdGhhdCBhIHNpbmdsZVxuICAqIGJhY2tlbmQgaW5zdGFuY2UgY2FuIGhhbmRsZS4gQ2Fubm90IGJlIHNldCBmb3IgSU5URVJOQUwgYmFja2VuZFxuICAqIHNlcnZpY2VzLlxuICAqIFxuICAqIFRoaXMgaXMgdXNlZCB0byBjYWxjdWxhdGUgdGhlIGNhcGFjaXR5IG9mIHRoZSBncm91cC5cbiAgKiBDYW4gYmUgdXNlZCBpbiBlaXRoZXIgQ09OTkVDVElPTiBvciBVVElMSVpBVElPTiBiYWxhbmNpbmcgbW9kZXMuXG4gICogRm9yIENPTk5FQ1RJT04gbW9kZSwgZWl0aGVyIG1heENvbm5lY3Rpb25zIG9yXG4gICogbWF4Q29ubmVjdGlvbnNQZXJJbnN0YW5jZSBtdXN0IGJlIHNldC5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9nb29nbGUvNi40LjAvZG9jcy9yZXNvdXJjZXMvY29tcHV0ZV9yZWdpb25fYmFja2VuZF9zZXJ2aWNlI21heF9jb25uZWN0aW9uc19wZXJfaW5zdGFuY2UgQ29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlI21heF9jb25uZWN0aW9uc19wZXJfaW5zdGFuY2V9XG4gICovXG4gIHJlYWRvbmx5IG1heENvbm5lY3Rpb25zUGVySW5zdGFuY2U/OiBudW1iZXI7XG4gIC8qKlxuICAqIFRoZSBtYXggcmVxdWVzdHMgcGVyIHNlY29uZCAoUlBTKSBvZiB0aGUgZ3JvdXAuIENhbm5vdCBiZSBzZXRcbiAgKiBmb3IgSU5URVJOQUwgYmFja2VuZCBzZXJ2aWNlcy5cbiAgKiBcbiAgKiBDYW4gYmUgdXNlZCB3aXRoIGVpdGhlciBSQVRFIG9yIFVUSUxJWkFUSU9OIGJhbGFuY2luZyBtb2RlcyxcbiAgKiBidXQgcmVxdWlyZWQgaWYgUkFURSBtb2RlLiBFaXRoZXIgbWF4UmF0ZSBvciBvbmVcbiAgKiBvZiBtYXhSYXRlUGVySW5zdGFuY2Ugb3IgbWF4UmF0ZVBlckVuZHBvaW50LCBhcyBhcHByb3ByaWF0ZSBmb3JcbiAgKiBncm91cCB0eXBlLCBtdXN0IGJlIHNldC5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9nb29nbGUvNi40LjAvZG9jcy9yZXNvdXJjZXMvY29tcHV0ZV9yZWdpb25fYmFja2VuZF9zZXJ2aWNlI21heF9yYXRlIENvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZSNtYXhfcmF0ZX1cbiAgKi9cbiAgcmVhZG9ubHkgbWF4UmF0ZT86IG51bWJlcjtcbiAgLyoqXG4gICogVGhlIG1heCByZXF1ZXN0cyBwZXIgc2Vjb25kIChSUFMpIHRoYXQgYSBzaW5nbGUgYmFja2VuZCBuZXR3b3JrXG4gICogZW5kcG9pbnQgY2FuIGhhbmRsZS4gVGhpcyBpcyB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgY2FwYWNpdHkgb2ZcbiAgKiB0aGUgZ3JvdXAuIENhbiBiZSB1c2VkIGluIGVpdGhlciBiYWxhbmNpbmcgbW9kZS4gRm9yIFJBVEUgbW9kZSxcbiAgKiBlaXRoZXIgbWF4UmF0ZSBvciBtYXhSYXRlUGVyRW5kcG9pbnQgbXVzdCBiZSBzZXQuIENhbm5vdCBiZSBzZXRcbiAgKiBmb3IgSU5URVJOQUwgYmFja2VuZCBzZXJ2aWNlcy5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9nb29nbGUvNi40LjAvZG9jcy9yZXNvdXJjZXMvY29tcHV0ZV9yZWdpb25fYmFja2VuZF9zZXJ2aWNlI21heF9yYXRlX3Blcl9lbmRwb2ludCBDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2UjbWF4X3JhdGVfcGVyX2VuZHBvaW50fVxuICAqL1xuICByZWFkb25seSBtYXhSYXRlUGVyRW5kcG9pbnQ/OiBudW1iZXI7XG4gIC8qKlxuICAqIFRoZSBtYXggcmVxdWVzdHMgcGVyIHNlY29uZCAoUlBTKSB0aGF0IGEgc2luZ2xlIGJhY2tlbmRcbiAgKiBpbnN0YW5jZSBjYW4gaGFuZGxlLiBUaGlzIGlzIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBjYXBhY2l0eSBvZlxuICAqIHRoZSBncm91cC4gQ2FuIGJlIHVzZWQgaW4gZWl0aGVyIGJhbGFuY2luZyBtb2RlLiBGb3IgUkFURSBtb2RlLFxuICAqIGVpdGhlciBtYXhSYXRlIG9yIG1heFJhdGVQZXJJbnN0YW5jZSBtdXN0IGJlIHNldC4gQ2Fubm90IGJlIHNldFxuICAqIGZvciBJTlRFUk5BTCBiYWNrZW5kIHNlcnZpY2VzLlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2dvb2dsZS82LjQuMC9kb2NzL3Jlc291cmNlcy9jb21wdXRlX3JlZ2lvbl9iYWNrZW5kX3NlcnZpY2UjbWF4X3JhdGVfcGVyX2luc3RhbmNlIENvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZSNtYXhfcmF0ZV9wZXJfaW5zdGFuY2V9XG4gICovXG4gIHJlYWRvbmx5IG1heFJhdGVQZXJJbnN0YW5jZT86IG51bWJlcjtcbiAgLyoqXG4gICogVXNlZCB3aGVuIGJhbGFuY2luZ01vZGUgaXMgVVRJTElaQVRJT04uIFRoaXMgcmF0aW8gZGVmaW5lcyB0aGVcbiAgKiBDUFUgdXRpbGl6YXRpb24gdGFyZ2V0IGZvciB0aGUgZ3JvdXAuIFZhbGlkIHJhbmdlIGlzIFswLjAsIDEuMF0uXG4gICogQ2Fubm90IGJlIHNldCBmb3IgSU5URVJOQUwgYmFja2VuZCBzZXJ2aWNlcy5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9nb29nbGUvNi40LjAvZG9jcy9yZXNvdXJjZXMvY29tcHV0ZV9yZWdpb25fYmFja2VuZF9zZXJ2aWNlI21heF91dGlsaXphdGlvbiBDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2UjbWF4X3V0aWxpemF0aW9ufVxuICAqL1xuICByZWFkb25seSBtYXhVdGlsaXphdGlvbj86IG51bWJlcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZUJhY2tlbmRUb1RlcnJhZm9ybShzdHJ1Y3Q/OiBDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VCYWNrZW5kIHwgY2RrdGYuSVJlc29sdmFibGUpOiBhbnkge1xuICBpZiAoIWNka3RmLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0Zi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdGYuaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIHJldHVybiB7XG4gICAgYmFsYW5jaW5nX21vZGU6IGNka3RmLnN0cmluZ1RvVGVycmFmb3JtKHN0cnVjdCEuYmFsYW5jaW5nTW9kZSksXG4gICAgY2FwYWNpdHlfc2NhbGVyOiBjZGt0Zi5udW1iZXJUb1RlcnJhZm9ybShzdHJ1Y3QhLmNhcGFjaXR5U2NhbGVyKSxcbiAgICBkZXNjcmlwdGlvbjogY2RrdGYuc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS5kZXNjcmlwdGlvbiksXG4gICAgZmFpbG92ZXI6IGNka3RmLmJvb2xlYW5Ub1RlcnJhZm9ybShzdHJ1Y3QhLmZhaWxvdmVyKSxcbiAgICBncm91cDogY2RrdGYuc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS5ncm91cCksXG4gICAgbWF4X2Nvbm5lY3Rpb25zOiBjZGt0Zi5udW1iZXJUb1RlcnJhZm9ybShzdHJ1Y3QhLm1heENvbm5lY3Rpb25zKSxcbiAgICBtYXhfY29ubmVjdGlvbnNfcGVyX2VuZHBvaW50OiBjZGt0Zi5udW1iZXJUb1RlcnJhZm9ybShzdHJ1Y3QhLm1heENvbm5lY3Rpb25zUGVyRW5kcG9pbnQpLFxuICAgIG1heF9jb25uZWN0aW9uc19wZXJfaW5zdGFuY2U6IGNka3RmLm51bWJlclRvVGVycmFmb3JtKHN0cnVjdCEubWF4Q29ubmVjdGlvbnNQZXJJbnN0YW5jZSksXG4gICAgbWF4X3JhdGU6IGNka3RmLm51bWJlclRvVGVycmFmb3JtKHN0cnVjdCEubWF4UmF0ZSksXG4gICAgbWF4X3JhdGVfcGVyX2VuZHBvaW50OiBjZGt0Zi5udW1iZXJUb1RlcnJhZm9ybShzdHJ1Y3QhLm1heFJhdGVQZXJFbmRwb2ludCksXG4gICAgbWF4X3JhdGVfcGVyX2luc3RhbmNlOiBjZGt0Zi5udW1iZXJUb1RlcnJhZm9ybShzdHJ1Y3QhLm1heFJhdGVQZXJJbnN0YW5jZSksXG4gICAgbWF4X3V0aWxpemF0aW9uOiBjZGt0Zi5udW1iZXJUb1RlcnJhZm9ybShzdHJ1Y3QhLm1heFV0aWxpemF0aW9uKSxcbiAgfVxufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VCYWNrZW5kVG9IY2xUZXJyYWZvcm0oc3RydWN0PzogQ29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlQmFja2VuZCB8IGNka3RmLklSZXNvbHZhYmxlKTogYW55IHtcbiAgaWYgKCFjZGt0Zi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdGYuVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RmLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICBjb25zdCBhdHRycyA9IHtcbiAgICBiYWxhbmNpbmdfbW9kZToge1xuICAgICAgdmFsdWU6IGNka3RmLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEuYmFsYW5jaW5nTW9kZSksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgIH0sXG4gICAgY2FwYWNpdHlfc2NhbGVyOiB7XG4gICAgICB2YWx1ZTogY2RrdGYubnVtYmVyVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5jYXBhY2l0eVNjYWxlciksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIm51bWJlclwiLFxuICAgIH0sXG4gICAgZGVzY3JpcHRpb246IHtcbiAgICAgIHZhbHVlOiBjZGt0Zi5zdHJpbmdUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLmRlc2NyaXB0aW9uKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgICBmYWlsb3Zlcjoge1xuICAgICAgdmFsdWU6IGNka3RmLmJvb2xlYW5Ub0hjbFRlcnJhZm9ybShzdHJ1Y3QhLmZhaWxvdmVyKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwiYm9vbGVhblwiLFxuICAgIH0sXG4gICAgZ3JvdXA6IHtcbiAgICAgIHZhbHVlOiBjZGt0Zi5zdHJpbmdUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLmdyb3VwKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgICBtYXhfY29ubmVjdGlvbnM6IHtcbiAgICAgIHZhbHVlOiBjZGt0Zi5udW1iZXJUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLm1heENvbm5lY3Rpb25zKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwibnVtYmVyXCIsXG4gICAgfSxcbiAgICBtYXhfY29ubmVjdGlvbnNfcGVyX2VuZHBvaW50OiB7XG4gICAgICB2YWx1ZTogY2RrdGYubnVtYmVyVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5tYXhDb25uZWN0aW9uc1BlckVuZHBvaW50KSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwibnVtYmVyXCIsXG4gICAgfSxcbiAgICBtYXhfY29ubmVjdGlvbnNfcGVyX2luc3RhbmNlOiB7XG4gICAgICB2YWx1ZTogY2RrdGYubnVtYmVyVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5tYXhDb25uZWN0aW9uc1Blckluc3RhbmNlKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwibnVtYmVyXCIsXG4gICAgfSxcbiAgICBtYXhfcmF0ZToge1xuICAgICAgdmFsdWU6IGNka3RmLm51bWJlclRvSGNsVGVycmFmb3JtKHN0cnVjdCEubWF4UmF0ZSksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIm51bWJlclwiLFxuICAgIH0sXG4gICAgbWF4X3JhdGVfcGVyX2VuZHBvaW50OiB7XG4gICAgICB2YWx1ZTogY2RrdGYubnVtYmVyVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5tYXhSYXRlUGVyRW5kcG9pbnQpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJudW1iZXJcIixcbiAgICB9LFxuICAgIG1heF9yYXRlX3Blcl9pbnN0YW5jZToge1xuICAgICAgdmFsdWU6IGNka3RmLm51bWJlclRvSGNsVGVycmFmb3JtKHN0cnVjdCEubWF4UmF0ZVBlckluc3RhbmNlKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwibnVtYmVyXCIsXG4gICAgfSxcbiAgICBtYXhfdXRpbGl6YXRpb246IHtcbiAgICAgIHZhbHVlOiBjZGt0Zi5udW1iZXJUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLm1heFV0aWxpemF0aW9uKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwibnVtYmVyXCIsXG4gICAgfSxcbiAgfTtcblxuICAvLyByZW1vdmUgdW5kZWZpbmVkIGF0dHJpYnV0ZXNcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhdHRycykuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWQpKTtcbn1cblxuZXhwb3J0IGNsYXNzIENvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZUJhY2tlbmRPdXRwdXRSZWZlcmVuY2UgZXh0ZW5kcyBjZGt0Zi5Db21wbGV4T2JqZWN0IHtcbiAgcHJpdmF0ZSBpc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gIHByaXZhdGUgcmVzb2x2YWJsZVZhbHVlPzogY2RrdGYuSVJlc29sdmFibGU7XG5cbiAgLyoqXG4gICogQHBhcmFtIHRlcnJhZm9ybVJlc291cmNlIFRoZSBwYXJlbnQgcmVzb3VyY2VcbiAgKiBAcGFyYW0gdGVycmFmb3JtQXR0cmlidXRlIFRoZSBhdHRyaWJ1dGUgb24gdGhlIHBhcmVudCByZXNvdXJjZSB0aGlzIGNsYXNzIGlzIHJlZmVyZW5jaW5nXG4gICogQHBhcmFtIGNvbXBsZXhPYmplY3RJbmRleCB0aGUgaW5kZXggb2YgdGhpcyBpdGVtIGluIHRoZSBsaXN0XG4gICogQHBhcmFtIGNvbXBsZXhPYmplY3RJc0Zyb21TZXQgd2hldGhlciB0aGUgbGlzdCBpcyB3cmFwcGluZyBhIHNldCAod2lsbCBhZGQgdG9saXN0KCkgdG8gYmUgYWJsZSB0byBhY2Nlc3MgYW4gaXRlbSB2aWEgYW4gaW5kZXgpXG4gICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih0ZXJyYWZvcm1SZXNvdXJjZTogY2RrdGYuSUludGVycG9sYXRpbmdQYXJlbnQsIHRlcnJhZm9ybUF0dHJpYnV0ZTogc3RyaW5nLCBjb21wbGV4T2JqZWN0SW5kZXg6IG51bWJlciwgY29tcGxleE9iamVjdElzRnJvbVNldDogYm9vbGVhbikge1xuICAgIHN1cGVyKHRlcnJhZm9ybVJlc291cmNlLCB0ZXJyYWZvcm1BdHRyaWJ1dGUsIGNvbXBsZXhPYmplY3RJc0Zyb21TZXQsIGNvbXBsZXhPYmplY3RJbmRleCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGludGVybmFsVmFsdWUoKTogQ29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlQmFja2VuZCB8IGNka3RmLklSZXNvbHZhYmxlIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5yZXNvbHZhYmxlVmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlc29sdmFibGVWYWx1ZTtcbiAgICB9XG4gICAgbGV0IGhhc0FueVZhbHVlcyA9IHRoaXMuaXNFbXB0eU9iamVjdDtcbiAgICBjb25zdCBpbnRlcm5hbFZhbHVlUmVzdWx0OiBhbnkgPSB7fTtcbiAgICBpZiAodGhpcy5fYmFsYW5jaW5nTW9kZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5iYWxhbmNpbmdNb2RlID0gdGhpcy5fYmFsYW5jaW5nTW9kZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2NhcGFjaXR5U2NhbGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmNhcGFjaXR5U2NhbGVyID0gdGhpcy5fY2FwYWNpdHlTY2FsZXI7XG4gICAgfVxuICAgIGlmICh0aGlzLl9kZXNjcmlwdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5kZXNjcmlwdGlvbiA9IHRoaXMuX2Rlc2NyaXB0aW9uO1xuICAgIH1cbiAgICBpZiAodGhpcy5fZmFpbG92ZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuZmFpbG92ZXIgPSB0aGlzLl9mYWlsb3ZlcjtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2dyb3VwICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0Lmdyb3VwID0gdGhpcy5fZ3JvdXA7XG4gICAgfVxuICAgIGlmICh0aGlzLl9tYXhDb25uZWN0aW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5tYXhDb25uZWN0aW9ucyA9IHRoaXMuX21heENvbm5lY3Rpb25zO1xuICAgIH1cbiAgICBpZiAodGhpcy5fbWF4Q29ubmVjdGlvbnNQZXJFbmRwb2ludCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5tYXhDb25uZWN0aW9uc1BlckVuZHBvaW50ID0gdGhpcy5fbWF4Q29ubmVjdGlvbnNQZXJFbmRwb2ludDtcbiAgICB9XG4gICAgaWYgKHRoaXMuX21heENvbm5lY3Rpb25zUGVySW5zdGFuY2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQubWF4Q29ubmVjdGlvbnNQZXJJbnN0YW5jZSA9IHRoaXMuX21heENvbm5lY3Rpb25zUGVySW5zdGFuY2U7XG4gICAgfVxuICAgIGlmICh0aGlzLl9tYXhSYXRlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0Lm1heFJhdGUgPSB0aGlzLl9tYXhSYXRlO1xuICAgIH1cbiAgICBpZiAodGhpcy5fbWF4UmF0ZVBlckVuZHBvaW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0Lm1heFJhdGVQZXJFbmRwb2ludCA9IHRoaXMuX21heFJhdGVQZXJFbmRwb2ludDtcbiAgICB9XG4gICAgaWYgKHRoaXMuX21heFJhdGVQZXJJbnN0YW5jZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5tYXhSYXRlUGVySW5zdGFuY2UgPSB0aGlzLl9tYXhSYXRlUGVySW5zdGFuY2U7XG4gICAgfVxuICAgIGlmICh0aGlzLl9tYXhVdGlsaXphdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5tYXhVdGlsaXphdGlvbiA9IHRoaXMuX21heFV0aWxpemF0aW9uO1xuICAgIH1cbiAgICByZXR1cm4gaGFzQW55VmFsdWVzID8gaW50ZXJuYWxWYWx1ZVJlc3VsdCA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgaW50ZXJuYWxWYWx1ZSh2YWx1ZTogQ29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlQmFja2VuZCB8IGNka3RmLklSZXNvbHZhYmxlIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuICAgICAgdGhpcy5yZXNvbHZhYmxlVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9iYWxhbmNpbmdNb2RlID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fY2FwYWNpdHlTY2FsZXIgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9kZXNjcmlwdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX2ZhaWxvdmVyID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fZ3JvdXAgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9tYXhDb25uZWN0aW9ucyA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX21heENvbm5lY3Rpb25zUGVyRW5kcG9pbnQgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9tYXhDb25uZWN0aW9uc1Blckluc3RhbmNlID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fbWF4UmF0ZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX21heFJhdGVQZXJFbmRwb2ludCA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX21heFJhdGVQZXJJbnN0YW5jZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX21heFV0aWxpemF0aW9uID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBlbHNlIGlmIChjZGt0Zi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHZhbHVlKSkge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLnJlc29sdmFibGVWYWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGggPT09IDA7XG4gICAgICB0aGlzLnJlc29sdmFibGVWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX2JhbGFuY2luZ01vZGUgPSB2YWx1ZS5iYWxhbmNpbmdNb2RlO1xuICAgICAgdGhpcy5fY2FwYWNpdHlTY2FsZXIgPSB2YWx1ZS5jYXBhY2l0eVNjYWxlcjtcbiAgICAgIHRoaXMuX2Rlc2NyaXB0aW9uID0gdmFsdWUuZGVzY3JpcHRpb247XG4gICAgICB0aGlzLl9mYWlsb3ZlciA9IHZhbHVlLmZhaWxvdmVyO1xuICAgICAgdGhpcy5fZ3JvdXAgPSB2YWx1ZS5ncm91cDtcbiAgICAgIHRoaXMuX21heENvbm5lY3Rpb25zID0gdmFsdWUubWF4Q29ubmVjdGlvbnM7XG4gICAgICB0aGlzLl9tYXhDb25uZWN0aW9uc1BlckVuZHBvaW50ID0gdmFsdWUubWF4Q29ubmVjdGlvbnNQZXJFbmRwb2ludDtcbiAgICAgIHRoaXMuX21heENvbm5lY3Rpb25zUGVySW5zdGFuY2UgPSB2YWx1ZS5tYXhDb25uZWN0aW9uc1Blckluc3RhbmNlO1xuICAgICAgdGhpcy5fbWF4UmF0ZSA9IHZhbHVlLm1heFJhdGU7XG4gICAgICB0aGlzLl9tYXhSYXRlUGVyRW5kcG9pbnQgPSB2YWx1ZS5tYXhSYXRlUGVyRW5kcG9pbnQ7XG4gICAgICB0aGlzLl9tYXhSYXRlUGVySW5zdGFuY2UgPSB2YWx1ZS5tYXhSYXRlUGVySW5zdGFuY2U7XG4gICAgICB0aGlzLl9tYXhVdGlsaXphdGlvbiA9IHZhbHVlLm1heFV0aWxpemF0aW9uO1xuICAgIH1cbiAgfVxuXG4gIC8vIGJhbGFuY2luZ19tb2RlIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2JhbGFuY2luZ01vZGU/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IGJhbGFuY2luZ01vZGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdiYWxhbmNpbmdfbW9kZScpO1xuICB9XG4gIHB1YmxpYyBzZXQgYmFsYW5jaW5nTW9kZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fYmFsYW5jaW5nTW9kZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldEJhbGFuY2luZ01vZGUoKSB7XG4gICAgdGhpcy5fYmFsYW5jaW5nTW9kZSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgYmFsYW5jaW5nTW9kZUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9iYWxhbmNpbmdNb2RlO1xuICB9XG5cbiAgLy8gY2FwYWNpdHlfc2NhbGVyIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2NhcGFjaXR5U2NhbGVyPzogbnVtYmVyOyBcbiAgcHVibGljIGdldCBjYXBhY2l0eVNjYWxlcigpIHtcbiAgICByZXR1cm4gdGhpcy5nZXROdW1iZXJBdHRyaWJ1dGUoJ2NhcGFjaXR5X3NjYWxlcicpO1xuICB9XG4gIHB1YmxpYyBzZXQgY2FwYWNpdHlTY2FsZXIodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX2NhcGFjaXR5U2NhbGVyID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0Q2FwYWNpdHlTY2FsZXIoKSB7XG4gICAgdGhpcy5fY2FwYWNpdHlTY2FsZXIgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGNhcGFjaXR5U2NhbGVySW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NhcGFjaXR5U2NhbGVyO1xuICB9XG5cbiAgLy8gZGVzY3JpcHRpb24gLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfZGVzY3JpcHRpb24/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IGRlc2NyaXB0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnZGVzY3JpcHRpb24nKTtcbiAgfVxuICBwdWJsaWMgc2V0IGRlc2NyaXB0aW9uKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9kZXNjcmlwdGlvbiA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldERlc2NyaXB0aW9uKCkge1xuICAgIHRoaXMuX2Rlc2NyaXB0aW9uID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBkZXNjcmlwdGlvbklucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9kZXNjcmlwdGlvbjtcbiAgfVxuXG4gIC8vIGZhaWxvdmVyIC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfZmFpbG92ZXI/OiBib29sZWFuIHwgY2RrdGYuSVJlc29sdmFibGU7IFxuICBwdWJsaWMgZ2V0IGZhaWxvdmVyKCkge1xuICAgIHJldHVybiB0aGlzLmdldEJvb2xlYW5BdHRyaWJ1dGUoJ2ZhaWxvdmVyJyk7XG4gIH1cbiAgcHVibGljIHNldCBmYWlsb3Zlcih2YWx1ZTogYm9vbGVhbiB8IGNka3RmLklSZXNvbHZhYmxlKSB7XG4gICAgdGhpcy5fZmFpbG92ZXIgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRGYWlsb3ZlcigpIHtcbiAgICB0aGlzLl9mYWlsb3ZlciA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgZmFpbG92ZXJJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZmFpbG92ZXI7XG4gIH1cblxuICAvLyBncm91cCAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogdHJ1ZVxuICBwcml2YXRlIF9ncm91cD86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgZ3JvdXAoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdncm91cCcpO1xuICB9XG4gIHB1YmxpYyBzZXQgZ3JvdXAodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2dyb3VwID0gdmFsdWU7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGdyb3VwSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2dyb3VwO1xuICB9XG5cbiAgLy8gbWF4X2Nvbm5lY3Rpb25zIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX21heENvbm5lY3Rpb25zPzogbnVtYmVyOyBcbiAgcHVibGljIGdldCBtYXhDb25uZWN0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXROdW1iZXJBdHRyaWJ1dGUoJ21heF9jb25uZWN0aW9ucycpO1xuICB9XG4gIHB1YmxpYyBzZXQgbWF4Q29ubmVjdGlvbnModmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX21heENvbm5lY3Rpb25zID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0TWF4Q29ubmVjdGlvbnMoKSB7XG4gICAgdGhpcy5fbWF4Q29ubmVjdGlvbnMgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IG1heENvbm5lY3Rpb25zSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX21heENvbm5lY3Rpb25zO1xuICB9XG5cbiAgLy8gbWF4X2Nvbm5lY3Rpb25zX3Blcl9lbmRwb2ludCAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9tYXhDb25uZWN0aW9uc1BlckVuZHBvaW50PzogbnVtYmVyOyBcbiAgcHVibGljIGdldCBtYXhDb25uZWN0aW9uc1BlckVuZHBvaW50KCkge1xuICAgIHJldHVybiB0aGlzLmdldE51bWJlckF0dHJpYnV0ZSgnbWF4X2Nvbm5lY3Rpb25zX3Blcl9lbmRwb2ludCcpO1xuICB9XG4gIHB1YmxpYyBzZXQgbWF4Q29ubmVjdGlvbnNQZXJFbmRwb2ludCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fbWF4Q29ubmVjdGlvbnNQZXJFbmRwb2ludCA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldE1heENvbm5lY3Rpb25zUGVyRW5kcG9pbnQoKSB7XG4gICAgdGhpcy5fbWF4Q29ubmVjdGlvbnNQZXJFbmRwb2ludCA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgbWF4Q29ubmVjdGlvbnNQZXJFbmRwb2ludElucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9tYXhDb25uZWN0aW9uc1BlckVuZHBvaW50O1xuICB9XG5cbiAgLy8gbWF4X2Nvbm5lY3Rpb25zX3Blcl9pbnN0YW5jZSAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9tYXhDb25uZWN0aW9uc1Blckluc3RhbmNlPzogbnVtYmVyOyBcbiAgcHVibGljIGdldCBtYXhDb25uZWN0aW9uc1Blckluc3RhbmNlKCkge1xuICAgIHJldHVybiB0aGlzLmdldE51bWJlckF0dHJpYnV0ZSgnbWF4X2Nvbm5lY3Rpb25zX3Blcl9pbnN0YW5jZScpO1xuICB9XG4gIHB1YmxpYyBzZXQgbWF4Q29ubmVjdGlvbnNQZXJJbnN0YW5jZSh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fbWF4Q29ubmVjdGlvbnNQZXJJbnN0YW5jZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldE1heENvbm5lY3Rpb25zUGVySW5zdGFuY2UoKSB7XG4gICAgdGhpcy5fbWF4Q29ubmVjdGlvbnNQZXJJbnN0YW5jZSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgbWF4Q29ubmVjdGlvbnNQZXJJbnN0YW5jZUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9tYXhDb25uZWN0aW9uc1Blckluc3RhbmNlO1xuICB9XG5cbiAgLy8gbWF4X3JhdGUgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfbWF4UmF0ZT86IG51bWJlcjsgXG4gIHB1YmxpYyBnZXQgbWF4UmF0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXROdW1iZXJBdHRyaWJ1dGUoJ21heF9yYXRlJyk7XG4gIH1cbiAgcHVibGljIHNldCBtYXhSYXRlKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9tYXhSYXRlID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0TWF4UmF0ZSgpIHtcbiAgICB0aGlzLl9tYXhSYXRlID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBtYXhSYXRlSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX21heFJhdGU7XG4gIH1cblxuICAvLyBtYXhfcmF0ZV9wZXJfZW5kcG9pbnQgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfbWF4UmF0ZVBlckVuZHBvaW50PzogbnVtYmVyOyBcbiAgcHVibGljIGdldCBtYXhSYXRlUGVyRW5kcG9pbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TnVtYmVyQXR0cmlidXRlKCdtYXhfcmF0ZV9wZXJfZW5kcG9pbnQnKTtcbiAgfVxuICBwdWJsaWMgc2V0IG1heFJhdGVQZXJFbmRwb2ludCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fbWF4UmF0ZVBlckVuZHBvaW50ID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0TWF4UmF0ZVBlckVuZHBvaW50KCkge1xuICAgIHRoaXMuX21heFJhdGVQZXJFbmRwb2ludCA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgbWF4UmF0ZVBlckVuZHBvaW50SW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX21heFJhdGVQZXJFbmRwb2ludDtcbiAgfVxuXG4gIC8vIG1heF9yYXRlX3Blcl9pbnN0YW5jZSAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9tYXhSYXRlUGVySW5zdGFuY2U/OiBudW1iZXI7IFxuICBwdWJsaWMgZ2V0IG1heFJhdGVQZXJJbnN0YW5jZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXROdW1iZXJBdHRyaWJ1dGUoJ21heF9yYXRlX3Blcl9pbnN0YW5jZScpO1xuICB9XG4gIHB1YmxpYyBzZXQgbWF4UmF0ZVBlckluc3RhbmNlKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9tYXhSYXRlUGVySW5zdGFuY2UgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRNYXhSYXRlUGVySW5zdGFuY2UoKSB7XG4gICAgdGhpcy5fbWF4UmF0ZVBlckluc3RhbmNlID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBtYXhSYXRlUGVySW5zdGFuY2VJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fbWF4UmF0ZVBlckluc3RhbmNlO1xuICB9XG5cbiAgLy8gbWF4X3V0aWxpemF0aW9uIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX21heFV0aWxpemF0aW9uPzogbnVtYmVyOyBcbiAgcHVibGljIGdldCBtYXhVdGlsaXphdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5nZXROdW1iZXJBdHRyaWJ1dGUoJ21heF91dGlsaXphdGlvbicpO1xuICB9XG4gIHB1YmxpYyBzZXQgbWF4VXRpbGl6YXRpb24odmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX21heFV0aWxpemF0aW9uID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0TWF4VXRpbGl6YXRpb24oKSB7XG4gICAgdGhpcy5fbWF4VXRpbGl6YXRpb24gPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IG1heFV0aWxpemF0aW9uSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX21heFV0aWxpemF0aW9uO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VCYWNrZW5kTGlzdCBleHRlbmRzIGNka3RmLkNvbXBsZXhMaXN0IHtcbiAgcHVibGljIGludGVybmFsVmFsdWU/IDogQ29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlQmFja2VuZFtdIHwgY2RrdGYuSVJlc29sdmFibGVcblxuICAvKipcbiAgKiBAcGFyYW0gdGVycmFmb3JtUmVzb3VyY2UgVGhlIHBhcmVudCByZXNvdXJjZVxuICAqIEBwYXJhbSB0ZXJyYWZvcm1BdHRyaWJ1dGUgVGhlIGF0dHJpYnV0ZSBvbiB0aGUgcGFyZW50IHJlc291cmNlIHRoaXMgY2xhc3MgaXMgcmVmZXJlbmNpbmdcbiAgKiBAcGFyYW0gd3JhcHNTZXQgd2hldGhlciB0aGUgbGlzdCBpcyB3cmFwcGluZyBhIHNldCAod2lsbCBhZGQgdG9saXN0KCkgdG8gYmUgYWJsZSB0byBhY2Nlc3MgYW4gaXRlbSB2aWEgYW4gaW5kZXgpXG4gICovXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCB0ZXJyYWZvcm1SZXNvdXJjZTogY2RrdGYuSUludGVycG9sYXRpbmdQYXJlbnQsIHByb3RlY3RlZCB0ZXJyYWZvcm1BdHRyaWJ1dGU6IHN0cmluZywgcHJvdGVjdGVkIHdyYXBzU2V0OiBib29sZWFuKSB7XG4gICAgc3VwZXIodGVycmFmb3JtUmVzb3VyY2UsIHRlcnJhZm9ybUF0dHJpYnV0ZSwgd3JhcHNTZXQpXG4gIH1cblxuICAvKipcbiAgKiBAcGFyYW0gaW5kZXggdGhlIGluZGV4IG9mIHRoZSBpdGVtIHRvIHJldHVyblxuICAqL1xuICBwdWJsaWMgZ2V0KGluZGV4OiBudW1iZXIpOiBDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VCYWNrZW5kT3V0cHV0UmVmZXJlbmNlIHtcbiAgICByZXR1cm4gbmV3IENvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZUJhY2tlbmRPdXRwdXRSZWZlcmVuY2UodGhpcy50ZXJyYWZvcm1SZXNvdXJjZSwgdGhpcy50ZXJyYWZvcm1BdHRyaWJ1dGUsIGluZGV4LCB0aGlzLndyYXBzU2V0KTtcbiAgfVxufVxuZXhwb3J0IGludGVyZmFjZSBDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VDZG5Qb2xpY3lDYWNoZUtleVBvbGljeSB7XG4gIC8qKlxuICAqIElmIHRydWUgcmVxdWVzdHMgdG8gZGlmZmVyZW50IGhvc3RzIHdpbGwgYmUgY2FjaGVkIHNlcGFyYXRlbHkuXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvZ29vZ2xlLzYuNC4wL2RvY3MvcmVzb3VyY2VzL2NvbXB1dGVfcmVnaW9uX2JhY2tlbmRfc2VydmljZSNpbmNsdWRlX2hvc3QgQ29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlI2luY2x1ZGVfaG9zdH1cbiAgKi9cbiAgcmVhZG9ubHkgaW5jbHVkZUhvc3Q/OiBib29sZWFuIHwgY2RrdGYuSVJlc29sdmFibGU7XG4gIC8qKlxuICAqIE5hbWVzIG9mIGNvb2tpZXMgdG8gaW5jbHVkZSBpbiBjYWNoZSBrZXlzLlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2dvb2dsZS82LjQuMC9kb2NzL3Jlc291cmNlcy9jb21wdXRlX3JlZ2lvbl9iYWNrZW5kX3NlcnZpY2UjaW5jbHVkZV9uYW1lZF9jb29raWVzIENvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZSNpbmNsdWRlX25hbWVkX2Nvb2tpZXN9XG4gICovXG4gIHJlYWRvbmx5IGluY2x1ZGVOYW1lZENvb2tpZXM/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICogSWYgdHJ1ZSwgaHR0cCBhbmQgaHR0cHMgcmVxdWVzdHMgd2lsbCBiZSBjYWNoZWQgc2VwYXJhdGVseS5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9nb29nbGUvNi40LjAvZG9jcy9yZXNvdXJjZXMvY29tcHV0ZV9yZWdpb25fYmFja2VuZF9zZXJ2aWNlI2luY2x1ZGVfcHJvdG9jb2wgQ29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlI2luY2x1ZGVfcHJvdG9jb2x9XG4gICovXG4gIHJlYWRvbmx5IGluY2x1ZGVQcm90b2NvbD86IGJvb2xlYW4gfCBjZGt0Zi5JUmVzb2x2YWJsZTtcbiAgLyoqXG4gICogSWYgdHJ1ZSwgaW5jbHVkZSBxdWVyeSBzdHJpbmcgcGFyYW1ldGVycyBpbiB0aGUgY2FjaGUga2V5XG4gICogYWNjb3JkaW5nIHRvIHF1ZXJ5X3N0cmluZ193aGl0ZWxpc3QgYW5kXG4gICogcXVlcnlfc3RyaW5nX2JsYWNrbGlzdC4gSWYgbmVpdGhlciBpcyBzZXQsIHRoZSBlbnRpcmUgcXVlcnlcbiAgKiBzdHJpbmcgd2lsbCBiZSBpbmNsdWRlZC5cbiAgKiBcbiAgKiBJZiBmYWxzZSwgdGhlIHF1ZXJ5IHN0cmluZyB3aWxsIGJlIGV4Y2x1ZGVkIGZyb20gdGhlIGNhY2hlXG4gICoga2V5IGVudGlyZWx5LlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2dvb2dsZS82LjQuMC9kb2NzL3Jlc291cmNlcy9jb21wdXRlX3JlZ2lvbl9iYWNrZW5kX3NlcnZpY2UjaW5jbHVkZV9xdWVyeV9zdHJpbmcgQ29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlI2luY2x1ZGVfcXVlcnlfc3RyaW5nfVxuICAqL1xuICByZWFkb25seSBpbmNsdWRlUXVlcnlTdHJpbmc/OiBib29sZWFuIHwgY2RrdGYuSVJlc29sdmFibGU7XG4gIC8qKlxuICAqIE5hbWVzIG9mIHF1ZXJ5IHN0cmluZyBwYXJhbWV0ZXJzIHRvIGV4Y2x1ZGUgaW4gY2FjaGUga2V5cy5cbiAgKiBcbiAgKiBBbGwgb3RoZXIgcGFyYW1ldGVycyB3aWxsIGJlIGluY2x1ZGVkLiBFaXRoZXIgc3BlY2lmeVxuICAqIHF1ZXJ5X3N0cmluZ193aGl0ZWxpc3Qgb3IgcXVlcnlfc3RyaW5nX2JsYWNrbGlzdCwgbm90IGJvdGguXG4gICogJyYnIGFuZCAnPScgd2lsbCBiZSBwZXJjZW50IGVuY29kZWQgYW5kIG5vdCB0cmVhdGVkIGFzXG4gICogZGVsaW1pdGVycy5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9nb29nbGUvNi40LjAvZG9jcy9yZXNvdXJjZXMvY29tcHV0ZV9yZWdpb25fYmFja2VuZF9zZXJ2aWNlI3F1ZXJ5X3N0cmluZ19ibGFja2xpc3QgQ29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlI3F1ZXJ5X3N0cmluZ19ibGFja2xpc3R9XG4gICovXG4gIHJlYWRvbmx5IHF1ZXJ5U3RyaW5nQmxhY2tsaXN0Pzogc3RyaW5nW107XG4gIC8qKlxuICAqIE5hbWVzIG9mIHF1ZXJ5IHN0cmluZyBwYXJhbWV0ZXJzIHRvIGluY2x1ZGUgaW4gY2FjaGUga2V5cy5cbiAgKiBcbiAgKiBBbGwgb3RoZXIgcGFyYW1ldGVycyB3aWxsIGJlIGV4Y2x1ZGVkLiBFaXRoZXIgc3BlY2lmeVxuICAqIHF1ZXJ5X3N0cmluZ193aGl0ZWxpc3Qgb3IgcXVlcnlfc3RyaW5nX2JsYWNrbGlzdCwgbm90IGJvdGguXG4gICogJyYnIGFuZCAnPScgd2lsbCBiZSBwZXJjZW50IGVuY29kZWQgYW5kIG5vdCB0cmVhdGVkIGFzXG4gICogZGVsaW1pdGVycy5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9nb29nbGUvNi40LjAvZG9jcy9yZXNvdXJjZXMvY29tcHV0ZV9yZWdpb25fYmFja2VuZF9zZXJ2aWNlI3F1ZXJ5X3N0cmluZ193aGl0ZWxpc3QgQ29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlI3F1ZXJ5X3N0cmluZ193aGl0ZWxpc3R9XG4gICovXG4gIHJlYWRvbmx5IHF1ZXJ5U3RyaW5nV2hpdGVsaXN0Pzogc3RyaW5nW107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VDZG5Qb2xpY3lDYWNoZUtleVBvbGljeVRvVGVycmFmb3JtKHN0cnVjdD86IENvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZUNkblBvbGljeUNhY2hlS2V5UG9saWN5T3V0cHV0UmVmZXJlbmNlIHwgQ29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlQ2RuUG9saWN5Q2FjaGVLZXlQb2xpY3kpOiBhbnkge1xuICBpZiAoIWNka3RmLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0Zi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdGYuaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIHJldHVybiB7XG4gICAgaW5jbHVkZV9ob3N0OiBjZGt0Zi5ib29sZWFuVG9UZXJyYWZvcm0oc3RydWN0IS5pbmNsdWRlSG9zdCksXG4gICAgaW5jbHVkZV9uYW1lZF9jb29raWVzOiBjZGt0Zi5saXN0TWFwcGVyKGNka3RmLnN0cmluZ1RvVGVycmFmb3JtLCBmYWxzZSkoc3RydWN0IS5pbmNsdWRlTmFtZWRDb29raWVzKSxcbiAgICBpbmNsdWRlX3Byb3RvY29sOiBjZGt0Zi5ib29sZWFuVG9UZXJyYWZvcm0oc3RydWN0IS5pbmNsdWRlUHJvdG9jb2wpLFxuICAgIGluY2x1ZGVfcXVlcnlfc3RyaW5nOiBjZGt0Zi5ib29sZWFuVG9UZXJyYWZvcm0oc3RydWN0IS5pbmNsdWRlUXVlcnlTdHJpbmcpLFxuICAgIHF1ZXJ5X3N0cmluZ19ibGFja2xpc3Q6IGNka3RmLmxpc3RNYXBwZXIoY2RrdGYuc3RyaW5nVG9UZXJyYWZvcm0sIGZhbHNlKShzdHJ1Y3QhLnF1ZXJ5U3RyaW5nQmxhY2tsaXN0KSxcbiAgICBxdWVyeV9zdHJpbmdfd2hpdGVsaXN0OiBjZGt0Zi5saXN0TWFwcGVyKGNka3RmLnN0cmluZ1RvVGVycmFmb3JtLCBmYWxzZSkoc3RydWN0IS5xdWVyeVN0cmluZ1doaXRlbGlzdCksXG4gIH1cbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlQ2RuUG9saWN5Q2FjaGVLZXlQb2xpY3lUb0hjbFRlcnJhZm9ybShzdHJ1Y3Q/OiBDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VDZG5Qb2xpY3lDYWNoZUtleVBvbGljeU91dHB1dFJlZmVyZW5jZSB8IENvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZUNkblBvbGljeUNhY2hlS2V5UG9saWN5KTogYW55IHtcbiAgaWYgKCFjZGt0Zi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdGYuVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RmLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICBjb25zdCBhdHRycyA9IHtcbiAgICBpbmNsdWRlX2hvc3Q6IHtcbiAgICAgIHZhbHVlOiBjZGt0Zi5ib29sZWFuVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5pbmNsdWRlSG9zdCksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcImJvb2xlYW5cIixcbiAgICB9LFxuICAgIGluY2x1ZGVfbmFtZWRfY29va2llczoge1xuICAgICAgdmFsdWU6IGNka3RmLmxpc3RNYXBwZXJIY2woY2RrdGYuc3RyaW5nVG9IY2xUZXJyYWZvcm0sIGZhbHNlKShzdHJ1Y3QhLmluY2x1ZGVOYW1lZENvb2tpZXMpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nTGlzdFwiLFxuICAgIH0sXG4gICAgaW5jbHVkZV9wcm90b2NvbDoge1xuICAgICAgdmFsdWU6IGNka3RmLmJvb2xlYW5Ub0hjbFRlcnJhZm9ybShzdHJ1Y3QhLmluY2x1ZGVQcm90b2NvbCksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcImJvb2xlYW5cIixcbiAgICB9LFxuICAgIGluY2x1ZGVfcXVlcnlfc3RyaW5nOiB7XG4gICAgICB2YWx1ZTogY2RrdGYuYm9vbGVhblRvSGNsVGVycmFmb3JtKHN0cnVjdCEuaW5jbHVkZVF1ZXJ5U3RyaW5nKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwiYm9vbGVhblwiLFxuICAgIH0sXG4gICAgcXVlcnlfc3RyaW5nX2JsYWNrbGlzdDoge1xuICAgICAgdmFsdWU6IGNka3RmLmxpc3RNYXBwZXJIY2woY2RrdGYuc3RyaW5nVG9IY2xUZXJyYWZvcm0sIGZhbHNlKShzdHJ1Y3QhLnF1ZXJ5U3RyaW5nQmxhY2tsaXN0KSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzZXRcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nTGlzdFwiLFxuICAgIH0sXG4gICAgcXVlcnlfc3RyaW5nX3doaXRlbGlzdDoge1xuICAgICAgdmFsdWU6IGNka3RmLmxpc3RNYXBwZXJIY2woY2RrdGYuc3RyaW5nVG9IY2xUZXJyYWZvcm0sIGZhbHNlKShzdHJ1Y3QhLnF1ZXJ5U3RyaW5nV2hpdGVsaXN0KSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzZXRcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nTGlzdFwiLFxuICAgIH0sXG4gIH07XG5cbiAgLy8gcmVtb3ZlIHVuZGVmaW5lZCBhdHRyaWJ1dGVzXG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoYXR0cnMpLmZpbHRlcigoW18sIHZhbHVlXSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZS52YWx1ZSAhPT0gdW5kZWZpbmVkKSk7XG59XG5cbmV4cG9ydCBjbGFzcyBDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VDZG5Qb2xpY3lDYWNoZUtleVBvbGljeU91dHB1dFJlZmVyZW5jZSBleHRlbmRzIGNka3RmLkNvbXBsZXhPYmplY3Qge1xuICBwcml2YXRlIGlzRW1wdHlPYmplY3QgPSBmYWxzZTtcblxuICAvKipcbiAgKiBAcGFyYW0gdGVycmFmb3JtUmVzb3VyY2UgVGhlIHBhcmVudCByZXNvdXJjZVxuICAqIEBwYXJhbSB0ZXJyYWZvcm1BdHRyaWJ1dGUgVGhlIGF0dHJpYnV0ZSBvbiB0aGUgcGFyZW50IHJlc291cmNlIHRoaXMgY2xhc3MgaXMgcmVmZXJlbmNpbmdcbiAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHRlcnJhZm9ybVJlc291cmNlOiBjZGt0Zi5JSW50ZXJwb2xhdGluZ1BhcmVudCwgdGVycmFmb3JtQXR0cmlidXRlOiBzdHJpbmcpIHtcbiAgICBzdXBlcih0ZXJyYWZvcm1SZXNvdXJjZSwgdGVycmFmb3JtQXR0cmlidXRlLCBmYWxzZSwgMCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGludGVybmFsVmFsdWUoKTogQ29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlQ2RuUG9saWN5Q2FjaGVLZXlQb2xpY3kgfCB1bmRlZmluZWQge1xuICAgIGxldCBoYXNBbnlWYWx1ZXMgPSB0aGlzLmlzRW1wdHlPYmplY3Q7XG4gICAgY29uc3QgaW50ZXJuYWxWYWx1ZVJlc3VsdDogYW55ID0ge307XG4gICAgaWYgKHRoaXMuX2luY2x1ZGVIb3N0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmluY2x1ZGVIb3N0ID0gdGhpcy5faW5jbHVkZUhvc3Q7XG4gICAgfVxuICAgIGlmICh0aGlzLl9pbmNsdWRlTmFtZWRDb29raWVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmluY2x1ZGVOYW1lZENvb2tpZXMgPSB0aGlzLl9pbmNsdWRlTmFtZWRDb29raWVzO1xuICAgIH1cbiAgICBpZiAodGhpcy5faW5jbHVkZVByb3RvY29sICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmluY2x1ZGVQcm90b2NvbCA9IHRoaXMuX2luY2x1ZGVQcm90b2NvbDtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2luY2x1ZGVRdWVyeVN0cmluZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5pbmNsdWRlUXVlcnlTdHJpbmcgPSB0aGlzLl9pbmNsdWRlUXVlcnlTdHJpbmc7XG4gICAgfVxuICAgIGlmICh0aGlzLl9xdWVyeVN0cmluZ0JsYWNrbGlzdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5xdWVyeVN0cmluZ0JsYWNrbGlzdCA9IHRoaXMuX3F1ZXJ5U3RyaW5nQmxhY2tsaXN0O1xuICAgIH1cbiAgICBpZiAodGhpcy5fcXVlcnlTdHJpbmdXaGl0ZWxpc3QgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQucXVlcnlTdHJpbmdXaGl0ZWxpc3QgPSB0aGlzLl9xdWVyeVN0cmluZ1doaXRlbGlzdDtcbiAgICB9XG4gICAgcmV0dXJuIGhhc0FueVZhbHVlcyA/IGludGVybmFsVmFsdWVSZXN1bHQgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgc2V0IGludGVybmFsVmFsdWUodmFsdWU6IENvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZUNkblBvbGljeUNhY2hlS2V5UG9saWN5IHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuICAgICAgdGhpcy5faW5jbHVkZUhvc3QgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9pbmNsdWRlTmFtZWRDb29raWVzID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5faW5jbHVkZVByb3RvY29sID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5faW5jbHVkZVF1ZXJ5U3RyaW5nID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fcXVlcnlTdHJpbmdCbGFja2xpc3QgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9xdWVyeVN0cmluZ1doaXRlbGlzdCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSAwO1xuICAgICAgdGhpcy5faW5jbHVkZUhvc3QgPSB2YWx1ZS5pbmNsdWRlSG9zdDtcbiAgICAgIHRoaXMuX2luY2x1ZGVOYW1lZENvb2tpZXMgPSB2YWx1ZS5pbmNsdWRlTmFtZWRDb29raWVzO1xuICAgICAgdGhpcy5faW5jbHVkZVByb3RvY29sID0gdmFsdWUuaW5jbHVkZVByb3RvY29sO1xuICAgICAgdGhpcy5faW5jbHVkZVF1ZXJ5U3RyaW5nID0gdmFsdWUuaW5jbHVkZVF1ZXJ5U3RyaW5nO1xuICAgICAgdGhpcy5fcXVlcnlTdHJpbmdCbGFja2xpc3QgPSB2YWx1ZS5xdWVyeVN0cmluZ0JsYWNrbGlzdDtcbiAgICAgIHRoaXMuX3F1ZXJ5U3RyaW5nV2hpdGVsaXN0ID0gdmFsdWUucXVlcnlTdHJpbmdXaGl0ZWxpc3Q7XG4gICAgfVxuICB9XG5cbiAgLy8gaW5jbHVkZV9ob3N0IC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2luY2x1ZGVIb3N0PzogYm9vbGVhbiB8IGNka3RmLklSZXNvbHZhYmxlOyBcbiAgcHVibGljIGdldCBpbmNsdWRlSG9zdCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRCb29sZWFuQXR0cmlidXRlKCdpbmNsdWRlX2hvc3QnKTtcbiAgfVxuICBwdWJsaWMgc2V0IGluY2x1ZGVIb3N0KHZhbHVlOiBib29sZWFuIHwgY2RrdGYuSVJlc29sdmFibGUpIHtcbiAgICB0aGlzLl9pbmNsdWRlSG9zdCA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldEluY2x1ZGVIb3N0KCkge1xuICAgIHRoaXMuX2luY2x1ZGVIb3N0ID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBpbmNsdWRlSG9zdElucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9pbmNsdWRlSG9zdDtcbiAgfVxuXG4gIC8vIGluY2x1ZGVfbmFtZWRfY29va2llcyAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9pbmNsdWRlTmFtZWRDb29raWVzPzogc3RyaW5nW107IFxuICBwdWJsaWMgZ2V0IGluY2x1ZGVOYW1lZENvb2tpZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TGlzdEF0dHJpYnV0ZSgnaW5jbHVkZV9uYW1lZF9jb29raWVzJyk7XG4gIH1cbiAgcHVibGljIHNldCBpbmNsdWRlTmFtZWRDb29raWVzKHZhbHVlOiBzdHJpbmdbXSkge1xuICAgIHRoaXMuX2luY2x1ZGVOYW1lZENvb2tpZXMgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRJbmNsdWRlTmFtZWRDb29raWVzKCkge1xuICAgIHRoaXMuX2luY2x1ZGVOYW1lZENvb2tpZXMgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGluY2x1ZGVOYW1lZENvb2tpZXNJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5faW5jbHVkZU5hbWVkQ29va2llcztcbiAgfVxuXG4gIC8vIGluY2x1ZGVfcHJvdG9jb2wgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfaW5jbHVkZVByb3RvY29sPzogYm9vbGVhbiB8IGNka3RmLklSZXNvbHZhYmxlOyBcbiAgcHVibGljIGdldCBpbmNsdWRlUHJvdG9jb2woKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Qm9vbGVhbkF0dHJpYnV0ZSgnaW5jbHVkZV9wcm90b2NvbCcpO1xuICB9XG4gIHB1YmxpYyBzZXQgaW5jbHVkZVByb3RvY29sKHZhbHVlOiBib29sZWFuIHwgY2RrdGYuSVJlc29sdmFibGUpIHtcbiAgICB0aGlzLl9pbmNsdWRlUHJvdG9jb2wgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRJbmNsdWRlUHJvdG9jb2woKSB7XG4gICAgdGhpcy5faW5jbHVkZVByb3RvY29sID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBpbmNsdWRlUHJvdG9jb2xJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5faW5jbHVkZVByb3RvY29sO1xuICB9XG5cbiAgLy8gaW5jbHVkZV9xdWVyeV9zdHJpbmcgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfaW5jbHVkZVF1ZXJ5U3RyaW5nPzogYm9vbGVhbiB8IGNka3RmLklSZXNvbHZhYmxlOyBcbiAgcHVibGljIGdldCBpbmNsdWRlUXVlcnlTdHJpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Qm9vbGVhbkF0dHJpYnV0ZSgnaW5jbHVkZV9xdWVyeV9zdHJpbmcnKTtcbiAgfVxuICBwdWJsaWMgc2V0IGluY2x1ZGVRdWVyeVN0cmluZyh2YWx1ZTogYm9vbGVhbiB8IGNka3RmLklSZXNvbHZhYmxlKSB7XG4gICAgdGhpcy5faW5jbHVkZVF1ZXJ5U3RyaW5nID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0SW5jbHVkZVF1ZXJ5U3RyaW5nKCkge1xuICAgIHRoaXMuX2luY2x1ZGVRdWVyeVN0cmluZyA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgaW5jbHVkZVF1ZXJ5U3RyaW5nSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2luY2x1ZGVRdWVyeVN0cmluZztcbiAgfVxuXG4gIC8vIHF1ZXJ5X3N0cmluZ19ibGFja2xpc3QgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfcXVlcnlTdHJpbmdCbGFja2xpc3Q/OiBzdHJpbmdbXTsgXG4gIHB1YmxpYyBnZXQgcXVlcnlTdHJpbmdCbGFja2xpc3QoKSB7XG4gICAgcmV0dXJuIGNka3RmLkZuLnRvbGlzdCh0aGlzLmdldExpc3RBdHRyaWJ1dGUoJ3F1ZXJ5X3N0cmluZ19ibGFja2xpc3QnKSk7XG4gIH1cbiAgcHVibGljIHNldCBxdWVyeVN0cmluZ0JsYWNrbGlzdCh2YWx1ZTogc3RyaW5nW10pIHtcbiAgICB0aGlzLl9xdWVyeVN0cmluZ0JsYWNrbGlzdCA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldFF1ZXJ5U3RyaW5nQmxhY2tsaXN0KCkge1xuICAgIHRoaXMuX3F1ZXJ5U3RyaW5nQmxhY2tsaXN0ID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBxdWVyeVN0cmluZ0JsYWNrbGlzdElucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9xdWVyeVN0cmluZ0JsYWNrbGlzdDtcbiAgfVxuXG4gIC8vIHF1ZXJ5X3N0cmluZ193aGl0ZWxpc3QgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfcXVlcnlTdHJpbmdXaGl0ZWxpc3Q/OiBzdHJpbmdbXTsgXG4gIHB1YmxpYyBnZXQgcXVlcnlTdHJpbmdXaGl0ZWxpc3QoKSB7XG4gICAgcmV0dXJuIGNka3RmLkZuLnRvbGlzdCh0aGlzLmdldExpc3RBdHRyaWJ1dGUoJ3F1ZXJ5X3N0cmluZ193aGl0ZWxpc3QnKSk7XG4gIH1cbiAgcHVibGljIHNldCBxdWVyeVN0cmluZ1doaXRlbGlzdCh2YWx1ZTogc3RyaW5nW10pIHtcbiAgICB0aGlzLl9xdWVyeVN0cmluZ1doaXRlbGlzdCA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldFF1ZXJ5U3RyaW5nV2hpdGVsaXN0KCkge1xuICAgIHRoaXMuX3F1ZXJ5U3RyaW5nV2hpdGVsaXN0ID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBxdWVyeVN0cmluZ1doaXRlbGlzdElucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9xdWVyeVN0cmluZ1doaXRlbGlzdDtcbiAgfVxufVxuZXhwb3J0IGludGVyZmFjZSBDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VDZG5Qb2xpY3lOZWdhdGl2ZUNhY2hpbmdQb2xpY3kge1xuICAvKipcbiAgKiBUaGUgSFRUUCBzdGF0dXMgY29kZSB0byBkZWZpbmUgYSBUVEwgYWdhaW5zdC4gT25seSBIVFRQIHN0YXR1cyBjb2RlcyAzMDAsIDMwMSwgMzA4LCA0MDQsIDQwNSwgNDEwLCA0MjEsIDQ1MSBhbmQgNTAxXG4gICogY2FuIGJlIHNwZWNpZmllZCBhcyB2YWx1ZXMsIGFuZCB5b3UgY2Fubm90IHNwZWNpZnkgYSBzdGF0dXMgY29kZSBtb3JlIHRoYW4gb25jZS5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9nb29nbGUvNi40LjAvZG9jcy9yZXNvdXJjZXMvY29tcHV0ZV9yZWdpb25fYmFja2VuZF9zZXJ2aWNlI2NvZGUgQ29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlI2NvZGV9XG4gICovXG4gIHJlYWRvbmx5IGNvZGU/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VDZG5Qb2xpY3lOZWdhdGl2ZUNhY2hpbmdQb2xpY3lUb1RlcnJhZm9ybShzdHJ1Y3Q/OiBDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VDZG5Qb2xpY3lOZWdhdGl2ZUNhY2hpbmdQb2xpY3kgfCBjZGt0Zi5JUmVzb2x2YWJsZSk6IGFueSB7XG4gIGlmICghY2RrdGYuY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RmLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0Zi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBjb2RlOiBjZGt0Zi5udW1iZXJUb1RlcnJhZm9ybShzdHJ1Y3QhLmNvZGUpLFxuICB9XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZUNkblBvbGljeU5lZ2F0aXZlQ2FjaGluZ1BvbGljeVRvSGNsVGVycmFmb3JtKHN0cnVjdD86IENvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZUNkblBvbGljeU5lZ2F0aXZlQ2FjaGluZ1BvbGljeSB8IGNka3RmLklSZXNvbHZhYmxlKTogYW55IHtcbiAgaWYgKCFjZGt0Zi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdGYuVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RmLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICBjb25zdCBhdHRycyA9IHtcbiAgICBjb2RlOiB7XG4gICAgICB2YWx1ZTogY2RrdGYubnVtYmVyVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5jb2RlKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwibnVtYmVyXCIsXG4gICAgfSxcbiAgfTtcblxuICAvLyByZW1vdmUgdW5kZWZpbmVkIGF0dHJpYnV0ZXNcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhdHRycykuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWQpKTtcbn1cblxuZXhwb3J0IGNsYXNzIENvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZUNkblBvbGljeU5lZ2F0aXZlQ2FjaGluZ1BvbGljeU91dHB1dFJlZmVyZW5jZSBleHRlbmRzIGNka3RmLkNvbXBsZXhPYmplY3Qge1xuICBwcml2YXRlIGlzRW1wdHlPYmplY3QgPSBmYWxzZTtcbiAgcHJpdmF0ZSByZXNvbHZhYmxlVmFsdWU/OiBjZGt0Zi5JUmVzb2x2YWJsZTtcblxuICAvKipcbiAgKiBAcGFyYW0gdGVycmFmb3JtUmVzb3VyY2UgVGhlIHBhcmVudCByZXNvdXJjZVxuICAqIEBwYXJhbSB0ZXJyYWZvcm1BdHRyaWJ1dGUgVGhlIGF0dHJpYnV0ZSBvbiB0aGUgcGFyZW50IHJlc291cmNlIHRoaXMgY2xhc3MgaXMgcmVmZXJlbmNpbmdcbiAgKiBAcGFyYW0gY29tcGxleE9iamVjdEluZGV4IHRoZSBpbmRleCBvZiB0aGlzIGl0ZW0gaW4gdGhlIGxpc3RcbiAgKiBAcGFyYW0gY29tcGxleE9iamVjdElzRnJvbVNldCB3aGV0aGVyIHRoZSBsaXN0IGlzIHdyYXBwaW5nIGEgc2V0ICh3aWxsIGFkZCB0b2xpc3QoKSB0byBiZSBhYmxlIHRvIGFjY2VzcyBhbiBpdGVtIHZpYSBhbiBpbmRleClcbiAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHRlcnJhZm9ybVJlc291cmNlOiBjZGt0Zi5JSW50ZXJwb2xhdGluZ1BhcmVudCwgdGVycmFmb3JtQXR0cmlidXRlOiBzdHJpbmcsIGNvbXBsZXhPYmplY3RJbmRleDogbnVtYmVyLCBjb21wbGV4T2JqZWN0SXNGcm9tU2V0OiBib29sZWFuKSB7XG4gICAgc3VwZXIodGVycmFmb3JtUmVzb3VyY2UsIHRlcnJhZm9ybUF0dHJpYnV0ZSwgY29tcGxleE9iamVjdElzRnJvbVNldCwgY29tcGxleE9iamVjdEluZGV4KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW50ZXJuYWxWYWx1ZSgpOiBDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VDZG5Qb2xpY3lOZWdhdGl2ZUNhY2hpbmdQb2xpY3kgfCBjZGt0Zi5JUmVzb2x2YWJsZSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMucmVzb2x2YWJsZVZhbHVlKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZXNvbHZhYmxlVmFsdWU7XG4gICAgfVxuICAgIGxldCBoYXNBbnlWYWx1ZXMgPSB0aGlzLmlzRW1wdHlPYmplY3Q7XG4gICAgY29uc3QgaW50ZXJuYWxWYWx1ZVJlc3VsdDogYW55ID0ge307XG4gICAgaWYgKHRoaXMuX2NvZGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuY29kZSA9IHRoaXMuX2NvZGU7XG4gICAgfVxuICAgIHJldHVybiBoYXNBbnlWYWx1ZXMgPyBpbnRlcm5hbFZhbHVlUmVzdWx0IDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHNldCBpbnRlcm5hbFZhbHVlKHZhbHVlOiBDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VDZG5Qb2xpY3lOZWdhdGl2ZUNhY2hpbmdQb2xpY3kgfCBjZGt0Zi5JUmVzb2x2YWJsZSB8IHVuZGVmaW5lZCkge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBmYWxzZTtcbiAgICAgIHRoaXMucmVzb2x2YWJsZVZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fY29kZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZWxzZSBpZiAoY2RrdGYuVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZSh2YWx1ZSkpIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuICAgICAgdGhpcy5yZXNvbHZhYmxlVmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSAwO1xuICAgICAgdGhpcy5yZXNvbHZhYmxlVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9jb2RlID0gdmFsdWUuY29kZTtcbiAgICB9XG4gIH1cblxuICAvLyBjb2RlIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2NvZGU/OiBudW1iZXI7IFxuICBwdWJsaWMgZ2V0IGNvZGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TnVtYmVyQXR0cmlidXRlKCdjb2RlJyk7XG4gIH1cbiAgcHVibGljIHNldCBjb2RlKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9jb2RlID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0Q29kZSgpIHtcbiAgICB0aGlzLl9jb2RlID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBjb2RlSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvZGU7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIENvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZUNkblBvbGljeU5lZ2F0aXZlQ2FjaGluZ1BvbGljeUxpc3QgZXh0ZW5kcyBjZGt0Zi5Db21wbGV4TGlzdCB7XG4gIHB1YmxpYyBpbnRlcm5hbFZhbHVlPyA6IENvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZUNkblBvbGljeU5lZ2F0aXZlQ2FjaGluZ1BvbGljeVtdIHwgY2RrdGYuSVJlc29sdmFibGVcblxuICAvKipcbiAgKiBAcGFyYW0gdGVycmFmb3JtUmVzb3VyY2UgVGhlIHBhcmVudCByZXNvdXJjZVxuICAqIEBwYXJhbSB0ZXJyYWZvcm1BdHRyaWJ1dGUgVGhlIGF0dHJpYnV0ZSBvbiB0aGUgcGFyZW50IHJlc291cmNlIHRoaXMgY2xhc3MgaXMgcmVmZXJlbmNpbmdcbiAgKiBAcGFyYW0gd3JhcHNTZXQgd2hldGhlciB0aGUgbGlzdCBpcyB3cmFwcGluZyBhIHNldCAod2lsbCBhZGQgdG9saXN0KCkgdG8gYmUgYWJsZSB0byBhY2Nlc3MgYW4gaXRlbSB2aWEgYW4gaW5kZXgpXG4gICovXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCB0ZXJyYWZvcm1SZXNvdXJjZTogY2RrdGYuSUludGVycG9sYXRpbmdQYXJlbnQsIHByb3RlY3RlZCB0ZXJyYWZvcm1BdHRyaWJ1dGU6IHN0cmluZywgcHJvdGVjdGVkIHdyYXBzU2V0OiBib29sZWFuKSB7XG4gICAgc3VwZXIodGVycmFmb3JtUmVzb3VyY2UsIHRlcnJhZm9ybUF0dHJpYnV0ZSwgd3JhcHNTZXQpXG4gIH1cblxuICAvKipcbiAgKiBAcGFyYW0gaW5kZXggdGhlIGluZGV4IG9mIHRoZSBpdGVtIHRvIHJldHVyblxuICAqL1xuICBwdWJsaWMgZ2V0KGluZGV4OiBudW1iZXIpOiBDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VDZG5Qb2xpY3lOZWdhdGl2ZUNhY2hpbmdQb2xpY3lPdXRwdXRSZWZlcmVuY2Uge1xuICAgIHJldHVybiBuZXcgQ29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlQ2RuUG9saWN5TmVnYXRpdmVDYWNoaW5nUG9saWN5T3V0cHV0UmVmZXJlbmNlKHRoaXMudGVycmFmb3JtUmVzb3VyY2UsIHRoaXMudGVycmFmb3JtQXR0cmlidXRlLCBpbmRleCwgdGhpcy53cmFwc1NldCk7XG4gIH1cbn1cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlQ2RuUG9saWN5IHtcbiAgLyoqXG4gICogU3BlY2lmaWVzIHRoZSBjYWNoZSBzZXR0aW5nIGZvciBhbGwgcmVzcG9uc2VzIGZyb20gdGhpcyBiYWNrZW5kLlxuICAqIFRoZSBwb3NzaWJsZSB2YWx1ZXMgYXJlOiBVU0VfT1JJR0lOX0hFQURFUlMsIEZPUkNFX0NBQ0hFX0FMTCBhbmQgQ0FDSEVfQUxMX1NUQVRJQyBQb3NzaWJsZSB2YWx1ZXM6IFtcIlVTRV9PUklHSU5fSEVBREVSU1wiLCBcIkZPUkNFX0NBQ0hFX0FMTFwiLCBcIkNBQ0hFX0FMTF9TVEFUSUNcIl1cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9nb29nbGUvNi40LjAvZG9jcy9yZXNvdXJjZXMvY29tcHV0ZV9yZWdpb25fYmFja2VuZF9zZXJ2aWNlI2NhY2hlX21vZGUgQ29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlI2NhY2hlX21vZGV9XG4gICovXG4gIHJlYWRvbmx5IGNhY2hlTW9kZT86IHN0cmluZztcbiAgLyoqXG4gICogU3BlY2lmaWVzIHRoZSBtYXhpbXVtIGFsbG93ZWQgVFRMIGZvciBjYWNoZWQgY29udGVudCBzZXJ2ZWQgYnkgdGhpcyBvcmlnaW4uXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvZ29vZ2xlLzYuNC4wL2RvY3MvcmVzb3VyY2VzL2NvbXB1dGVfcmVnaW9uX2JhY2tlbmRfc2VydmljZSNjbGllbnRfdHRsIENvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZSNjbGllbnRfdHRsfVxuICAqL1xuICByZWFkb25seSBjbGllbnRUdGw/OiBudW1iZXI7XG4gIC8qKlxuICAqIFNwZWNpZmllcyB0aGUgZGVmYXVsdCBUVEwgZm9yIGNhY2hlZCBjb250ZW50IHNlcnZlZCBieSB0aGlzIG9yaWdpbiBmb3IgcmVzcG9uc2VzXG4gICogdGhhdCBkbyBub3QgaGF2ZSBhbiBleGlzdGluZyB2YWxpZCBUVEwgKG1heC1hZ2Ugb3Igcy1tYXgtYWdlKS5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9nb29nbGUvNi40LjAvZG9jcy9yZXNvdXJjZXMvY29tcHV0ZV9yZWdpb25fYmFja2VuZF9zZXJ2aWNlI2RlZmF1bHRfdHRsIENvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZSNkZWZhdWx0X3R0bH1cbiAgKi9cbiAgcmVhZG9ubHkgZGVmYXVsdFR0bD86IG51bWJlcjtcbiAgLyoqXG4gICogU3BlY2lmaWVzIHRoZSBtYXhpbXVtIGFsbG93ZWQgVFRMIGZvciBjYWNoZWQgY29udGVudCBzZXJ2ZWQgYnkgdGhpcyBvcmlnaW4uXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvZ29vZ2xlLzYuNC4wL2RvY3MvcmVzb3VyY2VzL2NvbXB1dGVfcmVnaW9uX2JhY2tlbmRfc2VydmljZSNtYXhfdHRsIENvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZSNtYXhfdHRsfVxuICAqL1xuICByZWFkb25seSBtYXhUdGw/OiBudW1iZXI7XG4gIC8qKlxuICAqIE5lZ2F0aXZlIGNhY2hpbmcgYWxsb3dzIHBlci1zdGF0dXMgY29kZSBUVExzIHRvIGJlIHNldCwgaW4gb3JkZXIgdG8gYXBwbHkgZmluZS1ncmFpbmVkIGNhY2hpbmcgZm9yIGNvbW1vbiBlcnJvcnMgb3IgcmVkaXJlY3RzLlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2dvb2dsZS82LjQuMC9kb2NzL3Jlc291cmNlcy9jb21wdXRlX3JlZ2lvbl9iYWNrZW5kX3NlcnZpY2UjbmVnYXRpdmVfY2FjaGluZyBDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2UjbmVnYXRpdmVfY2FjaGluZ31cbiAgKi9cbiAgcmVhZG9ubHkgbmVnYXRpdmVDYWNoaW5nPzogYm9vbGVhbiB8IGNka3RmLklSZXNvbHZhYmxlO1xuICAvKipcbiAgKiBTZXJ2ZSBleGlzdGluZyBjb250ZW50IGZyb20gdGhlIGNhY2hlIChpZiBhdmFpbGFibGUpIHdoZW4gcmV2YWxpZGF0aW5nIGNvbnRlbnQgd2l0aCB0aGUgb3JpZ2luLCBvciB3aGVuIGFuIGVycm9yIGlzIGVuY291bnRlcmVkIHdoZW4gcmVmcmVzaGluZyB0aGUgY2FjaGUuXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvZ29vZ2xlLzYuNC4wL2RvY3MvcmVzb3VyY2VzL2NvbXB1dGVfcmVnaW9uX2JhY2tlbmRfc2VydmljZSNzZXJ2ZV93aGlsZV9zdGFsZSBDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2Ujc2VydmVfd2hpbGVfc3RhbGV9XG4gICovXG4gIHJlYWRvbmx5IHNlcnZlV2hpbGVTdGFsZT86IG51bWJlcjtcbiAgLyoqXG4gICogTWF4aW11bSBudW1iZXIgb2Ygc2Vjb25kcyB0aGUgcmVzcG9uc2UgdG8gYSBzaWduZWQgVVJMIHJlcXVlc3RcbiAgKiB3aWxsIGJlIGNvbnNpZGVyZWQgZnJlc2gsIGRlZmF1bHRzIHRvIDFociAoMzYwMHMpLiBBZnRlciB0aGlzXG4gICogdGltZSBwZXJpb2QsIHRoZSByZXNwb25zZSB3aWxsIGJlIHJldmFsaWRhdGVkIGJlZm9yZVxuICAqIGJlaW5nIHNlcnZlZC5cbiAgKiBcbiAgKiBXaGVuIHNlcnZpbmcgcmVzcG9uc2VzIHRvIHNpZ25lZCBVUkwgcmVxdWVzdHMsIENsb3VkIENETiB3aWxsXG4gICogaW50ZXJuYWxseSBiZWhhdmUgYXMgdGhvdWdoIGFsbCByZXNwb25zZXMgZnJvbSB0aGlzIGJhY2tlbmQgaGFkIGFcbiAgKiBcIkNhY2hlLUNvbnRyb2w6IHB1YmxpYywgbWF4LWFnZT1bVFRMXVwiIGhlYWRlciwgcmVnYXJkbGVzcyBvZiBhbnlcbiAgKiBleGlzdGluZyBDYWNoZS1Db250cm9sIGhlYWRlci4gVGhlIGFjdHVhbCBoZWFkZXJzIHNlcnZlZCBpblxuICAqIHJlc3BvbnNlcyB3aWxsIG5vdCBiZSBhbHRlcmVkLlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2dvb2dsZS82LjQuMC9kb2NzL3Jlc291cmNlcy9jb21wdXRlX3JlZ2lvbl9iYWNrZW5kX3NlcnZpY2Ujc2lnbmVkX3VybF9jYWNoZV9tYXhfYWdlX3NlYyBDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2Ujc2lnbmVkX3VybF9jYWNoZV9tYXhfYWdlX3NlY31cbiAgKi9cbiAgcmVhZG9ubHkgc2lnbmVkVXJsQ2FjaGVNYXhBZ2VTZWM/OiBudW1iZXI7XG4gIC8qKlxuICAqIGNhY2hlX2tleV9wb2xpY3kgYmxvY2tcbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9nb29nbGUvNi40LjAvZG9jcy9yZXNvdXJjZXMvY29tcHV0ZV9yZWdpb25fYmFja2VuZF9zZXJ2aWNlI2NhY2hlX2tleV9wb2xpY3kgQ29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlI2NhY2hlX2tleV9wb2xpY3l9XG4gICovXG4gIHJlYWRvbmx5IGNhY2hlS2V5UG9saWN5PzogQ29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlQ2RuUG9saWN5Q2FjaGVLZXlQb2xpY3k7XG4gIC8qKlxuICAqIG5lZ2F0aXZlX2NhY2hpbmdfcG9saWN5IGJsb2NrXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvZ29vZ2xlLzYuNC4wL2RvY3MvcmVzb3VyY2VzL2NvbXB1dGVfcmVnaW9uX2JhY2tlbmRfc2VydmljZSNuZWdhdGl2ZV9jYWNoaW5nX3BvbGljeSBDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2UjbmVnYXRpdmVfY2FjaGluZ19wb2xpY3l9XG4gICovXG4gIHJlYWRvbmx5IG5lZ2F0aXZlQ2FjaGluZ1BvbGljeT86IENvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZUNkblBvbGljeU5lZ2F0aXZlQ2FjaGluZ1BvbGljeVtdIHwgY2RrdGYuSVJlc29sdmFibGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VDZG5Qb2xpY3lUb1RlcnJhZm9ybShzdHJ1Y3Q/OiBDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VDZG5Qb2xpY3lPdXRwdXRSZWZlcmVuY2UgfCBDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VDZG5Qb2xpY3kpOiBhbnkge1xuICBpZiAoIWNka3RmLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0Zi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdGYuaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIHJldHVybiB7XG4gICAgY2FjaGVfbW9kZTogY2RrdGYuc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS5jYWNoZU1vZGUpLFxuICAgIGNsaWVudF90dGw6IGNka3RmLm51bWJlclRvVGVycmFmb3JtKHN0cnVjdCEuY2xpZW50VHRsKSxcbiAgICBkZWZhdWx0X3R0bDogY2RrdGYubnVtYmVyVG9UZXJyYWZvcm0oc3RydWN0IS5kZWZhdWx0VHRsKSxcbiAgICBtYXhfdHRsOiBjZGt0Zi5udW1iZXJUb1RlcnJhZm9ybShzdHJ1Y3QhLm1heFR0bCksXG4gICAgbmVnYXRpdmVfY2FjaGluZzogY2RrdGYuYm9vbGVhblRvVGVycmFmb3JtKHN0cnVjdCEubmVnYXRpdmVDYWNoaW5nKSxcbiAgICBzZXJ2ZV93aGlsZV9zdGFsZTogY2RrdGYubnVtYmVyVG9UZXJyYWZvcm0oc3RydWN0IS5zZXJ2ZVdoaWxlU3RhbGUpLFxuICAgIHNpZ25lZF91cmxfY2FjaGVfbWF4X2FnZV9zZWM6IGNka3RmLm51bWJlclRvVGVycmFmb3JtKHN0cnVjdCEuc2lnbmVkVXJsQ2FjaGVNYXhBZ2VTZWMpLFxuICAgIGNhY2hlX2tleV9wb2xpY3k6IGNvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZUNkblBvbGljeUNhY2hlS2V5UG9saWN5VG9UZXJyYWZvcm0oc3RydWN0IS5jYWNoZUtleVBvbGljeSksXG4gICAgbmVnYXRpdmVfY2FjaGluZ19wb2xpY3k6IGNka3RmLmxpc3RNYXBwZXIoY29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlQ2RuUG9saWN5TmVnYXRpdmVDYWNoaW5nUG9saWN5VG9UZXJyYWZvcm0sIHRydWUpKHN0cnVjdCEubmVnYXRpdmVDYWNoaW5nUG9saWN5KSxcbiAgfVxufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VDZG5Qb2xpY3lUb0hjbFRlcnJhZm9ybShzdHJ1Y3Q/OiBDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VDZG5Qb2xpY3lPdXRwdXRSZWZlcmVuY2UgfCBDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VDZG5Qb2xpY3kpOiBhbnkge1xuICBpZiAoIWNka3RmLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0Zi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdGYuaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIGNvbnN0IGF0dHJzID0ge1xuICAgIGNhY2hlX21vZGU6IHtcbiAgICAgIHZhbHVlOiBjZGt0Zi5zdHJpbmdUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLmNhY2hlTW9kZSksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgIH0sXG4gICAgY2xpZW50X3R0bDoge1xuICAgICAgdmFsdWU6IGNka3RmLm51bWJlclRvSGNsVGVycmFmb3JtKHN0cnVjdCEuY2xpZW50VHRsKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwibnVtYmVyXCIsXG4gICAgfSxcbiAgICBkZWZhdWx0X3R0bDoge1xuICAgICAgdmFsdWU6IGNka3RmLm51bWJlclRvSGNsVGVycmFmb3JtKHN0cnVjdCEuZGVmYXVsdFR0bCksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIm51bWJlclwiLFxuICAgIH0sXG4gICAgbWF4X3R0bDoge1xuICAgICAgdmFsdWU6IGNka3RmLm51bWJlclRvSGNsVGVycmFmb3JtKHN0cnVjdCEubWF4VHRsKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwibnVtYmVyXCIsXG4gICAgfSxcbiAgICBuZWdhdGl2ZV9jYWNoaW5nOiB7XG4gICAgICB2YWx1ZTogY2RrdGYuYm9vbGVhblRvSGNsVGVycmFmb3JtKHN0cnVjdCEubmVnYXRpdmVDYWNoaW5nKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwiYm9vbGVhblwiLFxuICAgIH0sXG4gICAgc2VydmVfd2hpbGVfc3RhbGU6IHtcbiAgICAgIHZhbHVlOiBjZGt0Zi5udW1iZXJUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLnNlcnZlV2hpbGVTdGFsZSksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIm51bWJlclwiLFxuICAgIH0sXG4gICAgc2lnbmVkX3VybF9jYWNoZV9tYXhfYWdlX3NlYzoge1xuICAgICAgdmFsdWU6IGNka3RmLm51bWJlclRvSGNsVGVycmFmb3JtKHN0cnVjdCEuc2lnbmVkVXJsQ2FjaGVNYXhBZ2VTZWMpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJudW1iZXJcIixcbiAgICB9LFxuICAgIGNhY2hlX2tleV9wb2xpY3k6IHtcbiAgICAgIHZhbHVlOiBjb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VDZG5Qb2xpY3lDYWNoZUtleVBvbGljeVRvSGNsVGVycmFmb3JtKHN0cnVjdCEuY2FjaGVLZXlQb2xpY3kpLFxuICAgICAgaXNCbG9jazogdHJ1ZSxcbiAgICAgIHR5cGU6IFwibGlzdFwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VDZG5Qb2xpY3lDYWNoZUtleVBvbGljeUxpc3RcIixcbiAgICB9LFxuICAgIG5lZ2F0aXZlX2NhY2hpbmdfcG9saWN5OiB7XG4gICAgICB2YWx1ZTogY2RrdGYubGlzdE1hcHBlckhjbChjb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VDZG5Qb2xpY3lOZWdhdGl2ZUNhY2hpbmdQb2xpY3lUb0hjbFRlcnJhZm9ybSwgdHJ1ZSkoc3RydWN0IS5uZWdhdGl2ZUNhY2hpbmdQb2xpY3kpLFxuICAgICAgaXNCbG9jazogdHJ1ZSxcbiAgICAgIHR5cGU6IFwibGlzdFwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VDZG5Qb2xpY3lOZWdhdGl2ZUNhY2hpbmdQb2xpY3lMaXN0XCIsXG4gICAgfSxcbiAgfTtcblxuICAvLyByZW1vdmUgdW5kZWZpbmVkIGF0dHJpYnV0ZXNcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhdHRycykuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWQpKTtcbn1cblxuZXhwb3J0IGNsYXNzIENvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZUNkblBvbGljeU91dHB1dFJlZmVyZW5jZSBleHRlbmRzIGNka3RmLkNvbXBsZXhPYmplY3Qge1xuICBwcml2YXRlIGlzRW1wdHlPYmplY3QgPSBmYWxzZTtcblxuICAvKipcbiAgKiBAcGFyYW0gdGVycmFmb3JtUmVzb3VyY2UgVGhlIHBhcmVudCByZXNvdXJjZVxuICAqIEBwYXJhbSB0ZXJyYWZvcm1BdHRyaWJ1dGUgVGhlIGF0dHJpYnV0ZSBvbiB0aGUgcGFyZW50IHJlc291cmNlIHRoaXMgY2xhc3MgaXMgcmVmZXJlbmNpbmdcbiAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHRlcnJhZm9ybVJlc291cmNlOiBjZGt0Zi5JSW50ZXJwb2xhdGluZ1BhcmVudCwgdGVycmFmb3JtQXR0cmlidXRlOiBzdHJpbmcpIHtcbiAgICBzdXBlcih0ZXJyYWZvcm1SZXNvdXJjZSwgdGVycmFmb3JtQXR0cmlidXRlLCBmYWxzZSwgMCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGludGVybmFsVmFsdWUoKTogQ29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlQ2RuUG9saWN5IHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgaGFzQW55VmFsdWVzID0gdGhpcy5pc0VtcHR5T2JqZWN0O1xuICAgIGNvbnN0IGludGVybmFsVmFsdWVSZXN1bHQ6IGFueSA9IHt9O1xuICAgIGlmICh0aGlzLl9jYWNoZU1vZGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuY2FjaGVNb2RlID0gdGhpcy5fY2FjaGVNb2RlO1xuICAgIH1cbiAgICBpZiAodGhpcy5fY2xpZW50VHRsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmNsaWVudFR0bCA9IHRoaXMuX2NsaWVudFR0bDtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2RlZmF1bHRUdGwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuZGVmYXVsdFR0bCA9IHRoaXMuX2RlZmF1bHRUdGw7XG4gICAgfVxuICAgIGlmICh0aGlzLl9tYXhUdGwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQubWF4VHRsID0gdGhpcy5fbWF4VHRsO1xuICAgIH1cbiAgICBpZiAodGhpcy5fbmVnYXRpdmVDYWNoaW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0Lm5lZ2F0aXZlQ2FjaGluZyA9IHRoaXMuX25lZ2F0aXZlQ2FjaGluZztcbiAgICB9XG4gICAgaWYgKHRoaXMuX3NlcnZlV2hpbGVTdGFsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5zZXJ2ZVdoaWxlU3RhbGUgPSB0aGlzLl9zZXJ2ZVdoaWxlU3RhbGU7XG4gICAgfVxuICAgIGlmICh0aGlzLl9zaWduZWRVcmxDYWNoZU1heEFnZVNlYyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5zaWduZWRVcmxDYWNoZU1heEFnZVNlYyA9IHRoaXMuX3NpZ25lZFVybENhY2hlTWF4QWdlU2VjO1xuICAgIH1cbiAgICBpZiAodGhpcy5fY2FjaGVLZXlQb2xpY3k/LmludGVybmFsVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuY2FjaGVLZXlQb2xpY3kgPSB0aGlzLl9jYWNoZUtleVBvbGljeT8uaW50ZXJuYWxWYWx1ZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX25lZ2F0aXZlQ2FjaGluZ1BvbGljeT8uaW50ZXJuYWxWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5uZWdhdGl2ZUNhY2hpbmdQb2xpY3kgPSB0aGlzLl9uZWdhdGl2ZUNhY2hpbmdQb2xpY3k/LmludGVybmFsVmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBoYXNBbnlWYWx1ZXMgPyBpbnRlcm5hbFZhbHVlUmVzdWx0IDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHNldCBpbnRlcm5hbFZhbHVlKHZhbHVlOiBDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VDZG5Qb2xpY3kgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLl9jYWNoZU1vZGUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9jbGllbnRUdGwgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9kZWZhdWx0VHRsID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fbWF4VHRsID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fbmVnYXRpdmVDYWNoaW5nID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fc2VydmVXaGlsZVN0YWxlID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fc2lnbmVkVXJsQ2FjaGVNYXhBZ2VTZWMgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9jYWNoZUtleVBvbGljeS5pbnRlcm5hbFZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fbmVnYXRpdmVDYWNoaW5nUG9saWN5LmludGVybmFsVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA9PT0gMDtcbiAgICAgIHRoaXMuX2NhY2hlTW9kZSA9IHZhbHVlLmNhY2hlTW9kZTtcbiAgICAgIHRoaXMuX2NsaWVudFR0bCA9IHZhbHVlLmNsaWVudFR0bDtcbiAgICAgIHRoaXMuX2RlZmF1bHRUdGwgPSB2YWx1ZS5kZWZhdWx0VHRsO1xuICAgICAgdGhpcy5fbWF4VHRsID0gdmFsdWUubWF4VHRsO1xuICAgICAgdGhpcy5fbmVnYXRpdmVDYWNoaW5nID0gdmFsdWUubmVnYXRpdmVDYWNoaW5nO1xuICAgICAgdGhpcy5fc2VydmVXaGlsZVN0YWxlID0gdmFsdWUuc2VydmVXaGlsZVN0YWxlO1xuICAgICAgdGhpcy5fc2lnbmVkVXJsQ2FjaGVNYXhBZ2VTZWMgPSB2YWx1ZS5zaWduZWRVcmxDYWNoZU1heEFnZVNlYztcbiAgICAgIHRoaXMuX2NhY2hlS2V5UG9saWN5LmludGVybmFsVmFsdWUgPSB2YWx1ZS5jYWNoZUtleVBvbGljeTtcbiAgICAgIHRoaXMuX25lZ2F0aXZlQ2FjaGluZ1BvbGljeS5pbnRlcm5hbFZhbHVlID0gdmFsdWUubmVnYXRpdmVDYWNoaW5nUG9saWN5O1xuICAgIH1cbiAgfVxuXG4gIC8vIGNhY2hlX21vZGUgLSBjb21wdXRlZDogdHJ1ZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9jYWNoZU1vZGU/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IGNhY2hlTW9kZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ2NhY2hlX21vZGUnKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNhY2hlTW9kZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fY2FjaGVNb2RlID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0Q2FjaGVNb2RlKCkge1xuICAgIHRoaXMuX2NhY2hlTW9kZSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgY2FjaGVNb2RlSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NhY2hlTW9kZTtcbiAgfVxuXG4gIC8vIGNsaWVudF90dGwgLSBjb21wdXRlZDogdHJ1ZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9jbGllbnRUdGw/OiBudW1iZXI7IFxuICBwdWJsaWMgZ2V0IGNsaWVudFR0bCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXROdW1iZXJBdHRyaWJ1dGUoJ2NsaWVudF90dGwnKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNsaWVudFR0bCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fY2xpZW50VHRsID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0Q2xpZW50VHRsKCkge1xuICAgIHRoaXMuX2NsaWVudFR0bCA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgY2xpZW50VHRsSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudFR0bDtcbiAgfVxuXG4gIC8vIGRlZmF1bHRfdHRsIC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfZGVmYXVsdFR0bD86IG51bWJlcjsgXG4gIHB1YmxpYyBnZXQgZGVmYXVsdFR0bCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXROdW1iZXJBdHRyaWJ1dGUoJ2RlZmF1bHRfdHRsJyk7XG4gIH1cbiAgcHVibGljIHNldCBkZWZhdWx0VHRsKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9kZWZhdWx0VHRsID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0RGVmYXVsdFR0bCgpIHtcbiAgICB0aGlzLl9kZWZhdWx0VHRsID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBkZWZhdWx0VHRsSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RlZmF1bHRUdGw7XG4gIH1cblxuICAvLyBtYXhfdHRsIC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfbWF4VHRsPzogbnVtYmVyOyBcbiAgcHVibGljIGdldCBtYXhUdGwoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TnVtYmVyQXR0cmlidXRlKCdtYXhfdHRsJyk7XG4gIH1cbiAgcHVibGljIHNldCBtYXhUdGwodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX21heFR0bCA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldE1heFR0bCgpIHtcbiAgICB0aGlzLl9tYXhUdGwgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IG1heFR0bElucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9tYXhUdGw7XG4gIH1cblxuICAvLyBuZWdhdGl2ZV9jYWNoaW5nIC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfbmVnYXRpdmVDYWNoaW5nPzogYm9vbGVhbiB8IGNka3RmLklSZXNvbHZhYmxlOyBcbiAgcHVibGljIGdldCBuZWdhdGl2ZUNhY2hpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Qm9vbGVhbkF0dHJpYnV0ZSgnbmVnYXRpdmVfY2FjaGluZycpO1xuICB9XG4gIHB1YmxpYyBzZXQgbmVnYXRpdmVDYWNoaW5nKHZhbHVlOiBib29sZWFuIHwgY2RrdGYuSVJlc29sdmFibGUpIHtcbiAgICB0aGlzLl9uZWdhdGl2ZUNhY2hpbmcgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXROZWdhdGl2ZUNhY2hpbmcoKSB7XG4gICAgdGhpcy5fbmVnYXRpdmVDYWNoaW5nID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBuZWdhdGl2ZUNhY2hpbmdJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fbmVnYXRpdmVDYWNoaW5nO1xuICB9XG5cbiAgLy8gc2VydmVfd2hpbGVfc3RhbGUgLSBjb21wdXRlZDogdHJ1ZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9zZXJ2ZVdoaWxlU3RhbGU/OiBudW1iZXI7IFxuICBwdWJsaWMgZ2V0IHNlcnZlV2hpbGVTdGFsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXROdW1iZXJBdHRyaWJ1dGUoJ3NlcnZlX3doaWxlX3N0YWxlJyk7XG4gIH1cbiAgcHVibGljIHNldCBzZXJ2ZVdoaWxlU3RhbGUodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX3NlcnZlV2hpbGVTdGFsZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldFNlcnZlV2hpbGVTdGFsZSgpIHtcbiAgICB0aGlzLl9zZXJ2ZVdoaWxlU3RhbGUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHNlcnZlV2hpbGVTdGFsZUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9zZXJ2ZVdoaWxlU3RhbGU7XG4gIH1cblxuICAvLyBzaWduZWRfdXJsX2NhY2hlX21heF9hZ2Vfc2VjIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX3NpZ25lZFVybENhY2hlTWF4QWdlU2VjPzogbnVtYmVyOyBcbiAgcHVibGljIGdldCBzaWduZWRVcmxDYWNoZU1heEFnZVNlYygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXROdW1iZXJBdHRyaWJ1dGUoJ3NpZ25lZF91cmxfY2FjaGVfbWF4X2FnZV9zZWMnKTtcbiAgfVxuICBwdWJsaWMgc2V0IHNpZ25lZFVybENhY2hlTWF4QWdlU2VjKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9zaWduZWRVcmxDYWNoZU1heEFnZVNlYyA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldFNpZ25lZFVybENhY2hlTWF4QWdlU2VjKCkge1xuICAgIHRoaXMuX3NpZ25lZFVybENhY2hlTWF4QWdlU2VjID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBzaWduZWRVcmxDYWNoZU1heEFnZVNlY0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9zaWduZWRVcmxDYWNoZU1heEFnZVNlYztcbiAgfVxuXG4gIC8vIGNhY2hlX2tleV9wb2xpY3kgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfY2FjaGVLZXlQb2xpY3kgPSBuZXcgQ29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlQ2RuUG9saWN5Q2FjaGVLZXlQb2xpY3lPdXRwdXRSZWZlcmVuY2UodGhpcywgXCJjYWNoZV9rZXlfcG9saWN5XCIpO1xuICBwdWJsaWMgZ2V0IGNhY2hlS2V5UG9saWN5KCkge1xuICAgIHJldHVybiB0aGlzLl9jYWNoZUtleVBvbGljeTtcbiAgfVxuICBwdWJsaWMgcHV0Q2FjaGVLZXlQb2xpY3kodmFsdWU6IENvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZUNkblBvbGljeUNhY2hlS2V5UG9saWN5KSB7XG4gICAgdGhpcy5fY2FjaGVLZXlQb2xpY3kuaW50ZXJuYWxWYWx1ZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldENhY2hlS2V5UG9saWN5KCkge1xuICAgIHRoaXMuX2NhY2hlS2V5UG9saWN5LmludGVybmFsVmFsdWUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGNhY2hlS2V5UG9saWN5SW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NhY2hlS2V5UG9saWN5LmludGVybmFsVmFsdWU7XG4gIH1cblxuICAvLyBuZWdhdGl2ZV9jYWNoaW5nX3BvbGljeSAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9uZWdhdGl2ZUNhY2hpbmdQb2xpY3kgPSBuZXcgQ29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlQ2RuUG9saWN5TmVnYXRpdmVDYWNoaW5nUG9saWN5TGlzdCh0aGlzLCBcIm5lZ2F0aXZlX2NhY2hpbmdfcG9saWN5XCIsIGZhbHNlKTtcbiAgcHVibGljIGdldCBuZWdhdGl2ZUNhY2hpbmdQb2xpY3koKSB7XG4gICAgcmV0dXJuIHRoaXMuX25lZ2F0aXZlQ2FjaGluZ1BvbGljeTtcbiAgfVxuICBwdWJsaWMgcHV0TmVnYXRpdmVDYWNoaW5nUG9saWN5KHZhbHVlOiBDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VDZG5Qb2xpY3lOZWdhdGl2ZUNhY2hpbmdQb2xpY3lbXSB8IGNka3RmLklSZXNvbHZhYmxlKSB7XG4gICAgdGhpcy5fbmVnYXRpdmVDYWNoaW5nUG9saWN5LmludGVybmFsVmFsdWUgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXROZWdhdGl2ZUNhY2hpbmdQb2xpY3koKSB7XG4gICAgdGhpcy5fbmVnYXRpdmVDYWNoaW5nUG9saWN5LmludGVybmFsVmFsdWUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IG5lZ2F0aXZlQ2FjaGluZ1BvbGljeUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9uZWdhdGl2ZUNhY2hpbmdQb2xpY3kuaW50ZXJuYWxWYWx1ZTtcbiAgfVxufVxuZXhwb3J0IGludGVyZmFjZSBDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VDaXJjdWl0QnJlYWtlcnMge1xuICAvKipcbiAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgY29ubmVjdGlvbnMgdG8gdGhlIGJhY2tlbmQgY2x1c3Rlci5cbiAgKiBEZWZhdWx0cyB0byAxMDI0LlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2dvb2dsZS82LjQuMC9kb2NzL3Jlc291cmNlcy9jb21wdXRlX3JlZ2lvbl9iYWNrZW5kX3NlcnZpY2UjbWF4X2Nvbm5lY3Rpb25zIENvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZSNtYXhfY29ubmVjdGlvbnN9XG4gICovXG4gIHJlYWRvbmx5IG1heENvbm5lY3Rpb25zPzogbnVtYmVyO1xuICAvKipcbiAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgcGVuZGluZyByZXF1ZXN0cyB0byB0aGUgYmFja2VuZCBjbHVzdGVyLlxuICAqIERlZmF1bHRzIHRvIDEwMjQuXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvZ29vZ2xlLzYuNC4wL2RvY3MvcmVzb3VyY2VzL2NvbXB1dGVfcmVnaW9uX2JhY2tlbmRfc2VydmljZSNtYXhfcGVuZGluZ19yZXF1ZXN0cyBDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2UjbWF4X3BlbmRpbmdfcmVxdWVzdHN9XG4gICovXG4gIHJlYWRvbmx5IG1heFBlbmRpbmdSZXF1ZXN0cz86IG51bWJlcjtcbiAgLyoqXG4gICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHBhcmFsbGVsIHJlcXVlc3RzIHRvIHRoZSBiYWNrZW5kIGNsdXN0ZXIuXG4gICogRGVmYXVsdHMgdG8gMTAyNC5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9nb29nbGUvNi40LjAvZG9jcy9yZXNvdXJjZXMvY29tcHV0ZV9yZWdpb25fYmFja2VuZF9zZXJ2aWNlI21heF9yZXF1ZXN0cyBDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2UjbWF4X3JlcXVlc3RzfVxuICAqL1xuICByZWFkb25seSBtYXhSZXF1ZXN0cz86IG51bWJlcjtcbiAgLyoqXG4gICogTWF4aW11bSByZXF1ZXN0cyBmb3IgYSBzaW5nbGUgYmFja2VuZCBjb25uZWN0aW9uLiBUaGlzIHBhcmFtZXRlclxuICAqIGlzIHJlc3BlY3RlZCBieSBib3RoIHRoZSBIVFRQLzEuMSBhbmQgSFRUUC8yIGltcGxlbWVudGF0aW9ucy4gSWZcbiAgKiBub3Qgc3BlY2lmaWVkLCB0aGVyZSBpcyBubyBsaW1pdC4gU2V0dGluZyB0aGlzIHBhcmFtZXRlciB0byAxXG4gICogd2lsbCBlZmZlY3RpdmVseSBkaXNhYmxlIGtlZXAgYWxpdmUuXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvZ29vZ2xlLzYuNC4wL2RvY3MvcmVzb3VyY2VzL2NvbXB1dGVfcmVnaW9uX2JhY2tlbmRfc2VydmljZSNtYXhfcmVxdWVzdHNfcGVyX2Nvbm5lY3Rpb24gQ29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlI21heF9yZXF1ZXN0c19wZXJfY29ubmVjdGlvbn1cbiAgKi9cbiAgcmVhZG9ubHkgbWF4UmVxdWVzdHNQZXJDb25uZWN0aW9uPzogbnVtYmVyO1xuICAvKipcbiAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgcGFyYWxsZWwgcmV0cmllcyB0byB0aGUgYmFja2VuZCBjbHVzdGVyLlxuICAqIERlZmF1bHRzIHRvIDMuXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvZ29vZ2xlLzYuNC4wL2RvY3MvcmVzb3VyY2VzL2NvbXB1dGVfcmVnaW9uX2JhY2tlbmRfc2VydmljZSNtYXhfcmV0cmllcyBDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2UjbWF4X3JldHJpZXN9XG4gICovXG4gIHJlYWRvbmx5IG1heFJldHJpZXM/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VDaXJjdWl0QnJlYWtlcnNUb1RlcnJhZm9ybShzdHJ1Y3Q/OiBDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VDaXJjdWl0QnJlYWtlcnNPdXRwdXRSZWZlcmVuY2UgfCBDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VDaXJjdWl0QnJlYWtlcnMpOiBhbnkge1xuICBpZiAoIWNka3RmLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0Zi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdGYuaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIHJldHVybiB7XG4gICAgbWF4X2Nvbm5lY3Rpb25zOiBjZGt0Zi5udW1iZXJUb1RlcnJhZm9ybShzdHJ1Y3QhLm1heENvbm5lY3Rpb25zKSxcbiAgICBtYXhfcGVuZGluZ19yZXF1ZXN0czogY2RrdGYubnVtYmVyVG9UZXJyYWZvcm0oc3RydWN0IS5tYXhQZW5kaW5nUmVxdWVzdHMpLFxuICAgIG1heF9yZXF1ZXN0czogY2RrdGYubnVtYmVyVG9UZXJyYWZvcm0oc3RydWN0IS5tYXhSZXF1ZXN0cyksXG4gICAgbWF4X3JlcXVlc3RzX3Blcl9jb25uZWN0aW9uOiBjZGt0Zi5udW1iZXJUb1RlcnJhZm9ybShzdHJ1Y3QhLm1heFJlcXVlc3RzUGVyQ29ubmVjdGlvbiksXG4gICAgbWF4X3JldHJpZXM6IGNka3RmLm51bWJlclRvVGVycmFmb3JtKHN0cnVjdCEubWF4UmV0cmllcyksXG4gIH1cbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlQ2lyY3VpdEJyZWFrZXJzVG9IY2xUZXJyYWZvcm0oc3RydWN0PzogQ29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlQ2lyY3VpdEJyZWFrZXJzT3V0cHV0UmVmZXJlbmNlIHwgQ29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlQ2lyY3VpdEJyZWFrZXJzKTogYW55IHtcbiAgaWYgKCFjZGt0Zi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdGYuVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RmLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICBjb25zdCBhdHRycyA9IHtcbiAgICBtYXhfY29ubmVjdGlvbnM6IHtcbiAgICAgIHZhbHVlOiBjZGt0Zi5udW1iZXJUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLm1heENvbm5lY3Rpb25zKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwibnVtYmVyXCIsXG4gICAgfSxcbiAgICBtYXhfcGVuZGluZ19yZXF1ZXN0czoge1xuICAgICAgdmFsdWU6IGNka3RmLm51bWJlclRvSGNsVGVycmFmb3JtKHN0cnVjdCEubWF4UGVuZGluZ1JlcXVlc3RzKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwibnVtYmVyXCIsXG4gICAgfSxcbiAgICBtYXhfcmVxdWVzdHM6IHtcbiAgICAgIHZhbHVlOiBjZGt0Zi5udW1iZXJUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLm1heFJlcXVlc3RzKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwibnVtYmVyXCIsXG4gICAgfSxcbiAgICBtYXhfcmVxdWVzdHNfcGVyX2Nvbm5lY3Rpb246IHtcbiAgICAgIHZhbHVlOiBjZGt0Zi5udW1iZXJUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLm1heFJlcXVlc3RzUGVyQ29ubmVjdGlvbiksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIm51bWJlclwiLFxuICAgIH0sXG4gICAgbWF4X3JldHJpZXM6IHtcbiAgICAgIHZhbHVlOiBjZGt0Zi5udW1iZXJUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLm1heFJldHJpZXMpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJudW1iZXJcIixcbiAgICB9LFxuICB9O1xuXG4gIC8vIHJlbW92ZSB1bmRlZmluZWQgYXR0cmlidXRlc1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKGF0dHJzKS5maWx0ZXIoKFtfLCB2YWx1ZV0pID0+IHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUudmFsdWUgIT09IHVuZGVmaW5lZCkpO1xufVxuXG5leHBvcnQgY2xhc3MgQ29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlQ2lyY3VpdEJyZWFrZXJzT3V0cHV0UmVmZXJlbmNlIGV4dGVuZHMgY2RrdGYuQ29tcGxleE9iamVjdCB7XG4gIHByaXZhdGUgaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuXG4gIC8qKlxuICAqIEBwYXJhbSB0ZXJyYWZvcm1SZXNvdXJjZSBUaGUgcGFyZW50IHJlc291cmNlXG4gICogQHBhcmFtIHRlcnJhZm9ybUF0dHJpYnV0ZSBUaGUgYXR0cmlidXRlIG9uIHRoZSBwYXJlbnQgcmVzb3VyY2UgdGhpcyBjbGFzcyBpcyByZWZlcmVuY2luZ1xuICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IodGVycmFmb3JtUmVzb3VyY2U6IGNka3RmLklJbnRlcnBvbGF0aW5nUGFyZW50LCB0ZXJyYWZvcm1BdHRyaWJ1dGU6IHN0cmluZykge1xuICAgIHN1cGVyKHRlcnJhZm9ybVJlc291cmNlLCB0ZXJyYWZvcm1BdHRyaWJ1dGUsIGZhbHNlLCAwKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW50ZXJuYWxWYWx1ZSgpOiBDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VDaXJjdWl0QnJlYWtlcnMgfCB1bmRlZmluZWQge1xuICAgIGxldCBoYXNBbnlWYWx1ZXMgPSB0aGlzLmlzRW1wdHlPYmplY3Q7XG4gICAgY29uc3QgaW50ZXJuYWxWYWx1ZVJlc3VsdDogYW55ID0ge307XG4gICAgaWYgKHRoaXMuX21heENvbm5lY3Rpb25zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0Lm1heENvbm5lY3Rpb25zID0gdGhpcy5fbWF4Q29ubmVjdGlvbnM7XG4gICAgfVxuICAgIGlmICh0aGlzLl9tYXhQZW5kaW5nUmVxdWVzdHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQubWF4UGVuZGluZ1JlcXVlc3RzID0gdGhpcy5fbWF4UGVuZGluZ1JlcXVlc3RzO1xuICAgIH1cbiAgICBpZiAodGhpcy5fbWF4UmVxdWVzdHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQubWF4UmVxdWVzdHMgPSB0aGlzLl9tYXhSZXF1ZXN0cztcbiAgICB9XG4gICAgaWYgKHRoaXMuX21heFJlcXVlc3RzUGVyQ29ubmVjdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5tYXhSZXF1ZXN0c1BlckNvbm5lY3Rpb24gPSB0aGlzLl9tYXhSZXF1ZXN0c1BlckNvbm5lY3Rpb247XG4gICAgfVxuICAgIGlmICh0aGlzLl9tYXhSZXRyaWVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0Lm1heFJldHJpZXMgPSB0aGlzLl9tYXhSZXRyaWVzO1xuICAgIH1cbiAgICByZXR1cm4gaGFzQW55VmFsdWVzID8gaW50ZXJuYWxWYWx1ZVJlc3VsdCA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgaW50ZXJuYWxWYWx1ZSh2YWx1ZTogQ29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlQ2lyY3VpdEJyZWFrZXJzIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuICAgICAgdGhpcy5fbWF4Q29ubmVjdGlvbnMgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9tYXhQZW5kaW5nUmVxdWVzdHMgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9tYXhSZXF1ZXN0cyA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX21heFJlcXVlc3RzUGVyQ29ubmVjdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX21heFJldHJpZXMgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA9PT0gMDtcbiAgICAgIHRoaXMuX21heENvbm5lY3Rpb25zID0gdmFsdWUubWF4Q29ubmVjdGlvbnM7XG4gICAgICB0aGlzLl9tYXhQZW5kaW5nUmVxdWVzdHMgPSB2YWx1ZS5tYXhQZW5kaW5nUmVxdWVzdHM7XG4gICAgICB0aGlzLl9tYXhSZXF1ZXN0cyA9IHZhbHVlLm1heFJlcXVlc3RzO1xuICAgICAgdGhpcy5fbWF4UmVxdWVzdHNQZXJDb25uZWN0aW9uID0gdmFsdWUubWF4UmVxdWVzdHNQZXJDb25uZWN0aW9uO1xuICAgICAgdGhpcy5fbWF4UmV0cmllcyA9IHZhbHVlLm1heFJldHJpZXM7XG4gICAgfVxuICB9XG5cbiAgLy8gbWF4X2Nvbm5lY3Rpb25zIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX21heENvbm5lY3Rpb25zPzogbnVtYmVyOyBcbiAgcHVibGljIGdldCBtYXhDb25uZWN0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXROdW1iZXJBdHRyaWJ1dGUoJ21heF9jb25uZWN0aW9ucycpO1xuICB9XG4gIHB1YmxpYyBzZXQgbWF4Q29ubmVjdGlvbnModmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX21heENvbm5lY3Rpb25zID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0TWF4Q29ubmVjdGlvbnMoKSB7XG4gICAgdGhpcy5fbWF4Q29ubmVjdGlvbnMgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IG1heENvbm5lY3Rpb25zSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX21heENvbm5lY3Rpb25zO1xuICB9XG5cbiAgLy8gbWF4X3BlbmRpbmdfcmVxdWVzdHMgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfbWF4UGVuZGluZ1JlcXVlc3RzPzogbnVtYmVyOyBcbiAgcHVibGljIGdldCBtYXhQZW5kaW5nUmVxdWVzdHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TnVtYmVyQXR0cmlidXRlKCdtYXhfcGVuZGluZ19yZXF1ZXN0cycpO1xuICB9XG4gIHB1YmxpYyBzZXQgbWF4UGVuZGluZ1JlcXVlc3RzKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9tYXhQZW5kaW5nUmVxdWVzdHMgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRNYXhQZW5kaW5nUmVxdWVzdHMoKSB7XG4gICAgdGhpcy5fbWF4UGVuZGluZ1JlcXVlc3RzID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBtYXhQZW5kaW5nUmVxdWVzdHNJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fbWF4UGVuZGluZ1JlcXVlc3RzO1xuICB9XG5cbiAgLy8gbWF4X3JlcXVlc3RzIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX21heFJlcXVlc3RzPzogbnVtYmVyOyBcbiAgcHVibGljIGdldCBtYXhSZXF1ZXN0cygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXROdW1iZXJBdHRyaWJ1dGUoJ21heF9yZXF1ZXN0cycpO1xuICB9XG4gIHB1YmxpYyBzZXQgbWF4UmVxdWVzdHModmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX21heFJlcXVlc3RzID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0TWF4UmVxdWVzdHMoKSB7XG4gICAgdGhpcy5fbWF4UmVxdWVzdHMgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IG1heFJlcXVlc3RzSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX21heFJlcXVlc3RzO1xuICB9XG5cbiAgLy8gbWF4X3JlcXVlc3RzX3Blcl9jb25uZWN0aW9uIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX21heFJlcXVlc3RzUGVyQ29ubmVjdGlvbj86IG51bWJlcjsgXG4gIHB1YmxpYyBnZXQgbWF4UmVxdWVzdHNQZXJDb25uZWN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLmdldE51bWJlckF0dHJpYnV0ZSgnbWF4X3JlcXVlc3RzX3Blcl9jb25uZWN0aW9uJyk7XG4gIH1cbiAgcHVibGljIHNldCBtYXhSZXF1ZXN0c1BlckNvbm5lY3Rpb24odmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX21heFJlcXVlc3RzUGVyQ29ubmVjdGlvbiA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldE1heFJlcXVlc3RzUGVyQ29ubmVjdGlvbigpIHtcbiAgICB0aGlzLl9tYXhSZXF1ZXN0c1BlckNvbm5lY3Rpb24gPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IG1heFJlcXVlc3RzUGVyQ29ubmVjdGlvbklucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9tYXhSZXF1ZXN0c1BlckNvbm5lY3Rpb247XG4gIH1cblxuICAvLyBtYXhfcmV0cmllcyAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9tYXhSZXRyaWVzPzogbnVtYmVyOyBcbiAgcHVibGljIGdldCBtYXhSZXRyaWVzKCkge1xuICAgIHJldHVybiB0aGlzLmdldE51bWJlckF0dHJpYnV0ZSgnbWF4X3JldHJpZXMnKTtcbiAgfVxuICBwdWJsaWMgc2V0IG1heFJldHJpZXModmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX21heFJldHJpZXMgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRNYXhSZXRyaWVzKCkge1xuICAgIHRoaXMuX21heFJldHJpZXMgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IG1heFJldHJpZXNJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fbWF4UmV0cmllcztcbiAgfVxufVxuZXhwb3J0IGludGVyZmFjZSBDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VDb25zaXN0ZW50SGFzaEh0dHBDb29raWVUdGwge1xuICAvKipcbiAgKiBTcGFuIG9mIHRpbWUgdGhhdCdzIGEgZnJhY3Rpb24gb2YgYSBzZWNvbmQgYXQgbmFub3NlY29uZFxuICAqIHJlc29sdXRpb24uIER1cmF0aW9ucyBsZXNzIHRoYW4gb25lIHNlY29uZCBhcmUgcmVwcmVzZW50ZWRcbiAgKiB3aXRoIGEgMCBzZWNvbmRzIGZpZWxkIGFuZCBhIHBvc2l0aXZlIG5hbm9zIGZpZWxkLiBNdXN0XG4gICogYmUgZnJvbSAwIHRvIDk5OSw5OTksOTk5IGluY2x1c2l2ZS5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9nb29nbGUvNi40LjAvZG9jcy9yZXNvdXJjZXMvY29tcHV0ZV9yZWdpb25fYmFja2VuZF9zZXJ2aWNlI25hbm9zIENvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZSNuYW5vc31cbiAgKi9cbiAgcmVhZG9ubHkgbmFub3M/OiBudW1iZXI7XG4gIC8qKlxuICAqIFNwYW4gb2YgdGltZSBhdCBhIHJlc29sdXRpb24gb2YgYSBzZWNvbmQuXG4gICogTXVzdCBiZSBmcm9tIDAgdG8gMzE1LDU3NiwwMDAsMDAwIGluY2x1c2l2ZS5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9nb29nbGUvNi40LjAvZG9jcy9yZXNvdXJjZXMvY29tcHV0ZV9yZWdpb25fYmFja2VuZF9zZXJ2aWNlI3NlY29uZHMgQ29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlI3NlY29uZHN9XG4gICovXG4gIHJlYWRvbmx5IHNlY29uZHM6IG51bWJlcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZUNvbnNpc3RlbnRIYXNoSHR0cENvb2tpZVR0bFRvVGVycmFmb3JtKHN0cnVjdD86IENvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZUNvbnNpc3RlbnRIYXNoSHR0cENvb2tpZVR0bE91dHB1dFJlZmVyZW5jZSB8IENvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZUNvbnNpc3RlbnRIYXNoSHR0cENvb2tpZVR0bCk6IGFueSB7XG4gIGlmICghY2RrdGYuY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RmLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0Zi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBuYW5vczogY2RrdGYubnVtYmVyVG9UZXJyYWZvcm0oc3RydWN0IS5uYW5vcyksXG4gICAgc2Vjb25kczogY2RrdGYubnVtYmVyVG9UZXJyYWZvcm0oc3RydWN0IS5zZWNvbmRzKSxcbiAgfVxufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VDb25zaXN0ZW50SGFzaEh0dHBDb29raWVUdGxUb0hjbFRlcnJhZm9ybShzdHJ1Y3Q/OiBDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VDb25zaXN0ZW50SGFzaEh0dHBDb29raWVUdGxPdXRwdXRSZWZlcmVuY2UgfCBDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VDb25zaXN0ZW50SGFzaEh0dHBDb29raWVUdGwpOiBhbnkge1xuICBpZiAoIWNka3RmLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0Zi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdGYuaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIGNvbnN0IGF0dHJzID0ge1xuICAgIG5hbm9zOiB7XG4gICAgICB2YWx1ZTogY2RrdGYubnVtYmVyVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5uYW5vcyksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIm51bWJlclwiLFxuICAgIH0sXG4gICAgc2Vjb25kczoge1xuICAgICAgdmFsdWU6IGNka3RmLm51bWJlclRvSGNsVGVycmFmb3JtKHN0cnVjdCEuc2Vjb25kcyksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIm51bWJlclwiLFxuICAgIH0sXG4gIH07XG5cbiAgLy8gcmVtb3ZlIHVuZGVmaW5lZCBhdHRyaWJ1dGVzXG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoYXR0cnMpLmZpbHRlcigoW18sIHZhbHVlXSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZS52YWx1ZSAhPT0gdW5kZWZpbmVkKSk7XG59XG5cbmV4cG9ydCBjbGFzcyBDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VDb25zaXN0ZW50SGFzaEh0dHBDb29raWVUdGxPdXRwdXRSZWZlcmVuY2UgZXh0ZW5kcyBjZGt0Zi5Db21wbGV4T2JqZWN0IHtcbiAgcHJpdmF0ZSBpc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG5cbiAgLyoqXG4gICogQHBhcmFtIHRlcnJhZm9ybVJlc291cmNlIFRoZSBwYXJlbnQgcmVzb3VyY2VcbiAgKiBAcGFyYW0gdGVycmFmb3JtQXR0cmlidXRlIFRoZSBhdHRyaWJ1dGUgb24gdGhlIHBhcmVudCByZXNvdXJjZSB0aGlzIGNsYXNzIGlzIHJlZmVyZW5jaW5nXG4gICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih0ZXJyYWZvcm1SZXNvdXJjZTogY2RrdGYuSUludGVycG9sYXRpbmdQYXJlbnQsIHRlcnJhZm9ybUF0dHJpYnV0ZTogc3RyaW5nKSB7XG4gICAgc3VwZXIodGVycmFmb3JtUmVzb3VyY2UsIHRlcnJhZm9ybUF0dHJpYnV0ZSwgZmFsc2UsIDApO1xuICB9XG5cbiAgcHVibGljIGdldCBpbnRlcm5hbFZhbHVlKCk6IENvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZUNvbnNpc3RlbnRIYXNoSHR0cENvb2tpZVR0bCB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGhhc0FueVZhbHVlcyA9IHRoaXMuaXNFbXB0eU9iamVjdDtcbiAgICBjb25zdCBpbnRlcm5hbFZhbHVlUmVzdWx0OiBhbnkgPSB7fTtcbiAgICBpZiAodGhpcy5fbmFub3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQubmFub3MgPSB0aGlzLl9uYW5vcztcbiAgICB9XG4gICAgaWYgKHRoaXMuX3NlY29uZHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuc2Vjb25kcyA9IHRoaXMuX3NlY29uZHM7XG4gICAgfVxuICAgIHJldHVybiBoYXNBbnlWYWx1ZXMgPyBpbnRlcm5hbFZhbHVlUmVzdWx0IDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHNldCBpbnRlcm5hbFZhbHVlKHZhbHVlOiBDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VDb25zaXN0ZW50SGFzaEh0dHBDb29raWVUdGwgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLl9uYW5vcyA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3NlY29uZHMgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA9PT0gMDtcbiAgICAgIHRoaXMuX25hbm9zID0gdmFsdWUubmFub3M7XG4gICAgICB0aGlzLl9zZWNvbmRzID0gdmFsdWUuc2Vjb25kcztcbiAgICB9XG4gIH1cblxuICAvLyBuYW5vcyAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9uYW5vcz86IG51bWJlcjsgXG4gIHB1YmxpYyBnZXQgbmFub3MoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TnVtYmVyQXR0cmlidXRlKCduYW5vcycpO1xuICB9XG4gIHB1YmxpYyBzZXQgbmFub3ModmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX25hbm9zID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0TmFub3MoKSB7XG4gICAgdGhpcy5fbmFub3MgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IG5hbm9zSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX25hbm9zO1xuICB9XG5cbiAgLy8gc2Vjb25kcyAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogdHJ1ZVxuICBwcml2YXRlIF9zZWNvbmRzPzogbnVtYmVyOyBcbiAgcHVibGljIGdldCBzZWNvbmRzKCkge1xuICAgIHJldHVybiB0aGlzLmdldE51bWJlckF0dHJpYnV0ZSgnc2Vjb25kcycpO1xuICB9XG4gIHB1YmxpYyBzZXQgc2Vjb25kcyh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fc2Vjb25kcyA9IHZhbHVlO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBzZWNvbmRzSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NlY29uZHM7XG4gIH1cbn1cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlQ29uc2lzdGVudEhhc2hIdHRwQ29va2llIHtcbiAgLyoqXG4gICogTmFtZSBvZiB0aGUgY29va2llLlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2dvb2dsZS82LjQuMC9kb2NzL3Jlc291cmNlcy9jb21wdXRlX3JlZ2lvbl9iYWNrZW5kX3NlcnZpY2UjbmFtZSBDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2UjbmFtZX1cbiAgKi9cbiAgcmVhZG9ubHkgbmFtZT86IHN0cmluZztcbiAgLyoqXG4gICogUGF0aCB0byBzZXQgZm9yIHRoZSBjb29raWUuXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvZ29vZ2xlLzYuNC4wL2RvY3MvcmVzb3VyY2VzL2NvbXB1dGVfcmVnaW9uX2JhY2tlbmRfc2VydmljZSNwYXRoIENvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZSNwYXRofVxuICAqL1xuICByZWFkb25seSBwYXRoPzogc3RyaW5nO1xuICAvKipcbiAgKiB0dGwgYmxvY2tcbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9nb29nbGUvNi40LjAvZG9jcy9yZXNvdXJjZXMvY29tcHV0ZV9yZWdpb25fYmFja2VuZF9zZXJ2aWNlI3R0bCBDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2UjdHRsfVxuICAqL1xuICByZWFkb25seSB0dGw/OiBDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VDb25zaXN0ZW50SGFzaEh0dHBDb29raWVUdGw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VDb25zaXN0ZW50SGFzaEh0dHBDb29raWVUb1RlcnJhZm9ybShzdHJ1Y3Q/OiBDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VDb25zaXN0ZW50SGFzaEh0dHBDb29raWVPdXRwdXRSZWZlcmVuY2UgfCBDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VDb25zaXN0ZW50SGFzaEh0dHBDb29raWUpOiBhbnkge1xuICBpZiAoIWNka3RmLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0Zi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdGYuaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIHJldHVybiB7XG4gICAgbmFtZTogY2RrdGYuc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS5uYW1lKSxcbiAgICBwYXRoOiBjZGt0Zi5zdHJpbmdUb1RlcnJhZm9ybShzdHJ1Y3QhLnBhdGgpLFxuICAgIHR0bDogY29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlQ29uc2lzdGVudEhhc2hIdHRwQ29va2llVHRsVG9UZXJyYWZvcm0oc3RydWN0IS50dGwpLFxuICB9XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZUNvbnNpc3RlbnRIYXNoSHR0cENvb2tpZVRvSGNsVGVycmFmb3JtKHN0cnVjdD86IENvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZUNvbnNpc3RlbnRIYXNoSHR0cENvb2tpZU91dHB1dFJlZmVyZW5jZSB8IENvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZUNvbnNpc3RlbnRIYXNoSHR0cENvb2tpZSk6IGFueSB7XG4gIGlmICghY2RrdGYuY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RmLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0Zi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgY29uc3QgYXR0cnMgPSB7XG4gICAgbmFtZToge1xuICAgICAgdmFsdWU6IGNka3RmLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEubmFtZSksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgIH0sXG4gICAgcGF0aDoge1xuICAgICAgdmFsdWU6IGNka3RmLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEucGF0aCksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgIH0sXG4gICAgdHRsOiB7XG4gICAgICB2YWx1ZTogY29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlQ29uc2lzdGVudEhhc2hIdHRwQ29va2llVHRsVG9IY2xUZXJyYWZvcm0oc3RydWN0IS50dGwpLFxuICAgICAgaXNCbG9jazogdHJ1ZSxcbiAgICAgIHR5cGU6IFwibGlzdFwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VDb25zaXN0ZW50SGFzaEh0dHBDb29raWVUdGxMaXN0XCIsXG4gICAgfSxcbiAgfTtcblxuICAvLyByZW1vdmUgdW5kZWZpbmVkIGF0dHJpYnV0ZXNcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhdHRycykuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWQpKTtcbn1cblxuZXhwb3J0IGNsYXNzIENvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZUNvbnNpc3RlbnRIYXNoSHR0cENvb2tpZU91dHB1dFJlZmVyZW5jZSBleHRlbmRzIGNka3RmLkNvbXBsZXhPYmplY3Qge1xuICBwcml2YXRlIGlzRW1wdHlPYmplY3QgPSBmYWxzZTtcblxuICAvKipcbiAgKiBAcGFyYW0gdGVycmFmb3JtUmVzb3VyY2UgVGhlIHBhcmVudCByZXNvdXJjZVxuICAqIEBwYXJhbSB0ZXJyYWZvcm1BdHRyaWJ1dGUgVGhlIGF0dHJpYnV0ZSBvbiB0aGUgcGFyZW50IHJlc291cmNlIHRoaXMgY2xhc3MgaXMgcmVmZXJlbmNpbmdcbiAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHRlcnJhZm9ybVJlc291cmNlOiBjZGt0Zi5JSW50ZXJwb2xhdGluZ1BhcmVudCwgdGVycmFmb3JtQXR0cmlidXRlOiBzdHJpbmcpIHtcbiAgICBzdXBlcih0ZXJyYWZvcm1SZXNvdXJjZSwgdGVycmFmb3JtQXR0cmlidXRlLCBmYWxzZSwgMCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGludGVybmFsVmFsdWUoKTogQ29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlQ29uc2lzdGVudEhhc2hIdHRwQ29va2llIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgaGFzQW55VmFsdWVzID0gdGhpcy5pc0VtcHR5T2JqZWN0O1xuICAgIGNvbnN0IGludGVybmFsVmFsdWVSZXN1bHQ6IGFueSA9IHt9O1xuICAgIGlmICh0aGlzLl9uYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0Lm5hbWUgPSB0aGlzLl9uYW1lO1xuICAgIH1cbiAgICBpZiAodGhpcy5fcGF0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5wYXRoID0gdGhpcy5fcGF0aDtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3R0bD8uaW50ZXJuYWxWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC50dGwgPSB0aGlzLl90dGw/LmludGVybmFsVmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBoYXNBbnlWYWx1ZXMgPyBpbnRlcm5hbFZhbHVlUmVzdWx0IDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHNldCBpbnRlcm5hbFZhbHVlKHZhbHVlOiBDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VDb25zaXN0ZW50SGFzaEh0dHBDb29raWUgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLl9uYW1lID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fcGF0aCA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3R0bC5pbnRlcm5hbFZhbHVlID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGggPT09IDA7XG4gICAgICB0aGlzLl9uYW1lID0gdmFsdWUubmFtZTtcbiAgICAgIHRoaXMuX3BhdGggPSB2YWx1ZS5wYXRoO1xuICAgICAgdGhpcy5fdHRsLmludGVybmFsVmFsdWUgPSB2YWx1ZS50dGw7XG4gICAgfVxuICB9XG5cbiAgLy8gbmFtZSAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9uYW1lPzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBuYW1lKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnbmFtZScpO1xuICB9XG4gIHB1YmxpYyBzZXQgbmFtZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fbmFtZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldE5hbWUoKSB7XG4gICAgdGhpcy5fbmFtZSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgbmFtZUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9uYW1lO1xuICB9XG5cbiAgLy8gcGF0aCAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9wYXRoPzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBwYXRoKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgncGF0aCcpO1xuICB9XG4gIHB1YmxpYyBzZXQgcGF0aCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fcGF0aCA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldFBhdGgoKSB7XG4gICAgdGhpcy5fcGF0aCA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgcGF0aElucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9wYXRoO1xuICB9XG5cbiAgLy8gdHRsIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX3R0bCA9IG5ldyBDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VDb25zaXN0ZW50SGFzaEh0dHBDb29raWVUdGxPdXRwdXRSZWZlcmVuY2UodGhpcywgXCJ0dGxcIik7XG4gIHB1YmxpYyBnZXQgdHRsKCkge1xuICAgIHJldHVybiB0aGlzLl90dGw7XG4gIH1cbiAgcHVibGljIHB1dFR0bCh2YWx1ZTogQ29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlQ29uc2lzdGVudEhhc2hIdHRwQ29va2llVHRsKSB7XG4gICAgdGhpcy5fdHRsLmludGVybmFsVmFsdWUgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRUdGwoKSB7XG4gICAgdGhpcy5fdHRsLmludGVybmFsVmFsdWUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHR0bElucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl90dGwuaW50ZXJuYWxWYWx1ZTtcbiAgfVxufVxuZXhwb3J0IGludGVyZmFjZSBDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VDb25zaXN0ZW50SGFzaCB7XG4gIC8qKlxuICAqIFRoZSBoYXNoIGJhc2VkIG9uIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGhlYWRlciBmaWVsZC5cbiAgKiBUaGlzIGZpZWxkIGlzIGFwcGxpY2FibGUgaWYgdGhlIHNlc3Npb25BZmZpbml0eSBpcyBzZXQgdG8gSEVBREVSX0ZJRUxELlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2dvb2dsZS82LjQuMC9kb2NzL3Jlc291cmNlcy9jb21wdXRlX3JlZ2lvbl9iYWNrZW5kX3NlcnZpY2UjaHR0cF9oZWFkZXJfbmFtZSBDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2UjaHR0cF9oZWFkZXJfbmFtZX1cbiAgKi9cbiAgcmVhZG9ubHkgaHR0cEhlYWRlck5hbWU/OiBzdHJpbmc7XG4gIC8qKlxuICAqIFRoZSBtaW5pbXVtIG51bWJlciBvZiB2aXJ0dWFsIG5vZGVzIHRvIHVzZSBmb3IgdGhlIGhhc2ggcmluZy5cbiAgKiBMYXJnZXIgcmluZyBzaXplcyByZXN1bHQgaW4gbW9yZSBncmFudWxhciBsb2FkXG4gICogZGlzdHJpYnV0aW9ucy4gSWYgdGhlIG51bWJlciBvZiBob3N0cyBpbiB0aGUgbG9hZCBiYWxhbmNpbmcgcG9vbFxuICAqIGlzIGxhcmdlciB0aGFuIHRoZSByaW5nIHNpemUsIGVhY2ggaG9zdCB3aWxsIGJlIGFzc2lnbmVkIGEgc2luZ2xlXG4gICogdmlydHVhbCBub2RlLlxuICAqIERlZmF1bHRzIHRvIDEwMjQuXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvZ29vZ2xlLzYuNC4wL2RvY3MvcmVzb3VyY2VzL2NvbXB1dGVfcmVnaW9uX2JhY2tlbmRfc2VydmljZSNtaW5pbXVtX3Jpbmdfc2l6ZSBDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2UjbWluaW11bV9yaW5nX3NpemV9XG4gICovXG4gIHJlYWRvbmx5IG1pbmltdW1SaW5nU2l6ZT86IG51bWJlcjtcbiAgLyoqXG4gICogaHR0cF9jb29raWUgYmxvY2tcbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9nb29nbGUvNi40LjAvZG9jcy9yZXNvdXJjZXMvY29tcHV0ZV9yZWdpb25fYmFja2VuZF9zZXJ2aWNlI2h0dHBfY29va2llIENvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZSNodHRwX2Nvb2tpZX1cbiAgKi9cbiAgcmVhZG9ubHkgaHR0cENvb2tpZT86IENvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZUNvbnNpc3RlbnRIYXNoSHR0cENvb2tpZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZUNvbnNpc3RlbnRIYXNoVG9UZXJyYWZvcm0oc3RydWN0PzogQ29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlQ29uc2lzdGVudEhhc2hPdXRwdXRSZWZlcmVuY2UgfCBDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VDb25zaXN0ZW50SGFzaCk6IGFueSB7XG4gIGlmICghY2RrdGYuY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RmLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0Zi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBodHRwX2hlYWRlcl9uYW1lOiBjZGt0Zi5zdHJpbmdUb1RlcnJhZm9ybShzdHJ1Y3QhLmh0dHBIZWFkZXJOYW1lKSxcbiAgICBtaW5pbXVtX3Jpbmdfc2l6ZTogY2RrdGYubnVtYmVyVG9UZXJyYWZvcm0oc3RydWN0IS5taW5pbXVtUmluZ1NpemUpLFxuICAgIGh0dHBfY29va2llOiBjb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VDb25zaXN0ZW50SGFzaEh0dHBDb29raWVUb1RlcnJhZm9ybShzdHJ1Y3QhLmh0dHBDb29raWUpLFxuICB9XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZUNvbnNpc3RlbnRIYXNoVG9IY2xUZXJyYWZvcm0oc3RydWN0PzogQ29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlQ29uc2lzdGVudEhhc2hPdXRwdXRSZWZlcmVuY2UgfCBDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VDb25zaXN0ZW50SGFzaCk6IGFueSB7XG4gIGlmICghY2RrdGYuY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RmLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0Zi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgY29uc3QgYXR0cnMgPSB7XG4gICAgaHR0cF9oZWFkZXJfbmFtZToge1xuICAgICAgdmFsdWU6IGNka3RmLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEuaHR0cEhlYWRlck5hbWUpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICB9LFxuICAgIG1pbmltdW1fcmluZ19zaXplOiB7XG4gICAgICB2YWx1ZTogY2RrdGYubnVtYmVyVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5taW5pbXVtUmluZ1NpemUpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJudW1iZXJcIixcbiAgICB9LFxuICAgIGh0dHBfY29va2llOiB7XG4gICAgICB2YWx1ZTogY29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlQ29uc2lzdGVudEhhc2hIdHRwQ29va2llVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5odHRwQ29va2llKSxcbiAgICAgIGlzQmxvY2s6IHRydWUsXG4gICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwiQ29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlQ29uc2lzdGVudEhhc2hIdHRwQ29va2llTGlzdFwiLFxuICAgIH0sXG4gIH07XG5cbiAgLy8gcmVtb3ZlIHVuZGVmaW5lZCBhdHRyaWJ1dGVzXG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoYXR0cnMpLmZpbHRlcigoW18sIHZhbHVlXSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZS52YWx1ZSAhPT0gdW5kZWZpbmVkKSk7XG59XG5cbmV4cG9ydCBjbGFzcyBDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VDb25zaXN0ZW50SGFzaE91dHB1dFJlZmVyZW5jZSBleHRlbmRzIGNka3RmLkNvbXBsZXhPYmplY3Qge1xuICBwcml2YXRlIGlzRW1wdHlPYmplY3QgPSBmYWxzZTtcblxuICAvKipcbiAgKiBAcGFyYW0gdGVycmFmb3JtUmVzb3VyY2UgVGhlIHBhcmVudCByZXNvdXJjZVxuICAqIEBwYXJhbSB0ZXJyYWZvcm1BdHRyaWJ1dGUgVGhlIGF0dHJpYnV0ZSBvbiB0aGUgcGFyZW50IHJlc291cmNlIHRoaXMgY2xhc3MgaXMgcmVmZXJlbmNpbmdcbiAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHRlcnJhZm9ybVJlc291cmNlOiBjZGt0Zi5JSW50ZXJwb2xhdGluZ1BhcmVudCwgdGVycmFmb3JtQXR0cmlidXRlOiBzdHJpbmcpIHtcbiAgICBzdXBlcih0ZXJyYWZvcm1SZXNvdXJjZSwgdGVycmFmb3JtQXR0cmlidXRlLCBmYWxzZSwgMCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGludGVybmFsVmFsdWUoKTogQ29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlQ29uc2lzdGVudEhhc2ggfCB1bmRlZmluZWQge1xuICAgIGxldCBoYXNBbnlWYWx1ZXMgPSB0aGlzLmlzRW1wdHlPYmplY3Q7XG4gICAgY29uc3QgaW50ZXJuYWxWYWx1ZVJlc3VsdDogYW55ID0ge307XG4gICAgaWYgKHRoaXMuX2h0dHBIZWFkZXJOYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0Lmh0dHBIZWFkZXJOYW1lID0gdGhpcy5faHR0cEhlYWRlck5hbWU7XG4gICAgfVxuICAgIGlmICh0aGlzLl9taW5pbXVtUmluZ1NpemUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQubWluaW11bVJpbmdTaXplID0gdGhpcy5fbWluaW11bVJpbmdTaXplO1xuICAgIH1cbiAgICBpZiAodGhpcy5faHR0cENvb2tpZT8uaW50ZXJuYWxWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5odHRwQ29va2llID0gdGhpcy5faHR0cENvb2tpZT8uaW50ZXJuYWxWYWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGhhc0FueVZhbHVlcyA/IGludGVybmFsVmFsdWVSZXN1bHQgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgc2V0IGludGVybmFsVmFsdWUodmFsdWU6IENvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZUNvbnNpc3RlbnRIYXNoIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuICAgICAgdGhpcy5faHR0cEhlYWRlck5hbWUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9taW5pbXVtUmluZ1NpemUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9odHRwQ29va2llLmludGVybmFsVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA9PT0gMDtcbiAgICAgIHRoaXMuX2h0dHBIZWFkZXJOYW1lID0gdmFsdWUuaHR0cEhlYWRlck5hbWU7XG4gICAgICB0aGlzLl9taW5pbXVtUmluZ1NpemUgPSB2YWx1ZS5taW5pbXVtUmluZ1NpemU7XG4gICAgICB0aGlzLl9odHRwQ29va2llLmludGVybmFsVmFsdWUgPSB2YWx1ZS5odHRwQ29va2llO1xuICAgIH1cbiAgfVxuXG4gIC8vIGh0dHBfaGVhZGVyX25hbWUgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfaHR0cEhlYWRlck5hbWU/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IGh0dHBIZWFkZXJOYW1lKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnaHR0cF9oZWFkZXJfbmFtZScpO1xuICB9XG4gIHB1YmxpYyBzZXQgaHR0cEhlYWRlck5hbWUodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2h0dHBIZWFkZXJOYW1lID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0SHR0cEhlYWRlck5hbWUoKSB7XG4gICAgdGhpcy5faHR0cEhlYWRlck5hbWUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGh0dHBIZWFkZXJOYW1lSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2h0dHBIZWFkZXJOYW1lO1xuICB9XG5cbiAgLy8gbWluaW11bV9yaW5nX3NpemUgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfbWluaW11bVJpbmdTaXplPzogbnVtYmVyOyBcbiAgcHVibGljIGdldCBtaW5pbXVtUmluZ1NpemUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TnVtYmVyQXR0cmlidXRlKCdtaW5pbXVtX3Jpbmdfc2l6ZScpO1xuICB9XG4gIHB1YmxpYyBzZXQgbWluaW11bVJpbmdTaXplKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9taW5pbXVtUmluZ1NpemUgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRNaW5pbXVtUmluZ1NpemUoKSB7XG4gICAgdGhpcy5fbWluaW11bVJpbmdTaXplID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBtaW5pbXVtUmluZ1NpemVJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fbWluaW11bVJpbmdTaXplO1xuICB9XG5cbiAgLy8gaHR0cF9jb29raWUgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfaHR0cENvb2tpZSA9IG5ldyBDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VDb25zaXN0ZW50SGFzaEh0dHBDb29raWVPdXRwdXRSZWZlcmVuY2UodGhpcywgXCJodHRwX2Nvb2tpZVwiKTtcbiAgcHVibGljIGdldCBodHRwQ29va2llKCkge1xuICAgIHJldHVybiB0aGlzLl9odHRwQ29va2llO1xuICB9XG4gIHB1YmxpYyBwdXRIdHRwQ29va2llKHZhbHVlOiBDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VDb25zaXN0ZW50SGFzaEh0dHBDb29raWUpIHtcbiAgICB0aGlzLl9odHRwQ29va2llLmludGVybmFsVmFsdWUgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRIdHRwQ29va2llKCkge1xuICAgIHRoaXMuX2h0dHBDb29raWUuaW50ZXJuYWxWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgaHR0cENvb2tpZUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9odHRwQ29va2llLmludGVybmFsVmFsdWU7XG4gIH1cbn1cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlRmFpbG92ZXJQb2xpY3kge1xuICAvKipcbiAgKiBPbiBmYWlsb3ZlciBvciBmYWlsYmFjaywgdGhpcyBmaWVsZCBpbmRpY2F0ZXMgd2hldGhlciBjb25uZWN0aW9uIGRyYWluXG4gICogd2lsbCBiZSBob25vcmVkLiBTZXR0aW5nIHRoaXMgdG8gdHJ1ZSBoYXMgdGhlIGZvbGxvd2luZyBlZmZlY3Q6IGNvbm5lY3Rpb25zXG4gICogdG8gdGhlIG9sZCBhY3RpdmUgcG9vbCBhcmUgbm90IGRyYWluZWQuIENvbm5lY3Rpb25zIHRvIHRoZSBuZXcgYWN0aXZlIHBvb2xcbiAgKiB1c2UgdGhlIHRpbWVvdXQgb2YgMTAgbWluIChjdXJyZW50bHkgZml4ZWQpLiBTZXR0aW5nIHRvIGZhbHNlIGhhcyB0aGVcbiAgKiBmb2xsb3dpbmcgZWZmZWN0OiBib3RoIG9sZCBhbmQgbmV3IGNvbm5lY3Rpb25zIHdpbGwgaGF2ZSBhIGRyYWluIHRpbWVvdXRcbiAgKiBvZiAxMCBtaW4uXG4gICogVGhpcyBjYW4gYmUgc2V0IHRvIHRydWUgb25seSBpZiB0aGUgcHJvdG9jb2wgaXMgVENQLlxuICAqIFRoZSBkZWZhdWx0IGlzIGZhbHNlLlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2dvb2dsZS82LjQuMC9kb2NzL3Jlc291cmNlcy9jb21wdXRlX3JlZ2lvbl9iYWNrZW5kX3NlcnZpY2UjZGlzYWJsZV9jb25uZWN0aW9uX2RyYWluX29uX2ZhaWxvdmVyIENvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZSNkaXNhYmxlX2Nvbm5lY3Rpb25fZHJhaW5fb25fZmFpbG92ZXJ9XG4gICovXG4gIHJlYWRvbmx5IGRpc2FibGVDb25uZWN0aW9uRHJhaW5PbkZhaWxvdmVyPzogYm9vbGVhbiB8IGNka3RmLklSZXNvbHZhYmxlO1xuICAvKipcbiAgKiBUaGlzIG9wdGlvbiBpcyB1c2VkIG9ubHkgd2hlbiBubyBoZWFsdGh5IFZNcyBhcmUgZGV0ZWN0ZWQgaW4gdGhlIHByaW1hcnlcbiAgKiBhbmQgYmFja3VwIGluc3RhbmNlIGdyb3Vwcy4gV2hlbiBzZXQgdG8gdHJ1ZSwgdHJhZmZpYyBpcyBkcm9wcGVkLiBXaGVuXG4gICogc2V0IHRvIGZhbHNlLCBuZXcgY29ubmVjdGlvbnMgYXJlIHNlbnQgYWNyb3NzIGFsbCBWTXMgaW4gdGhlIHByaW1hcnkgZ3JvdXAuXG4gICogVGhlIGRlZmF1bHQgaXMgZmFsc2UuXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvZ29vZ2xlLzYuNC4wL2RvY3MvcmVzb3VyY2VzL2NvbXB1dGVfcmVnaW9uX2JhY2tlbmRfc2VydmljZSNkcm9wX3RyYWZmaWNfaWZfdW5oZWFsdGh5IENvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZSNkcm9wX3RyYWZmaWNfaWZfdW5oZWFsdGh5fVxuICAqL1xuICByZWFkb25seSBkcm9wVHJhZmZpY0lmVW5oZWFsdGh5PzogYm9vbGVhbiB8IGNka3RmLklSZXNvbHZhYmxlO1xuICAvKipcbiAgKiBUaGUgdmFsdWUgb2YgdGhlIGZpZWxkIG11c3QgYmUgaW4gWzAsIDFdLiBJZiB0aGUgcmF0aW8gb2YgdGhlIGhlYWx0aHlcbiAgKiBWTXMgaW4gdGhlIHByaW1hcnkgYmFja2VuZCBpcyBhdCBvciBiZWxvdyB0aGlzIG51bWJlciwgdHJhZmZpYyBhcnJpdmluZ1xuICAqIGF0IHRoZSBsb2FkLWJhbGFuY2VkIElQIHdpbGwgYmUgZGlyZWN0ZWQgdG8gdGhlIGZhaWxvdmVyIGJhY2tlbmQuXG4gICogSW4gY2FzZSB3aGVyZSAnZmFpbG92ZXJSYXRpbycgaXMgbm90IHNldCBvciBhbGwgdGhlIFZNcyBpbiB0aGUgYmFja3VwXG4gICogYmFja2VuZCBhcmUgdW5oZWFsdGh5LCB0aGUgdHJhZmZpYyB3aWxsIGJlIGRpcmVjdGVkIGJhY2sgdG8gdGhlIHByaW1hcnlcbiAgKiBiYWNrZW5kIGluIHRoZSBcImZvcmNlXCIgbW9kZSwgd2hlcmUgdHJhZmZpYyB3aWxsIGJlIHNwcmVhZCB0byB0aGUgaGVhbHRoeVxuICAqIFZNcyB3aXRoIHRoZSBiZXN0IGVmZm9ydCwgb3IgdG8gYWxsIFZNcyB3aGVuIG5vIFZNIGlzIGhlYWx0aHkuXG4gICogVGhpcyBmaWVsZCBpcyBvbmx5IHVzZWQgd2l0aCBsNCBsb2FkIGJhbGFuY2luZy5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9nb29nbGUvNi40LjAvZG9jcy9yZXNvdXJjZXMvY29tcHV0ZV9yZWdpb25fYmFja2VuZF9zZXJ2aWNlI2ZhaWxvdmVyX3JhdGlvIENvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZSNmYWlsb3Zlcl9yYXRpb31cbiAgKi9cbiAgcmVhZG9ubHkgZmFpbG92ZXJSYXRpbz86IG51bWJlcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZUZhaWxvdmVyUG9saWN5VG9UZXJyYWZvcm0oc3RydWN0PzogQ29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlRmFpbG92ZXJQb2xpY3lPdXRwdXRSZWZlcmVuY2UgfCBDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VGYWlsb3ZlclBvbGljeSk6IGFueSB7XG4gIGlmICghY2RrdGYuY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RmLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0Zi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBkaXNhYmxlX2Nvbm5lY3Rpb25fZHJhaW5fb25fZmFpbG92ZXI6IGNka3RmLmJvb2xlYW5Ub1RlcnJhZm9ybShzdHJ1Y3QhLmRpc2FibGVDb25uZWN0aW9uRHJhaW5PbkZhaWxvdmVyKSxcbiAgICBkcm9wX3RyYWZmaWNfaWZfdW5oZWFsdGh5OiBjZGt0Zi5ib29sZWFuVG9UZXJyYWZvcm0oc3RydWN0IS5kcm9wVHJhZmZpY0lmVW5oZWFsdGh5KSxcbiAgICBmYWlsb3Zlcl9yYXRpbzogY2RrdGYubnVtYmVyVG9UZXJyYWZvcm0oc3RydWN0IS5mYWlsb3ZlclJhdGlvKSxcbiAgfVxufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VGYWlsb3ZlclBvbGljeVRvSGNsVGVycmFmb3JtKHN0cnVjdD86IENvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZUZhaWxvdmVyUG9saWN5T3V0cHV0UmVmZXJlbmNlIHwgQ29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlRmFpbG92ZXJQb2xpY3kpOiBhbnkge1xuICBpZiAoIWNka3RmLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0Zi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdGYuaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIGNvbnN0IGF0dHJzID0ge1xuICAgIGRpc2FibGVfY29ubmVjdGlvbl9kcmFpbl9vbl9mYWlsb3Zlcjoge1xuICAgICAgdmFsdWU6IGNka3RmLmJvb2xlYW5Ub0hjbFRlcnJhZm9ybShzdHJ1Y3QhLmRpc2FibGVDb25uZWN0aW9uRHJhaW5PbkZhaWxvdmVyKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwiYm9vbGVhblwiLFxuICAgIH0sXG4gICAgZHJvcF90cmFmZmljX2lmX3VuaGVhbHRoeToge1xuICAgICAgdmFsdWU6IGNka3RmLmJvb2xlYW5Ub0hjbFRlcnJhZm9ybShzdHJ1Y3QhLmRyb3BUcmFmZmljSWZVbmhlYWx0aHkpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJib29sZWFuXCIsXG4gICAgfSxcbiAgICBmYWlsb3Zlcl9yYXRpbzoge1xuICAgICAgdmFsdWU6IGNka3RmLm51bWJlclRvSGNsVGVycmFmb3JtKHN0cnVjdCEuZmFpbG92ZXJSYXRpbyksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIm51bWJlclwiLFxuICAgIH0sXG4gIH07XG5cbiAgLy8gcmVtb3ZlIHVuZGVmaW5lZCBhdHRyaWJ1dGVzXG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoYXR0cnMpLmZpbHRlcigoW18sIHZhbHVlXSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZS52YWx1ZSAhPT0gdW5kZWZpbmVkKSk7XG59XG5cbmV4cG9ydCBjbGFzcyBDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VGYWlsb3ZlclBvbGljeU91dHB1dFJlZmVyZW5jZSBleHRlbmRzIGNka3RmLkNvbXBsZXhPYmplY3Qge1xuICBwcml2YXRlIGlzRW1wdHlPYmplY3QgPSBmYWxzZTtcblxuICAvKipcbiAgKiBAcGFyYW0gdGVycmFmb3JtUmVzb3VyY2UgVGhlIHBhcmVudCByZXNvdXJjZVxuICAqIEBwYXJhbSB0ZXJyYWZvcm1BdHRyaWJ1dGUgVGhlIGF0dHJpYnV0ZSBvbiB0aGUgcGFyZW50IHJlc291cmNlIHRoaXMgY2xhc3MgaXMgcmVmZXJlbmNpbmdcbiAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHRlcnJhZm9ybVJlc291cmNlOiBjZGt0Zi5JSW50ZXJwb2xhdGluZ1BhcmVudCwgdGVycmFmb3JtQXR0cmlidXRlOiBzdHJpbmcpIHtcbiAgICBzdXBlcih0ZXJyYWZvcm1SZXNvdXJjZSwgdGVycmFmb3JtQXR0cmlidXRlLCBmYWxzZSwgMCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGludGVybmFsVmFsdWUoKTogQ29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlRmFpbG92ZXJQb2xpY3kgfCB1bmRlZmluZWQge1xuICAgIGxldCBoYXNBbnlWYWx1ZXMgPSB0aGlzLmlzRW1wdHlPYmplY3Q7XG4gICAgY29uc3QgaW50ZXJuYWxWYWx1ZVJlc3VsdDogYW55ID0ge307XG4gICAgaWYgKHRoaXMuX2Rpc2FibGVDb25uZWN0aW9uRHJhaW5PbkZhaWxvdmVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmRpc2FibGVDb25uZWN0aW9uRHJhaW5PbkZhaWxvdmVyID0gdGhpcy5fZGlzYWJsZUNvbm5lY3Rpb25EcmFpbk9uRmFpbG92ZXI7XG4gICAgfVxuICAgIGlmICh0aGlzLl9kcm9wVHJhZmZpY0lmVW5oZWFsdGh5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmRyb3BUcmFmZmljSWZVbmhlYWx0aHkgPSB0aGlzLl9kcm9wVHJhZmZpY0lmVW5oZWFsdGh5O1xuICAgIH1cbiAgICBpZiAodGhpcy5fZmFpbG92ZXJSYXRpbyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5mYWlsb3ZlclJhdGlvID0gdGhpcy5fZmFpbG92ZXJSYXRpbztcbiAgICB9XG4gICAgcmV0dXJuIGhhc0FueVZhbHVlcyA/IGludGVybmFsVmFsdWVSZXN1bHQgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgc2V0IGludGVybmFsVmFsdWUodmFsdWU6IENvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZUZhaWxvdmVyUG9saWN5IHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuICAgICAgdGhpcy5fZGlzYWJsZUNvbm5lY3Rpb25EcmFpbk9uRmFpbG92ZXIgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9kcm9wVHJhZmZpY0lmVW5oZWFsdGh5ID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fZmFpbG92ZXJSYXRpbyA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSAwO1xuICAgICAgdGhpcy5fZGlzYWJsZUNvbm5lY3Rpb25EcmFpbk9uRmFpbG92ZXIgPSB2YWx1ZS5kaXNhYmxlQ29ubmVjdGlvbkRyYWluT25GYWlsb3ZlcjtcbiAgICAgIHRoaXMuX2Ryb3BUcmFmZmljSWZVbmhlYWx0aHkgPSB2YWx1ZS5kcm9wVHJhZmZpY0lmVW5oZWFsdGh5O1xuICAgICAgdGhpcy5fZmFpbG92ZXJSYXRpbyA9IHZhbHVlLmZhaWxvdmVyUmF0aW87XG4gICAgfVxuICB9XG5cbiAgLy8gZGlzYWJsZV9jb25uZWN0aW9uX2RyYWluX29uX2ZhaWxvdmVyIC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfZGlzYWJsZUNvbm5lY3Rpb25EcmFpbk9uRmFpbG92ZXI/OiBib29sZWFuIHwgY2RrdGYuSVJlc29sdmFibGU7IFxuICBwdWJsaWMgZ2V0IGRpc2FibGVDb25uZWN0aW9uRHJhaW5PbkZhaWxvdmVyKCkge1xuICAgIHJldHVybiB0aGlzLmdldEJvb2xlYW5BdHRyaWJ1dGUoJ2Rpc2FibGVfY29ubmVjdGlvbl9kcmFpbl9vbl9mYWlsb3ZlcicpO1xuICB9XG4gIHB1YmxpYyBzZXQgZGlzYWJsZUNvbm5lY3Rpb25EcmFpbk9uRmFpbG92ZXIodmFsdWU6IGJvb2xlYW4gfCBjZGt0Zi5JUmVzb2x2YWJsZSkge1xuICAgIHRoaXMuX2Rpc2FibGVDb25uZWN0aW9uRHJhaW5PbkZhaWxvdmVyID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0RGlzYWJsZUNvbm5lY3Rpb25EcmFpbk9uRmFpbG92ZXIoKSB7XG4gICAgdGhpcy5fZGlzYWJsZUNvbm5lY3Rpb25EcmFpbk9uRmFpbG92ZXIgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGRpc2FibGVDb25uZWN0aW9uRHJhaW5PbkZhaWxvdmVySW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Rpc2FibGVDb25uZWN0aW9uRHJhaW5PbkZhaWxvdmVyO1xuICB9XG5cbiAgLy8gZHJvcF90cmFmZmljX2lmX3VuaGVhbHRoeSAtIGNvbXB1dGVkOiB0cnVlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2Ryb3BUcmFmZmljSWZVbmhlYWx0aHk/OiBib29sZWFuIHwgY2RrdGYuSVJlc29sdmFibGU7IFxuICBwdWJsaWMgZ2V0IGRyb3BUcmFmZmljSWZVbmhlYWx0aHkoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Qm9vbGVhbkF0dHJpYnV0ZSgnZHJvcF90cmFmZmljX2lmX3VuaGVhbHRoeScpO1xuICB9XG4gIHB1YmxpYyBzZXQgZHJvcFRyYWZmaWNJZlVuaGVhbHRoeSh2YWx1ZTogYm9vbGVhbiB8IGNka3RmLklSZXNvbHZhYmxlKSB7XG4gICAgdGhpcy5fZHJvcFRyYWZmaWNJZlVuaGVhbHRoeSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldERyb3BUcmFmZmljSWZVbmhlYWx0aHkoKSB7XG4gICAgdGhpcy5fZHJvcFRyYWZmaWNJZlVuaGVhbHRoeSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgZHJvcFRyYWZmaWNJZlVuaGVhbHRoeUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9kcm9wVHJhZmZpY0lmVW5oZWFsdGh5O1xuICB9XG5cbiAgLy8gZmFpbG92ZXJfcmF0aW8gLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfZmFpbG92ZXJSYXRpbz86IG51bWJlcjsgXG4gIHB1YmxpYyBnZXQgZmFpbG92ZXJSYXRpbygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXROdW1iZXJBdHRyaWJ1dGUoJ2ZhaWxvdmVyX3JhdGlvJyk7XG4gIH1cbiAgcHVibGljIHNldCBmYWlsb3ZlclJhdGlvKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9mYWlsb3ZlclJhdGlvID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0RmFpbG92ZXJSYXRpbygpIHtcbiAgICB0aGlzLl9mYWlsb3ZlclJhdGlvID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBmYWlsb3ZlclJhdGlvSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZhaWxvdmVyUmF0aW87XG4gIH1cbn1cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlSWFwIHtcbiAgLyoqXG4gICogV2hldGhlciB0aGUgc2VydmluZyBpbmZyYXN0cnVjdHVyZSB3aWxsIGF1dGhlbnRpY2F0ZSBhbmQgYXV0aG9yaXplIGFsbCBpbmNvbWluZyByZXF1ZXN0cy5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9nb29nbGUvNi40LjAvZG9jcy9yZXNvdXJjZXMvY29tcHV0ZV9yZWdpb25fYmFja2VuZF9zZXJ2aWNlI2VuYWJsZWQgQ29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlI2VuYWJsZWR9XG4gICovXG4gIHJlYWRvbmx5IGVuYWJsZWQ6IGJvb2xlYW4gfCBjZGt0Zi5JUmVzb2x2YWJsZTtcbiAgLyoqXG4gICogT0F1dGgyIENsaWVudCBJRCBmb3IgSUFQXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvZ29vZ2xlLzYuNC4wL2RvY3MvcmVzb3VyY2VzL2NvbXB1dGVfcmVnaW9uX2JhY2tlbmRfc2VydmljZSNvYXV0aDJfY2xpZW50X2lkIENvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZSNvYXV0aDJfY2xpZW50X2lkfVxuICAqL1xuICByZWFkb25seSBvYXV0aDJDbGllbnRJZD86IHN0cmluZztcbiAgLyoqXG4gICogT0F1dGgyIENsaWVudCBTZWNyZXQgZm9yIElBUFxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2dvb2dsZS82LjQuMC9kb2NzL3Jlc291cmNlcy9jb21wdXRlX3JlZ2lvbl9iYWNrZW5kX3NlcnZpY2Ujb2F1dGgyX2NsaWVudF9zZWNyZXQgQ29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlI29hdXRoMl9jbGllbnRfc2VjcmV0fVxuICAqL1xuICByZWFkb25seSBvYXV0aDJDbGllbnRTZWNyZXQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VJYXBUb1RlcnJhZm9ybShzdHJ1Y3Q/OiBDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VJYXBPdXRwdXRSZWZlcmVuY2UgfCBDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VJYXApOiBhbnkge1xuICBpZiAoIWNka3RmLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0Zi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdGYuaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIHJldHVybiB7XG4gICAgZW5hYmxlZDogY2RrdGYuYm9vbGVhblRvVGVycmFmb3JtKHN0cnVjdCEuZW5hYmxlZCksXG4gICAgb2F1dGgyX2NsaWVudF9pZDogY2RrdGYuc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS5vYXV0aDJDbGllbnRJZCksXG4gICAgb2F1dGgyX2NsaWVudF9zZWNyZXQ6IGNka3RmLnN0cmluZ1RvVGVycmFmb3JtKHN0cnVjdCEub2F1dGgyQ2xpZW50U2VjcmV0KSxcbiAgfVxufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VJYXBUb0hjbFRlcnJhZm9ybShzdHJ1Y3Q/OiBDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VJYXBPdXRwdXRSZWZlcmVuY2UgfCBDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VJYXApOiBhbnkge1xuICBpZiAoIWNka3RmLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0Zi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdGYuaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIGNvbnN0IGF0dHJzID0ge1xuICAgIGVuYWJsZWQ6IHtcbiAgICAgIHZhbHVlOiBjZGt0Zi5ib29sZWFuVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5lbmFibGVkKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwiYm9vbGVhblwiLFxuICAgIH0sXG4gICAgb2F1dGgyX2NsaWVudF9pZDoge1xuICAgICAgdmFsdWU6IGNka3RmLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEub2F1dGgyQ2xpZW50SWQpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICB9LFxuICAgIG9hdXRoMl9jbGllbnRfc2VjcmV0OiB7XG4gICAgICB2YWx1ZTogY2RrdGYuc3RyaW5nVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5vYXV0aDJDbGllbnRTZWNyZXQpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICB9LFxuICB9O1xuXG4gIC8vIHJlbW92ZSB1bmRlZmluZWQgYXR0cmlidXRlc1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKGF0dHJzKS5maWx0ZXIoKFtfLCB2YWx1ZV0pID0+IHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUudmFsdWUgIT09IHVuZGVmaW5lZCkpO1xufVxuXG5leHBvcnQgY2xhc3MgQ29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlSWFwT3V0cHV0UmVmZXJlbmNlIGV4dGVuZHMgY2RrdGYuQ29tcGxleE9iamVjdCB7XG4gIHByaXZhdGUgaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuXG4gIC8qKlxuICAqIEBwYXJhbSB0ZXJyYWZvcm1SZXNvdXJjZSBUaGUgcGFyZW50IHJlc291cmNlXG4gICogQHBhcmFtIHRlcnJhZm9ybUF0dHJpYnV0ZSBUaGUgYXR0cmlidXRlIG9uIHRoZSBwYXJlbnQgcmVzb3VyY2UgdGhpcyBjbGFzcyBpcyByZWZlcmVuY2luZ1xuICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IodGVycmFmb3JtUmVzb3VyY2U6IGNka3RmLklJbnRlcnBvbGF0aW5nUGFyZW50LCB0ZXJyYWZvcm1BdHRyaWJ1dGU6IHN0cmluZykge1xuICAgIHN1cGVyKHRlcnJhZm9ybVJlc291cmNlLCB0ZXJyYWZvcm1BdHRyaWJ1dGUsIGZhbHNlLCAwKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW50ZXJuYWxWYWx1ZSgpOiBDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VJYXAgfCB1bmRlZmluZWQge1xuICAgIGxldCBoYXNBbnlWYWx1ZXMgPSB0aGlzLmlzRW1wdHlPYmplY3Q7XG4gICAgY29uc3QgaW50ZXJuYWxWYWx1ZVJlc3VsdDogYW55ID0ge307XG4gICAgaWYgKHRoaXMuX2VuYWJsZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuZW5hYmxlZCA9IHRoaXMuX2VuYWJsZWQ7XG4gICAgfVxuICAgIGlmICh0aGlzLl9vYXV0aDJDbGllbnRJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5vYXV0aDJDbGllbnRJZCA9IHRoaXMuX29hdXRoMkNsaWVudElkO1xuICAgIH1cbiAgICBpZiAodGhpcy5fb2F1dGgyQ2xpZW50U2VjcmV0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0Lm9hdXRoMkNsaWVudFNlY3JldCA9IHRoaXMuX29hdXRoMkNsaWVudFNlY3JldDtcbiAgICB9XG4gICAgcmV0dXJuIGhhc0FueVZhbHVlcyA/IGludGVybmFsVmFsdWVSZXN1bHQgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgc2V0IGludGVybmFsVmFsdWUodmFsdWU6IENvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZUlhcCB8IHVuZGVmaW5lZCkge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBmYWxzZTtcbiAgICAgIHRoaXMuX2VuYWJsZWQgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9vYXV0aDJDbGllbnRJZCA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX29hdXRoMkNsaWVudFNlY3JldCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSAwO1xuICAgICAgdGhpcy5fZW5hYmxlZCA9IHZhbHVlLmVuYWJsZWQ7XG4gICAgICB0aGlzLl9vYXV0aDJDbGllbnRJZCA9IHZhbHVlLm9hdXRoMkNsaWVudElkO1xuICAgICAgdGhpcy5fb2F1dGgyQ2xpZW50U2VjcmV0ID0gdmFsdWUub2F1dGgyQ2xpZW50U2VjcmV0O1xuICAgIH1cbiAgfVxuXG4gIC8vIGVuYWJsZWQgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfZW5hYmxlZD86IGJvb2xlYW4gfCBjZGt0Zi5JUmVzb2x2YWJsZTsgXG4gIHB1YmxpYyBnZXQgZW5hYmxlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRCb29sZWFuQXR0cmlidXRlKCdlbmFibGVkJyk7XG4gIH1cbiAgcHVibGljIHNldCBlbmFibGVkKHZhbHVlOiBib29sZWFuIHwgY2RrdGYuSVJlc29sdmFibGUpIHtcbiAgICB0aGlzLl9lbmFibGVkID0gdmFsdWU7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGVuYWJsZWRJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZW5hYmxlZDtcbiAgfVxuXG4gIC8vIG9hdXRoMl9jbGllbnRfaWQgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfb2F1dGgyQ2xpZW50SWQ/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IG9hdXRoMkNsaWVudElkKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnb2F1dGgyX2NsaWVudF9pZCcpO1xuICB9XG4gIHB1YmxpYyBzZXQgb2F1dGgyQ2xpZW50SWQodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX29hdXRoMkNsaWVudElkID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0T2F1dGgyQ2xpZW50SWQoKSB7XG4gICAgdGhpcy5fb2F1dGgyQ2xpZW50SWQgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IG9hdXRoMkNsaWVudElkSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX29hdXRoMkNsaWVudElkO1xuICB9XG5cbiAgLy8gb2F1dGgyX2NsaWVudF9zZWNyZXQgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfb2F1dGgyQ2xpZW50U2VjcmV0Pzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBvYXV0aDJDbGllbnRTZWNyZXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdvYXV0aDJfY2xpZW50X3NlY3JldCcpO1xuICB9XG4gIHB1YmxpYyBzZXQgb2F1dGgyQ2xpZW50U2VjcmV0KHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9vYXV0aDJDbGllbnRTZWNyZXQgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRPYXV0aDJDbGllbnRTZWNyZXQoKSB7XG4gICAgdGhpcy5fb2F1dGgyQ2xpZW50U2VjcmV0ID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBvYXV0aDJDbGllbnRTZWNyZXRJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fb2F1dGgyQ2xpZW50U2VjcmV0O1xuICB9XG5cbiAgLy8gb2F1dGgyX2NsaWVudF9zZWNyZXRfc2hhMjU2IC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHB1YmxpYyBnZXQgb2F1dGgyQ2xpZW50U2VjcmV0U2hhMjU2KCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnb2F1dGgyX2NsaWVudF9zZWNyZXRfc2hhMjU2Jyk7XG4gIH1cbn1cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlTG9nQ29uZmlnIHtcbiAgLyoqXG4gICogV2hldGhlciB0byBlbmFibGUgbG9nZ2luZyBmb3IgdGhlIGxvYWQgYmFsYW5jZXIgdHJhZmZpYyBzZXJ2ZWQgYnkgdGhpcyBiYWNrZW5kIHNlcnZpY2UuXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvZ29vZ2xlLzYuNC4wL2RvY3MvcmVzb3VyY2VzL2NvbXB1dGVfcmVnaW9uX2JhY2tlbmRfc2VydmljZSNlbmFibGUgQ29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlI2VuYWJsZX1cbiAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlPzogYm9vbGVhbiB8IGNka3RmLklSZXNvbHZhYmxlO1xuICAvKipcbiAgKiBUaGlzIGZpZWxkIGNhbiBvbmx5IGJlIHNwZWNpZmllZCBpZiBsb2dnaW5nIGlzIGVuYWJsZWQgZm9yIHRoaXMgYmFja2VuZCBzZXJ2aWNlLiBUaGUgdmFsdWUgb2ZcbiAgKiB0aGUgZmllbGQgbXVzdCBiZSBpbiBbMCwgMV0uIFRoaXMgY29uZmlndXJlcyB0aGUgc2FtcGxpbmcgcmF0ZSBvZiByZXF1ZXN0cyB0byB0aGUgbG9hZCBiYWxhbmNlclxuICAqIHdoZXJlIDEuMCBtZWFucyBhbGwgbG9nZ2VkIHJlcXVlc3RzIGFyZSByZXBvcnRlZCBhbmQgMC4wIG1lYW5zIG5vIGxvZ2dlZCByZXF1ZXN0cyBhcmUgcmVwb3J0ZWQuXG4gICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgMS4wLlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2dvb2dsZS82LjQuMC9kb2NzL3Jlc291cmNlcy9jb21wdXRlX3JlZ2lvbl9iYWNrZW5kX3NlcnZpY2Ujc2FtcGxlX3JhdGUgQ29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlI3NhbXBsZV9yYXRlfVxuICAqL1xuICByZWFkb25seSBzYW1wbGVSYXRlPzogbnVtYmVyO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlTG9nQ29uZmlnVG9UZXJyYWZvcm0oc3RydWN0PzogQ29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlTG9nQ29uZmlnT3V0cHV0UmVmZXJlbmNlIHwgQ29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlTG9nQ29uZmlnKTogYW55IHtcbiAgaWYgKCFjZGt0Zi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdGYuVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RmLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGVuYWJsZTogY2RrdGYuYm9vbGVhblRvVGVycmFmb3JtKHN0cnVjdCEuZW5hYmxlKSxcbiAgICBzYW1wbGVfcmF0ZTogY2RrdGYubnVtYmVyVG9UZXJyYWZvcm0oc3RydWN0IS5zYW1wbGVSYXRlKSxcbiAgfVxufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VMb2dDb25maWdUb0hjbFRlcnJhZm9ybShzdHJ1Y3Q/OiBDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VMb2dDb25maWdPdXRwdXRSZWZlcmVuY2UgfCBDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VMb2dDb25maWcpOiBhbnkge1xuICBpZiAoIWNka3RmLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0Zi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdGYuaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIGNvbnN0IGF0dHJzID0ge1xuICAgIGVuYWJsZToge1xuICAgICAgdmFsdWU6IGNka3RmLmJvb2xlYW5Ub0hjbFRlcnJhZm9ybShzdHJ1Y3QhLmVuYWJsZSksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcImJvb2xlYW5cIixcbiAgICB9LFxuICAgIHNhbXBsZV9yYXRlOiB7XG4gICAgICB2YWx1ZTogY2RrdGYubnVtYmVyVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5zYW1wbGVSYXRlKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwibnVtYmVyXCIsXG4gICAgfSxcbiAgfTtcblxuICAvLyByZW1vdmUgdW5kZWZpbmVkIGF0dHJpYnV0ZXNcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhdHRycykuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWQpKTtcbn1cblxuZXhwb3J0IGNsYXNzIENvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZUxvZ0NvbmZpZ091dHB1dFJlZmVyZW5jZSBleHRlbmRzIGNka3RmLkNvbXBsZXhPYmplY3Qge1xuICBwcml2YXRlIGlzRW1wdHlPYmplY3QgPSBmYWxzZTtcblxuICAvKipcbiAgKiBAcGFyYW0gdGVycmFmb3JtUmVzb3VyY2UgVGhlIHBhcmVudCByZXNvdXJjZVxuICAqIEBwYXJhbSB0ZXJyYWZvcm1BdHRyaWJ1dGUgVGhlIGF0dHJpYnV0ZSBvbiB0aGUgcGFyZW50IHJlc291cmNlIHRoaXMgY2xhc3MgaXMgcmVmZXJlbmNpbmdcbiAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHRlcnJhZm9ybVJlc291cmNlOiBjZGt0Zi5JSW50ZXJwb2xhdGluZ1BhcmVudCwgdGVycmFmb3JtQXR0cmlidXRlOiBzdHJpbmcpIHtcbiAgICBzdXBlcih0ZXJyYWZvcm1SZXNvdXJjZSwgdGVycmFmb3JtQXR0cmlidXRlLCBmYWxzZSwgMCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGludGVybmFsVmFsdWUoKTogQ29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlTG9nQ29uZmlnIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgaGFzQW55VmFsdWVzID0gdGhpcy5pc0VtcHR5T2JqZWN0O1xuICAgIGNvbnN0IGludGVybmFsVmFsdWVSZXN1bHQ6IGFueSA9IHt9O1xuICAgIGlmICh0aGlzLl9lbmFibGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuZW5hYmxlID0gdGhpcy5fZW5hYmxlO1xuICAgIH1cbiAgICBpZiAodGhpcy5fc2FtcGxlUmF0ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5zYW1wbGVSYXRlID0gdGhpcy5fc2FtcGxlUmF0ZTtcbiAgICB9XG4gICAgcmV0dXJuIGhhc0FueVZhbHVlcyA/IGludGVybmFsVmFsdWVSZXN1bHQgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgc2V0IGludGVybmFsVmFsdWUodmFsdWU6IENvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZUxvZ0NvbmZpZyB8IHVuZGVmaW5lZCkge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBmYWxzZTtcbiAgICAgIHRoaXMuX2VuYWJsZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3NhbXBsZVJhdGUgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA9PT0gMDtcbiAgICAgIHRoaXMuX2VuYWJsZSA9IHZhbHVlLmVuYWJsZTtcbiAgICAgIHRoaXMuX3NhbXBsZVJhdGUgPSB2YWx1ZS5zYW1wbGVSYXRlO1xuICAgIH1cbiAgfVxuXG4gIC8vIGVuYWJsZSAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9lbmFibGU/OiBib29sZWFuIHwgY2RrdGYuSVJlc29sdmFibGU7IFxuICBwdWJsaWMgZ2V0IGVuYWJsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRCb29sZWFuQXR0cmlidXRlKCdlbmFibGUnKTtcbiAgfVxuICBwdWJsaWMgc2V0IGVuYWJsZSh2YWx1ZTogYm9vbGVhbiB8IGNka3RmLklSZXNvbHZhYmxlKSB7XG4gICAgdGhpcy5fZW5hYmxlID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0RW5hYmxlKCkge1xuICAgIHRoaXMuX2VuYWJsZSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgZW5hYmxlSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2VuYWJsZTtcbiAgfVxuXG4gIC8vIHNhbXBsZV9yYXRlIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX3NhbXBsZVJhdGU/OiBudW1iZXI7IFxuICBwdWJsaWMgZ2V0IHNhbXBsZVJhdGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TnVtYmVyQXR0cmlidXRlKCdzYW1wbGVfcmF0ZScpO1xuICB9XG4gIHB1YmxpYyBzZXQgc2FtcGxlUmF0ZSh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fc2FtcGxlUmF0ZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldFNhbXBsZVJhdGUoKSB7XG4gICAgdGhpcy5fc2FtcGxlUmF0ZSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgc2FtcGxlUmF0ZUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9zYW1wbGVSYXRlO1xuICB9XG59XG5leHBvcnQgaW50ZXJmYWNlIENvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZU91dGxpZXJEZXRlY3Rpb25CYXNlRWplY3Rpb25UaW1lIHtcbiAgLyoqXG4gICogU3BhbiBvZiB0aW1lIHRoYXQncyBhIGZyYWN0aW9uIG9mIGEgc2Vjb25kIGF0IG5hbm9zZWNvbmQgcmVzb2x1dGlvbi4gRHVyYXRpb25zXG4gICogbGVzcyB0aGFuIG9uZSBzZWNvbmQgYXJlIHJlcHJlc2VudGVkIHdpdGggYSAwICdzZWNvbmRzJyBmaWVsZCBhbmQgYSBwb3NpdGl2ZVxuICAqICduYW5vcycgZmllbGQuIE11c3QgYmUgZnJvbSAwIHRvIDk5OSw5OTksOTk5IGluY2x1c2l2ZS5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9nb29nbGUvNi40LjAvZG9jcy9yZXNvdXJjZXMvY29tcHV0ZV9yZWdpb25fYmFja2VuZF9zZXJ2aWNlI25hbm9zIENvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZSNuYW5vc31cbiAgKi9cbiAgcmVhZG9ubHkgbmFub3M/OiBudW1iZXI7XG4gIC8qKlxuICAqIFNwYW4gb2YgdGltZSBhdCBhIHJlc29sdXRpb24gb2YgYSBzZWNvbmQuIE11c3QgYmUgZnJvbSAwIHRvIDMxNSw1NzYsMDAwLDAwMFxuICAqIGluY2x1c2l2ZS5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9nb29nbGUvNi40LjAvZG9jcy9yZXNvdXJjZXMvY29tcHV0ZV9yZWdpb25fYmFja2VuZF9zZXJ2aWNlI3NlY29uZHMgQ29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlI3NlY29uZHN9XG4gICovXG4gIHJlYWRvbmx5IHNlY29uZHM6IG51bWJlcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZU91dGxpZXJEZXRlY3Rpb25CYXNlRWplY3Rpb25UaW1lVG9UZXJyYWZvcm0oc3RydWN0PzogQ29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlT3V0bGllckRldGVjdGlvbkJhc2VFamVjdGlvblRpbWVPdXRwdXRSZWZlcmVuY2UgfCBDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VPdXRsaWVyRGV0ZWN0aW9uQmFzZUVqZWN0aW9uVGltZSk6IGFueSB7XG4gIGlmICghY2RrdGYuY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RmLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0Zi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBuYW5vczogY2RrdGYubnVtYmVyVG9UZXJyYWZvcm0oc3RydWN0IS5uYW5vcyksXG4gICAgc2Vjb25kczogY2RrdGYubnVtYmVyVG9UZXJyYWZvcm0oc3RydWN0IS5zZWNvbmRzKSxcbiAgfVxufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VPdXRsaWVyRGV0ZWN0aW9uQmFzZUVqZWN0aW9uVGltZVRvSGNsVGVycmFmb3JtKHN0cnVjdD86IENvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZU91dGxpZXJEZXRlY3Rpb25CYXNlRWplY3Rpb25UaW1lT3V0cHV0UmVmZXJlbmNlIHwgQ29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlT3V0bGllckRldGVjdGlvbkJhc2VFamVjdGlvblRpbWUpOiBhbnkge1xuICBpZiAoIWNka3RmLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0Zi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdGYuaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIGNvbnN0IGF0dHJzID0ge1xuICAgIG5hbm9zOiB7XG4gICAgICB2YWx1ZTogY2RrdGYubnVtYmVyVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5uYW5vcyksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIm51bWJlclwiLFxuICAgIH0sXG4gICAgc2Vjb25kczoge1xuICAgICAgdmFsdWU6IGNka3RmLm51bWJlclRvSGNsVGVycmFmb3JtKHN0cnVjdCEuc2Vjb25kcyksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIm51bWJlclwiLFxuICAgIH0sXG4gIH07XG5cbiAgLy8gcmVtb3ZlIHVuZGVmaW5lZCBhdHRyaWJ1dGVzXG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoYXR0cnMpLmZpbHRlcigoW18sIHZhbHVlXSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZS52YWx1ZSAhPT0gdW5kZWZpbmVkKSk7XG59XG5cbmV4cG9ydCBjbGFzcyBDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VPdXRsaWVyRGV0ZWN0aW9uQmFzZUVqZWN0aW9uVGltZU91dHB1dFJlZmVyZW5jZSBleHRlbmRzIGNka3RmLkNvbXBsZXhPYmplY3Qge1xuICBwcml2YXRlIGlzRW1wdHlPYmplY3QgPSBmYWxzZTtcblxuICAvKipcbiAgKiBAcGFyYW0gdGVycmFmb3JtUmVzb3VyY2UgVGhlIHBhcmVudCByZXNvdXJjZVxuICAqIEBwYXJhbSB0ZXJyYWZvcm1BdHRyaWJ1dGUgVGhlIGF0dHJpYnV0ZSBvbiB0aGUgcGFyZW50IHJlc291cmNlIHRoaXMgY2xhc3MgaXMgcmVmZXJlbmNpbmdcbiAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHRlcnJhZm9ybVJlc291cmNlOiBjZGt0Zi5JSW50ZXJwb2xhdGluZ1BhcmVudCwgdGVycmFmb3JtQXR0cmlidXRlOiBzdHJpbmcpIHtcbiAgICBzdXBlcih0ZXJyYWZvcm1SZXNvdXJjZSwgdGVycmFmb3JtQXR0cmlidXRlLCBmYWxzZSwgMCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGludGVybmFsVmFsdWUoKTogQ29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlT3V0bGllckRldGVjdGlvbkJhc2VFamVjdGlvblRpbWUgfCB1bmRlZmluZWQge1xuICAgIGxldCBoYXNBbnlWYWx1ZXMgPSB0aGlzLmlzRW1wdHlPYmplY3Q7XG4gICAgY29uc3QgaW50ZXJuYWxWYWx1ZVJlc3VsdDogYW55ID0ge307XG4gICAgaWYgKHRoaXMuX25hbm9zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0Lm5hbm9zID0gdGhpcy5fbmFub3M7XG4gICAgfVxuICAgIGlmICh0aGlzLl9zZWNvbmRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LnNlY29uZHMgPSB0aGlzLl9zZWNvbmRzO1xuICAgIH1cbiAgICByZXR1cm4gaGFzQW55VmFsdWVzID8gaW50ZXJuYWxWYWx1ZVJlc3VsdCA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgaW50ZXJuYWxWYWx1ZSh2YWx1ZTogQ29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlT3V0bGllckRldGVjdGlvbkJhc2VFamVjdGlvblRpbWUgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLl9uYW5vcyA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3NlY29uZHMgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA9PT0gMDtcbiAgICAgIHRoaXMuX25hbm9zID0gdmFsdWUubmFub3M7XG4gICAgICB0aGlzLl9zZWNvbmRzID0gdmFsdWUuc2Vjb25kcztcbiAgICB9XG4gIH1cblxuICAvLyBuYW5vcyAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9uYW5vcz86IG51bWJlcjsgXG4gIHB1YmxpYyBnZXQgbmFub3MoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TnVtYmVyQXR0cmlidXRlKCduYW5vcycpO1xuICB9XG4gIHB1YmxpYyBzZXQgbmFub3ModmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX25hbm9zID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0TmFub3MoKSB7XG4gICAgdGhpcy5fbmFub3MgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IG5hbm9zSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX25hbm9zO1xuICB9XG5cbiAgLy8gc2Vjb25kcyAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogdHJ1ZVxuICBwcml2YXRlIF9zZWNvbmRzPzogbnVtYmVyOyBcbiAgcHVibGljIGdldCBzZWNvbmRzKCkge1xuICAgIHJldHVybiB0aGlzLmdldE51bWJlckF0dHJpYnV0ZSgnc2Vjb25kcycpO1xuICB9XG4gIHB1YmxpYyBzZXQgc2Vjb25kcyh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fc2Vjb25kcyA9IHZhbHVlO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBzZWNvbmRzSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NlY29uZHM7XG4gIH1cbn1cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlT3V0bGllckRldGVjdGlvbkludGVydmFsIHtcbiAgLyoqXG4gICogU3BhbiBvZiB0aW1lIHRoYXQncyBhIGZyYWN0aW9uIG9mIGEgc2Vjb25kIGF0IG5hbm9zZWNvbmQgcmVzb2x1dGlvbi4gRHVyYXRpb25zXG4gICogbGVzcyB0aGFuIG9uZSBzZWNvbmQgYXJlIHJlcHJlc2VudGVkIHdpdGggYSAwICdzZWNvbmRzJyBmaWVsZCBhbmQgYSBwb3NpdGl2ZVxuICAqICduYW5vcycgZmllbGQuIE11c3QgYmUgZnJvbSAwIHRvIDk5OSw5OTksOTk5IGluY2x1c2l2ZS5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9nb29nbGUvNi40LjAvZG9jcy9yZXNvdXJjZXMvY29tcHV0ZV9yZWdpb25fYmFja2VuZF9zZXJ2aWNlI25hbm9zIENvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZSNuYW5vc31cbiAgKi9cbiAgcmVhZG9ubHkgbmFub3M/OiBudW1iZXI7XG4gIC8qKlxuICAqIFNwYW4gb2YgdGltZSBhdCBhIHJlc29sdXRpb24gb2YgYSBzZWNvbmQuIE11c3QgYmUgZnJvbSAwIHRvIDMxNSw1NzYsMDAwLDAwMFxuICAqIGluY2x1c2l2ZS5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9nb29nbGUvNi40LjAvZG9jcy9yZXNvdXJjZXMvY29tcHV0ZV9yZWdpb25fYmFja2VuZF9zZXJ2aWNlI3NlY29uZHMgQ29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlI3NlY29uZHN9XG4gICovXG4gIHJlYWRvbmx5IHNlY29uZHM6IG51bWJlcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZU91dGxpZXJEZXRlY3Rpb25JbnRlcnZhbFRvVGVycmFmb3JtKHN0cnVjdD86IENvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZU91dGxpZXJEZXRlY3Rpb25JbnRlcnZhbE91dHB1dFJlZmVyZW5jZSB8IENvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZU91dGxpZXJEZXRlY3Rpb25JbnRlcnZhbCk6IGFueSB7XG4gIGlmICghY2RrdGYuY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RmLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0Zi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBuYW5vczogY2RrdGYubnVtYmVyVG9UZXJyYWZvcm0oc3RydWN0IS5uYW5vcyksXG4gICAgc2Vjb25kczogY2RrdGYubnVtYmVyVG9UZXJyYWZvcm0oc3RydWN0IS5zZWNvbmRzKSxcbiAgfVxufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VPdXRsaWVyRGV0ZWN0aW9uSW50ZXJ2YWxUb0hjbFRlcnJhZm9ybShzdHJ1Y3Q/OiBDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VPdXRsaWVyRGV0ZWN0aW9uSW50ZXJ2YWxPdXRwdXRSZWZlcmVuY2UgfCBDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VPdXRsaWVyRGV0ZWN0aW9uSW50ZXJ2YWwpOiBhbnkge1xuICBpZiAoIWNka3RmLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0Zi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdGYuaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIGNvbnN0IGF0dHJzID0ge1xuICAgIG5hbm9zOiB7XG4gICAgICB2YWx1ZTogY2RrdGYubnVtYmVyVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5uYW5vcyksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIm51bWJlclwiLFxuICAgIH0sXG4gICAgc2Vjb25kczoge1xuICAgICAgdmFsdWU6IGNka3RmLm51bWJlclRvSGNsVGVycmFmb3JtKHN0cnVjdCEuc2Vjb25kcyksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIm51bWJlclwiLFxuICAgIH0sXG4gIH07XG5cbiAgLy8gcmVtb3ZlIHVuZGVmaW5lZCBhdHRyaWJ1dGVzXG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoYXR0cnMpLmZpbHRlcigoW18sIHZhbHVlXSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZS52YWx1ZSAhPT0gdW5kZWZpbmVkKSk7XG59XG5cbmV4cG9ydCBjbGFzcyBDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VPdXRsaWVyRGV0ZWN0aW9uSW50ZXJ2YWxPdXRwdXRSZWZlcmVuY2UgZXh0ZW5kcyBjZGt0Zi5Db21wbGV4T2JqZWN0IHtcbiAgcHJpdmF0ZSBpc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG5cbiAgLyoqXG4gICogQHBhcmFtIHRlcnJhZm9ybVJlc291cmNlIFRoZSBwYXJlbnQgcmVzb3VyY2VcbiAgKiBAcGFyYW0gdGVycmFmb3JtQXR0cmlidXRlIFRoZSBhdHRyaWJ1dGUgb24gdGhlIHBhcmVudCByZXNvdXJjZSB0aGlzIGNsYXNzIGlzIHJlZmVyZW5jaW5nXG4gICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih0ZXJyYWZvcm1SZXNvdXJjZTogY2RrdGYuSUludGVycG9sYXRpbmdQYXJlbnQsIHRlcnJhZm9ybUF0dHJpYnV0ZTogc3RyaW5nKSB7XG4gICAgc3VwZXIodGVycmFmb3JtUmVzb3VyY2UsIHRlcnJhZm9ybUF0dHJpYnV0ZSwgZmFsc2UsIDApO1xuICB9XG5cbiAgcHVibGljIGdldCBpbnRlcm5hbFZhbHVlKCk6IENvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZU91dGxpZXJEZXRlY3Rpb25JbnRlcnZhbCB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGhhc0FueVZhbHVlcyA9IHRoaXMuaXNFbXB0eU9iamVjdDtcbiAgICBjb25zdCBpbnRlcm5hbFZhbHVlUmVzdWx0OiBhbnkgPSB7fTtcbiAgICBpZiAodGhpcy5fbmFub3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQubmFub3MgPSB0aGlzLl9uYW5vcztcbiAgICB9XG4gICAgaWYgKHRoaXMuX3NlY29uZHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuc2Vjb25kcyA9IHRoaXMuX3NlY29uZHM7XG4gICAgfVxuICAgIHJldHVybiBoYXNBbnlWYWx1ZXMgPyBpbnRlcm5hbFZhbHVlUmVzdWx0IDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHNldCBpbnRlcm5hbFZhbHVlKHZhbHVlOiBDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VPdXRsaWVyRGV0ZWN0aW9uSW50ZXJ2YWwgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLl9uYW5vcyA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3NlY29uZHMgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA9PT0gMDtcbiAgICAgIHRoaXMuX25hbm9zID0gdmFsdWUubmFub3M7XG4gICAgICB0aGlzLl9zZWNvbmRzID0gdmFsdWUuc2Vjb25kcztcbiAgICB9XG4gIH1cblxuICAvLyBuYW5vcyAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9uYW5vcz86IG51bWJlcjsgXG4gIHB1YmxpYyBnZXQgbmFub3MoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TnVtYmVyQXR0cmlidXRlKCduYW5vcycpO1xuICB9XG4gIHB1YmxpYyBzZXQgbmFub3ModmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX25hbm9zID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0TmFub3MoKSB7XG4gICAgdGhpcy5fbmFub3MgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IG5hbm9zSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX25hbm9zO1xuICB9XG5cbiAgLy8gc2Vjb25kcyAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogdHJ1ZVxuICBwcml2YXRlIF9zZWNvbmRzPzogbnVtYmVyOyBcbiAgcHVibGljIGdldCBzZWNvbmRzKCkge1xuICAgIHJldHVybiB0aGlzLmdldE51bWJlckF0dHJpYnV0ZSgnc2Vjb25kcycpO1xuICB9XG4gIHB1YmxpYyBzZXQgc2Vjb25kcyh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fc2Vjb25kcyA9IHZhbHVlO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBzZWNvbmRzSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NlY29uZHM7XG4gIH1cbn1cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlT3V0bGllckRldGVjdGlvbiB7XG4gIC8qKlxuICAqIE51bWJlciBvZiBlcnJvcnMgYmVmb3JlIGEgaG9zdCBpcyBlamVjdGVkIGZyb20gdGhlIGNvbm5lY3Rpb24gcG9vbC4gV2hlbiB0aGVcbiAgKiBiYWNrZW5kIGhvc3QgaXMgYWNjZXNzZWQgb3ZlciBIVFRQLCBhIDV4eCByZXR1cm4gY29kZSBxdWFsaWZpZXMgYXMgYW4gZXJyb3IuXG4gICogRGVmYXVsdHMgdG8gNS5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9nb29nbGUvNi40LjAvZG9jcy9yZXNvdXJjZXMvY29tcHV0ZV9yZWdpb25fYmFja2VuZF9zZXJ2aWNlI2NvbnNlY3V0aXZlX2Vycm9ycyBDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2UjY29uc2VjdXRpdmVfZXJyb3JzfVxuICAqL1xuICByZWFkb25seSBjb25zZWN1dGl2ZUVycm9ycz86IG51bWJlcjtcbiAgLyoqXG4gICogVGhlIG51bWJlciBvZiBjb25zZWN1dGl2ZSBnYXRld2F5IGZhaWx1cmVzICg1MDIsIDUwMywgNTA0IHN0YXR1cyBvciBjb25uZWN0aW9uXG4gICogZXJyb3JzIHRoYXQgYXJlIG1hcHBlZCB0byBvbmUgb2YgdGhvc2Ugc3RhdHVzIGNvZGVzKSBiZWZvcmUgYSBjb25zZWN1dGl2ZVxuICAqIGdhdGV3YXkgZmFpbHVyZSBlamVjdGlvbiBvY2N1cnMuIERlZmF1bHRzIHRvIDUuXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvZ29vZ2xlLzYuNC4wL2RvY3MvcmVzb3VyY2VzL2NvbXB1dGVfcmVnaW9uX2JhY2tlbmRfc2VydmljZSNjb25zZWN1dGl2ZV9nYXRld2F5X2ZhaWx1cmUgQ29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlI2NvbnNlY3V0aXZlX2dhdGV3YXlfZmFpbHVyZX1cbiAgKi9cbiAgcmVhZG9ubHkgY29uc2VjdXRpdmVHYXRld2F5RmFpbHVyZT86IG51bWJlcjtcbiAgLyoqXG4gICogVGhlIHBlcmNlbnRhZ2UgY2hhbmNlIHRoYXQgYSBob3N0IHdpbGwgYmUgYWN0dWFsbHkgZWplY3RlZCB3aGVuIGFuIG91dGxpZXJcbiAgKiBzdGF0dXMgaXMgZGV0ZWN0ZWQgdGhyb3VnaCBjb25zZWN1dGl2ZSA1eHguIFRoaXMgc2V0dGluZyBjYW4gYmUgdXNlZCB0byBkaXNhYmxlXG4gICogZWplY3Rpb24gb3IgdG8gcmFtcCBpdCB1cCBzbG93bHkuIERlZmF1bHRzIHRvIDEwMC5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9nb29nbGUvNi40LjAvZG9jcy9yZXNvdXJjZXMvY29tcHV0ZV9yZWdpb25fYmFja2VuZF9zZXJ2aWNlI2VuZm9yY2luZ19jb25zZWN1dGl2ZV9lcnJvcnMgQ29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlI2VuZm9yY2luZ19jb25zZWN1dGl2ZV9lcnJvcnN9XG4gICovXG4gIHJlYWRvbmx5IGVuZm9yY2luZ0NvbnNlY3V0aXZlRXJyb3JzPzogbnVtYmVyO1xuICAvKipcbiAgKiBUaGUgcGVyY2VudGFnZSBjaGFuY2UgdGhhdCBhIGhvc3Qgd2lsbCBiZSBhY3R1YWxseSBlamVjdGVkIHdoZW4gYW4gb3V0bGllclxuICAqIHN0YXR1cyBpcyBkZXRlY3RlZCB0aHJvdWdoIGNvbnNlY3V0aXZlIGdhdGV3YXkgZmFpbHVyZXMuIFRoaXMgc2V0dGluZyBjYW4gYmVcbiAgKiB1c2VkIHRvIGRpc2FibGUgZWplY3Rpb24gb3IgdG8gcmFtcCBpdCB1cCBzbG93bHkuIERlZmF1bHRzIHRvIDAuXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvZ29vZ2xlLzYuNC4wL2RvY3MvcmVzb3VyY2VzL2NvbXB1dGVfcmVnaW9uX2JhY2tlbmRfc2VydmljZSNlbmZvcmNpbmdfY29uc2VjdXRpdmVfZ2F0ZXdheV9mYWlsdXJlIENvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZSNlbmZvcmNpbmdfY29uc2VjdXRpdmVfZ2F0ZXdheV9mYWlsdXJlfVxuICAqL1xuICByZWFkb25seSBlbmZvcmNpbmdDb25zZWN1dGl2ZUdhdGV3YXlGYWlsdXJlPzogbnVtYmVyO1xuICAvKipcbiAgKiBUaGUgcGVyY2VudGFnZSBjaGFuY2UgdGhhdCBhIGhvc3Qgd2lsbCBiZSBhY3R1YWxseSBlamVjdGVkIHdoZW4gYW4gb3V0bGllclxuICAqIHN0YXR1cyBpcyBkZXRlY3RlZCB0aHJvdWdoIHN1Y2Nlc3MgcmF0ZSBzdGF0aXN0aWNzLiBUaGlzIHNldHRpbmcgY2FuIGJlIHVzZWQgdG9cbiAgKiBkaXNhYmxlIGVqZWN0aW9uIG9yIHRvIHJhbXAgaXQgdXAgc2xvd2x5LiBEZWZhdWx0cyB0byAxMDAuXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvZ29vZ2xlLzYuNC4wL2RvY3MvcmVzb3VyY2VzL2NvbXB1dGVfcmVnaW9uX2JhY2tlbmRfc2VydmljZSNlbmZvcmNpbmdfc3VjY2Vzc19yYXRlIENvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZSNlbmZvcmNpbmdfc3VjY2Vzc19yYXRlfVxuICAqL1xuICByZWFkb25seSBlbmZvcmNpbmdTdWNjZXNzUmF0ZT86IG51bWJlcjtcbiAgLyoqXG4gICogTWF4aW11bSBwZXJjZW50YWdlIG9mIGhvc3RzIGluIHRoZSBsb2FkIGJhbGFuY2luZyBwb29sIGZvciB0aGUgYmFja2VuZCBzZXJ2aWNlXG4gICogdGhhdCBjYW4gYmUgZWplY3RlZC4gRGVmYXVsdHMgdG8gMTAlLlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2dvb2dsZS82LjQuMC9kb2NzL3Jlc291cmNlcy9jb21wdXRlX3JlZ2lvbl9iYWNrZW5kX3NlcnZpY2UjbWF4X2VqZWN0aW9uX3BlcmNlbnQgQ29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlI21heF9lamVjdGlvbl9wZXJjZW50fVxuICAqL1xuICByZWFkb25seSBtYXhFamVjdGlvblBlcmNlbnQ/OiBudW1iZXI7XG4gIC8qKlxuICAqIFRoZSBudW1iZXIgb2YgaG9zdHMgaW4gYSBjbHVzdGVyIHRoYXQgbXVzdCBoYXZlIGVub3VnaCByZXF1ZXN0IHZvbHVtZSB0byBkZXRlY3RcbiAgKiBzdWNjZXNzIHJhdGUgb3V0bGllcnMuIElmIHRoZSBudW1iZXIgb2YgaG9zdHMgaXMgbGVzcyB0aGFuIHRoaXMgc2V0dGluZywgb3V0bGllclxuICAqIGRldGVjdGlvbiB2aWEgc3VjY2VzcyByYXRlIHN0YXRpc3RpY3MgaXMgbm90IHBlcmZvcm1lZCBmb3IgYW55IGhvc3QgaW4gdGhlXG4gICogY2x1c3Rlci4gRGVmYXVsdHMgdG8gNS5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9nb29nbGUvNi40LjAvZG9jcy9yZXNvdXJjZXMvY29tcHV0ZV9yZWdpb25fYmFja2VuZF9zZXJ2aWNlI3N1Y2Nlc3NfcmF0ZV9taW5pbXVtX2hvc3RzIENvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZSNzdWNjZXNzX3JhdGVfbWluaW11bV9ob3N0c31cbiAgKi9cbiAgcmVhZG9ubHkgc3VjY2Vzc1JhdGVNaW5pbXVtSG9zdHM/OiBudW1iZXI7XG4gIC8qKlxuICAqIFRoZSBtaW5pbXVtIG51bWJlciBvZiB0b3RhbCByZXF1ZXN0cyB0aGF0IG11c3QgYmUgY29sbGVjdGVkIGluIG9uZSBpbnRlcnZhbCAoYXNcbiAgKiBkZWZpbmVkIGJ5IHRoZSBpbnRlcnZhbCBkdXJhdGlvbiBhYm92ZSkgdG8gaW5jbHVkZSB0aGlzIGhvc3QgaW4gc3VjY2VzcyByYXRlXG4gICogYmFzZWQgb3V0bGllciBkZXRlY3Rpb24uIElmIHRoZSB2b2x1bWUgaXMgbG93ZXIgdGhhbiB0aGlzIHNldHRpbmcsIG91dGxpZXJcbiAgKiBkZXRlY3Rpb24gdmlhIHN1Y2Nlc3MgcmF0ZSBzdGF0aXN0aWNzIGlzIG5vdCBwZXJmb3JtZWQgZm9yIHRoYXQgaG9zdC4gRGVmYXVsdHNcbiAgKiB0byAxMDAuXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvZ29vZ2xlLzYuNC4wL2RvY3MvcmVzb3VyY2VzL2NvbXB1dGVfcmVnaW9uX2JhY2tlbmRfc2VydmljZSNzdWNjZXNzX3JhdGVfcmVxdWVzdF92b2x1bWUgQ29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlI3N1Y2Nlc3NfcmF0ZV9yZXF1ZXN0X3ZvbHVtZX1cbiAgKi9cbiAgcmVhZG9ubHkgc3VjY2Vzc1JhdGVSZXF1ZXN0Vm9sdW1lPzogbnVtYmVyO1xuICAvKipcbiAgKiBUaGlzIGZhY3RvciBpcyB1c2VkIHRvIGRldGVybWluZSB0aGUgZWplY3Rpb24gdGhyZXNob2xkIGZvciBzdWNjZXNzIHJhdGUgb3V0bGllclxuICAqIGVqZWN0aW9uLiBUaGUgZWplY3Rpb24gdGhyZXNob2xkIGlzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIG1lYW4gc3VjY2Vzc1xuICAqIHJhdGUsIGFuZCB0aGUgcHJvZHVjdCBvZiB0aGlzIGZhY3RvciBhbmQgdGhlIHN0YW5kYXJkIGRldmlhdGlvbiBvZiB0aGUgbWVhblxuICAqIHN1Y2Nlc3MgcmF0ZTogbWVhbiAtIChzdGRldiAqIHN1Y2Nlc3NfcmF0ZV9zdGRldl9mYWN0b3IpLiBUaGlzIGZhY3RvciBpcyBkaXZpZGVkXG4gICogYnkgYSB0aG91c2FuZCB0byBnZXQgYSBkb3VibGUuIFRoYXQgaXMsIGlmIHRoZSBkZXNpcmVkIGZhY3RvciBpcyAxLjksIHRoZVxuICAqIHJ1bnRpbWUgdmFsdWUgc2hvdWxkIGJlIDE5MDAuIERlZmF1bHRzIHRvIDE5MDAuXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvZ29vZ2xlLzYuNC4wL2RvY3MvcmVzb3VyY2VzL2NvbXB1dGVfcmVnaW9uX2JhY2tlbmRfc2VydmljZSNzdWNjZXNzX3JhdGVfc3RkZXZfZmFjdG9yIENvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZSNzdWNjZXNzX3JhdGVfc3RkZXZfZmFjdG9yfVxuICAqL1xuICByZWFkb25seSBzdWNjZXNzUmF0ZVN0ZGV2RmFjdG9yPzogbnVtYmVyO1xuICAvKipcbiAgKiBiYXNlX2VqZWN0aW9uX3RpbWUgYmxvY2tcbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9nb29nbGUvNi40LjAvZG9jcy9yZXNvdXJjZXMvY29tcHV0ZV9yZWdpb25fYmFja2VuZF9zZXJ2aWNlI2Jhc2VfZWplY3Rpb25fdGltZSBDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2UjYmFzZV9lamVjdGlvbl90aW1lfVxuICAqL1xuICByZWFkb25seSBiYXNlRWplY3Rpb25UaW1lPzogQ29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlT3V0bGllckRldGVjdGlvbkJhc2VFamVjdGlvblRpbWU7XG4gIC8qKlxuICAqIGludGVydmFsIGJsb2NrXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvZ29vZ2xlLzYuNC4wL2RvY3MvcmVzb3VyY2VzL2NvbXB1dGVfcmVnaW9uX2JhY2tlbmRfc2VydmljZSNpbnRlcnZhbCBDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2UjaW50ZXJ2YWx9XG4gICovXG4gIHJlYWRvbmx5IGludGVydmFsPzogQ29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlT3V0bGllckRldGVjdGlvbkludGVydmFsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlT3V0bGllckRldGVjdGlvblRvVGVycmFmb3JtKHN0cnVjdD86IENvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZU91dGxpZXJEZXRlY3Rpb25PdXRwdXRSZWZlcmVuY2UgfCBDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VPdXRsaWVyRGV0ZWN0aW9uKTogYW55IHtcbiAgaWYgKCFjZGt0Zi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdGYuVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RmLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGNvbnNlY3V0aXZlX2Vycm9yczogY2RrdGYubnVtYmVyVG9UZXJyYWZvcm0oc3RydWN0IS5jb25zZWN1dGl2ZUVycm9ycyksXG4gICAgY29uc2VjdXRpdmVfZ2F0ZXdheV9mYWlsdXJlOiBjZGt0Zi5udW1iZXJUb1RlcnJhZm9ybShzdHJ1Y3QhLmNvbnNlY3V0aXZlR2F0ZXdheUZhaWx1cmUpLFxuICAgIGVuZm9yY2luZ19jb25zZWN1dGl2ZV9lcnJvcnM6IGNka3RmLm51bWJlclRvVGVycmFmb3JtKHN0cnVjdCEuZW5mb3JjaW5nQ29uc2VjdXRpdmVFcnJvcnMpLFxuICAgIGVuZm9yY2luZ19jb25zZWN1dGl2ZV9nYXRld2F5X2ZhaWx1cmU6IGNka3RmLm51bWJlclRvVGVycmFmb3JtKHN0cnVjdCEuZW5mb3JjaW5nQ29uc2VjdXRpdmVHYXRld2F5RmFpbHVyZSksXG4gICAgZW5mb3JjaW5nX3N1Y2Nlc3NfcmF0ZTogY2RrdGYubnVtYmVyVG9UZXJyYWZvcm0oc3RydWN0IS5lbmZvcmNpbmdTdWNjZXNzUmF0ZSksXG4gICAgbWF4X2VqZWN0aW9uX3BlcmNlbnQ6IGNka3RmLm51bWJlclRvVGVycmFmb3JtKHN0cnVjdCEubWF4RWplY3Rpb25QZXJjZW50KSxcbiAgICBzdWNjZXNzX3JhdGVfbWluaW11bV9ob3N0czogY2RrdGYubnVtYmVyVG9UZXJyYWZvcm0oc3RydWN0IS5zdWNjZXNzUmF0ZU1pbmltdW1Ib3N0cyksXG4gICAgc3VjY2Vzc19yYXRlX3JlcXVlc3Rfdm9sdW1lOiBjZGt0Zi5udW1iZXJUb1RlcnJhZm9ybShzdHJ1Y3QhLnN1Y2Nlc3NSYXRlUmVxdWVzdFZvbHVtZSksXG4gICAgc3VjY2Vzc19yYXRlX3N0ZGV2X2ZhY3RvcjogY2RrdGYubnVtYmVyVG9UZXJyYWZvcm0oc3RydWN0IS5zdWNjZXNzUmF0ZVN0ZGV2RmFjdG9yKSxcbiAgICBiYXNlX2VqZWN0aW9uX3RpbWU6IGNvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZU91dGxpZXJEZXRlY3Rpb25CYXNlRWplY3Rpb25UaW1lVG9UZXJyYWZvcm0oc3RydWN0IS5iYXNlRWplY3Rpb25UaW1lKSxcbiAgICBpbnRlcnZhbDogY29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlT3V0bGllckRldGVjdGlvbkludGVydmFsVG9UZXJyYWZvcm0oc3RydWN0IS5pbnRlcnZhbCksXG4gIH1cbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlT3V0bGllckRldGVjdGlvblRvSGNsVGVycmFmb3JtKHN0cnVjdD86IENvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZU91dGxpZXJEZXRlY3Rpb25PdXRwdXRSZWZlcmVuY2UgfCBDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VPdXRsaWVyRGV0ZWN0aW9uKTogYW55IHtcbiAgaWYgKCFjZGt0Zi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdGYuVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RmLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICBjb25zdCBhdHRycyA9IHtcbiAgICBjb25zZWN1dGl2ZV9lcnJvcnM6IHtcbiAgICAgIHZhbHVlOiBjZGt0Zi5udW1iZXJUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLmNvbnNlY3V0aXZlRXJyb3JzKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwibnVtYmVyXCIsXG4gICAgfSxcbiAgICBjb25zZWN1dGl2ZV9nYXRld2F5X2ZhaWx1cmU6IHtcbiAgICAgIHZhbHVlOiBjZGt0Zi5udW1iZXJUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLmNvbnNlY3V0aXZlR2F0ZXdheUZhaWx1cmUpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJudW1iZXJcIixcbiAgICB9LFxuICAgIGVuZm9yY2luZ19jb25zZWN1dGl2ZV9lcnJvcnM6IHtcbiAgICAgIHZhbHVlOiBjZGt0Zi5udW1iZXJUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLmVuZm9yY2luZ0NvbnNlY3V0aXZlRXJyb3JzKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwibnVtYmVyXCIsXG4gICAgfSxcbiAgICBlbmZvcmNpbmdfY29uc2VjdXRpdmVfZ2F0ZXdheV9mYWlsdXJlOiB7XG4gICAgICB2YWx1ZTogY2RrdGYubnVtYmVyVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5lbmZvcmNpbmdDb25zZWN1dGl2ZUdhdGV3YXlGYWlsdXJlKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwibnVtYmVyXCIsXG4gICAgfSxcbiAgICBlbmZvcmNpbmdfc3VjY2Vzc19yYXRlOiB7XG4gICAgICB2YWx1ZTogY2RrdGYubnVtYmVyVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5lbmZvcmNpbmdTdWNjZXNzUmF0ZSksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIm51bWJlclwiLFxuICAgIH0sXG4gICAgbWF4X2VqZWN0aW9uX3BlcmNlbnQ6IHtcbiAgICAgIHZhbHVlOiBjZGt0Zi5udW1iZXJUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLm1heEVqZWN0aW9uUGVyY2VudCksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIm51bWJlclwiLFxuICAgIH0sXG4gICAgc3VjY2Vzc19yYXRlX21pbmltdW1faG9zdHM6IHtcbiAgICAgIHZhbHVlOiBjZGt0Zi5udW1iZXJUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLnN1Y2Nlc3NSYXRlTWluaW11bUhvc3RzKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwibnVtYmVyXCIsXG4gICAgfSxcbiAgICBzdWNjZXNzX3JhdGVfcmVxdWVzdF92b2x1bWU6IHtcbiAgICAgIHZhbHVlOiBjZGt0Zi5udW1iZXJUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLnN1Y2Nlc3NSYXRlUmVxdWVzdFZvbHVtZSksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIm51bWJlclwiLFxuICAgIH0sXG4gICAgc3VjY2Vzc19yYXRlX3N0ZGV2X2ZhY3Rvcjoge1xuICAgICAgdmFsdWU6IGNka3RmLm51bWJlclRvSGNsVGVycmFmb3JtKHN0cnVjdCEuc3VjY2Vzc1JhdGVTdGRldkZhY3RvciksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIm51bWJlclwiLFxuICAgIH0sXG4gICAgYmFzZV9lamVjdGlvbl90aW1lOiB7XG4gICAgICB2YWx1ZTogY29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlT3V0bGllckRldGVjdGlvbkJhc2VFamVjdGlvblRpbWVUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLmJhc2VFamVjdGlvblRpbWUpLFxuICAgICAgaXNCbG9jazogdHJ1ZSxcbiAgICAgIHR5cGU6IFwibGlzdFwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VPdXRsaWVyRGV0ZWN0aW9uQmFzZUVqZWN0aW9uVGltZUxpc3RcIixcbiAgICB9LFxuICAgIGludGVydmFsOiB7XG4gICAgICB2YWx1ZTogY29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlT3V0bGllckRldGVjdGlvbkludGVydmFsVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5pbnRlcnZhbCksXG4gICAgICBpc0Jsb2NrOiB0cnVlLFxuICAgICAgdHlwZTogXCJsaXN0XCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIkNvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZU91dGxpZXJEZXRlY3Rpb25JbnRlcnZhbExpc3RcIixcbiAgICB9LFxuICB9O1xuXG4gIC8vIHJlbW92ZSB1bmRlZmluZWQgYXR0cmlidXRlc1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKGF0dHJzKS5maWx0ZXIoKFtfLCB2YWx1ZV0pID0+IHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUudmFsdWUgIT09IHVuZGVmaW5lZCkpO1xufVxuXG5leHBvcnQgY2xhc3MgQ29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlT3V0bGllckRldGVjdGlvbk91dHB1dFJlZmVyZW5jZSBleHRlbmRzIGNka3RmLkNvbXBsZXhPYmplY3Qge1xuICBwcml2YXRlIGlzRW1wdHlPYmplY3QgPSBmYWxzZTtcblxuICAvKipcbiAgKiBAcGFyYW0gdGVycmFmb3JtUmVzb3VyY2UgVGhlIHBhcmVudCByZXNvdXJjZVxuICAqIEBwYXJhbSB0ZXJyYWZvcm1BdHRyaWJ1dGUgVGhlIGF0dHJpYnV0ZSBvbiB0aGUgcGFyZW50IHJlc291cmNlIHRoaXMgY2xhc3MgaXMgcmVmZXJlbmNpbmdcbiAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHRlcnJhZm9ybVJlc291cmNlOiBjZGt0Zi5JSW50ZXJwb2xhdGluZ1BhcmVudCwgdGVycmFmb3JtQXR0cmlidXRlOiBzdHJpbmcpIHtcbiAgICBzdXBlcih0ZXJyYWZvcm1SZXNvdXJjZSwgdGVycmFmb3JtQXR0cmlidXRlLCBmYWxzZSwgMCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGludGVybmFsVmFsdWUoKTogQ29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlT3V0bGllckRldGVjdGlvbiB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGhhc0FueVZhbHVlcyA9IHRoaXMuaXNFbXB0eU9iamVjdDtcbiAgICBjb25zdCBpbnRlcm5hbFZhbHVlUmVzdWx0OiBhbnkgPSB7fTtcbiAgICBpZiAodGhpcy5fY29uc2VjdXRpdmVFcnJvcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuY29uc2VjdXRpdmVFcnJvcnMgPSB0aGlzLl9jb25zZWN1dGl2ZUVycm9ycztcbiAgICB9XG4gICAgaWYgKHRoaXMuX2NvbnNlY3V0aXZlR2F0ZXdheUZhaWx1cmUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuY29uc2VjdXRpdmVHYXRld2F5RmFpbHVyZSA9IHRoaXMuX2NvbnNlY3V0aXZlR2F0ZXdheUZhaWx1cmU7XG4gICAgfVxuICAgIGlmICh0aGlzLl9lbmZvcmNpbmdDb25zZWN1dGl2ZUVycm9ycyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5lbmZvcmNpbmdDb25zZWN1dGl2ZUVycm9ycyA9IHRoaXMuX2VuZm9yY2luZ0NvbnNlY3V0aXZlRXJyb3JzO1xuICAgIH1cbiAgICBpZiAodGhpcy5fZW5mb3JjaW5nQ29uc2VjdXRpdmVHYXRld2F5RmFpbHVyZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5lbmZvcmNpbmdDb25zZWN1dGl2ZUdhdGV3YXlGYWlsdXJlID0gdGhpcy5fZW5mb3JjaW5nQ29uc2VjdXRpdmVHYXRld2F5RmFpbHVyZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2VuZm9yY2luZ1N1Y2Nlc3NSYXRlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmVuZm9yY2luZ1N1Y2Nlc3NSYXRlID0gdGhpcy5fZW5mb3JjaW5nU3VjY2Vzc1JhdGU7XG4gICAgfVxuICAgIGlmICh0aGlzLl9tYXhFamVjdGlvblBlcmNlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQubWF4RWplY3Rpb25QZXJjZW50ID0gdGhpcy5fbWF4RWplY3Rpb25QZXJjZW50O1xuICAgIH1cbiAgICBpZiAodGhpcy5fc3VjY2Vzc1JhdGVNaW5pbXVtSG9zdHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuc3VjY2Vzc1JhdGVNaW5pbXVtSG9zdHMgPSB0aGlzLl9zdWNjZXNzUmF0ZU1pbmltdW1Ib3N0cztcbiAgICB9XG4gICAgaWYgKHRoaXMuX3N1Y2Nlc3NSYXRlUmVxdWVzdFZvbHVtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5zdWNjZXNzUmF0ZVJlcXVlc3RWb2x1bWUgPSB0aGlzLl9zdWNjZXNzUmF0ZVJlcXVlc3RWb2x1bWU7XG4gICAgfVxuICAgIGlmICh0aGlzLl9zdWNjZXNzUmF0ZVN0ZGV2RmFjdG9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LnN1Y2Nlc3NSYXRlU3RkZXZGYWN0b3IgPSB0aGlzLl9zdWNjZXNzUmF0ZVN0ZGV2RmFjdG9yO1xuICAgIH1cbiAgICBpZiAodGhpcy5fYmFzZUVqZWN0aW9uVGltZT8uaW50ZXJuYWxWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5iYXNlRWplY3Rpb25UaW1lID0gdGhpcy5fYmFzZUVqZWN0aW9uVGltZT8uaW50ZXJuYWxWYWx1ZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2ludGVydmFsPy5pbnRlcm5hbFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmludGVydmFsID0gdGhpcy5faW50ZXJ2YWw/LmludGVybmFsVmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBoYXNBbnlWYWx1ZXMgPyBpbnRlcm5hbFZhbHVlUmVzdWx0IDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHNldCBpbnRlcm5hbFZhbHVlKHZhbHVlOiBDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VPdXRsaWVyRGV0ZWN0aW9uIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuICAgICAgdGhpcy5fY29uc2VjdXRpdmVFcnJvcnMgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9jb25zZWN1dGl2ZUdhdGV3YXlGYWlsdXJlID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fZW5mb3JjaW5nQ29uc2VjdXRpdmVFcnJvcnMgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9lbmZvcmNpbmdDb25zZWN1dGl2ZUdhdGV3YXlGYWlsdXJlID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fZW5mb3JjaW5nU3VjY2Vzc1JhdGUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9tYXhFamVjdGlvblBlcmNlbnQgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9zdWNjZXNzUmF0ZU1pbmltdW1Ib3N0cyA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3N1Y2Nlc3NSYXRlUmVxdWVzdFZvbHVtZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3N1Y2Nlc3NSYXRlU3RkZXZGYWN0b3IgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9iYXNlRWplY3Rpb25UaW1lLmludGVybmFsVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9pbnRlcnZhbC5pbnRlcm5hbFZhbHVlID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGggPT09IDA7XG4gICAgICB0aGlzLl9jb25zZWN1dGl2ZUVycm9ycyA9IHZhbHVlLmNvbnNlY3V0aXZlRXJyb3JzO1xuICAgICAgdGhpcy5fY29uc2VjdXRpdmVHYXRld2F5RmFpbHVyZSA9IHZhbHVlLmNvbnNlY3V0aXZlR2F0ZXdheUZhaWx1cmU7XG4gICAgICB0aGlzLl9lbmZvcmNpbmdDb25zZWN1dGl2ZUVycm9ycyA9IHZhbHVlLmVuZm9yY2luZ0NvbnNlY3V0aXZlRXJyb3JzO1xuICAgICAgdGhpcy5fZW5mb3JjaW5nQ29uc2VjdXRpdmVHYXRld2F5RmFpbHVyZSA9IHZhbHVlLmVuZm9yY2luZ0NvbnNlY3V0aXZlR2F0ZXdheUZhaWx1cmU7XG4gICAgICB0aGlzLl9lbmZvcmNpbmdTdWNjZXNzUmF0ZSA9IHZhbHVlLmVuZm9yY2luZ1N1Y2Nlc3NSYXRlO1xuICAgICAgdGhpcy5fbWF4RWplY3Rpb25QZXJjZW50ID0gdmFsdWUubWF4RWplY3Rpb25QZXJjZW50O1xuICAgICAgdGhpcy5fc3VjY2Vzc1JhdGVNaW5pbXVtSG9zdHMgPSB2YWx1ZS5zdWNjZXNzUmF0ZU1pbmltdW1Ib3N0cztcbiAgICAgIHRoaXMuX3N1Y2Nlc3NSYXRlUmVxdWVzdFZvbHVtZSA9IHZhbHVlLnN1Y2Nlc3NSYXRlUmVxdWVzdFZvbHVtZTtcbiAgICAgIHRoaXMuX3N1Y2Nlc3NSYXRlU3RkZXZGYWN0b3IgPSB2YWx1ZS5zdWNjZXNzUmF0ZVN0ZGV2RmFjdG9yO1xuICAgICAgdGhpcy5fYmFzZUVqZWN0aW9uVGltZS5pbnRlcm5hbFZhbHVlID0gdmFsdWUuYmFzZUVqZWN0aW9uVGltZTtcbiAgICAgIHRoaXMuX2ludGVydmFsLmludGVybmFsVmFsdWUgPSB2YWx1ZS5pbnRlcnZhbDtcbiAgICB9XG4gIH1cblxuICAvLyBjb25zZWN1dGl2ZV9lcnJvcnMgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfY29uc2VjdXRpdmVFcnJvcnM/OiBudW1iZXI7IFxuICBwdWJsaWMgZ2V0IGNvbnNlY3V0aXZlRXJyb3JzKCkge1xuICAgIHJldHVybiB0aGlzLmdldE51bWJlckF0dHJpYnV0ZSgnY29uc2VjdXRpdmVfZXJyb3JzJyk7XG4gIH1cbiAgcHVibGljIHNldCBjb25zZWN1dGl2ZUVycm9ycyh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fY29uc2VjdXRpdmVFcnJvcnMgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRDb25zZWN1dGl2ZUVycm9ycygpIHtcbiAgICB0aGlzLl9jb25zZWN1dGl2ZUVycm9ycyA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgY29uc2VjdXRpdmVFcnJvcnNJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fY29uc2VjdXRpdmVFcnJvcnM7XG4gIH1cblxuICAvLyBjb25zZWN1dGl2ZV9nYXRld2F5X2ZhaWx1cmUgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfY29uc2VjdXRpdmVHYXRld2F5RmFpbHVyZT86IG51bWJlcjsgXG4gIHB1YmxpYyBnZXQgY29uc2VjdXRpdmVHYXRld2F5RmFpbHVyZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXROdW1iZXJBdHRyaWJ1dGUoJ2NvbnNlY3V0aXZlX2dhdGV3YXlfZmFpbHVyZScpO1xuICB9XG4gIHB1YmxpYyBzZXQgY29uc2VjdXRpdmVHYXRld2F5RmFpbHVyZSh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fY29uc2VjdXRpdmVHYXRld2F5RmFpbHVyZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldENvbnNlY3V0aXZlR2F0ZXdheUZhaWx1cmUoKSB7XG4gICAgdGhpcy5fY29uc2VjdXRpdmVHYXRld2F5RmFpbHVyZSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgY29uc2VjdXRpdmVHYXRld2F5RmFpbHVyZUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9jb25zZWN1dGl2ZUdhdGV3YXlGYWlsdXJlO1xuICB9XG5cbiAgLy8gZW5mb3JjaW5nX2NvbnNlY3V0aXZlX2Vycm9ycyAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9lbmZvcmNpbmdDb25zZWN1dGl2ZUVycm9ycz86IG51bWJlcjsgXG4gIHB1YmxpYyBnZXQgZW5mb3JjaW5nQ29uc2VjdXRpdmVFcnJvcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TnVtYmVyQXR0cmlidXRlKCdlbmZvcmNpbmdfY29uc2VjdXRpdmVfZXJyb3JzJyk7XG4gIH1cbiAgcHVibGljIHNldCBlbmZvcmNpbmdDb25zZWN1dGl2ZUVycm9ycyh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fZW5mb3JjaW5nQ29uc2VjdXRpdmVFcnJvcnMgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRFbmZvcmNpbmdDb25zZWN1dGl2ZUVycm9ycygpIHtcbiAgICB0aGlzLl9lbmZvcmNpbmdDb25zZWN1dGl2ZUVycm9ycyA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgZW5mb3JjaW5nQ29uc2VjdXRpdmVFcnJvcnNJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZW5mb3JjaW5nQ29uc2VjdXRpdmVFcnJvcnM7XG4gIH1cblxuICAvLyBlbmZvcmNpbmdfY29uc2VjdXRpdmVfZ2F0ZXdheV9mYWlsdXJlIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2VuZm9yY2luZ0NvbnNlY3V0aXZlR2F0ZXdheUZhaWx1cmU/OiBudW1iZXI7IFxuICBwdWJsaWMgZ2V0IGVuZm9yY2luZ0NvbnNlY3V0aXZlR2F0ZXdheUZhaWx1cmUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TnVtYmVyQXR0cmlidXRlKCdlbmZvcmNpbmdfY29uc2VjdXRpdmVfZ2F0ZXdheV9mYWlsdXJlJyk7XG4gIH1cbiAgcHVibGljIHNldCBlbmZvcmNpbmdDb25zZWN1dGl2ZUdhdGV3YXlGYWlsdXJlKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9lbmZvcmNpbmdDb25zZWN1dGl2ZUdhdGV3YXlGYWlsdXJlID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0RW5mb3JjaW5nQ29uc2VjdXRpdmVHYXRld2F5RmFpbHVyZSgpIHtcbiAgICB0aGlzLl9lbmZvcmNpbmdDb25zZWN1dGl2ZUdhdGV3YXlGYWlsdXJlID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBlbmZvcmNpbmdDb25zZWN1dGl2ZUdhdGV3YXlGYWlsdXJlSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2VuZm9yY2luZ0NvbnNlY3V0aXZlR2F0ZXdheUZhaWx1cmU7XG4gIH1cblxuICAvLyBlbmZvcmNpbmdfc3VjY2Vzc19yYXRlIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2VuZm9yY2luZ1N1Y2Nlc3NSYXRlPzogbnVtYmVyOyBcbiAgcHVibGljIGdldCBlbmZvcmNpbmdTdWNjZXNzUmF0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXROdW1iZXJBdHRyaWJ1dGUoJ2VuZm9yY2luZ19zdWNjZXNzX3JhdGUnKTtcbiAgfVxuICBwdWJsaWMgc2V0IGVuZm9yY2luZ1N1Y2Nlc3NSYXRlKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9lbmZvcmNpbmdTdWNjZXNzUmF0ZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldEVuZm9yY2luZ1N1Y2Nlc3NSYXRlKCkge1xuICAgIHRoaXMuX2VuZm9yY2luZ1N1Y2Nlc3NSYXRlID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBlbmZvcmNpbmdTdWNjZXNzUmF0ZUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9lbmZvcmNpbmdTdWNjZXNzUmF0ZTtcbiAgfVxuXG4gIC8vIG1heF9lamVjdGlvbl9wZXJjZW50IC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX21heEVqZWN0aW9uUGVyY2VudD86IG51bWJlcjsgXG4gIHB1YmxpYyBnZXQgbWF4RWplY3Rpb25QZXJjZW50KCkge1xuICAgIHJldHVybiB0aGlzLmdldE51bWJlckF0dHJpYnV0ZSgnbWF4X2VqZWN0aW9uX3BlcmNlbnQnKTtcbiAgfVxuICBwdWJsaWMgc2V0IG1heEVqZWN0aW9uUGVyY2VudCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fbWF4RWplY3Rpb25QZXJjZW50ID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0TWF4RWplY3Rpb25QZXJjZW50KCkge1xuICAgIHRoaXMuX21heEVqZWN0aW9uUGVyY2VudCA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgbWF4RWplY3Rpb25QZXJjZW50SW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX21heEVqZWN0aW9uUGVyY2VudDtcbiAgfVxuXG4gIC8vIHN1Y2Nlc3NfcmF0ZV9taW5pbXVtX2hvc3RzIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX3N1Y2Nlc3NSYXRlTWluaW11bUhvc3RzPzogbnVtYmVyOyBcbiAgcHVibGljIGdldCBzdWNjZXNzUmF0ZU1pbmltdW1Ib3N0cygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXROdW1iZXJBdHRyaWJ1dGUoJ3N1Y2Nlc3NfcmF0ZV9taW5pbXVtX2hvc3RzJyk7XG4gIH1cbiAgcHVibGljIHNldCBzdWNjZXNzUmF0ZU1pbmltdW1Ib3N0cyh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fc3VjY2Vzc1JhdGVNaW5pbXVtSG9zdHMgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRTdWNjZXNzUmF0ZU1pbmltdW1Ib3N0cygpIHtcbiAgICB0aGlzLl9zdWNjZXNzUmF0ZU1pbmltdW1Ib3N0cyA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgc3VjY2Vzc1JhdGVNaW5pbXVtSG9zdHNJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fc3VjY2Vzc1JhdGVNaW5pbXVtSG9zdHM7XG4gIH1cblxuICAvLyBzdWNjZXNzX3JhdGVfcmVxdWVzdF92b2x1bWUgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfc3VjY2Vzc1JhdGVSZXF1ZXN0Vm9sdW1lPzogbnVtYmVyOyBcbiAgcHVibGljIGdldCBzdWNjZXNzUmF0ZVJlcXVlc3RWb2x1bWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TnVtYmVyQXR0cmlidXRlKCdzdWNjZXNzX3JhdGVfcmVxdWVzdF92b2x1bWUnKTtcbiAgfVxuICBwdWJsaWMgc2V0IHN1Y2Nlc3NSYXRlUmVxdWVzdFZvbHVtZSh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fc3VjY2Vzc1JhdGVSZXF1ZXN0Vm9sdW1lID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0U3VjY2Vzc1JhdGVSZXF1ZXN0Vm9sdW1lKCkge1xuICAgIHRoaXMuX3N1Y2Nlc3NSYXRlUmVxdWVzdFZvbHVtZSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgc3VjY2Vzc1JhdGVSZXF1ZXN0Vm9sdW1lSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N1Y2Nlc3NSYXRlUmVxdWVzdFZvbHVtZTtcbiAgfVxuXG4gIC8vIHN1Y2Nlc3NfcmF0ZV9zdGRldl9mYWN0b3IgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfc3VjY2Vzc1JhdGVTdGRldkZhY3Rvcj86IG51bWJlcjsgXG4gIHB1YmxpYyBnZXQgc3VjY2Vzc1JhdGVTdGRldkZhY3RvcigpIHtcbiAgICByZXR1cm4gdGhpcy5nZXROdW1iZXJBdHRyaWJ1dGUoJ3N1Y2Nlc3NfcmF0ZV9zdGRldl9mYWN0b3InKTtcbiAgfVxuICBwdWJsaWMgc2V0IHN1Y2Nlc3NSYXRlU3RkZXZGYWN0b3IodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX3N1Y2Nlc3NSYXRlU3RkZXZGYWN0b3IgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRTdWNjZXNzUmF0ZVN0ZGV2RmFjdG9yKCkge1xuICAgIHRoaXMuX3N1Y2Nlc3NSYXRlU3RkZXZGYWN0b3IgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHN1Y2Nlc3NSYXRlU3RkZXZGYWN0b3JJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fc3VjY2Vzc1JhdGVTdGRldkZhY3RvcjtcbiAgfVxuXG4gIC8vIGJhc2VfZWplY3Rpb25fdGltZSAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9iYXNlRWplY3Rpb25UaW1lID0gbmV3IENvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZU91dGxpZXJEZXRlY3Rpb25CYXNlRWplY3Rpb25UaW1lT3V0cHV0UmVmZXJlbmNlKHRoaXMsIFwiYmFzZV9lamVjdGlvbl90aW1lXCIpO1xuICBwdWJsaWMgZ2V0IGJhc2VFamVjdGlvblRpbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Jhc2VFamVjdGlvblRpbWU7XG4gIH1cbiAgcHVibGljIHB1dEJhc2VFamVjdGlvblRpbWUodmFsdWU6IENvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZU91dGxpZXJEZXRlY3Rpb25CYXNlRWplY3Rpb25UaW1lKSB7XG4gICAgdGhpcy5fYmFzZUVqZWN0aW9uVGltZS5pbnRlcm5hbFZhbHVlID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0QmFzZUVqZWN0aW9uVGltZSgpIHtcbiAgICB0aGlzLl9iYXNlRWplY3Rpb25UaW1lLmludGVybmFsVmFsdWUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGJhc2VFamVjdGlvblRpbWVJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fYmFzZUVqZWN0aW9uVGltZS5pbnRlcm5hbFZhbHVlO1xuICB9XG5cbiAgLy8gaW50ZXJ2YWwgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfaW50ZXJ2YWwgPSBuZXcgQ29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlT3V0bGllckRldGVjdGlvbkludGVydmFsT3V0cHV0UmVmZXJlbmNlKHRoaXMsIFwiaW50ZXJ2YWxcIik7XG4gIHB1YmxpYyBnZXQgaW50ZXJ2YWwoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2ludGVydmFsO1xuICB9XG4gIHB1YmxpYyBwdXRJbnRlcnZhbCh2YWx1ZTogQ29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlT3V0bGllckRldGVjdGlvbkludGVydmFsKSB7XG4gICAgdGhpcy5faW50ZXJ2YWwuaW50ZXJuYWxWYWx1ZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldEludGVydmFsKCkge1xuICAgIHRoaXMuX2ludGVydmFsLmludGVybmFsVmFsdWUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGludGVydmFsSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2ludGVydmFsLmludGVybmFsVmFsdWU7XG4gIH1cbn1cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlVGltZW91dHMge1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvZ29vZ2xlLzYuNC4wL2RvY3MvcmVzb3VyY2VzL2NvbXB1dGVfcmVnaW9uX2JhY2tlbmRfc2VydmljZSNjcmVhdGUgQ29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlI2NyZWF0ZX1cbiAgKi9cbiAgcmVhZG9ubHkgY3JlYXRlPzogc3RyaW5nO1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvZ29vZ2xlLzYuNC4wL2RvY3MvcmVzb3VyY2VzL2NvbXB1dGVfcmVnaW9uX2JhY2tlbmRfc2VydmljZSNkZWxldGUgQ29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlI2RlbGV0ZX1cbiAgKi9cbiAgcmVhZG9ubHkgZGVsZXRlPzogc3RyaW5nO1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvZ29vZ2xlLzYuNC4wL2RvY3MvcmVzb3VyY2VzL2NvbXB1dGVfcmVnaW9uX2JhY2tlbmRfc2VydmljZSN1cGRhdGUgQ29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlI3VwZGF0ZX1cbiAgKi9cbiAgcmVhZG9ubHkgdXBkYXRlPzogc3RyaW5nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlVGltZW91dHNUb1RlcnJhZm9ybShzdHJ1Y3Q/OiBDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VUaW1lb3V0cyB8IGNka3RmLklSZXNvbHZhYmxlKTogYW55IHtcbiAgaWYgKCFjZGt0Zi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdGYuVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RmLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGNyZWF0ZTogY2RrdGYuc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS5jcmVhdGUpLFxuICAgIGRlbGV0ZTogY2RrdGYuc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS5kZWxldGUpLFxuICAgIHVwZGF0ZTogY2RrdGYuc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS51cGRhdGUpLFxuICB9XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZVRpbWVvdXRzVG9IY2xUZXJyYWZvcm0oc3RydWN0PzogQ29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlVGltZW91dHMgfCBjZGt0Zi5JUmVzb2x2YWJsZSk6IGFueSB7XG4gIGlmICghY2RrdGYuY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RmLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0Zi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgY29uc3QgYXR0cnMgPSB7XG4gICAgY3JlYXRlOiB7XG4gICAgICB2YWx1ZTogY2RrdGYuc3RyaW5nVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5jcmVhdGUpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICB9LFxuICAgIGRlbGV0ZToge1xuICAgICAgdmFsdWU6IGNka3RmLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEuZGVsZXRlKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgICB1cGRhdGU6IHtcbiAgICAgIHZhbHVlOiBjZGt0Zi5zdHJpbmdUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLnVwZGF0ZSksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgIH0sXG4gIH07XG5cbiAgLy8gcmVtb3ZlIHVuZGVmaW5lZCBhdHRyaWJ1dGVzXG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoYXR0cnMpLmZpbHRlcigoW18sIHZhbHVlXSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZS52YWx1ZSAhPT0gdW5kZWZpbmVkKSk7XG59XG5cbmV4cG9ydCBjbGFzcyBDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VUaW1lb3V0c091dHB1dFJlZmVyZW5jZSBleHRlbmRzIGNka3RmLkNvbXBsZXhPYmplY3Qge1xuICBwcml2YXRlIGlzRW1wdHlPYmplY3QgPSBmYWxzZTtcbiAgcHJpdmF0ZSByZXNvbHZhYmxlVmFsdWU/OiBjZGt0Zi5JUmVzb2x2YWJsZTtcblxuICAvKipcbiAgKiBAcGFyYW0gdGVycmFmb3JtUmVzb3VyY2UgVGhlIHBhcmVudCByZXNvdXJjZVxuICAqIEBwYXJhbSB0ZXJyYWZvcm1BdHRyaWJ1dGUgVGhlIGF0dHJpYnV0ZSBvbiB0aGUgcGFyZW50IHJlc291cmNlIHRoaXMgY2xhc3MgaXMgcmVmZXJlbmNpbmdcbiAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHRlcnJhZm9ybVJlc291cmNlOiBjZGt0Zi5JSW50ZXJwb2xhdGluZ1BhcmVudCwgdGVycmFmb3JtQXR0cmlidXRlOiBzdHJpbmcpIHtcbiAgICBzdXBlcih0ZXJyYWZvcm1SZXNvdXJjZSwgdGVycmFmb3JtQXR0cmlidXRlLCBmYWxzZSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGludGVybmFsVmFsdWUoKTogQ29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlVGltZW91dHMgfCBjZGt0Zi5JUmVzb2x2YWJsZSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMucmVzb2x2YWJsZVZhbHVlKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZXNvbHZhYmxlVmFsdWU7XG4gICAgfVxuICAgIGxldCBoYXNBbnlWYWx1ZXMgPSB0aGlzLmlzRW1wdHlPYmplY3Q7XG4gICAgY29uc3QgaW50ZXJuYWxWYWx1ZVJlc3VsdDogYW55ID0ge307XG4gICAgaWYgKHRoaXMuX2NyZWF0ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5jcmVhdGUgPSB0aGlzLl9jcmVhdGU7XG4gICAgfVxuICAgIGlmICh0aGlzLl9kZWxldGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuZGVsZXRlID0gdGhpcy5fZGVsZXRlO1xuICAgIH1cbiAgICBpZiAodGhpcy5fdXBkYXRlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LnVwZGF0ZSA9IHRoaXMuX3VwZGF0ZTtcbiAgICB9XG4gICAgcmV0dXJuIGhhc0FueVZhbHVlcyA/IGludGVybmFsVmFsdWVSZXN1bHQgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgc2V0IGludGVybmFsVmFsdWUodmFsdWU6IENvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZVRpbWVvdXRzIHwgY2RrdGYuSVJlc29sdmFibGUgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLnJlc29sdmFibGVWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX2NyZWF0ZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX2RlbGV0ZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3VwZGF0ZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZWxzZSBpZiAoY2RrdGYuVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZSh2YWx1ZSkpIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuICAgICAgdGhpcy5yZXNvbHZhYmxlVmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSAwO1xuICAgICAgdGhpcy5yZXNvbHZhYmxlVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9jcmVhdGUgPSB2YWx1ZS5jcmVhdGU7XG4gICAgICB0aGlzLl9kZWxldGUgPSB2YWx1ZS5kZWxldGU7XG4gICAgICB0aGlzLl91cGRhdGUgPSB2YWx1ZS51cGRhdGU7XG4gICAgfVxuICB9XG5cbiAgLy8gY3JlYXRlIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2NyZWF0ZT86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgY3JlYXRlKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnY3JlYXRlJyk7XG4gIH1cbiAgcHVibGljIHNldCBjcmVhdGUodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2NyZWF0ZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldENyZWF0ZSgpIHtcbiAgICB0aGlzLl9jcmVhdGUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGNyZWF0ZUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9jcmVhdGU7XG4gIH1cblxuICAvLyBkZWxldGUgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfZGVsZXRlPzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBkZWxldGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdkZWxldGUnKTtcbiAgfVxuICBwdWJsaWMgc2V0IGRlbGV0ZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fZGVsZXRlID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0RGVsZXRlKCkge1xuICAgIHRoaXMuX2RlbGV0ZSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgZGVsZXRlSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RlbGV0ZTtcbiAgfVxuXG4gIC8vIHVwZGF0ZSAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF91cGRhdGU/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IHVwZGF0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ3VwZGF0ZScpO1xuICB9XG4gIHB1YmxpYyBzZXQgdXBkYXRlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl91cGRhdGUgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRVcGRhdGUoKSB7XG4gICAgdGhpcy5fdXBkYXRlID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCB1cGRhdGVJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdXBkYXRlO1xuICB9XG59XG5cbi8qKlxuKiBSZXByZXNlbnRzIGEge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvZ29vZ2xlLzYuNC4wL2RvY3MvcmVzb3VyY2VzL2NvbXB1dGVfcmVnaW9uX2JhY2tlbmRfc2VydmljZSBnb29nbGVfY29tcHV0ZV9yZWdpb25fYmFja2VuZF9zZXJ2aWNlfVxuKi9cbmV4cG9ydCBjbGFzcyBDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2UgZXh0ZW5kcyBjZGt0Zi5UZXJyYWZvcm1SZXNvdXJjZSB7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT1cbiAgLy8gU1RBVElDIFBST1BFUlRJRVNcbiAgLy8gPT09PT09PT09PT09PT09PT1cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSB0ZlJlc291cmNlVHlwZSA9IFwiZ29vZ2xlX2NvbXB1dGVfcmVnaW9uX2JhY2tlbmRfc2VydmljZVwiO1xuXG4gIC8vID09PT09PT09PT09PT09XG4gIC8vIFNUQVRJQyBNZXRob2RzXG4gIC8vID09PT09PT09PT09PT09XG4gIC8qKlxuICAqIEdlbmVyYXRlcyBDREtURiBjb2RlIGZvciBpbXBvcnRpbmcgYSBDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2UgcmVzb3VyY2UgdXBvbiBydW5uaW5nIFwiY2RrdGYgcGxhbiA8c3RhY2stbmFtZT5cIlxuICAqIEBwYXJhbSBzY29wZSBUaGUgc2NvcGUgaW4gd2hpY2ggdG8gZGVmaW5lIHRoaXMgY29uc3RydWN0XG4gICogQHBhcmFtIGltcG9ydFRvSWQgVGhlIGNvbnN0cnVjdCBpZCB1c2VkIGluIHRoZSBnZW5lcmF0ZWQgY29uZmlnIGZvciB0aGUgQ29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlIHRvIGltcG9ydFxuICAqIEBwYXJhbSBpbXBvcnRGcm9tSWQgVGhlIGlkIG9mIHRoZSBleGlzdGluZyBDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2UgdGhhdCBzaG91bGQgYmUgaW1wb3J0ZWQuIFJlZmVyIHRvIHRoZSB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9nb29nbGUvNi40LjAvZG9jcy9yZXNvdXJjZXMvY29tcHV0ZV9yZWdpb25fYmFja2VuZF9zZXJ2aWNlI2ltcG9ydCBpbXBvcnQgc2VjdGlvbn0gaW4gdGhlIGRvY3VtZW50YXRpb24gb2YgdGhpcyByZXNvdXJjZSBmb3IgdGhlIGlkIHRvIHVzZVxuICAqIEBwYXJhbSBwcm92aWRlcj8gT3B0aW9uYWwgaW5zdGFuY2Ugb2YgdGhlIHByb3ZpZGVyIHdoZXJlIHRoZSBDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2UgdG8gaW1wb3J0IGlzIGZvdW5kXG4gICovXG4gIHB1YmxpYyBzdGF0aWMgZ2VuZXJhdGVDb25maWdGb3JJbXBvcnQoc2NvcGU6IENvbnN0cnVjdCwgaW1wb3J0VG9JZDogc3RyaW5nLCBpbXBvcnRGcm9tSWQ6IHN0cmluZywgcHJvdmlkZXI/OiBjZGt0Zi5UZXJyYWZvcm1Qcm92aWRlcikge1xuICAgICAgICByZXR1cm4gbmV3IGNka3RmLkltcG9ydGFibGVSZXNvdXJjZShzY29wZSwgaW1wb3J0VG9JZCwgeyB0ZXJyYWZvcm1SZXNvdXJjZVR5cGU6IFwiZ29vZ2xlX2NvbXB1dGVfcmVnaW9uX2JhY2tlbmRfc2VydmljZVwiLCBpbXBvcnRJZDogaW1wb3J0RnJvbUlkLCBwcm92aWRlciB9KTtcbiAgICAgIH1cblxuICAvLyA9PT09PT09PT09PVxuICAvLyBJTklUSUFMSVpFUlxuICAvLyA9PT09PT09PT09PVxuXG4gIC8qKlxuICAqIENyZWF0ZSBhIG5ldyB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9nb29nbGUvNi40LjAvZG9jcy9yZXNvdXJjZXMvY29tcHV0ZV9yZWdpb25fYmFja2VuZF9zZXJ2aWNlIGdvb2dsZV9jb21wdXRlX3JlZ2lvbl9iYWNrZW5kX3NlcnZpY2V9IFJlc291cmNlXG4gICpcbiAgKiBAcGFyYW0gc2NvcGUgVGhlIHNjb3BlIGluIHdoaWNoIHRvIGRlZmluZSB0aGlzIGNvbnN0cnVjdFxuICAqIEBwYXJhbSBpZCBUaGUgc2NvcGVkIGNvbnN0cnVjdCBJRC4gTXVzdCBiZSB1bmlxdWUgYW1vbmdzdCBzaWJsaW5ncyBpbiB0aGUgc2FtZSBzY29wZVxuICAqIEBwYXJhbSBvcHRpb25zIENvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZUNvbmZpZ1xuICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgY29uZmlnOiBDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VDb25maWcpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHtcbiAgICAgIHRlcnJhZm9ybVJlc291cmNlVHlwZTogJ2dvb2dsZV9jb21wdXRlX3JlZ2lvbl9iYWNrZW5kX3NlcnZpY2UnLFxuICAgICAgdGVycmFmb3JtR2VuZXJhdG9yTWV0YWRhdGE6IHtcbiAgICAgICAgcHJvdmlkZXJOYW1lOiAnZ29vZ2xlJyxcbiAgICAgICAgcHJvdmlkZXJWZXJzaW9uOiAnNi40LjAnLFxuICAgICAgICBwcm92aWRlclZlcnNpb25Db25zdHJhaW50OiAnfj4gNi4wJ1xuICAgICAgfSxcbiAgICAgIHByb3ZpZGVyOiBjb25maWcucHJvdmlkZXIsXG4gICAgICBkZXBlbmRzT246IGNvbmZpZy5kZXBlbmRzT24sXG4gICAgICBjb3VudDogY29uZmlnLmNvdW50LFxuICAgICAgbGlmZWN5Y2xlOiBjb25maWcubGlmZWN5Y2xlLFxuICAgICAgcHJvdmlzaW9uZXJzOiBjb25maWcucHJvdmlzaW9uZXJzLFxuICAgICAgY29ubmVjdGlvbjogY29uZmlnLmNvbm5lY3Rpb24sXG4gICAgICBmb3JFYWNoOiBjb25maWcuZm9yRWFjaFxuICAgIH0pO1xuICAgIHRoaXMuX2FmZmluaXR5Q29va2llVHRsU2VjID0gY29uZmlnLmFmZmluaXR5Q29va2llVHRsU2VjO1xuICAgIHRoaXMuX2Nvbm5lY3Rpb25EcmFpbmluZ1RpbWVvdXRTZWMgPSBjb25maWcuY29ubmVjdGlvbkRyYWluaW5nVGltZW91dFNlYztcbiAgICB0aGlzLl9kZXNjcmlwdGlvbiA9IGNvbmZpZy5kZXNjcmlwdGlvbjtcbiAgICB0aGlzLl9lbmFibGVDZG4gPSBjb25maWcuZW5hYmxlQ2RuO1xuICAgIHRoaXMuX2hlYWx0aENoZWNrcyA9IGNvbmZpZy5oZWFsdGhDaGVja3M7XG4gICAgdGhpcy5faWQgPSBjb25maWcuaWQ7XG4gICAgdGhpcy5fbG9hZEJhbGFuY2luZ1NjaGVtZSA9IGNvbmZpZy5sb2FkQmFsYW5jaW5nU2NoZW1lO1xuICAgIHRoaXMuX2xvY2FsaXR5TGJQb2xpY3kgPSBjb25maWcubG9jYWxpdHlMYlBvbGljeTtcbiAgICB0aGlzLl9uYW1lID0gY29uZmlnLm5hbWU7XG4gICAgdGhpcy5fbmV0d29yayA9IGNvbmZpZy5uZXR3b3JrO1xuICAgIHRoaXMuX3BvcnROYW1lID0gY29uZmlnLnBvcnROYW1lO1xuICAgIHRoaXMuX3Byb2plY3QgPSBjb25maWcucHJvamVjdDtcbiAgICB0aGlzLl9wcm90b2NvbCA9IGNvbmZpZy5wcm90b2NvbDtcbiAgICB0aGlzLl9yZWdpb24gPSBjb25maWcucmVnaW9uO1xuICAgIHRoaXMuX3Nlc3Npb25BZmZpbml0eSA9IGNvbmZpZy5zZXNzaW9uQWZmaW5pdHk7XG4gICAgdGhpcy5fdGltZW91dFNlYyA9IGNvbmZpZy50aW1lb3V0U2VjO1xuICAgIHRoaXMuX2JhY2tlbmQuaW50ZXJuYWxWYWx1ZSA9IGNvbmZpZy5iYWNrZW5kO1xuICAgIHRoaXMuX2NkblBvbGljeS5pbnRlcm5hbFZhbHVlID0gY29uZmlnLmNkblBvbGljeTtcbiAgICB0aGlzLl9jaXJjdWl0QnJlYWtlcnMuaW50ZXJuYWxWYWx1ZSA9IGNvbmZpZy5jaXJjdWl0QnJlYWtlcnM7XG4gICAgdGhpcy5fY29uc2lzdGVudEhhc2guaW50ZXJuYWxWYWx1ZSA9IGNvbmZpZy5jb25zaXN0ZW50SGFzaDtcbiAgICB0aGlzLl9mYWlsb3ZlclBvbGljeS5pbnRlcm5hbFZhbHVlID0gY29uZmlnLmZhaWxvdmVyUG9saWN5O1xuICAgIHRoaXMuX2lhcC5pbnRlcm5hbFZhbHVlID0gY29uZmlnLmlhcDtcbiAgICB0aGlzLl9sb2dDb25maWcuaW50ZXJuYWxWYWx1ZSA9IGNvbmZpZy5sb2dDb25maWc7XG4gICAgdGhpcy5fb3V0bGllckRldGVjdGlvbi5pbnRlcm5hbFZhbHVlID0gY29uZmlnLm91dGxpZXJEZXRlY3Rpb247XG4gICAgdGhpcy5fdGltZW91dHMuaW50ZXJuYWxWYWx1ZSA9IGNvbmZpZy50aW1lb3V0cztcbiAgfVxuXG4gIC8vID09PT09PT09PT1cbiAgLy8gQVRUUklCVVRFU1xuICAvLyA9PT09PT09PT09XG5cbiAgLy8gYWZmaW5pdHlfY29va2llX3R0bF9zZWMgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfYWZmaW5pdHlDb29raWVUdGxTZWM/OiBudW1iZXI7IFxuICBwdWJsaWMgZ2V0IGFmZmluaXR5Q29va2llVHRsU2VjKCkge1xuICAgIHJldHVybiB0aGlzLmdldE51bWJlckF0dHJpYnV0ZSgnYWZmaW5pdHlfY29va2llX3R0bF9zZWMnKTtcbiAgfVxuICBwdWJsaWMgc2V0IGFmZmluaXR5Q29va2llVHRsU2VjKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9hZmZpbml0eUNvb2tpZVR0bFNlYyA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldEFmZmluaXR5Q29va2llVHRsU2VjKCkge1xuICAgIHRoaXMuX2FmZmluaXR5Q29va2llVHRsU2VjID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBhZmZpbml0eUNvb2tpZVR0bFNlY0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9hZmZpbml0eUNvb2tpZVR0bFNlYztcbiAgfVxuXG4gIC8vIGNvbm5lY3Rpb25fZHJhaW5pbmdfdGltZW91dF9zZWMgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfY29ubmVjdGlvbkRyYWluaW5nVGltZW91dFNlYz86IG51bWJlcjsgXG4gIHB1YmxpYyBnZXQgY29ubmVjdGlvbkRyYWluaW5nVGltZW91dFNlYygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXROdW1iZXJBdHRyaWJ1dGUoJ2Nvbm5lY3Rpb25fZHJhaW5pbmdfdGltZW91dF9zZWMnKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNvbm5lY3Rpb25EcmFpbmluZ1RpbWVvdXRTZWModmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX2Nvbm5lY3Rpb25EcmFpbmluZ1RpbWVvdXRTZWMgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRDb25uZWN0aW9uRHJhaW5pbmdUaW1lb3V0U2VjKCkge1xuICAgIHRoaXMuX2Nvbm5lY3Rpb25EcmFpbmluZ1RpbWVvdXRTZWMgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGNvbm5lY3Rpb25EcmFpbmluZ1RpbWVvdXRTZWNJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fY29ubmVjdGlvbkRyYWluaW5nVGltZW91dFNlYztcbiAgfVxuXG4gIC8vIGNyZWF0aW9uX3RpbWVzdGFtcCAtIGNvbXB1dGVkOiB0cnVlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiBmYWxzZVxuICBwdWJsaWMgZ2V0IGNyZWF0aW9uVGltZXN0YW1wKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnY3JlYXRpb25fdGltZXN0YW1wJyk7XG4gIH1cblxuICAvLyBkZXNjcmlwdGlvbiAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9kZXNjcmlwdGlvbj86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgZGVzY3JpcHRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdkZXNjcmlwdGlvbicpO1xuICB9XG4gIHB1YmxpYyBzZXQgZGVzY3JpcHRpb24odmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2Rlc2NyaXB0aW9uID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0RGVzY3JpcHRpb24oKSB7XG4gICAgdGhpcy5fZGVzY3JpcHRpb24gPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGRlc2NyaXB0aW9uSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Rlc2NyaXB0aW9uO1xuICB9XG5cbiAgLy8gZW5hYmxlX2NkbiAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9lbmFibGVDZG4/OiBib29sZWFuIHwgY2RrdGYuSVJlc29sdmFibGU7IFxuICBwdWJsaWMgZ2V0IGVuYWJsZUNkbigpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRCb29sZWFuQXR0cmlidXRlKCdlbmFibGVfY2RuJyk7XG4gIH1cbiAgcHVibGljIHNldCBlbmFibGVDZG4odmFsdWU6IGJvb2xlYW4gfCBjZGt0Zi5JUmVzb2x2YWJsZSkge1xuICAgIHRoaXMuX2VuYWJsZUNkbiA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldEVuYWJsZUNkbigpIHtcbiAgICB0aGlzLl9lbmFibGVDZG4gPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGVuYWJsZUNkbklucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9lbmFibGVDZG47XG4gIH1cblxuICAvLyBmaW5nZXJwcmludCAtIGNvbXB1dGVkOiB0cnVlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiBmYWxzZVxuICBwdWJsaWMgZ2V0IGZpbmdlcnByaW50KCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnZmluZ2VycHJpbnQnKTtcbiAgfVxuXG4gIC8vIGdlbmVyYXRlZF9pZCAtIGNvbXB1dGVkOiB0cnVlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiBmYWxzZVxuICBwdWJsaWMgZ2V0IGdlbmVyYXRlZElkKCkge1xuICAgIHJldHVybiB0aGlzLmdldE51bWJlckF0dHJpYnV0ZSgnZ2VuZXJhdGVkX2lkJyk7XG4gIH1cblxuICAvLyBoZWFsdGhfY2hlY2tzIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2hlYWx0aENoZWNrcz86IHN0cmluZ1tdOyBcbiAgcHVibGljIGdldCBoZWFsdGhDaGVja3MoKSB7XG4gICAgcmV0dXJuIGNka3RmLkZuLnRvbGlzdCh0aGlzLmdldExpc3RBdHRyaWJ1dGUoJ2hlYWx0aF9jaGVja3MnKSk7XG4gIH1cbiAgcHVibGljIHNldCBoZWFsdGhDaGVja3ModmFsdWU6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5faGVhbHRoQ2hlY2tzID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0SGVhbHRoQ2hlY2tzKCkge1xuICAgIHRoaXMuX2hlYWx0aENoZWNrcyA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgaGVhbHRoQ2hlY2tzSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2hlYWx0aENoZWNrcztcbiAgfVxuXG4gIC8vIGlkIC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfaWQ/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IGlkKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnaWQnKTtcbiAgfVxuICBwdWJsaWMgc2V0IGlkKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9pZCA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldElkKCkge1xuICAgIHRoaXMuX2lkID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBpZElucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9pZDtcbiAgfVxuXG4gIC8vIGxvYWRfYmFsYW5jaW5nX3NjaGVtZSAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9sb2FkQmFsYW5jaW5nU2NoZW1lPzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBsb2FkQmFsYW5jaW5nU2NoZW1lKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnbG9hZF9iYWxhbmNpbmdfc2NoZW1lJyk7XG4gIH1cbiAgcHVibGljIHNldCBsb2FkQmFsYW5jaW5nU2NoZW1lKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9sb2FkQmFsYW5jaW5nU2NoZW1lID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0TG9hZEJhbGFuY2luZ1NjaGVtZSgpIHtcbiAgICB0aGlzLl9sb2FkQmFsYW5jaW5nU2NoZW1lID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBsb2FkQmFsYW5jaW5nU2NoZW1lSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2xvYWRCYWxhbmNpbmdTY2hlbWU7XG4gIH1cblxuICAvLyBsb2NhbGl0eV9sYl9wb2xpY3kgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfbG9jYWxpdHlMYlBvbGljeT86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgbG9jYWxpdHlMYlBvbGljeSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ2xvY2FsaXR5X2xiX3BvbGljeScpO1xuICB9XG4gIHB1YmxpYyBzZXQgbG9jYWxpdHlMYlBvbGljeSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fbG9jYWxpdHlMYlBvbGljeSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldExvY2FsaXR5TGJQb2xpY3koKSB7XG4gICAgdGhpcy5fbG9jYWxpdHlMYlBvbGljeSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgbG9jYWxpdHlMYlBvbGljeUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9sb2NhbGl0eUxiUG9saWN5O1xuICB9XG5cbiAgLy8gbmFtZSAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogdHJ1ZVxuICBwcml2YXRlIF9uYW1lPzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBuYW1lKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnbmFtZScpO1xuICB9XG4gIHB1YmxpYyBzZXQgbmFtZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fbmFtZSA9IHZhbHVlO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBuYW1lSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX25hbWU7XG4gIH1cblxuICAvLyBuZXR3b3JrIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX25ldHdvcms/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IG5ldHdvcmsoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCduZXR3b3JrJyk7XG4gIH1cbiAgcHVibGljIHNldCBuZXR3b3JrKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9uZXR3b3JrID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0TmV0d29yaygpIHtcbiAgICB0aGlzLl9uZXR3b3JrID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBuZXR3b3JrSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX25ldHdvcms7XG4gIH1cblxuICAvLyBwb3J0X25hbWUgLSBjb21wdXRlZDogdHJ1ZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9wb3J0TmFtZT86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgcG9ydE5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdwb3J0X25hbWUnKTtcbiAgfVxuICBwdWJsaWMgc2V0IHBvcnROYW1lKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9wb3J0TmFtZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldFBvcnROYW1lKCkge1xuICAgIHRoaXMuX3BvcnROYW1lID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBwb3J0TmFtZUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9wb3J0TmFtZTtcbiAgfVxuXG4gIC8vIHByb2plY3QgLSBjb21wdXRlZDogdHJ1ZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9wcm9qZWN0Pzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBwcm9qZWN0KCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgncHJvamVjdCcpO1xuICB9XG4gIHB1YmxpYyBzZXQgcHJvamVjdCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fcHJvamVjdCA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldFByb2plY3QoKSB7XG4gICAgdGhpcy5fcHJvamVjdCA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgcHJvamVjdElucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9wcm9qZWN0O1xuICB9XG5cbiAgLy8gcHJvdG9jb2wgLSBjb21wdXRlZDogdHJ1ZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9wcm90b2NvbD86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgcHJvdG9jb2woKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdwcm90b2NvbCcpO1xuICB9XG4gIHB1YmxpYyBzZXQgcHJvdG9jb2wodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX3Byb3RvY29sID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0UHJvdG9jb2woKSB7XG4gICAgdGhpcy5fcHJvdG9jb2wgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHByb3RvY29sSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Byb3RvY29sO1xuICB9XG5cbiAgLy8gcmVnaW9uIC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfcmVnaW9uPzogc3RyaW5nOyBcbiAgcHVibGljIGdldCByZWdpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdyZWdpb24nKTtcbiAgfVxuICBwdWJsaWMgc2V0IHJlZ2lvbih2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fcmVnaW9uID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0UmVnaW9uKCkge1xuICAgIHRoaXMuX3JlZ2lvbiA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgcmVnaW9uSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3JlZ2lvbjtcbiAgfVxuXG4gIC8vIHNlbGZfbGluayAtIGNvbXB1dGVkOiB0cnVlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiBmYWxzZVxuICBwdWJsaWMgZ2V0IHNlbGZMaW5rKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnc2VsZl9saW5rJyk7XG4gIH1cblxuICAvLyBzZXNzaW9uX2FmZmluaXR5IC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfc2Vzc2lvbkFmZmluaXR5Pzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBzZXNzaW9uQWZmaW5pdHkoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdzZXNzaW9uX2FmZmluaXR5Jyk7XG4gIH1cbiAgcHVibGljIHNldCBzZXNzaW9uQWZmaW5pdHkodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX3Nlc3Npb25BZmZpbml0eSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldFNlc3Npb25BZmZpbml0eSgpIHtcbiAgICB0aGlzLl9zZXNzaW9uQWZmaW5pdHkgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHNlc3Npb25BZmZpbml0eUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9zZXNzaW9uQWZmaW5pdHk7XG4gIH1cblxuICAvLyB0aW1lb3V0X3NlYyAtIGNvbXB1dGVkOiB0cnVlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX3RpbWVvdXRTZWM/OiBudW1iZXI7IFxuICBwdWJsaWMgZ2V0IHRpbWVvdXRTZWMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TnVtYmVyQXR0cmlidXRlKCd0aW1lb3V0X3NlYycpO1xuICB9XG4gIHB1YmxpYyBzZXQgdGltZW91dFNlYyh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fdGltZW91dFNlYyA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldFRpbWVvdXRTZWMoKSB7XG4gICAgdGhpcy5fdGltZW91dFNlYyA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgdGltZW91dFNlY0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl90aW1lb3V0U2VjO1xuICB9XG5cbiAgLy8gYmFja2VuZCAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9iYWNrZW5kID0gbmV3IENvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZUJhY2tlbmRMaXN0KHRoaXMsIFwiYmFja2VuZFwiLCB0cnVlKTtcbiAgcHVibGljIGdldCBiYWNrZW5kKCkge1xuICAgIHJldHVybiB0aGlzLl9iYWNrZW5kO1xuICB9XG4gIHB1YmxpYyBwdXRCYWNrZW5kKHZhbHVlOiBDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VCYWNrZW5kW10gfCBjZGt0Zi5JUmVzb2x2YWJsZSkge1xuICAgIHRoaXMuX2JhY2tlbmQuaW50ZXJuYWxWYWx1ZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldEJhY2tlbmQoKSB7XG4gICAgdGhpcy5fYmFja2VuZC5pbnRlcm5hbFZhbHVlID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBiYWNrZW5kSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2JhY2tlbmQuaW50ZXJuYWxWYWx1ZTtcbiAgfVxuXG4gIC8vIGNkbl9wb2xpY3kgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfY2RuUG9saWN5ID0gbmV3IENvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZUNkblBvbGljeU91dHB1dFJlZmVyZW5jZSh0aGlzLCBcImNkbl9wb2xpY3lcIik7XG4gIHB1YmxpYyBnZXQgY2RuUG9saWN5KCkge1xuICAgIHJldHVybiB0aGlzLl9jZG5Qb2xpY3k7XG4gIH1cbiAgcHVibGljIHB1dENkblBvbGljeSh2YWx1ZTogQ29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlQ2RuUG9saWN5KSB7XG4gICAgdGhpcy5fY2RuUG9saWN5LmludGVybmFsVmFsdWUgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRDZG5Qb2xpY3koKSB7XG4gICAgdGhpcy5fY2RuUG9saWN5LmludGVybmFsVmFsdWUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGNkblBvbGljeUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9jZG5Qb2xpY3kuaW50ZXJuYWxWYWx1ZTtcbiAgfVxuXG4gIC8vIGNpcmN1aXRfYnJlYWtlcnMgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfY2lyY3VpdEJyZWFrZXJzID0gbmV3IENvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZUNpcmN1aXRCcmVha2Vyc091dHB1dFJlZmVyZW5jZSh0aGlzLCBcImNpcmN1aXRfYnJlYWtlcnNcIik7XG4gIHB1YmxpYyBnZXQgY2lyY3VpdEJyZWFrZXJzKCkge1xuICAgIHJldHVybiB0aGlzLl9jaXJjdWl0QnJlYWtlcnM7XG4gIH1cbiAgcHVibGljIHB1dENpcmN1aXRCcmVha2Vycyh2YWx1ZTogQ29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlQ2lyY3VpdEJyZWFrZXJzKSB7XG4gICAgdGhpcy5fY2lyY3VpdEJyZWFrZXJzLmludGVybmFsVmFsdWUgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRDaXJjdWl0QnJlYWtlcnMoKSB7XG4gICAgdGhpcy5fY2lyY3VpdEJyZWFrZXJzLmludGVybmFsVmFsdWUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGNpcmN1aXRCcmVha2Vyc0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9jaXJjdWl0QnJlYWtlcnMuaW50ZXJuYWxWYWx1ZTtcbiAgfVxuXG4gIC8vIGNvbnNpc3RlbnRfaGFzaCAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9jb25zaXN0ZW50SGFzaCA9IG5ldyBDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VDb25zaXN0ZW50SGFzaE91dHB1dFJlZmVyZW5jZSh0aGlzLCBcImNvbnNpc3RlbnRfaGFzaFwiKTtcbiAgcHVibGljIGdldCBjb25zaXN0ZW50SGFzaCgpIHtcbiAgICByZXR1cm4gdGhpcy5fY29uc2lzdGVudEhhc2g7XG4gIH1cbiAgcHVibGljIHB1dENvbnNpc3RlbnRIYXNoKHZhbHVlOiBDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VDb25zaXN0ZW50SGFzaCkge1xuICAgIHRoaXMuX2NvbnNpc3RlbnRIYXNoLmludGVybmFsVmFsdWUgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRDb25zaXN0ZW50SGFzaCgpIHtcbiAgICB0aGlzLl9jb25zaXN0ZW50SGFzaC5pbnRlcm5hbFZhbHVlID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBjb25zaXN0ZW50SGFzaElucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9jb25zaXN0ZW50SGFzaC5pbnRlcm5hbFZhbHVlO1xuICB9XG5cbiAgLy8gZmFpbG92ZXJfcG9saWN5IC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2ZhaWxvdmVyUG9saWN5ID0gbmV3IENvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZUZhaWxvdmVyUG9saWN5T3V0cHV0UmVmZXJlbmNlKHRoaXMsIFwiZmFpbG92ZXJfcG9saWN5XCIpO1xuICBwdWJsaWMgZ2V0IGZhaWxvdmVyUG9saWN5KCkge1xuICAgIHJldHVybiB0aGlzLl9mYWlsb3ZlclBvbGljeTtcbiAgfVxuICBwdWJsaWMgcHV0RmFpbG92ZXJQb2xpY3kodmFsdWU6IENvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZUZhaWxvdmVyUG9saWN5KSB7XG4gICAgdGhpcy5fZmFpbG92ZXJQb2xpY3kuaW50ZXJuYWxWYWx1ZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldEZhaWxvdmVyUG9saWN5KCkge1xuICAgIHRoaXMuX2ZhaWxvdmVyUG9saWN5LmludGVybmFsVmFsdWUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGZhaWxvdmVyUG9saWN5SW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZhaWxvdmVyUG9saWN5LmludGVybmFsVmFsdWU7XG4gIH1cblxuICAvLyBpYXAgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfaWFwID0gbmV3IENvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZUlhcE91dHB1dFJlZmVyZW5jZSh0aGlzLCBcImlhcFwiKTtcbiAgcHVibGljIGdldCBpYXAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2lhcDtcbiAgfVxuICBwdWJsaWMgcHV0SWFwKHZhbHVlOiBDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VJYXApIHtcbiAgICB0aGlzLl9pYXAuaW50ZXJuYWxWYWx1ZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldElhcCgpIHtcbiAgICB0aGlzLl9pYXAuaW50ZXJuYWxWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgaWFwSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2lhcC5pbnRlcm5hbFZhbHVlO1xuICB9XG5cbiAgLy8gbG9nX2NvbmZpZyAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9sb2dDb25maWcgPSBuZXcgQ29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlTG9nQ29uZmlnT3V0cHV0UmVmZXJlbmNlKHRoaXMsIFwibG9nX2NvbmZpZ1wiKTtcbiAgcHVibGljIGdldCBsb2dDb25maWcoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2xvZ0NvbmZpZztcbiAgfVxuICBwdWJsaWMgcHV0TG9nQ29uZmlnKHZhbHVlOiBDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VMb2dDb25maWcpIHtcbiAgICB0aGlzLl9sb2dDb25maWcuaW50ZXJuYWxWYWx1ZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldExvZ0NvbmZpZygpIHtcbiAgICB0aGlzLl9sb2dDb25maWcuaW50ZXJuYWxWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgbG9nQ29uZmlnSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2xvZ0NvbmZpZy5pbnRlcm5hbFZhbHVlO1xuICB9XG5cbiAgLy8gb3V0bGllcl9kZXRlY3Rpb24gLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfb3V0bGllckRldGVjdGlvbiA9IG5ldyBDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VPdXRsaWVyRGV0ZWN0aW9uT3V0cHV0UmVmZXJlbmNlKHRoaXMsIFwib3V0bGllcl9kZXRlY3Rpb25cIik7XG4gIHB1YmxpYyBnZXQgb3V0bGllckRldGVjdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5fb3V0bGllckRldGVjdGlvbjtcbiAgfVxuICBwdWJsaWMgcHV0T3V0bGllckRldGVjdGlvbih2YWx1ZTogQ29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlT3V0bGllckRldGVjdGlvbikge1xuICAgIHRoaXMuX291dGxpZXJEZXRlY3Rpb24uaW50ZXJuYWxWYWx1ZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldE91dGxpZXJEZXRlY3Rpb24oKSB7XG4gICAgdGhpcy5fb3V0bGllckRldGVjdGlvbi5pbnRlcm5hbFZhbHVlID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBvdXRsaWVyRGV0ZWN0aW9uSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX291dGxpZXJEZXRlY3Rpb24uaW50ZXJuYWxWYWx1ZTtcbiAgfVxuXG4gIC8vIHRpbWVvdXRzIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX3RpbWVvdXRzID0gbmV3IENvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZVRpbWVvdXRzT3V0cHV0UmVmZXJlbmNlKHRoaXMsIFwidGltZW91dHNcIik7XG4gIHB1YmxpYyBnZXQgdGltZW91dHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RpbWVvdXRzO1xuICB9XG4gIHB1YmxpYyBwdXRUaW1lb3V0cyh2YWx1ZTogQ29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlVGltZW91dHMpIHtcbiAgICB0aGlzLl90aW1lb3V0cy5pbnRlcm5hbFZhbHVlID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0VGltZW91dHMoKSB7XG4gICAgdGhpcy5fdGltZW91dHMuaW50ZXJuYWxWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgdGltZW91dHNJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdGltZW91dHMuaW50ZXJuYWxWYWx1ZTtcbiAgfVxuXG4gIC8vID09PT09PT09PVxuICAvLyBTWU5USEVTSVNcbiAgLy8gPT09PT09PT09XG5cbiAgcHJvdGVjdGVkIHN5bnRoZXNpemVBdHRyaWJ1dGVzKCk6IHsgW25hbWU6IHN0cmluZ106IGFueSB9IHtcbiAgICByZXR1cm4ge1xuICAgICAgYWZmaW5pdHlfY29va2llX3R0bF9zZWM6IGNka3RmLm51bWJlclRvVGVycmFmb3JtKHRoaXMuX2FmZmluaXR5Q29va2llVHRsU2VjKSxcbiAgICAgIGNvbm5lY3Rpb25fZHJhaW5pbmdfdGltZW91dF9zZWM6IGNka3RmLm51bWJlclRvVGVycmFmb3JtKHRoaXMuX2Nvbm5lY3Rpb25EcmFpbmluZ1RpbWVvdXRTZWMpLFxuICAgICAgZGVzY3JpcHRpb246IGNka3RmLnN0cmluZ1RvVGVycmFmb3JtKHRoaXMuX2Rlc2NyaXB0aW9uKSxcbiAgICAgIGVuYWJsZV9jZG46IGNka3RmLmJvb2xlYW5Ub1RlcnJhZm9ybSh0aGlzLl9lbmFibGVDZG4pLFxuICAgICAgaGVhbHRoX2NoZWNrczogY2RrdGYubGlzdE1hcHBlcihjZGt0Zi5zdHJpbmdUb1RlcnJhZm9ybSwgZmFsc2UpKHRoaXMuX2hlYWx0aENoZWNrcyksXG4gICAgICBpZDogY2RrdGYuc3RyaW5nVG9UZXJyYWZvcm0odGhpcy5faWQpLFxuICAgICAgbG9hZF9iYWxhbmNpbmdfc2NoZW1lOiBjZGt0Zi5zdHJpbmdUb1RlcnJhZm9ybSh0aGlzLl9sb2FkQmFsYW5jaW5nU2NoZW1lKSxcbiAgICAgIGxvY2FsaXR5X2xiX3BvbGljeTogY2RrdGYuc3RyaW5nVG9UZXJyYWZvcm0odGhpcy5fbG9jYWxpdHlMYlBvbGljeSksXG4gICAgICBuYW1lOiBjZGt0Zi5zdHJpbmdUb1RlcnJhZm9ybSh0aGlzLl9uYW1lKSxcbiAgICAgIG5ldHdvcms6IGNka3RmLnN0cmluZ1RvVGVycmFmb3JtKHRoaXMuX25ldHdvcmspLFxuICAgICAgcG9ydF9uYW1lOiBjZGt0Zi5zdHJpbmdUb1RlcnJhZm9ybSh0aGlzLl9wb3J0TmFtZSksXG4gICAgICBwcm9qZWN0OiBjZGt0Zi5zdHJpbmdUb1RlcnJhZm9ybSh0aGlzLl9wcm9qZWN0KSxcbiAgICAgIHByb3RvY29sOiBjZGt0Zi5zdHJpbmdUb1RlcnJhZm9ybSh0aGlzLl9wcm90b2NvbCksXG4gICAgICByZWdpb246IGNka3RmLnN0cmluZ1RvVGVycmFmb3JtKHRoaXMuX3JlZ2lvbiksXG4gICAgICBzZXNzaW9uX2FmZmluaXR5OiBjZGt0Zi5zdHJpbmdUb1RlcnJhZm9ybSh0aGlzLl9zZXNzaW9uQWZmaW5pdHkpLFxuICAgICAgdGltZW91dF9zZWM6IGNka3RmLm51bWJlclRvVGVycmFmb3JtKHRoaXMuX3RpbWVvdXRTZWMpLFxuICAgICAgYmFja2VuZDogY2RrdGYubGlzdE1hcHBlcihjb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VCYWNrZW5kVG9UZXJyYWZvcm0sIHRydWUpKHRoaXMuX2JhY2tlbmQuaW50ZXJuYWxWYWx1ZSksXG4gICAgICBjZG5fcG9saWN5OiBjb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VDZG5Qb2xpY3lUb1RlcnJhZm9ybSh0aGlzLl9jZG5Qb2xpY3kuaW50ZXJuYWxWYWx1ZSksXG4gICAgICBjaXJjdWl0X2JyZWFrZXJzOiBjb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VDaXJjdWl0QnJlYWtlcnNUb1RlcnJhZm9ybSh0aGlzLl9jaXJjdWl0QnJlYWtlcnMuaW50ZXJuYWxWYWx1ZSksXG4gICAgICBjb25zaXN0ZW50X2hhc2g6IGNvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZUNvbnNpc3RlbnRIYXNoVG9UZXJyYWZvcm0odGhpcy5fY29uc2lzdGVudEhhc2guaW50ZXJuYWxWYWx1ZSksXG4gICAgICBmYWlsb3Zlcl9wb2xpY3k6IGNvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZUZhaWxvdmVyUG9saWN5VG9UZXJyYWZvcm0odGhpcy5fZmFpbG92ZXJQb2xpY3kuaW50ZXJuYWxWYWx1ZSksXG4gICAgICBpYXA6IGNvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZUlhcFRvVGVycmFmb3JtKHRoaXMuX2lhcC5pbnRlcm5hbFZhbHVlKSxcbiAgICAgIGxvZ19jb25maWc6IGNvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZUxvZ0NvbmZpZ1RvVGVycmFmb3JtKHRoaXMuX2xvZ0NvbmZpZy5pbnRlcm5hbFZhbHVlKSxcbiAgICAgIG91dGxpZXJfZGV0ZWN0aW9uOiBjb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VPdXRsaWVyRGV0ZWN0aW9uVG9UZXJyYWZvcm0odGhpcy5fb3V0bGllckRldGVjdGlvbi5pbnRlcm5hbFZhbHVlKSxcbiAgICAgIHRpbWVvdXRzOiBjb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VUaW1lb3V0c1RvVGVycmFmb3JtKHRoaXMuX3RpbWVvdXRzLmludGVybmFsVmFsdWUpLFxuICAgIH07XG4gIH1cblxuICBwcm90ZWN0ZWQgc3ludGhlc2l6ZUhjbEF0dHJpYnV0ZXMoKTogeyBbbmFtZTogc3RyaW5nXTogYW55IH0ge1xuICAgIGNvbnN0IGF0dHJzID0ge1xuICAgICAgYWZmaW5pdHlfY29va2llX3R0bF9zZWM6IHtcbiAgICAgICAgdmFsdWU6IGNka3RmLm51bWJlclRvSGNsVGVycmFmb3JtKHRoaXMuX2FmZmluaXR5Q29va2llVHRsU2VjKSxcbiAgICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwibnVtYmVyXCIsXG4gICAgICB9LFxuICAgICAgY29ubmVjdGlvbl9kcmFpbmluZ190aW1lb3V0X3NlYzoge1xuICAgICAgICB2YWx1ZTogY2RrdGYubnVtYmVyVG9IY2xUZXJyYWZvcm0odGhpcy5fY29ubmVjdGlvbkRyYWluaW5nVGltZW91dFNlYyksXG4gICAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIm51bWJlclwiLFxuICAgICAgfSxcbiAgICAgIGRlc2NyaXB0aW9uOiB7XG4gICAgICAgIHZhbHVlOiBjZGt0Zi5zdHJpbmdUb0hjbFRlcnJhZm9ybSh0aGlzLl9kZXNjcmlwdGlvbiksXG4gICAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgICAgfSxcbiAgICAgIGVuYWJsZV9jZG46IHtcbiAgICAgICAgdmFsdWU6IGNka3RmLmJvb2xlYW5Ub0hjbFRlcnJhZm9ybSh0aGlzLl9lbmFibGVDZG4pLFxuICAgICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJib29sZWFuXCIsXG4gICAgICB9LFxuICAgICAgaGVhbHRoX2NoZWNrczoge1xuICAgICAgICB2YWx1ZTogY2RrdGYubGlzdE1hcHBlckhjbChjZGt0Zi5zdHJpbmdUb0hjbFRlcnJhZm9ybSwgZmFsc2UpKHRoaXMuX2hlYWx0aENoZWNrcyksXG4gICAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgICB0eXBlOiBcInNldFwiLFxuICAgICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ0xpc3RcIixcbiAgICAgIH0sXG4gICAgICBpZDoge1xuICAgICAgICB2YWx1ZTogY2RrdGYuc3RyaW5nVG9IY2xUZXJyYWZvcm0odGhpcy5faWQpLFxuICAgICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICAgIH0sXG4gICAgICBsb2FkX2JhbGFuY2luZ19zY2hlbWU6IHtcbiAgICAgICAgdmFsdWU6IGNka3RmLnN0cmluZ1RvSGNsVGVycmFmb3JtKHRoaXMuX2xvYWRCYWxhbmNpbmdTY2hlbWUpLFxuICAgICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICAgIH0sXG4gICAgICBsb2NhbGl0eV9sYl9wb2xpY3k6IHtcbiAgICAgICAgdmFsdWU6IGNka3RmLnN0cmluZ1RvSGNsVGVycmFmb3JtKHRoaXMuX2xvY2FsaXR5TGJQb2xpY3kpLFxuICAgICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICAgIH0sXG4gICAgICBuYW1lOiB7XG4gICAgICAgIHZhbHVlOiBjZGt0Zi5zdHJpbmdUb0hjbFRlcnJhZm9ybSh0aGlzLl9uYW1lKSxcbiAgICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgICB9LFxuICAgICAgbmV0d29yazoge1xuICAgICAgICB2YWx1ZTogY2RrdGYuc3RyaW5nVG9IY2xUZXJyYWZvcm0odGhpcy5fbmV0d29yayksXG4gICAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgICAgfSxcbiAgICAgIHBvcnRfbmFtZToge1xuICAgICAgICB2YWx1ZTogY2RrdGYuc3RyaW5nVG9IY2xUZXJyYWZvcm0odGhpcy5fcG9ydE5hbWUpLFxuICAgICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICAgIH0sXG4gICAgICBwcm9qZWN0OiB7XG4gICAgICAgIHZhbHVlOiBjZGt0Zi5zdHJpbmdUb0hjbFRlcnJhZm9ybSh0aGlzLl9wcm9qZWN0KSxcbiAgICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgICB9LFxuICAgICAgcHJvdG9jb2w6IHtcbiAgICAgICAgdmFsdWU6IGNka3RmLnN0cmluZ1RvSGNsVGVycmFmb3JtKHRoaXMuX3Byb3RvY29sKSxcbiAgICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgICB9LFxuICAgICAgcmVnaW9uOiB7XG4gICAgICAgIHZhbHVlOiBjZGt0Zi5zdHJpbmdUb0hjbFRlcnJhZm9ybSh0aGlzLl9yZWdpb24pLFxuICAgICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICAgIH0sXG4gICAgICBzZXNzaW9uX2FmZmluaXR5OiB7XG4gICAgICAgIHZhbHVlOiBjZGt0Zi5zdHJpbmdUb0hjbFRlcnJhZm9ybSh0aGlzLl9zZXNzaW9uQWZmaW5pdHkpLFxuICAgICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICAgIH0sXG4gICAgICB0aW1lb3V0X3NlYzoge1xuICAgICAgICB2YWx1ZTogY2RrdGYubnVtYmVyVG9IY2xUZXJyYWZvcm0odGhpcy5fdGltZW91dFNlYyksXG4gICAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIm51bWJlclwiLFxuICAgICAgfSxcbiAgICAgIGJhY2tlbmQ6IHtcbiAgICAgICAgdmFsdWU6IGNka3RmLmxpc3RNYXBwZXJIY2woY29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlQmFja2VuZFRvSGNsVGVycmFmb3JtLCB0cnVlKSh0aGlzLl9iYWNrZW5kLmludGVybmFsVmFsdWUpLFxuICAgICAgICBpc0Jsb2NrOiB0cnVlLFxuICAgICAgICB0eXBlOiBcInNldFwiLFxuICAgICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIkNvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZUJhY2tlbmRMaXN0XCIsXG4gICAgICB9LFxuICAgICAgY2RuX3BvbGljeToge1xuICAgICAgICB2YWx1ZTogY29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlQ2RuUG9saWN5VG9IY2xUZXJyYWZvcm0odGhpcy5fY2RuUG9saWN5LmludGVybmFsVmFsdWUpLFxuICAgICAgICBpc0Jsb2NrOiB0cnVlLFxuICAgICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VDZG5Qb2xpY3lMaXN0XCIsXG4gICAgICB9LFxuICAgICAgY2lyY3VpdF9icmVha2Vyczoge1xuICAgICAgICB2YWx1ZTogY29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlQ2lyY3VpdEJyZWFrZXJzVG9IY2xUZXJyYWZvcm0odGhpcy5fY2lyY3VpdEJyZWFrZXJzLmludGVybmFsVmFsdWUpLFxuICAgICAgICBpc0Jsb2NrOiB0cnVlLFxuICAgICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VDaXJjdWl0QnJlYWtlcnNMaXN0XCIsXG4gICAgICB9LFxuICAgICAgY29uc2lzdGVudF9oYXNoOiB7XG4gICAgICAgIHZhbHVlOiBjb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VDb25zaXN0ZW50SGFzaFRvSGNsVGVycmFmb3JtKHRoaXMuX2NvbnNpc3RlbnRIYXNoLmludGVybmFsVmFsdWUpLFxuICAgICAgICBpc0Jsb2NrOiB0cnVlLFxuICAgICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VDb25zaXN0ZW50SGFzaExpc3RcIixcbiAgICAgIH0sXG4gICAgICBmYWlsb3Zlcl9wb2xpY3k6IHtcbiAgICAgICAgdmFsdWU6IGNvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZUZhaWxvdmVyUG9saWN5VG9IY2xUZXJyYWZvcm0odGhpcy5fZmFpbG92ZXJQb2xpY3kuaW50ZXJuYWxWYWx1ZSksXG4gICAgICAgIGlzQmxvY2s6IHRydWUsXG4gICAgICAgIHR5cGU6IFwibGlzdFwiLFxuICAgICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIkNvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZUZhaWxvdmVyUG9saWN5TGlzdFwiLFxuICAgICAgfSxcbiAgICAgIGlhcDoge1xuICAgICAgICB2YWx1ZTogY29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlSWFwVG9IY2xUZXJyYWZvcm0odGhpcy5faWFwLmludGVybmFsVmFsdWUpLFxuICAgICAgICBpc0Jsb2NrOiB0cnVlLFxuICAgICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VJYXBMaXN0XCIsXG4gICAgICB9LFxuICAgICAgbG9nX2NvbmZpZzoge1xuICAgICAgICB2YWx1ZTogY29tcHV0ZVJlZ2lvbkJhY2tlbmRTZXJ2aWNlTG9nQ29uZmlnVG9IY2xUZXJyYWZvcm0odGhpcy5fbG9nQ29uZmlnLmludGVybmFsVmFsdWUpLFxuICAgICAgICBpc0Jsb2NrOiB0cnVlLFxuICAgICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VMb2dDb25maWdMaXN0XCIsXG4gICAgICB9LFxuICAgICAgb3V0bGllcl9kZXRlY3Rpb246IHtcbiAgICAgICAgdmFsdWU6IGNvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZU91dGxpZXJEZXRlY3Rpb25Ub0hjbFRlcnJhZm9ybSh0aGlzLl9vdXRsaWVyRGV0ZWN0aW9uLmludGVybmFsVmFsdWUpLFxuICAgICAgICBpc0Jsb2NrOiB0cnVlLFxuICAgICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJDb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VPdXRsaWVyRGV0ZWN0aW9uTGlzdFwiLFxuICAgICAgfSxcbiAgICAgIHRpbWVvdXRzOiB7XG4gICAgICAgIHZhbHVlOiBjb21wdXRlUmVnaW9uQmFja2VuZFNlcnZpY2VUaW1lb3V0c1RvSGNsVGVycmFmb3JtKHRoaXMuX3RpbWVvdXRzLmludGVybmFsVmFsdWUpLFxuICAgICAgICBpc0Jsb2NrOiB0cnVlLFxuICAgICAgICB0eXBlOiBcInN0cnVjdFwiLFxuICAgICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIkNvbXB1dGVSZWdpb25CYWNrZW5kU2VydmljZVRpbWVvdXRzXCIsXG4gICAgICB9LFxuICAgIH07XG5cbiAgICAvLyByZW1vdmUgdW5kZWZpbmVkIGF0dHJpYnV0ZXNcbiAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKGF0dHJzKS5maWx0ZXIoKFtfLCB2YWx1ZV0pID0+IHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUudmFsdWUgIT09IHVuZGVmaW5lZCApKVxuICB9XG59XG4iXX0=