rhizo-co-terraform-provider-oci
Version:
Prebuilt oci Provider for Terraform CDK (cdktf)
500 lines • 74.1 kB
JavaScript
"use strict";
var _a, _b, _c, _d, _e;
Object.defineProperty(exports, "__esModule", { value: true });
exports.DataOciAdmVulnerabilityAuditApplicationDependencyVulnerability = exports.DataOciAdmVulnerabilityAuditApplicationDependencyVulnerabilityItemsList = exports.DataOciAdmVulnerabilityAuditApplicationDependencyVulnerabilityItemsOutputReference = exports.dataOciAdmVulnerabilityAuditApplicationDependencyVulnerabilityItemsToHclTerraform = exports.dataOciAdmVulnerabilityAuditApplicationDependencyVulnerabilityItemsToTerraform = exports.DataOciAdmVulnerabilityAuditApplicationDependencyVulnerabilityItemsVulnerabilitiesList = exports.DataOciAdmVulnerabilityAuditApplicationDependencyVulnerabilityItemsVulnerabilitiesOutputReference = exports.dataOciAdmVulnerabilityAuditApplicationDependencyVulnerabilityItemsVulnerabilitiesToHclTerraform = exports.dataOciAdmVulnerabilityAuditApplicationDependencyVulnerabilityItemsVulnerabilitiesToTerraform = void 0;
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
const cdktf = require("cdktf");
function dataOciAdmVulnerabilityAuditApplicationDependencyVulnerabilityItemsVulnerabilitiesToTerraform(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 {};
}
exports.dataOciAdmVulnerabilityAuditApplicationDependencyVulnerabilityItemsVulnerabilitiesToTerraform = dataOciAdmVulnerabilityAuditApplicationDependencyVulnerabilityItemsVulnerabilitiesToTerraform;
function dataOciAdmVulnerabilityAuditApplicationDependencyVulnerabilityItemsVulnerabilitiesToHclTerraform(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 = {};
return attrs;
}
exports.dataOciAdmVulnerabilityAuditApplicationDependencyVulnerabilityItemsVulnerabilitiesToHclTerraform = dataOciAdmVulnerabilityAuditApplicationDependencyVulnerabilityItemsVulnerabilitiesToHclTerraform;
class DataOciAdmVulnerabilityAuditApplicationDependencyVulnerabilityItemsVulnerabilitiesOutputReference 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() {
let hasAnyValues = this.isEmptyObject;
const internalValueResult = {};
return hasAnyValues ? internalValueResult : undefined;
}
set internalValue(value) {
if (value === undefined) {
this.isEmptyObject = false;
}
else {
this.isEmptyObject = Object.keys(value).length === 0;
}
}
// cvss_v2score - computed: true, optional: false, required: false
get cvssV2Score() {
return this.getNumberAttribute('cvss_v2score');
}
// cvss_v3score - computed: true, optional: false, required: false
get cvssV3Score() {
return this.getNumberAttribute('cvss_v3score');
}
// id - computed: true, optional: false, required: false
get id() {
return this.getStringAttribute('id');
}
// is_false_positive - computed: true, optional: false, required: false
get isFalsePositive() {
return this.getBooleanAttribute('is_false_positive');
}
// is_ignored - computed: true, optional: false, required: false
get isIgnored() {
return this.getBooleanAttribute('is_ignored');
}
// severity - computed: true, optional: false, required: false
get severity() {
return this.getStringAttribute('severity');
}
// source - computed: true, optional: false, required: false
get source() {
return this.getStringAttribute('source');
}
}
exports.DataOciAdmVulnerabilityAuditApplicationDependencyVulnerabilityItemsVulnerabilitiesOutputReference = DataOciAdmVulnerabilityAuditApplicationDependencyVulnerabilityItemsVulnerabilitiesOutputReference;
_a = JSII_RTTI_SYMBOL_1;
DataOciAdmVulnerabilityAuditApplicationDependencyVulnerabilityItemsVulnerabilitiesOutputReference[_a] = { fqn: "rhizo-co-terraform-provider-oci.dataOciAdmVulnerabilityAuditApplicationDependencyVulnerability.DataOciAdmVulnerabilityAuditApplicationDependencyVulnerabilityItemsVulnerabilitiesOutputReference", version: "1.0.0" };
class DataOciAdmVulnerabilityAuditApplicationDependencyVulnerabilityItemsVulnerabilitiesList 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 DataOciAdmVulnerabilityAuditApplicationDependencyVulnerabilityItemsVulnerabilitiesOutputReference(this.terraformResource, this.terraformAttribute, index, this.wrapsSet);
}
}
exports.DataOciAdmVulnerabilityAuditApplicationDependencyVulnerabilityItemsVulnerabilitiesList = DataOciAdmVulnerabilityAuditApplicationDependencyVulnerabilityItemsVulnerabilitiesList;
_b = JSII_RTTI_SYMBOL_1;
DataOciAdmVulnerabilityAuditApplicationDependencyVulnerabilityItemsVulnerabilitiesList[_b] = { fqn: "rhizo-co-terraform-provider-oci.dataOciAdmVulnerabilityAuditApplicationDependencyVulnerability.DataOciAdmVulnerabilityAuditApplicationDependencyVulnerabilityItemsVulnerabilitiesList", version: "1.0.0" };
function dataOciAdmVulnerabilityAuditApplicationDependencyVulnerabilityItemsToTerraform(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 {};
}
exports.dataOciAdmVulnerabilityAuditApplicationDependencyVulnerabilityItemsToTerraform = dataOciAdmVulnerabilityAuditApplicationDependencyVulnerabilityItemsToTerraform;
function dataOciAdmVulnerabilityAuditApplicationDependencyVulnerabilityItemsToHclTerraform(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 = {};
return attrs;
}
exports.dataOciAdmVulnerabilityAuditApplicationDependencyVulnerabilityItemsToHclTerraform = dataOciAdmVulnerabilityAuditApplicationDependencyVulnerabilityItemsToHclTerraform;
class DataOciAdmVulnerabilityAuditApplicationDependencyVulnerabilityItemsOutputReference 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;
// vulnerabilities - computed: true, optional: false, required: false
this._vulnerabilities = new DataOciAdmVulnerabilityAuditApplicationDependencyVulnerabilityItemsVulnerabilitiesList(this, "vulnerabilities", false);
}
get internalValue() {
let hasAnyValues = this.isEmptyObject;
const internalValueResult = {};
return hasAnyValues ? internalValueResult : undefined;
}
set internalValue(value) {
if (value === undefined) {
this.isEmptyObject = false;
}
else {
this.isEmptyObject = Object.keys(value).length === 0;
}
}
// application_dependency_node_ids - computed: true, optional: false, required: false
get applicationDependencyNodeIds() {
return this.getListAttribute('application_dependency_node_ids');
}
// gav - computed: true, optional: false, required: false
get gav() {
return this.getStringAttribute('gav');
}
// is_found_in_knowledge_base - computed: true, optional: false, required: false
get isFoundInKnowledgeBase() {
return this.getBooleanAttribute('is_found_in_knowledge_base');
}
// node_id - computed: true, optional: false, required: false
get nodeId() {
return this.getStringAttribute('node_id');
}
// purl - computed: true, optional: false, required: false
get purl() {
return this.getStringAttribute('purl');
}
get vulnerabilities() {
return this._vulnerabilities;
}
}
exports.DataOciAdmVulnerabilityAuditApplicationDependencyVulnerabilityItemsOutputReference = DataOciAdmVulnerabilityAuditApplicationDependencyVulnerabilityItemsOutputReference;
_c = JSII_RTTI_SYMBOL_1;
DataOciAdmVulnerabilityAuditApplicationDependencyVulnerabilityItemsOutputReference[_c] = { fqn: "rhizo-co-terraform-provider-oci.dataOciAdmVulnerabilityAuditApplicationDependencyVulnerability.DataOciAdmVulnerabilityAuditApplicationDependencyVulnerabilityItemsOutputReference", version: "1.0.0" };
class DataOciAdmVulnerabilityAuditApplicationDependencyVulnerabilityItemsList 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 DataOciAdmVulnerabilityAuditApplicationDependencyVulnerabilityItemsOutputReference(this.terraformResource, this.terraformAttribute, index, this.wrapsSet);
}
}
exports.DataOciAdmVulnerabilityAuditApplicationDependencyVulnerabilityItemsList = DataOciAdmVulnerabilityAuditApplicationDependencyVulnerabilityItemsList;
_d = JSII_RTTI_SYMBOL_1;
DataOciAdmVulnerabilityAuditApplicationDependencyVulnerabilityItemsList[_d] = { fqn: "rhizo-co-terraform-provider-oci.dataOciAdmVulnerabilityAuditApplicationDependencyVulnerability.DataOciAdmVulnerabilityAuditApplicationDependencyVulnerabilityItemsList", version: "1.0.0" };
/**
* Represents a {@link https://registry.terraform.io/providers/oracle/oci/6.18.0/docs/data-sources/adm_vulnerability_audit_application_dependency_vulnerability oci_adm_vulnerability_audit_application_dependency_vulnerability}
*/
class DataOciAdmVulnerabilityAuditApplicationDependencyVulnerability extends cdktf.TerraformDataSource {
// ==============
// STATIC Methods
// ==============
/**
* Generates CDKTF code for importing a DataOciAdmVulnerabilityAuditApplicationDependencyVulnerability 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 DataOciAdmVulnerabilityAuditApplicationDependencyVulnerability to import
* @param importFromId The id of the existing DataOciAdmVulnerabilityAuditApplicationDependencyVulnerability that should be imported. Refer to the {@link https://registry.terraform.io/providers/oracle/oci/6.18.0/docs/data-sources/adm_vulnerability_audit_application_dependency_vulnerability#import import section} in the documentation of this resource for the id to use
* @param provider? Optional instance of the provider where the DataOciAdmVulnerabilityAuditApplicationDependencyVulnerability to import is found
*/
static generateConfigForImport(scope, importToId, importFromId, provider) {
return new cdktf.ImportableResource(scope, importToId, { terraformResourceType: "oci_adm_vulnerability_audit_application_dependency_vulnerability", importId: importFromId, provider });
}
// ===========
// INITIALIZER
// ===========
/**
* Create a new {@link https://registry.terraform.io/providers/oracle/oci/6.18.0/docs/data-sources/adm_vulnerability_audit_application_dependency_vulnerability oci_adm_vulnerability_audit_application_dependency_vulnerability} Data Source
*
* @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 DataOciAdmVulnerabilityAuditApplicationDependencyVulnerabilityConfig
*/
constructor(scope, id, config) {
super(scope, id, {
terraformResourceType: 'oci_adm_vulnerability_audit_application_dependency_vulnerability',
terraformGeneratorMetadata: {
providerName: 'oci',
providerVersion: '6.18.0',
providerVersionConstraint: '~> 6.18.0'
},
provider: config.provider,
dependsOn: config.dependsOn,
count: config.count,
lifecycle: config.lifecycle,
provisioners: config.provisioners,
connection: config.connection,
forEach: config.forEach
});
// items - computed: true, optional: false, required: false
this._items = new DataOciAdmVulnerabilityAuditApplicationDependencyVulnerabilityItemsList(this, "items", false);
this._cvssV2GreaterThanOrEqual = config.cvssV2GreaterThanOrEqual;
this._cvssV3GreaterThanOrEqual = config.cvssV3GreaterThanOrEqual;
this._depth = config.depth;
this._gav = config.gav;
this._id = config.id;
this._purl = config.purl;
this._rootNodeId = config.rootNodeId;
this._severityGreaterThanOrEqual = config.severityGreaterThanOrEqual;
this._sortBy = config.sortBy;
this._vulnerabilityAuditId = config.vulnerabilityAuditId;
this._vulnerabilityId = config.vulnerabilityId;
}
get cvssV2GreaterThanOrEqual() {
return this.getNumberAttribute('cvss_v2greater_than_or_equal');
}
set cvssV2GreaterThanOrEqual(value) {
this._cvssV2GreaterThanOrEqual = value;
}
resetCvssV2GreaterThanOrEqual() {
this._cvssV2GreaterThanOrEqual = undefined;
}
// Temporarily expose input value. Use with caution.
get cvssV2GreaterThanOrEqualInput() {
return this._cvssV2GreaterThanOrEqual;
}
get cvssV3GreaterThanOrEqual() {
return this.getNumberAttribute('cvss_v3greater_than_or_equal');
}
set cvssV3GreaterThanOrEqual(value) {
this._cvssV3GreaterThanOrEqual = value;
}
resetCvssV3GreaterThanOrEqual() {
this._cvssV3GreaterThanOrEqual = undefined;
}
// Temporarily expose input value. Use with caution.
get cvssV3GreaterThanOrEqualInput() {
return this._cvssV3GreaterThanOrEqual;
}
get depth() {
return this.getNumberAttribute('depth');
}
set depth(value) {
this._depth = value;
}
resetDepth() {
this._depth = undefined;
}
// Temporarily expose input value. Use with caution.
get depthInput() {
return this._depth;
}
get gav() {
return this.getStringAttribute('gav');
}
set gav(value) {
this._gav = value;
}
resetGav() {
this._gav = undefined;
}
// Temporarily expose input value. Use with caution.
get gavInput() {
return this._gav;
}
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 items() {
return this._items;
}
get purl() {
return this.getStringAttribute('purl');
}
set purl(value) {
this._purl = value;
}
resetPurl() {
this._purl = undefined;
}
// Temporarily expose input value. Use with caution.
get purlInput() {
return this._purl;
}
get rootNodeId() {
return this.getStringAttribute('root_node_id');
}
set rootNodeId(value) {
this._rootNodeId = value;
}
resetRootNodeId() {
this._rootNodeId = undefined;
}
// Temporarily expose input value. Use with caution.
get rootNodeIdInput() {
return this._rootNodeId;
}
get severityGreaterThanOrEqual() {
return this.getStringAttribute('severity_greater_than_or_equal');
}
set severityGreaterThanOrEqual(value) {
this._severityGreaterThanOrEqual = value;
}
resetSeverityGreaterThanOrEqual() {
this._severityGreaterThanOrEqual = undefined;
}
// Temporarily expose input value. Use with caution.
get severityGreaterThanOrEqualInput() {
return this._severityGreaterThanOrEqual;
}
get sortBy() {
return this.getStringAttribute('sort_by');
}
set sortBy(value) {
this._sortBy = value;
}
resetSortBy() {
this._sortBy = undefined;
}
// Temporarily expose input value. Use with caution.
get sortByInput() {
return this._sortBy;
}
get vulnerabilityAuditId() {
return this.getStringAttribute('vulnerability_audit_id');
}
set vulnerabilityAuditId(value) {
this._vulnerabilityAuditId = value;
}
// Temporarily expose input value. Use with caution.
get vulnerabilityAuditIdInput() {
return this._vulnerabilityAuditId;
}
get vulnerabilityId() {
return this.getStringAttribute('vulnerability_id');
}
set vulnerabilityId(value) {
this._vulnerabilityId = value;
}
resetVulnerabilityId() {
this._vulnerabilityId = undefined;
}
// Temporarily expose input value. Use with caution.
get vulnerabilityIdInput() {
return this._vulnerabilityId;
}
// =========
// SYNTHESIS
// =========
synthesizeAttributes() {
return {
cvss_v2greater_than_or_equal: cdktf.numberToTerraform(this._cvssV2GreaterThanOrEqual),
cvss_v3greater_than_or_equal: cdktf.numberToTerraform(this._cvssV3GreaterThanOrEqual),
depth: cdktf.numberToTerraform(this._depth),
gav: cdktf.stringToTerraform(this._gav),
id: cdktf.stringToTerraform(this._id),
purl: cdktf.stringToTerraform(this._purl),
root_node_id: cdktf.stringToTerraform(this._rootNodeId),
severity_greater_than_or_equal: cdktf.stringToTerraform(this._severityGreaterThanOrEqual),
sort_by: cdktf.stringToTerraform(this._sortBy),
vulnerability_audit_id: cdktf.stringToTerraform(this._vulnerabilityAuditId),
vulnerability_id: cdktf.stringToTerraform(this._vulnerabilityId),
};
}
synthesizeHclAttributes() {
const attrs = {
cvss_v2greater_than_or_equal: {
value: cdktf.numberToHclTerraform(this._cvssV2GreaterThanOrEqual),
isBlock: false,
type: "simple",
storageClassType: "number",
},
cvss_v3greater_than_or_equal: {
value: cdktf.numberToHclTerraform(this._cvssV3GreaterThanOrEqual),
isBlock: false,
type: "simple",
storageClassType: "number",
},
depth: {
value: cdktf.numberToHclTerraform(this._depth),
isBlock: false,
type: "simple",
storageClassType: "number",
},
gav: {
value: cdktf.stringToHclTerraform(this._gav),
isBlock: false,
type: "simple",
storageClassType: "string",
},
id: {
value: cdktf.stringToHclTerraform(this._id),
isBlock: false,
type: "simple",
storageClassType: "string",
},
purl: {
value: cdktf.stringToHclTerraform(this._purl),
isBlock: false,
type: "simple",
storageClassType: "string",
},
root_node_id: {
value: cdktf.stringToHclTerraform(this._rootNodeId),
isBlock: false,
type: "simple",
storageClassType: "string",
},
severity_greater_than_or_equal: {
value: cdktf.stringToHclTerraform(this._severityGreaterThanOrEqual),
isBlock: false,
type: "simple",
storageClassType: "string",
},
sort_by: {
value: cdktf.stringToHclTerraform(this._sortBy),
isBlock: false,
type: "simple",
storageClassType: "string",
},
vulnerability_audit_id: {
value: cdktf.stringToHclTerraform(this._vulnerabilityAuditId),
isBlock: false,
type: "simple",
storageClassType: "string",
},
vulnerability_id: {
value: cdktf.stringToHclTerraform(this._vulnerabilityId),
isBlock: false,
type: "simple",
storageClassType: "string",
},
};
// remove undefined attributes
return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
}
}
exports.DataOciAdmVulnerabilityAuditApplicationDependencyVulnerability = DataOciAdmVulnerabilityAuditApplicationDependencyVulnerability;
_e = JSII_RTTI_SYMBOL_1;
DataOciAdmVulnerabilityAuditApplicationDependencyVulnerability[_e] = { fqn: "rhizo-co-terraform-provider-oci.dataOciAdmVulnerabilityAuditApplicationDependencyVulnerability.DataOciAdmVulnerabilityAuditApplicationDependencyVulnerability", version: "1.0.0" };
// =================
// STATIC PROPERTIES
// =================
DataOciAdmVulnerabilityAuditApplicationDependencyVulnerability.tfResourceType = "oci_adm_vulnerability_audit_application_dependency_vulnerability";
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZGF0YS1vY2ktYWRtLXZ1bG5lcmFiaWxpdHktYXVkaXQtYXBwbGljYXRpb24tZGVwZW5kZW5jeS12dWxuZXJhYmlsaXR5L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBSUEsK0JBQStCO0FBd0QvQixTQUFnQiw2RkFBNkYsQ0FBQyxNQUEyRjtJQUN2TSxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQUMsT0FBTyxNQUFNLENBQUM7SUFBQyxDQUFDO0lBQzVGLElBQUksS0FBSyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDbkMsTUFBTSxJQUFJLEtBQUssQ0FBQyxvSEFBb0gsQ0FBQyxDQUFDO0lBQ3hJLENBQUM7SUFDRCxPQUFPLEVBQ04sQ0FBQTtBQUNILENBQUM7QUFQRCxzTUFPQztBQUdELFNBQWdCLGdHQUFnRyxDQUFDLE1BQTJGO0lBQzFNLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFBQyxPQUFPLE1BQU0sQ0FBQztJQUFDLENBQUM7SUFDNUYsSUFBSSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUNuQyxNQUFNLElBQUksS0FBSyxDQUFDLG9IQUFvSCxDQUFDLENBQUM7SUFDeEksQ0FBQztJQUNELE1BQU0sS0FBSyxHQUFHLEVBQ2IsQ0FBQztJQUNGLE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQVJELDRNQVFDO0FBRUQsTUFBYSxpR0FBa0csU0FBUSxLQUFLLENBQUMsYUFBYTtJQUd4STs7Ozs7TUFLRTtJQUNGLFlBQW1C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QUUsQ0FBQyxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssQ0FBQyxLQUFLLEtBQUssU0FBUyxDQUFFLENBQUMsQ0FBQTtJQUM1SCxDQUFDOztBQWhWSCx3SUFpVkM7OztBQS9VQyxvQkFBb0I7QUFDcEIsb0JBQW9CO0FBQ3BCLG9CQUFvQjtBQUNHLDZFQUFjLEdBQUcsa0VBQWtFLEFBQXJFLENBQXNFIiwic291cmNlc0NvbnRlbnQiOlsiLy8gaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL29yYWNsZS9vY2kvNi4xOC4wL2RvY3MvZGF0YS1zb3VyY2VzL2FkbV92dWxuZXJhYmlsaXR5X2F1ZGl0X2FwcGxpY2F0aW9uX2RlcGVuZGVuY3lfdnVsbmVyYWJpbGl0eVxuLy8gZ2VuZXJhdGVkIGZyb20gdGVycmFmb3JtIHJlc291cmNlIHNjaGVtYVxuXG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCAqIGFzIGNka3RmIGZyb20gJ2Nka3RmJztcblxuLy8gQ29uZmlndXJhdGlvblxuXG5leHBvcnQgaW50ZXJmYWNlIERhdGFPY2lBZG1WdWxuZXJhYmlsaXR5QXVkaXRBcHBsaWNhdGlvbkRlcGVuZGVuY3lWdWxuZXJhYmlsaXR5Q29uZmlnIGV4dGVuZHMgY2RrdGYuVGVycmFmb3JtTWV0YUFyZ3VtZW50cyB7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL29yYWNsZS9vY2kvNi4xOC4wL2RvY3MvZGF0YS1zb3VyY2VzL2FkbV92dWxuZXJhYmlsaXR5X2F1ZGl0X2FwcGxpY2F0aW9uX2RlcGVuZGVuY3lfdnVsbmVyYWJpbGl0eSNjdnNzX3YyZ3JlYXRlcl90aGFuX29yX2VxdWFsIERhdGFPY2lBZG1WdWxuZXJhYmlsaXR5QXVkaXRBcHBsaWNhdGlvbkRlcGVuZGVuY3lWdWxuZXJhYmlsaXR5I2N2c3NfdjJncmVhdGVyX3RoYW5fb3JfZXF1YWx9XG4gICovXG4gIHJlYWRvbmx5IGN2c3NWMkdyZWF0ZXJUaGFuT3JFcXVhbD86IG51bWJlcjtcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvb3JhY2xlL29jaS82LjE4LjAvZG9jcy9kYXRhLXNvdXJjZXMvYWRtX3Z1bG5lcmFiaWxpdHlfYXVkaXRfYXBwbGljYXRpb25fZGVwZW5kZW5jeV92dWxuZXJhYmlsaXR5I2N2c3NfdjNncmVhdGVyX3RoYW5fb3JfZXF1YWwgRGF0YU9jaUFkbVZ1bG5lcmFiaWxpdHlBdWRpdEFwcGxpY2F0aW9uRGVwZW5kZW5jeVZ1bG5lcmFiaWxpdHkjY3Zzc192M2dyZWF0ZXJfdGhhbl9vcl9lcXVhbH1cbiAgKi9cbiAgcmVhZG9ubHkgY3Zzc1YzR3JlYXRlclRoYW5PckVxdWFsPzogbnVtYmVyO1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9vcmFjbGUvb2NpLzYuMTguMC9kb2NzL2RhdGEtc291cmNlcy9hZG1fdnVsbmVyYWJpbGl0eV9hdWRpdF9hcHBsaWNhdGlvbl9kZXBlbmRlbmN5X3Z1bG5lcmFiaWxpdHkjZGVwdGggRGF0YU9jaUFkbVZ1bG5lcmFiaWxpdHlBdWRpdEFwcGxpY2F0aW9uRGVwZW5kZW5jeVZ1bG5lcmFiaWxpdHkjZGVwdGh9XG4gICovXG4gIHJlYWRvbmx5IGRlcHRoPzogbnVtYmVyO1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9vcmFjbGUvb2NpLzYuMTguMC9kb2NzL2RhdGEtc291cmNlcy9hZG1fdnVsbmVyYWJpbGl0eV9hdWRpdF9hcHBsaWNhdGlvbl9kZXBlbmRlbmN5X3Z1bG5lcmFiaWxpdHkjZ2F2IERhdGFPY2lBZG1WdWxuZXJhYmlsaXR5QXVkaXRBcHBsaWNhdGlvbkRlcGVuZGVuY3lWdWxuZXJhYmlsaXR5I2dhdn1cbiAgKi9cbiAgcmVhZG9ubHkgZ2F2Pzogc3RyaW5nO1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9vcmFjbGUvb2NpLzYuMTguMC9kb2NzL2RhdGEtc291cmNlcy9hZG1fdnVsbmVyYWJpbGl0eV9hdWRpdF9hcHBsaWNhdGlvbl9kZXBlbmRlbmN5X3Z1bG5lcmFiaWxpdHkjaWQgRGF0YU9jaUFkbVZ1bG5lcmFiaWxpdHlBdWRpdEFwcGxpY2F0aW9uRGVwZW5kZW5jeVZ1bG5lcmFiaWxpdHkjaWR9XG4gICpcbiAgKiBQbGVhc2UgYmUgYXdhcmUgdGhhdCB0aGUgaWQgZmllbGQgaXMgYXV0b21hdGljYWxseSBhZGRlZCB0byBhbGwgcmVzb3VyY2VzIGluIFRlcnJhZm9ybSBwcm92aWRlcnMgdXNpbmcgYSBUZXJyYWZvcm0gcHJvdmlkZXIgU0RLIHZlcnNpb24gYmVsb3cgMi5cbiAgKiBJZiB5b3UgZXhwZXJpZW5jZSBwcm9ibGVtcyBzZXR0aW5nIHRoaXMgdmFsdWUgaXQgbWlnaHQgbm90IGJlIHNldHRhYmxlLiBQbGVhc2UgdGFrZSBhIGxvb2sgYXQgdGhlIHByb3ZpZGVyIGRvY3VtZW50YXRpb24gdG8gZW5zdXJlIGl0IHNob3VsZCBiZSBzZXR0YWJsZS5cbiAgKi9cbiAgcmVhZG9ubHkgaWQ/OiBzdHJpbmc7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL29yYWNsZS9vY2kvNi4xOC4wL2RvY3MvZGF0YS1zb3VyY2VzL2FkbV92dWxuZXJhYmlsaXR5X2F1ZGl0X2FwcGxpY2F0aW9uX2RlcGVuZGVuY3lfdnVsbmVyYWJpbGl0eSNwdXJsIERhdGFPY2lBZG1WdWxuZXJhYmlsaXR5QXVkaXRBcHBsaWNhdGlvbkRlcGVuZGVuY3lWdWxuZXJhYmlsaXR5I3B1cmx9XG4gICovXG4gIHJlYWRvbmx5IHB1cmw/OiBzdHJpbmc7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL29yYWNsZS9vY2kvNi4xOC4wL2RvY3MvZGF0YS1zb3VyY2VzL2FkbV92dWxuZXJhYmlsaXR5X2F1ZGl0X2FwcGxpY2F0aW9uX2RlcGVuZGVuY3lfdnVsbmVyYWJpbGl0eSNyb290X25vZGVfaWQgRGF0YU9jaUFkbVZ1bG5lcmFiaWxpdHlBdWRpdEFwcGxpY2F0aW9uRGVwZW5kZW5jeVZ1bG5lcmFiaWxpdHkjcm9vdF9ub2RlX2lkfVxuICAqL1xuICByZWFkb25seSByb290Tm9kZUlkPzogc3RyaW5nO1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9vcmFjbGUvb2NpLzYuMTguMC9kb2NzL2RhdGEtc291cmNlcy9hZG1fdnVsbmVyYWJpbGl0eV9hdWRpdF9hcHBsaWNhdGlvbl9kZXBlbmRlbmN5X3Z1bG5lcmFiaWxpdHkjc2V2ZXJpdHlfZ3JlYXRlcl90aGFuX29yX2VxdWFsIERhdGFPY2lBZG1WdWxuZXJhYmlsaXR5QXVkaXRBcHBsaWNhdGlvbkRlcGVuZGVuY3lWdWxuZXJhYmlsaXR5I3NldmVyaXR5X2dyZWF0ZXJfdGhhbl9vcl9lcXVhbH1cbiAgKi9cbiAgcmVhZG9ubHkgc2V2ZXJpdHlHcmVhdGVyVGhhbk9yRXF1YWw/OiBzdHJpbmc7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL29yYWNsZS9vY2kvNi4xOC4wL2RvY3MvZGF0YS1zb3VyY2VzL2FkbV92dWxuZXJhYmlsaXR5X2F1ZGl0X2FwcGxpY2F0aW9uX2RlcGVuZGVuY3lfdnVsbmVyYWJpbGl0eSNzb3J0X2J5IERhdGFPY2lBZG1WdWxuZXJhYmlsaXR5QXVkaXRBcHBsaWNhdGlvbkRlcGVuZGVuY3lWdWxuZXJhYmlsaXR5I3NvcnRfYnl9XG4gICovXG4gIHJlYWRvbmx5IHNvcnRCeT86IHN0cmluZztcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvb3JhY2xlL29jaS82LjE4LjAvZG9jcy9kYXRhLXNvdXJjZXMvYWRtX3Z1bG5lcmFiaWxpdHlfYXVkaXRfYXBwbGljYXRpb25fZGVwZW5kZW5jeV92dWxuZXJhYmlsaXR5I3Z1bG5lcmFiaWxpdHlfYXVkaXRfaWQgRGF0YU9jaUFkbVZ1bG5lcmFiaWxpdHlBdWRpdEFwcGxpY2F0aW9uRGVwZW5kZW5jeVZ1bG5lcmFiaWxpdHkjdnVsbmVyYWJpbGl0eV9hdWRpdF9pZH1cbiAgKi9cbiAgcmVhZG9ubHkgdnVsbmVyYWJpbGl0eUF1ZGl0SWQ6IHN0cmluZztcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvb3JhY2xlL29jaS82LjE4LjAvZG9jcy9kYXRhLXNvdXJjZXMvYWRtX3Z1bG5lcmFiaWxpdHlfYXVkaXRfYXBwbGljYXRpb25fZGVwZW5kZW5jeV92dWxuZXJhYmlsaXR5I3Z1bG5lcmFiaWxpdHlfaWQgRGF0YU9jaUFkbVZ1bG5lcmFiaWxpdHlBdWRpdEFwcGxpY2F0aW9uRGVwZW5kZW5jeVZ1bG5lcmFiaWxpdHkjdnVsbmVyYWJpbGl0eV9pZH1cbiAgKi9cbiAgcmVhZG9ubHkgdnVsbmVyYWJpbGl0eUlkPzogc3RyaW5nO1xufVxuZXhwb3J0IGludGVyZmFjZSBEYXRhT2NpQWRtVnVsbmVyYWJpbGl0eUF1ZGl0QXBwbGljYXRpb25EZXBlbmRlbmN5VnVsbmVyYWJpbGl0eUl0ZW1zVnVsbmVyYWJpbGl0aWVzIHtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRhdGFPY2lBZG1WdWxuZXJhYmlsaXR5QXVkaXRBcHBsaWNhdGlvbkRlcGVuZGVuY3lWdWxuZXJhYmlsaXR5SXRlbXNWdWxuZXJhYmlsaXRpZXNUb1RlcnJhZm9ybShzdHJ1Y3Q/OiBEYXRhT2NpQWRtVnVsbmVyYWJpbGl0eUF1ZGl0QXBwbGljYXRpb25EZXBlbmRlbmN5VnVsbmVyYWJpbGl0eUl0ZW1zVnVsbmVyYWJpbGl0aWVzKTogYW55IHtcbiAgaWYgKCFjZGt0Zi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdGYuVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RmLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICByZXR1cm4ge1xuICB9XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGRhdGFPY2lBZG1WdWxuZXJhYmlsaXR5QXVkaXRBcHBsaWNhdGlvbkRlcGVuZGVuY3lWdWxuZXJhYmlsaXR5SXRlbXNWdWxuZXJhYmlsaXRpZXNUb0hjbFRlcnJhZm9ybShzdHJ1Y3Q/OiBEYXRhT2NpQWRtVnVsbmVyYWJpbGl0eUF1ZGl0QXBwbGljYXRpb25EZXBlbmRlbmN5VnVsbmVyYWJpbGl0eUl0ZW1zVnVsbmVyYWJpbGl0aWVzKTogYW55IHtcbiAgaWYgKCFjZGt0Zi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdGYuVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RmLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICBjb25zdCBhdHRycyA9IHtcbiAgfTtcbiAgcmV0dXJuIGF0dHJzO1xufVxuXG5leHBvcnQgY2xhc3MgRGF0YU9jaUFkbVZ1bG5lcmFiaWxpdHlBdWRpdEFwcGxpY2F0aW9uRGVwZW5kZW5jeVZ1bG5lcmFiaWxpdHlJdGVtc1Z1bG5lcmFiaWxpdGllc091dHB1dFJlZmVyZW5jZSBleHRlbmRzIGNka3RmLkNvbXBsZXhPYmplY3Qge1xuICBwcml2YXRlIGlzRW1wdHlPYmplY3QgPSBmYWxzZTtcblxuICAvKipcbiAgKiBAcGFyYW0gdGVycmFmb3JtUmVzb3VyY2UgVGhlIHBhcmVudCByZXNvdXJjZVxuICAqIEBwYXJhbSB0ZXJyYWZvcm1BdHRyaWJ1dGUgVGhlIGF0dHJpYnV0ZSBvbiB0aGUgcGFyZW50IHJlc291cmNlIHRoaXMgY2xhc3MgaXMgcmVmZXJlbmNpbmdcbiAgKiBAcGFyYW0gY29tcGxleE9iamVjdEluZGV4IHRoZSBpbmRleCBvZiB0aGlzIGl0ZW0gaW4gdGhlIGxpc3RcbiAgKiBAcGFyYW0gY29tcGxleE9iamVjdElzRnJvbVNldCB3aGV0aGVyIHRoZSBsaXN0IGlzIHdyYXBwaW5nIGEgc2V0ICh3aWxsIGFkZCB0b2xpc3QoKSB0byBiZSBhYmxlIHRvIGFjY2VzcyBhbiBpdGVtIHZpYSBhbiBpbmRleClcbiAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHRlcnJhZm9ybVJlc291cmNlOiBjZGt0Zi5JSW50ZXJwb2xhdGluZ1BhcmVudCwgdGVycmFmb3JtQXR0cmlidXRlOiBzdHJpbmcsIGNvbXBsZXhPYmplY3RJbmRleDogbnVtYmVyLCBjb21wbGV4T2JqZWN0SXNGcm9tU2V0OiBib29sZWFuKSB7XG4gICAgc3VwZXIodGVycmFmb3JtUmVzb3VyY2UsIHRlcnJhZm9ybUF0dHJpYnV0ZSwgY29tcGxleE9iamVjdElzRnJvbVNldCwgY29tcGxleE9iamVjdEluZGV4KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW50ZXJuYWxWYWx1ZSgpOiBEYXRhT2NpQWRtVnVsbmVyYWJpbGl0eUF1ZGl0QXBwbGljYXRpb25EZXBlbmRlbmN5VnVsbmVyYWJpbGl0eUl0ZW1zVnVsbmVyYWJpbGl0aWVzIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgaGFzQW55VmFsdWVzID0gdGhpcy5pc0VtcHR5T2JqZWN0O1xuICAgIGNvbnN0IGludGVybmFsVmFsdWVSZXN1bHQ6IGFueSA9IHt9O1xuICAgIHJldHVybiBoYXNBbnlWYWx1ZXMgPyBpbnRlcm5hbFZhbHVlUmVzdWx0IDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHNldCBpbnRlcm5hbFZhbHVlKHZhbHVlOiBEYXRhT2NpQWRtVnVsbmVyYWJpbGl0eUF1ZGl0QXBwbGljYXRpb25EZXBlbmRlbmN5VnVsbmVyYWJpbGl0eUl0ZW1zVnVsbmVyYWJpbGl0aWVzIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGggPT09IDA7XG4gICAgfVxuICB9XG5cbiAgLy8gY3Zzc192MnNjb3JlIC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHB1YmxpYyBnZXQgY3Zzc1YyU2NvcmUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TnVtYmVyQXR0cmlidXRlKCdjdnNzX3Yyc2NvcmUnKTtcbiAgfVxuXG4gIC8vIGN2c3NfdjNzY29yZSAtIGNvbXB1dGVkOiB0cnVlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiBmYWxzZVxuICBwdWJsaWMgZ2V0IGN2c3NWM1Njb3JlKCkge1xuICAgIHJldHVybiB0aGlzLmdldE51bWJlckF0dHJpYnV0ZSgnY3Zzc192M3Njb3JlJyk7XG4gIH1cblxuICAvLyBpZCAtIGNvbXB1dGVkOiB0cnVlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiBmYWxzZVxuICBwdWJsaWMgZ2V0IGlkKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnaWQnKTtcbiAgfVxuXG4gIC8vIGlzX2ZhbHNlX3Bvc2l0aXZlIC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHB1YmxpYyBnZXQgaXNGYWxzZVBvc2l0aXZlKCkge1xuICAgIHJldHVybiB0aGlzLmdldEJvb2xlYW5BdHRyaWJ1dGUoJ2lzX2ZhbHNlX3Bvc2l0aXZlJyk7XG4gIH1cblxuICAvLyBpc19pZ25vcmVkIC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHB1YmxpYyBnZXQgaXNJZ25vcmVkKCkge1xuICAgIHJldHVybiB0aGlzLmdldEJvb2xlYW5BdHRyaWJ1dGUoJ2lzX2lnbm9yZWQnKTtcbiAgfVxuXG4gIC8vIHNldmVyaXR5IC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHB1YmxpYyBnZXQgc2V2ZXJpdHkoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdzZXZlcml0eScpO1xuICB9XG5cbiAgLy8gc291cmNlIC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHB1YmxpYyBnZXQgc291cmNlKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnc291cmNlJyk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIERhdGFPY2lBZG1WdWxuZXJhYmlsaXR5QXVkaXRBcHBsaWNhdGlvbkRlcGVuZGVuY3lWdWxuZXJhYmlsaXR5SXRlbXNWdWxuZXJhYmlsaXRpZXNMaXN0IGV4dGVuZHMgY2RrdGYuQ29tcGxleExpc3Qge1xuXG4gIC8qKlxuICAqIEBwYXJhbSB0ZXJyYWZvcm1SZXNvdXJjZSBUaGUgcGFyZW50IHJlc291cmNlXG4gICogQHBhcmFtIHRlcnJhZm9ybUF0dHJpYnV0ZSBUaGUgYXR0cmlidXRlIG9uIHRoZSBwYXJlbnQgcmVzb3VyY2UgdGhpcyBjbGFzcyBpcyByZWZlcmVuY2luZ1xuICAqIEBwYXJhbSB3cmFwc1NldCB3aGV0aGVyIHRoZSBsaXN0IGlzIHdyYXBwaW5nIGEgc2V0ICh3aWxsIGFkZCB0b2xpc3QoKSB0byBiZSBhYmxlIHRvIGFjY2VzcyBhbiBpdGVtIHZpYSBhbiBpbmRleClcbiAgKi9cbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIHRlcnJhZm9ybVJlc291cmNlOiBjZGt0Zi5JSW50ZXJwb2xhdGluZ1BhcmVudCwgcHJvdGVjdGVkIHRlcnJhZm9ybUF0dHJpYnV0ZTogc3RyaW5nLCBwcm90ZWN0ZWQgd3JhcHNTZXQ6IGJvb2xlYW4pIHtcbiAgICBzdXBlcih0ZXJyYWZvcm1SZXNvdXJjZSwgdGVycmFmb3JtQXR0cmlidXRlLCB3cmFwc1NldClcbiAgfVxuXG4gIC8qKlxuICAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggb2YgdGhlIGl0ZW0gdG8gcmV0dXJuXG4gICovXG4gIHB1YmxpYyBnZXQoaW5kZXg6IG51bWJlcik6IERhdGFPY2lBZG1WdWxuZXJhYmlsaXR5QXVkaXRBcHBsaWNhdGlvbkRlcGVuZGVuY3lWdWxuZXJhYmlsaXR5SXRlbXNWdWxuZXJhYmlsaXRpZXNPdXRwdXRSZWZlcmVuY2Uge1xuICAgIHJldHVybiBuZXcgRGF0YU9jaUFkbVZ1bG5lcmFiaWxpdHlBdWRpdEFwcGxpY2F0aW9uRGVwZW5kZW5jeVZ1bG5lcmFiaWxpdHlJdGVtc1Z1bG5lcmFiaWxpdGllc091dHB1dFJlZmVyZW5jZSh0aGlzLnRlcnJhZm9ybVJlc291cmNlLCB0aGlzLnRlcnJhZm9ybUF0dHJpYnV0ZSwgaW5kZXgsIHRoaXMud3JhcHNTZXQpO1xuICB9XG59XG5leHBvcnQgaW50ZXJmYWNlIERhdGFPY2lBZG1WdWxuZXJhYmlsaXR5QXVkaXRBcHBsaWNhdGlvbkRlcGVuZGVuY3lWdWxuZXJhYmlsaXR5SXRlbXMge1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGF0YU9jaUFkbVZ1bG5lcmFiaWxpdHlBdWRpdEFwcGxpY2F0aW9uRGVwZW5kZW5jeVZ1bG5lcmFiaWxpdHlJdGVtc1RvVGVycmFmb3JtKHN0cnVjdD86IERhdGFPY2lBZG1WdWxuZXJhYmlsaXR5QXVkaXRBcHBsaWNhdGlvbkRlcGVuZGVuY3lWdWxuZXJhYmlsaXR5SXRlbXMpOiBhbnkge1xuICBpZiAoIWNka3RmLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0Zi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdGYuaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIHJldHVybiB7XG4gIH1cbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gZGF0YU9jaUFkbVZ1bG5lcmFiaWxpdHlBdWRpdEFwcGxpY2F0aW9uRGVwZW5kZW5jeVZ1bG5lcmFiaWxpdHlJdGVtc1RvSGNsVGVycmFmb3JtKHN0cnVjdD86IERhdGFPY2lBZG1WdWxuZXJhYmlsaXR5QXVkaXRBcHBsaWNhdGlvbkRlcGVuZGVuY3lWdWxuZXJhYmlsaXR5SXRlbXMpOiBhbnkge1xuICBpZiAoIWNka3RmLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0Zi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdGYuaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIGNvbnN0IGF0dHJzID0ge1xuICB9O1xuICByZXR1cm4gYXR0cnM7XG59XG5cbmV4cG9ydCBjbGFzcyBEYXRhT2NpQWRtVnVsbmVyYWJpbGl0eUF1ZGl0QXBwbGljYXRpb25EZXBlbmRlbmN5VnVsbmVyYWJpbGl0eUl0ZW1zT3V0cHV0UmVmZXJlbmNlIGV4dGVuZHMgY2RrdGYuQ29tcGxleE9iamVjdCB7XG4gIHByaXZhdGUgaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuXG4gIC8qKlxuICAqIEBwYXJhbSB0ZXJyYWZvcm1SZXNvdXJjZSBUaGUgcGFyZW50IHJlc291cmNlXG4gICogQHBhcmFtIHRlcnJhZm9ybUF0dHJpYnV0ZSBUaGUgYXR0cmlidXRlIG9uIHRoZSBwYXJlbnQgcmVzb3VyY2UgdGhpcyBjbGFzcyBpcyByZWZlcmVuY2luZ1xuICAqIEBwYXJhbSBjb21wbGV4T2JqZWN0SW5kZXggdGhlIGluZGV4IG9mIHRoaXMgaXRlbSBpbiB0aGUgbGlzdFxuICAqIEBwYXJhbSBjb21wbGV4T2JqZWN0SXNGcm9tU2V0IHdoZXRoZXIgdGhlIGxpc3QgaXMgd3JhcHBpbmcgYSBzZXQgKHdpbGwgYWRkIHRvbGlzdCgpIHRvIGJlIGFibGUgdG8gYWNjZXNzIGFuIGl0ZW0gdmlhIGFuIGluZGV4KVxuICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IodGVycmFmb3JtUmVzb3VyY2U6IGNka3RmLklJbnRlcnBvbGF0aW5nUGFyZW50LCB0ZXJyYWZvcm1BdHRyaWJ1dGU6IHN0cmluZywgY29tcGxleE9iamVjdEluZGV4OiBudW1iZXIsIGNvbXBsZXhPYmplY3RJc0Zyb21TZXQ6IGJvb2xlYW4pIHtcbiAgICBzdXBlcih0ZXJyYWZvcm1SZXNvdXJjZSwgdGVycmFmb3JtQXR0cmlidXRlLCBjb21wbGV4T2JqZWN0SXNGcm9tU2V0LCBjb21wbGV4T2JqZWN0SW5kZXgpO1xuICB9XG5cbiAgcHVibGljIGdldCBpbnRlcm5hbFZhbHVlKCk6IERhdGFPY2lBZG1WdWxuZXJhYmlsaXR5QXVkaXRBcHBsaWNhdGlvbkRlcGVuZGVuY3lWdWxuZXJhYmlsaXR5SXRlbXMgfCB1bmRlZmluZWQge1xuICAgIGxldCBoYXNBbnlWYWx1ZXMgPSB0aGlzLmlzRW1wdHlPYmplY3Q7XG4gICAgY29uc3QgaW50ZXJuYWxWYWx1ZVJlc3VsdDogYW55ID0ge307XG4gICAgcmV0dXJuIGhhc0FueVZhbHVlcyA/IGludGVybmFsVmFsdWVSZXN1bHQgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgc2V0IGludGVybmFsVmFsdWUodmFsdWU6IERhdGFPY2lBZG1WdWxuZXJhYmlsaXR5QXVkaXRBcHBsaWNhdGlvbkRlcGVuZGVuY3lWdWxuZXJhYmlsaXR5SXRlbXMgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA9PT0gMDtcbiAgICB9XG4gIH1cblxuICAvLyBhcHBsaWNhdGlvbl9kZXBlbmRlbmN5X25vZGVfaWRzIC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHB1YmxpYyBnZXQgYXBwbGljYXRpb25EZXBlbmRlbmN5Tm9kZUlkcygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMaXN0QXR0cmlidXRlKCdhcHBsaWNhdGlvbl9kZXBlbmRlbmN5X25vZGVfaWRzJyk7XG4gIH1cblxuICAvLyBnYXYgLSBjb21wdXRlZDogdHJ1ZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogZmFsc2VcbiAgcHVibGljIGdldCBnYXYoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdnYXYnKTtcbiAgfVxuXG4gIC8vIGlzX2ZvdW5kX2luX2tub3dsZWRnZV9iYXNlIC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHB1YmxpYyBnZXQgaXNGb3VuZEluS25vd2xlZGdlQmFzZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRCb29sZWFuQXR0cmlidXRlKCdpc19mb3VuZF9pbl9rbm93bGVkZ2VfYmFzZScpO1xuICB9XG5cbiAgLy8gbm9kZV9pZCAtIGNvbXB1dGVkOiB0cnVlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiBmYWxzZVxuICBwdWJsaWMgZ2V0IG5vZGVJZCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ25vZGVfaWQnKTtcbiAgfVxuXG4gIC8vIHB1cmwgLSBjb21wdXRlZDogdHJ1ZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogZmFsc2VcbiAgcHVibGljIGdldCBwdXJsKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgncHVybCcpO1xuICB9XG5cbiAgLy8gdnVsbmVyYWJpbGl0aWVzIC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX3Z1bG5lcmFiaWxpdGllcyA9IG5ldyBEYXRhT2NpQWRtVnVsbmVyYWJpbGl0eUF1ZGl0QXBwbGljYXRpb25EZXBlbmRlbmN5VnVsbmVyYWJpbGl0eUl0ZW1zVnVsbmVyYWJpbGl0aWVzTGlzdCh0aGlzLCBcInZ1bG5lcmFiaWxpdGllc1wiLCBmYWxzZSk7XG4gIHB1YmxpYyBnZXQgdnVsbmVyYWJpbGl0aWVzKCkge1xuICAgIHJldHVybiB0aGlzLl92dWxuZXJhYmlsaXRpZXM7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIERhdGFPY2lBZG1WdWxuZXJhYmlsaXR5QXVkaXRBcHBsaWNhdGlvbkRlcGVuZGVuY3lWdWxuZXJhYmlsaXR5SXRlbXNMaXN0IGV4dGVuZHMgY2RrdGYuQ29tcGxleExpc3Qge1xuXG4gIC8qKlxuICAqIEBwYXJhbSB0ZXJyYWZvcm1SZXNvdXJjZSBUaGUgcGFyZW50IHJlc291cmNlXG4gICogQHBhcmFtIHRlcnJhZm9ybUF0dHJpYnV0ZSBUaGUgYXR0cmlidXRlIG9uIHRoZSBwYXJlbnQgcmVzb3VyY2UgdGhpcyBjbGFzcyBpcyByZWZlcmVuY2luZ1xuICAqIEBwYXJhbSB3cmFwc1NldCB3aGV0aGVyIHRoZSBsaXN0IGlzIHdyYXBwaW5nIGEgc2V0ICh3aWxsIGFkZCB0b2xpc3QoKSB0byBiZSBhYmxlIHRvIGFjY2VzcyBhbiBpdGVtIHZpYSBhbiBpbmRleClcbiAgKi9cbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIHRlcnJhZm9ybVJlc291cmNlOiBjZGt0Zi5JSW50ZXJwb2xhdGluZ1BhcmVudCwgcHJvdGVjdGVkIHRlcnJhZm9ybUF0dHJpYnV0ZTogc3RyaW5nLCBwcm90ZWN0ZWQgd3JhcHNTZXQ6IGJvb2xlYW4pIHtcbiAgICBzdXBlcih0ZXJyYWZvcm1SZXNvdXJjZSwgdGVycmFmb3JtQXR0cmlidXRlLCB3cmFwc1NldClcbiAgfVxuXG4gIC8qKlxuICAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggb2YgdGhlIGl0ZW0gdG8gcmV0dXJuXG4gICovXG4gIHB1YmxpYyBnZXQoaW5kZXg6IG51bWJlcik6IERhdGFPY2lBZG1WdWxuZXJhYmlsaXR5QXVkaXRBcHBsaWNhdGlvbkRlcGVuZGVuY3lWdWxuZXJhYmlsaXR5SXRlbXNPdXRwdXRSZWZlcmVuY2Uge1xuICAgIHJldHVybiBuZXcgRGF0YU9jaUFkbVZ1bG5lcmFiaWxpdHlBdWRpdEFwcGxpY2F0aW9uRGVwZW5kZW5jeVZ1bG5lcmFiaWxpdHlJdGVtc091dHB1dFJlZmVyZW5jZSh0aGlzLnRlcnJhZm9ybVJlc291cmNlLCB0aGlzLnRlcnJhZm9ybUF0dHJpYnV0ZSwgaW5kZXgsIHRoaXMud3JhcHNTZXQpO1xuICB9XG59XG5cbi8qKlxuKiBSZXByZXNlbnRzIGEge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9vcmFjbGUvb2NpLzYuMTguMC9kb2NzL2RhdGEtc291cmNlcy9hZG1fdnVsbmVyYWJpbGl0eV9hdWRpdF9hcHBsaWNhdGlvbl9kZXBlbmRlbmN5X3Z1bG5lcmFiaWxpdHkgb2NpX2FkbV92dWxuZXJhYmlsaXR5X2F1ZGl0X2FwcGxpY2F0aW9uX2RlcGVuZGVuY3lfdnVsbmVyYWJpbGl0eX1cbiovXG5leHBvcnQgY2xhc3MgRGF0YU9jaUFkbVZ1bG5lcmFiaWxpdHlBdWRpdEFwcGxpY2F0aW9uRGVwZW5kZW5jeVZ1bG5lcmFiaWxpdHkgZXh0ZW5kcyBjZGt0Zi5UZXJyYWZvcm1EYXRhU291cmNlIHtcblxuICAvLyA9PT09PT09PT09PT09PT09PVxuICAvLyBTVEFUSUMgUFJPUEVSVElFU1xuICAvLyA9PT09PT09PT09PT09PT09PVxuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHRmUmVzb3VyY2VUeXBlID0gXCJvY2lfYWRtX3Z1bG5lcmFiaWxpdHlfYXVkaXRfYXBwbGljYXRpb25fZGVwZW5kZW5jeV92dWxuZXJhYmlsaXR5XCI7XG5cbiAgLy8gPT09PT09PT09PT09PT1cbiAgLy8gU1RBVElDIE1ldGhvZHNcbiAgLy8gPT09PT09PT09PT09PT1cbiAgLyoqXG4gICogR2VuZXJhdGVzIENES1RGIGNvZGUgZm9yIGltcG9ydGluZyBhIERhdGFPY2lBZG1WdWxuZXJhYmlsaXR5QXVkaXRBcHBsaWNhdGlvbkRlcGVuZGVuY3lWdWxuZXJhYmlsaXR5IHJlc291cmNlIHVwb24gcnVubmluZyBcImNka3RmIHBsYW4gPHN0YWNrLW5hbWU+XCJcbiAgKiBAcGFyYW0gc2NvcGUgVGhlIHNjb3BlIGluIHdoaWNoIHRvIGRlZmluZSB0aGlzIGNvbnN0cnVjdFxuICAqIEBwYXJhbSBpbXBvcnRUb0lkIFRoZSBjb25zdHJ1Y3QgaWQgdXNlZCBpbiB0aGUgZ2VuZXJhdGVkIGNvbmZpZyBmb3IgdGhlIERhdGFPY2lBZG1WdWxuZXJhYmlsaXR5QXVkaXRBcHBsaWNhdGlvbkRlcGVuZGVuY3lWdWxuZXJhYmlsaXR5IHRvIGltcG9ydFxuICAqIEBwYXJhbSBpbXBvcnRGcm9tSWQgVGhlIGlkIG9mIHRoZSBleGlzdGluZyBEYXRhT2NpQWRtVnVsbmVyYWJpbGl0eUF1ZGl0QXBwbGljYXRpb25EZXBlbmRlbmN5VnVsbmVyYWJpbGl0eSB0aGF0IHNob3VsZCBiZSBpbXBvcnRlZC4gUmVmZXIgdG8gdGhlIHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvb3JhY2xlL29jaS82LjE4LjAvZG9jcy9kYXRhLXNvdXJjZXMvYWRtX3Z1bG5lcmFiaWxpdHlfYXVkaXRfYXBwbGljYXRpb25fZGVwZW5kZW5jeV92dWxuZXJhYmlsaXR5I2ltcG9ydCBpbXBvcnQgc2VjdGlvbn0gaW4gdGhlIGRvY3VtZW50YXRpb24gb2YgdGhpcyByZXNvdXJjZSBmb3IgdGhlIGlkIHRvIHVzZVxuICAqIEBwYXJhbSBwcm92aWRlcj8gT3B0aW9uYWwgaW5zdGFuY2Ugb2YgdGhlIHByb3ZpZGVyIHdoZXJlIHRoZSBEYXRhT2NpQWRtVnVsbmVyYWJpbGl0eUF1ZGl0QXBwbGljYXRpb25EZXBlbmRlbmN5VnVsbmVyYWJpbGl0eSB0byBpbXBvcnQgaXMgZm91bmRcbiAgKi9cbiAgcHVibGljIHN0YXRpYyBnZW5lcmF0ZUNvbmZpZ0ZvckltcG9ydChzY29wZTogQ29uc3RydWN0LCBpbXBvcnRUb0lkOiBzdHJpbmcsIGltcG9ydEZyb21JZDogc3RyaW5nLCBwcm92aWRlcj86IGNka3RmLlRlcnJhZm9ybVByb3ZpZGVyKSB7XG4gICAgICAgIHJldHVybiBuZXcgY2RrdGYuSW1wb3J0YWJsZVJlc291cmNlKHNjb3BlLCBpbXBvcnRUb0lkLCB7IHRlcnJhZm9ybVJlc291cmNlVHlwZTogXCJvY2lfYWRtX3Z1bG5lcmFiaWxpdHlfYXVkaXRfYXBwbGljYXRpb25fZGVwZW5kZW5jeV92dWxuZXJhYmlsaXR5XCIsIGltcG9ydElkOiBpbXBvcnRGcm9tSWQsIHByb3ZpZGVyIH0pO1xuICAgICAgfVxuXG4gIC8vID09PT09PT09PT09XG4gIC8vIElOSVRJQUxJWkVSXG4gIC8vID09PT09PT09PT09XG5cbiAgLyoqXG4gICogQ3JlYXRlIGEgbmV3IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvb3JhY2xlL29jaS82LjE4LjAvZG9jcy9kYXRhLXNvdXJjZXMvYWRtX3Z1bG5lcmFiaWxpdHlfYXVkaXRfYXBwbGljYXRpb25fZGVwZW5kZW5jeV92dWxuZXJhYmlsaXR5IG9jaV9hZG1fdnVsbmVyYWJpbGl0eV9hdWRpdF9hcHBsaWNhdGlvbl9kZXBlbmRlbmN5X3Z1bG5lcmFiaWxpdHl9IERhdGEgU291cmNlXG4gICpcbiAgKiBAcGFyYW0gc2NvcGUgVGhlIHNjb3BlIGluIHdoaWNoIHRvIGRlZmluZSB0aGlzIGNvbnN0cnVjdFxuICAqIEBwYXJhbSBpZCBUaGUgc2NvcGVkIGNvbnN0cnVjdCBJRC4gTXVzdCBiZSB1bmlxdWUgYW1vbmdzdCBzaWJsaW5ncyBpbiB0aGUgc2FtZSBzY29wZVxuICAqIEBwYXJhbSBvcHRpb25zIERhdGFPY2lBZG1WdWxuZXJhYmlsaXR5QXVkaXRBcHBsaWNhdGlvbkRlcGVuZGVuY3lWdWxuZXJhYmlsaXR5Q29uZmlnXG4gICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBjb25maWc6IERhdGFPY2lBZG1WdWxuZXJhYmlsaXR5QXVkaXRBcHBsaWNhdGlvbkRlcGVuZGVuY3lWdWxuZXJhYmlsaXR5Q29uZmlnKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCB7XG4gICAgICB0ZXJyYWZvcm1SZXNvdXJjZVR5cGU6ICdvY2lfYWRtX3Z1bG5lcmFiaWxpdHlfYXVkaXRfYXBwbGljYXRpb25fZGVwZW5kZW5jeV92dWxuZXJhYmlsaXR5JyxcbiAgICAgIHRlcnJhZm9ybUdlbmVyYXRvck1ldGFkYXRhOiB7XG4gICAgICAgIHByb3ZpZGVyTmFtZTogJ29jaScsXG4gICAgICAgIHByb3ZpZGVyVmVyc2lvbjogJzYuMTguMCcsXG4gICAgICAgIHByb3ZpZGVyVmVyc2lvbkNvbnN0cmFpbnQ6ICd+PiA2LjE4LjAnXG4gICAgICB9LFxuICAgICAgcHJvdmlkZXI6IGNvbmZpZy5wcm92aWRlcixcbiAgICAgIGRlcGVuZHNPbjogY29uZmlnLmRlcGVuZHNPbixcbiAgICAgIGNvdW50OiBjb25maWcuY291bnQsXG4gICAgICBsaWZlY3ljbGU6IGNvbmZpZy5saWZlY3ljbGUsXG4gICAgICBwcm92aXNpb25lcnM6IGNvbmZpZy5wcm92aXNpb25lcnMsXG4gICAgICBjb25uZWN0aW9uOiBjb25maWcuY29ubmVjdGlvbixcbiAgICAgIGZvckVhY2g6IGNvbmZpZy5mb3JFYWNoXG4gICAgfSk7XG4gICAgdGhpcy5fY3Zzc1YyR3JlYXRlclRoYW5PckVxdWFsID0gY29uZmlnLmN2c3NWMkdyZWF0ZXJUaGFuT3JFcXVhbDtcbiAgICB0aGlzLl9jdnNzVjNHcmVhdGVyVGhhbk9yRXF1YWwgPSBjb25maWcuY3Zzc1YzR3JlYXRlclRoYW5PckVxdWFsO1xuICAgIHRoaXMuX2RlcHRoID0gY29uZmlnLmRlcHRoO1xuICAgIHRoaXMuX2dhdiA9IGNvbmZpZy5nYXY7XG4gICAgdGhpcy5faWQgPSBjb25maWcuaWQ7XG4gICAgdGhpcy5fcHVybCA9IGNvbmZpZy5wdXJsO1xuICAgIHRoaXMuX3Jvb3ROb2RlSWQgPSBjb25maWcucm9vdE5vZGVJZDtcbiAgICB0aGlzLl9zZXZlcml0eUdyZWF0ZXJUaGFuT3JFcXVhbCA9IGNvbmZpZy5zZXZlcml0eUdyZWF0ZXJUaGFuT3JFcXVhbDtcbiAgICB0aGlzLl9zb3J0QnkgPSBjb25maWcuc29ydEJ5O1xuICAgIHRoaXMuX3Z1bG5lcmFiaWxpdHlBdWRpdElkID0gY29uZmlnLnZ1bG5lcmFiaWxpdHlBdWRpdElkO1xuICAgIHRoaXMuX3Z1bG5lcmFiaWxpdHlJZCA9IGNvbmZpZy52dWxuZXJhYmlsaXR5SWQ7XG4gIH1cblxuICAvLyA9PT09PT09PT09XG4gIC8vIEFUVFJJQlVURVNcbiAgLy8gPT09PT09PT09PVxuXG4gIC8vIGN2c3NfdjJncmVhdGVyX3RoYW5fb3JfZXF1YWwgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfY3Zzc1YyR3JlYXRlclRoYW5PckVxdWFsPzogbnVtYmVyOyBcbiAgcHVibGljIGdldCBjdnNzVjJHcmVhdGVyVGhhbk9yRXF1YWwoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TnVtYmVyQXR0cmlidXRlKCdjdnNzX3YyZ3JlYXRlcl90aGFuX29yX2VxdWFsJyk7XG4gIH1cbiAgcHVibGljIHNldCBjdnNzVjJHcmVhdGVyVGhhbk9yRXF1YWwodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX2N2c3NWMkdyZWF0ZXJUaGFuT3JFcXVhbCA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldEN2c3NWMkdyZWF0ZXJUaGFuT3JFcXVhbCgpIHtcbiAgICB0aGlzLl9jdnNzVjJHcmVhdGVyVGhhbk9yRXF1YWwgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGN2c3NWMkdyZWF0ZXJUaGFuT3JFcXVhbElucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9jdnNzVjJHcmVhdGVyVGhhbk9yRXF1YWw7XG4gIH1cblxuICAvLyBjdnNzX3YzZ3JlYXRlcl90aGFuX29yX2VxdWFsIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2N2c3NWM0dyZWF0ZXJUaGFuT3JFcXVhbD86IG51bWJlcjsgXG4gIHB1YmxpYyBnZXQgY3Zzc1YzR3JlYXRlclRoYW5PckVxdWFsKCkge1xuICAgIHJldHVybiB0aGlzLmdldE51bWJlckF0dHJpYnV0ZSgnY3Zzc192M2dyZWF0ZXJfdGhhbl9vcl9lcXVhbCcpO1xuICB9XG4gIHB1YmxpYyBzZXQgY3Zzc1YzR3JlYXRlclRoYW5PckVxdWFsKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9jdnNzVjNHcmVhdGVyVGhhbk9yRXF1YWwgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRDdnNzVjNHcmVhdGVyVGhhbk9yRXF1YWwoKSB7XG4gICAgdGhpcy5fY3Zzc1YzR3JlYXRlclRoYW5PckVxdWFsID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBjdnNzVjNHcmVhdGVyVGhhbk9yRXF1YWxJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fY3Zzc1YzR3JlYXRlclRoYW5PckVxdWFsO1xuICB9XG5cbiAgLy8gZGVwdGggLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfZGVwdGg/OiBudW1iZXI7IFxuICBwdWJsaWMgZ2V0IGRlcHRoKCkge1xuICAgIHJldHVybiB0aGlzLmdldE51bWJlckF0dHJpYnV0ZSgnZGVwdGgnKTtcbiAgfVxuICBwdWJsaWMgc2V0IGRlcHRoKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9kZXB0aCA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldERlcHRoKCkge1xuICAgIHRoaXMuX2RlcHRoID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBkZXB0aElucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9kZXB0aDtcbiAgfVxuXG4gIC8vIGdhdiAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9nYXY/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IGdhdigpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ2dhdicpO1xuICB9XG4gIHB1YmxpYyBzZXQgZ2F2KHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9nYXYgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRHYXYoKSB7XG4gICAgdGhpcy5fZ2F2ID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBnYXZJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZ2F2O1xuICB9XG5cbiAgLy8gaWQgLSBjb21wdXRlZDogdHJ1ZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9pZD86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgaWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdpZCcpO1xuICB9XG4gIHB1YmxpYyBzZXQgaWQodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2lkID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0SWQoKSB7XG4gICAgdGhpcy5faWQgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGlkSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2lkO1xuICB9XG5cbiAgLy8gaXRlbXMgLSBjb21wdXRlZDogdHJ1ZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfaXRlbXMgPSBuZXcgRGF0YU9jaUFkbVZ1bG5lcmFiaWxpdHlBdWRpdEFwcGxpY2F0aW9uRGVwZW5kZW5jeVZ1bG5lcmFiaWxpdHlJdGVtc0xpc3QodGhpcywgXCJpdGVtc1wiLCBmYWxzZSk7XG4gIHB1YmxpYyBnZXQgaXRlbXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2l0ZW1zO1xuICB9XG5cbiAgLy8gcHVybCAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9wdXJsPzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBwdXJsKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgncHVybCcpO1xuICB9XG4gIHB1YmxpYyBzZXQgcHVybCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fcHVybCA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldFB1cmwoKSB7XG4gICAgdGhpcy5fcHVybCA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgcHVybElucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9wdXJsO1xuICB9XG5cbiAgLy8gcm9vdF9ub2RlX2lkIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX3Jvb3ROb2RlSWQ/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IHJvb3ROb2RlSWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdyb290X25vZGVfaWQnKTtcbiAgfVxuICBwdWJsaWMgc2V0IHJvb3ROb2RlSWQodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX3Jvb3ROb2RlSWQgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRSb290Tm9kZUlkKCkge1xuICAgIHRoaXMuX3Jvb3ROb2RlSWQgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHJvb3ROb2RlSWRJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcm9vdE5vZGVJZDtcbiAgfVxuXG4gIC8vIHNldmVyaXR5X2dyZWF0ZXJfdGhhbl9vcl9lcXVhbCAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9zZXZlcml0eUdyZWF0ZXJUaGFuT3JFcXVhbD86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgc2V2ZXJpdHlHcmVhdGVyVGhhbk9yRXF1YWwoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdzZXZlcml0eV9ncmVhdGVyX3RoYW5fb3JfZXF1YWwnKTtcbiAgfVxuICBwdWJsaWMgc2V0IHNldmVyaXR5R3JlYXRlclRoYW5PckVxdWFsKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9zZXZlcml0eUdyZWF0ZXJUaGFuT3JFcXVhbCA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldFNldmVyaXR5R3JlYXRlclRoYW5PckVxdWFsKCkge1xuICAgIHRoaXMuX3NldmVyaXR5R3JlYXRlclRoYW5PckVxdWFsID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBzZXZlcml0eUdyZWF0ZXJUaGFuT3JFcXVhbElucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9zZXZlcml0eUdyZWF0ZXJUaGFuT3JFcXVhbDtcbiAgfVxuXG4gIC8vIHNvcnRfYnkgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfc29ydEJ5Pzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBzb3J0QnkoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdzb3J0X2J5Jyk7XG4gIH1cbiAgcHVibGljIHNldCBzb3J0QnkodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX3NvcnRCeSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldFNvcnRCeSgpIHtcbiAgICB0aGlzLl9zb3J0QnkgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHNvcnRCeUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9zb3J0Qnk7XG4gIH1cblxuICAvLyB2dWxuZXJhYmlsaXR5X2F1ZGl0X2lkIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiB0cnVlXG4gIHByaXZhdGUgX3Z1bG5lcmFiaWxpdHlBdWRpdElkPzogc3RyaW5nOyBcbiAgcHVibGljIGdldCB2dWxuZXJhYmlsaXR5QXVkaXRJZCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ3Z1bG5lcmFiaWxpdHlfYXVkaXRfaWQnKTtcbiAgfVxuICBwdWJsaWMgc2V0IHZ1bG5lcmFiaWxpdHlBdWRpdElkKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl92dWxuZXJhYmlsaXR5QXVkaXRJZCA9IHZhbHVlO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCB2dWxuZXJhYmlsaXR5QXVkaXRJZElucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl92dWxuZXJhYmlsaXR5QXVkaXRJZDtcbiAgfVxuXG4gIC8vIHZ1bG5lcmFiaWxpdHlfaWQgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfdnVsbmVyYWJpbGl0eUlkPzogc3RyaW5nOyBcbiAgcHVibGljIGdldCB2dWxuZXJhYmlsaXR5SWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCd2dWxuZXJhYmlsaXR5X2lkJyk7XG4gIH1cbiAgcHVibGljIHNldCB2dWxuZXJhYmlsaXR5SWQodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX3Z1bG5lcmFiaWxpdHlJZCA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldFZ1bG5lcmFiaWxpdHlJZCgpIHtcbiAgICB0aGlzLl92dWxuZXJhYmlsaXR5SWQgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHZ1bG5lcmFiaWxpdHlJZElucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl92dWxuZXJhYmlsaXR5SWQ7XG4gIH1cblxuICAvLyA9PT09PT09PT1cbiAgLy8gU1lOVEhFU0lTXG4gIC8vID09PT09PT09PVxuXG4gIHByb3RlY3RlZCBzeW50aGVzaXplQXR0cmlidXRlcygpOiB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGN2c3NfdjJncmVhdGVyX3RoYW5fb3JfZXF1YWw6IGNka3RmLm51bWJlclRvVGVycmFmb3JtKHRoaXMuX2N2c3NWMkdyZWF0ZXJUaGFuT3JFcXVhbCksXG4gICAgICBjdnNzX3YzZ3JlYXRlcl90aGFuX29yX2VxdWFsOiBjZGt0Zi5udW1iZXJUb1RlcnJhZm9ybSh0aGlzLl9jdnNzVjNHcmVhdGVyVGhhbk9yRXF1YWwpLFxuICAgICAgZGVwdGg6IGNka3RmLm51bWJlclRvVGVycmFmb3JtKHRoaXMuX2RlcHRoKSxcbiAgICAgIGdhdjogY2RrdGYuc3RyaW5nVG9UZXJyYWZvcm0odGhpcy5fZ2F2KSxcbiAgICAgIGlkOiBjZGt0Zi5zdHJpbmdUb1RlcnJhZm9ybSh0aGlzLl9pZCksXG4gICAgICBwdXJsOiBjZGt0Zi5zdHJpbmdUb1RlcnJhZm9ybSh0aGlzLl9wdXJsKSxcbiAgICAgIHJvb3Rfbm9kZV9pZDogY2RrdGYuc3RyaW5nVG9UZXJyYWZvcm0odGhpcy5fcm9vdE5vZGVJZCksXG4gICAgICBzZXZlcml0eV9ncmVhdGVyX3RoYW5fb3JfZXF1YWw6IGNka3RmLnN0cmluZ1RvVGVycmFmb3JtKHRoaXMuX3NldmVyaXR5R3JlYXRlclRoYW5PckVxdWFsKSxcbiAgICAgIHNvcnRfYnk6IGNka3RmLnN0cmluZ1RvVGVycmFmb3JtKHRoaXMuX3NvcnRCeSksXG4gICAgICB2dWxuZXJhYmlsaXR5X2F1ZGl0X2lkOiBjZGt0Zi5zdHJpbmdUb1RlcnJhZm9ybSh0aGlzLl92dWxuZXJhYmlsaXR5QXVkaXRJZCksXG4gICAgICB2dWxuZXJhYmlsaXR5X2lkOiBjZGt0Zi5zdHJpbmdUb1RlcnJhZm9ybSh0aGlzLl92dWxuZXJhYmlsaXR5SWQpLFxuICAgIH07XG4gIH1cblxuICBwcm90ZWN0ZWQgc3ludGhlc2l6ZUhjbEF0dHJpYnV0ZXMoKTogeyBbbmFtZTogc3RyaW5nXTogYW55IH0ge1xuICAgIGNvbnN0IGF0dHJzID0ge1xuICAgICAgY3Zzc192MmdyZWF0ZXJfdGhhbl9vcl9lcXVhbDoge1xuICAgICAgICB2YWx1ZTogY2RrdGYubnVtYmVyVG9IY2xUZXJyYWZvcm0odGhpcy5fY3Zzc1YyR3JlYXRlclRoYW5PckVxdWFsKSxcbiAgICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwibnVtYmVyXCIsXG4gICAgICB9LFxuICAgICAgY3Zzc192M2dyZWF0ZXJfdGhhbl9vcl9lcXVhbDoge1xuICAgICAgICB2YWx1ZTogY2RrdGYubnVtYmVyVG9IY2xUZXJyYWZvcm0odGhpcy5fY3Zzc1YzR3JlYXRlclRoYW5PckVxdWFsKSxcbiAgICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwibnVtYmVyXCIsXG4gICAgICB9LFxuICAgICAgZGVwdGg6IHtcbiAgICAgICAgdmFsdWU6IGNka3RmLm51bWJlclRvSGNsVGVycmFmb3JtKHRoaXMuX2RlcHRoKSxcbiAgICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwibnVtYmVyXCIsXG4gICAgICB9LFxuICAgICAgZ2F2OiB7XG4gICAgICAgIHZhbHVlOiBjZGt0Zi5zdHJpbmdUb0hjbFRlcnJhZm9ybSh0aGlzLl9nYXYpLFxuICAgICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICAgIH0sXG4gICAgICBpZDoge1xuICAgICAgICB2YWx1ZTogY2RrdGYuc3RyaW5nVG9IY2xUZXJyYWZvcm0odGhpcy5faWQpLFxuICAgICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICAgIH0sXG4gICAgICBwdXJsOiB7XG4gICAgICAgIHZhbHVlOiBjZGt0Zi5zdHJpbmdUb0hjbFRlcnJhZm9ybSh0aGlzLl9wdXJsKSxcbiAgICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgICB9LFxuICAgICAgcm9vdF9ub2RlX2lkOiB7XG4gICAgICAgIHZhbHVlOiBjZGt0Zi5zdHJpbmdUb0hjbFRlcnJhZm9ybSh0aGlzLl9yb290Tm9kZUlkKSxcbiAgICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgICB9LFxuICAgICAgc2V2ZXJpdHlfZ3JlYXRlcl90aGFuX29yX2VxdWFsOiB7XG4gICAgICAgIHZhbHVlOiBjZGt0Zi5zdHJpbmdUb0hjbFRlcnJhZm9ybSh0aGlzLl9zZXZlcml0eUdyZWF0ZXJUaGFuT3JFcXVhbCksXG4gICAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgICAgfSxcbiAgICAgIHNvcnRfYnk6IHtcbiAgICAgICAgdmFsdWU6IGNka3RmLnN0cmluZ1RvSGNsVGVycmFmb3JtKHRoaXMuX3NvcnRCeSksXG4gICAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgICAgfSxcbiAgICAgIHZ1bG5lcmFiaWxpdHlfYXVkaXRfaWQ6IHtcbiAgICAgICAgdmFsdWU6IGNka3RmLnN0cmluZ1RvSGNsVGVycmFmb3JtKHRoaXMuX3Z1bG5lcmFiaWxpdHlBdWRpdElkKSxcbiAgICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgICB9LFxuICAgICAgdnVsbmVyYWJpbGl0eV9pZDoge1xuICAgICAgICB2YWx1ZTogY2RrdGYuc3RyaW5nVG9IY2xUZXJyYWZvcm0odGhpcy5fdnVsbmVyYWJpbGl0eUlkKSxcbiAgICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgICB9LFxuICAgIH07XG5cbiAgICAvLyByZW1vdmUgdW5kZWZpbmVkIGF0dHJpYnV0ZXNcbiAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKGF0dHJzKS5maWx0ZXIoKFtfLCB2YWx1ZV0pID0+IHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUudmFsdWUgIT09IHVuZGVmaW5lZCApKVxuICB9XG59XG4iXX0=