@cdktf/provider-databricks
Version:
Prebuilt databricks Provider for Terraform CDK (cdktf)
308 lines • 48.1 kB
JavaScript
"use strict";
var _a, _b, _c;
Object.defineProperty(exports, "__esModule", { value: true });
exports.JobWebhookNotificationsOutputReference = exports.JobWebhookNotificationsOnSuccessList = exports.JobWebhookNotificationsOnSuccessOutputReference = void 0;
exports.jobWebhookNotificationsOnSuccessToTerraform = jobWebhookNotificationsOnSuccessToTerraform;
exports.jobWebhookNotificationsOnSuccessToHclTerraform = jobWebhookNotificationsOnSuccessToHclTerraform;
exports.jobWebhookNotificationsToTerraform = jobWebhookNotificationsToTerraform;
exports.jobWebhookNotificationsToHclTerraform = jobWebhookNotificationsToHclTerraform;
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
/**
* Copyright (c) HashiCorp, Inc.
* SPDX-License-Identifier: MPL-2.0
*/
const cdktf = require("cdktf");
const structs400_1 = require("./structs400");
function jobWebhookNotificationsOnSuccessToTerraform(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 {
id: cdktf.stringToTerraform(struct.id),
};
}
function jobWebhookNotificationsOnSuccessToHclTerraform(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 = {
id: {
value: cdktf.stringToHclTerraform(struct.id),
isBlock: false,
type: "simple",
storageClassType: "string",
},
};
// remove undefined attributes
return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
}
class JobWebhookNotificationsOnSuccessOutputReference 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._id !== undefined) {
hasAnyValues = true;
internalValueResult.id = this._id;
}
return hasAnyValues ? internalValueResult : undefined;
}
set internalValue(value) {
if (value === undefined) {
this.isEmptyObject = false;
this.resolvableValue = undefined;
this._id = 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._id = value.id;
}
}
get id() {
return this.getStringAttribute('id');
}
set id(value) {
this._id = value;
}
// Temporarily expose input value. Use with caution.
get idInput() {
return this._id;
}
}
exports.JobWebhookNotificationsOnSuccessOutputReference = JobWebhookNotificationsOnSuccessOutputReference;
_a = JSII_RTTI_SYMBOL_1;
JobWebhookNotificationsOnSuccessOutputReference[_a] = { fqn: "@cdktf/provider-databricks.job.JobWebhookNotificationsOnSuccessOutputReference", version: "15.16.1" };
class JobWebhookNotificationsOnSuccessList 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 JobWebhookNotificationsOnSuccessOutputReference(this.terraformResource, this.terraformAttribute, index, this.wrapsSet);
}
}
exports.JobWebhookNotificationsOnSuccessList = JobWebhookNotificationsOnSuccessList;
_b = JSII_RTTI_SYMBOL_1;
JobWebhookNotificationsOnSuccessList[_b] = { fqn: "@cdktf/provider-databricks.job.JobWebhookNotificationsOnSuccessList", version: "15.16.1" };
function jobWebhookNotificationsToTerraform(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 {
on_duration_warning_threshold_exceeded: cdktf.listMapper(structs400_1.jobWebhookNotificationsOnDurationWarningThresholdExceededToTerraform, true)(struct.onDurationWarningThresholdExceeded),
on_failure: cdktf.listMapper(structs400_1.jobWebhookNotificationsOnFailureToTerraform, true)(struct.onFailure),
on_start: cdktf.listMapper(structs400_1.jobWebhookNotificationsOnStartToTerraform, true)(struct.onStart),
on_streaming_backlog_exceeded: cdktf.listMapper(structs400_1.jobWebhookNotificationsOnStreamingBacklogExceededToTerraform, true)(struct.onStreamingBacklogExceeded),
on_success: cdktf.listMapper(jobWebhookNotificationsOnSuccessToTerraform, true)(struct.onSuccess),
};
}
function jobWebhookNotificationsToHclTerraform(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 = {
on_duration_warning_threshold_exceeded: {
value: cdktf.listMapperHcl(structs400_1.jobWebhookNotificationsOnDurationWarningThresholdExceededToHclTerraform, true)(struct.onDurationWarningThresholdExceeded),
isBlock: true,
type: "list",
storageClassType: "JobWebhookNotificationsOnDurationWarningThresholdExceededList",
},
on_failure: {
value: cdktf.listMapperHcl(structs400_1.jobWebhookNotificationsOnFailureToHclTerraform, true)(struct.onFailure),
isBlock: true,
type: "list",
storageClassType: "JobWebhookNotificationsOnFailureList",
},
on_start: {
value: cdktf.listMapperHcl(structs400_1.jobWebhookNotificationsOnStartToHclTerraform, true)(struct.onStart),
isBlock: true,
type: "list",
storageClassType: "JobWebhookNotificationsOnStartList",
},
on_streaming_backlog_exceeded: {
value: cdktf.listMapperHcl(structs400_1.jobWebhookNotificationsOnStreamingBacklogExceededToHclTerraform, true)(struct.onStreamingBacklogExceeded),
isBlock: true,
type: "list",
storageClassType: "JobWebhookNotificationsOnStreamingBacklogExceededList",
},
on_success: {
value: cdktf.listMapperHcl(jobWebhookNotificationsOnSuccessToHclTerraform, true)(struct.onSuccess),
isBlock: true,
type: "list",
storageClassType: "JobWebhookNotificationsOnSuccessList",
},
};
// remove undefined attributes
return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
}
class JobWebhookNotificationsOutputReference 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;
// on_duration_warning_threshold_exceeded - computed: false, optional: true, required: false
this._onDurationWarningThresholdExceeded = new structs400_1.JobWebhookNotificationsOnDurationWarningThresholdExceededList(this, "on_duration_warning_threshold_exceeded", false);
// on_failure - computed: false, optional: true, required: false
this._onFailure = new structs400_1.JobWebhookNotificationsOnFailureList(this, "on_failure", false);
// on_start - computed: false, optional: true, required: false
this._onStart = new structs400_1.JobWebhookNotificationsOnStartList(this, "on_start", false);
// on_streaming_backlog_exceeded - computed: false, optional: true, required: false
this._onStreamingBacklogExceeded = new structs400_1.JobWebhookNotificationsOnStreamingBacklogExceededList(this, "on_streaming_backlog_exceeded", false);
// on_success - computed: false, optional: true, required: false
this._onSuccess = new JobWebhookNotificationsOnSuccessList(this, "on_success", false);
}
get internalValue() {
let hasAnyValues = this.isEmptyObject;
const internalValueResult = {};
if (this._onDurationWarningThresholdExceeded?.internalValue !== undefined) {
hasAnyValues = true;
internalValueResult.onDurationWarningThresholdExceeded = this._onDurationWarningThresholdExceeded?.internalValue;
}
if (this._onFailure?.internalValue !== undefined) {
hasAnyValues = true;
internalValueResult.onFailure = this._onFailure?.internalValue;
}
if (this._onStart?.internalValue !== undefined) {
hasAnyValues = true;
internalValueResult.onStart = this._onStart?.internalValue;
}
if (this._onStreamingBacklogExceeded?.internalValue !== undefined) {
hasAnyValues = true;
internalValueResult.onStreamingBacklogExceeded = this._onStreamingBacklogExceeded?.internalValue;
}
if (this._onSuccess?.internalValue !== undefined) {
hasAnyValues = true;
internalValueResult.onSuccess = this._onSuccess?.internalValue;
}
return hasAnyValues ? internalValueResult : undefined;
}
set internalValue(value) {
if (value === undefined) {
this.isEmptyObject = false;
this._onDurationWarningThresholdExceeded.internalValue = undefined;
this._onFailure.internalValue = undefined;
this._onStart.internalValue = undefined;
this._onStreamingBacklogExceeded.internalValue = undefined;
this._onSuccess.internalValue = undefined;
}
else {
this.isEmptyObject = Object.keys(value).length === 0;
this._onDurationWarningThresholdExceeded.internalValue = value.onDurationWarningThresholdExceeded;
this._onFailure.internalValue = value.onFailure;
this._onStart.internalValue = value.onStart;
this._onStreamingBacklogExceeded.internalValue = value.onStreamingBacklogExceeded;
this._onSuccess.internalValue = value.onSuccess;
}
}
get onDurationWarningThresholdExceeded() {
return this._onDurationWarningThresholdExceeded;
}
putOnDurationWarningThresholdExceeded(value) {
this._onDurationWarningThresholdExceeded.internalValue = value;
}
resetOnDurationWarningThresholdExceeded() {
this._onDurationWarningThresholdExceeded.internalValue = undefined;
}
// Temporarily expose input value. Use with caution.
get onDurationWarningThresholdExceededInput() {
return this._onDurationWarningThresholdExceeded.internalValue;
}
get onFailure() {
return this._onFailure;
}
putOnFailure(value) {
this._onFailure.internalValue = value;
}
resetOnFailure() {
this._onFailure.internalValue = undefined;
}
// Temporarily expose input value. Use with caution.
get onFailureInput() {
return this._onFailure.internalValue;
}
get onStart() {
return this._onStart;
}
putOnStart(value) {
this._onStart.internalValue = value;
}
resetOnStart() {
this._onStart.internalValue = undefined;
}
// Temporarily expose input value. Use with caution.
get onStartInput() {
return this._onStart.internalValue;
}
get onStreamingBacklogExceeded() {
return this._onStreamingBacklogExceeded;
}
putOnStreamingBacklogExceeded(value) {
this._onStreamingBacklogExceeded.internalValue = value;
}
resetOnStreamingBacklogExceeded() {
this._onStreamingBacklogExceeded.internalValue = undefined;
}
// Temporarily expose input value. Use with caution.
get onStreamingBacklogExceededInput() {
return this._onStreamingBacklogExceeded.internalValue;
}
get onSuccess() {
return this._onSuccess;
}
putOnSuccess(value) {
this._onSuccess.internalValue = value;
}
resetOnSuccess() {
this._onSuccess.internalValue = undefined;
}
// Temporarily expose input value. Use with caution.
get onSuccessInput() {
return this._onSuccess.internalValue;
}
}
exports.JobWebhookNotificationsOutputReference = JobWebhookNotificationsOutputReference;
_c = JSII_RTTI_SYMBOL_1;
JobWebhookNotificationsOutputReference[_c] = { fqn: "@cdktf/provider-databricks.job.JobWebhookNotificationsOutputReference", version: "15.16.1" };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RydWN0czgwMC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9qb2IvaW5kZXgtc3RydWN0cy9zdHJ1Y3RzODAwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFnQ0Esa0dBUUM7QUFHRCx3R0FnQkM7QUFnSEQsZ0ZBWUM7QUFHRCxzRkF3Q0M7O0FBbE9EOzs7R0FHRztBQUVILCtCQUErQjtBQUMvQiw2Q0FlMkU7QUFXM0UsU0FBZ0IsMkNBQTJDLENBQUMsTUFBNkQ7SUFDdkgsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUFDLE9BQU8sTUFBTSxDQUFDO0lBQUMsQ0FBQztJQUM1RixJQUFJLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQ25DLE1BQU0sSUFBSSxLQUFLLENBQUMsb0hBQW9ILENBQUMsQ0FBQztJQUN4SSxDQUFDO0lBQ0QsT0FBTztRQUNMLEVBQUUsRUFBRSxLQUFLLENBQUMsaUJBQWlCLENBQUMsTUFBTyxDQUFDLEVBQUUsQ0FBQztLQUN4QyxDQUFBO0FBQ0gsQ0FBQztBQUdELFNBQWdCLDhDQUE4QyxDQUFDLE1BQTZEO0lBQzFILElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFBQyxPQUFPLE1BQU0sQ0FBQztJQUFDLENBQUM7SUFDNUYsSUFBSSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUNuQyxNQUFNLElBQUksS0FBSyxDQUFDLG9IQUFvSCxDQUFDLENBQUM7SUFDeEksQ0FBQztJQUNELE1BQU0sS0FBSyxHQUFHO1FBQ1osRUFBRSxFQUFFO1lBQ0YsS0FBSyxFQUFFLEtB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LElBQVcsWUFBWTtRQUNyQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDO0lBQ3JDLENBQUM7SUFJRCxJQUFXLDBCQUEwQjtRQUNuQyxPQUFPLElBQUksQ0FBQywyQkFBMkIsQ0FBQztJQUMxQyxDQUFDO0lBQ00sNkJBQTZCLENBQUMsS0FBOEU7UUFDakgsSUFBSSxDQUFDLDJCQUEyQixDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7SUFDekQsQ0FBQztJQUNNLCtCQUErQjtRQUNwQyxJQUFJLENBQUMsMkJBQTJCLENBQUMsYUFBYSxHQUFHLFNBQVMsQ0FBQztJQUM3RCxDQUFDO0lBQ0Qsb0RBQW9EO0lBQ3BELElBQVcsK0JBQStCO1FBQ3hDLE9BQU8sSUFBSSxDQUFDLDJCQUEyQixDQUFDLGFBQWEsQ0FBQztJQUN4RCxDQUFDO0lBSUQsSUFBVyxTQUFTO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUN6QixDQUFDO0lBQ00sWUFBWSxDQUFDLEtBQTZEO1FBQy9FLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztJQUN4QyxDQUFDO0lBQ00sY0FBYztRQUNuQixJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsR0FBRyxTQUFTLENBQUM7SUFDNUMsQ0FBQztJQUNELG9EQUFvRDtJQUNwRCxJQUFXLGNBQWM7UUFDdkIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQztJQUN2QyxDQUFDOztBQXRJSCx3RkF1SUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAoYykgSGFzaGlDb3JwLCBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTVBMLTIuMFxuICovXG5cbmltcG9ydCAqIGFzIGNka3RmIGZyb20gJ2Nka3RmJztcbmltcG9ydCB7IEpvYldlYmhvb2tOb3RpZmljYXRpb25zT25EdXJhdGlvbldhcm5pbmdUaHJlc2hvbGRFeGNlZWRlZCxcbmpvYldlYmhvb2tOb3RpZmljYXRpb25zT25EdXJhdGlvbldhcm5pbmdUaHJlc2hvbGRFeGNlZWRlZFRvVGVycmFmb3JtLFxuam9iV2ViaG9va05vdGlmaWNhdGlvbnNPbkR1cmF0aW9uV2FybmluZ1RocmVzaG9sZEV4Y2VlZGVkVG9IY2xUZXJyYWZvcm0sXG5Kb2JXZWJob29rTm90aWZpY2F0aW9uc09uRHVyYXRpb25XYXJuaW5nVGhyZXNob2xkRXhjZWVkZWRMaXN0LFxuSm9iV2ViaG9va05vdGlmaWNhdGlvbnNPbkZhaWx1cmUsXG5qb2JXZWJob29rTm90aWZpY2F0aW9uc09uRmFpbHVyZVRvVGVycmFmb3JtLFxuam9iV2ViaG9va05vdGlmaWNhdGlvbnNPbkZhaWx1cmVUb0hjbFRlcnJhZm9ybSxcbkpvYldlYmhvb2tOb3RpZmljYXRpb25zT25GYWlsdXJlTGlzdCxcbkpvYldlYmhvb2tOb3RpZmljYXRpb25zT25TdGFydCxcbmpvYldlYmhvb2tOb3RpZmljYXRpb25zT25TdGFydFRvVGVycmFmb3JtLFxuam9iV2ViaG9va05vdGlmaWNhdGlvbnNPblN0YXJ0VG9IY2xUZXJyYWZvcm0sXG5Kb2JXZWJob29rTm90aWZpY2F0aW9uc09uU3RhcnRMaXN0LFxuSm9iV2ViaG9va05vdGlmaWNhdGlvbnNPblN0cmVhbWluZ0JhY2tsb2dFeGNlZWRlZCxcbmpvYldlYmhvb2tOb3RpZmljYXRpb25zT25TdHJlYW1pbmdCYWNrbG9nRXhjZWVkZWRUb1RlcnJhZm9ybSxcbmpvYldlYmhvb2tOb3RpZmljYXRpb25zT25TdHJlYW1pbmdCYWNrbG9nRXhjZWVkZWRUb0hjbFRlcnJhZm9ybSxcbkpvYldlYmhvb2tOb3RpZmljYXRpb25zT25TdHJlYW1pbmdCYWNrbG9nRXhjZWVkZWRMaXN0IH0gZnJvbSAnLi9zdHJ1Y3RzNDAwJ1xuZXhwb3J0IGludGVyZmFjZSBKb2JXZWJob29rTm90aWZpY2F0aW9uc09uU3VjY2VzcyB7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2RhdGFicmlja3MvZGF0YWJyaWNrcy8xLjk5LjAvZG9jcy9yZXNvdXJjZXMvam9iI2lkIEpvYiNpZH1cbiAgKlxuICAqIFBsZWFzZSBiZSBhd2FyZSB0aGF0IHRoZSBpZCBmaWVsZCBpcyBhdXRvbWF0aWNhbGx5IGFkZGVkIHRvIGFsbCByZXNvdXJjZXMgaW4gVGVycmFmb3JtIHByb3ZpZGVycyB1c2luZyBhIFRlcnJhZm9ybSBwcm92aWRlciBTREsgdmVyc2lvbiBiZWxvdyAyLlxuICAqIElmIHlvdSBleHBlcmllbmNlIHByb2JsZW1zIHNldHRpbmcgdGhpcyB2YWx1ZSBpdCBtaWdodCBub3QgYmUgc2V0dGFibGUuIFBsZWFzZSB0YWtlIGEgbG9vayBhdCB0aGUgcHJvdmlkZXIgZG9jdW1lbnRhdGlvbiB0byBlbnN1cmUgaXQgc2hvdWxkIGJlIHNldHRhYmxlLlxuICAqL1xuICByZWFkb25seSBpZDogc3RyaW5nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gam9iV2ViaG9va05vdGlmaWNhdGlvbnNPblN1Y2Nlc3NUb1RlcnJhZm9ybShzdHJ1Y3Q/OiBKb2JXZWJob29rTm90aWZpY2F0aW9uc09uU3VjY2VzcyB8IGNka3RmLklSZXNvbHZhYmxlKTogYW55IHtcbiAgaWYgKCFjZGt0Zi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdGYuVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RmLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGlkOiBjZGt0Zi5zdHJpbmdUb1RlcnJhZm9ybShzdHJ1Y3QhLmlkKSxcbiAgfVxufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBqb2JXZWJob29rTm90aWZpY2F0aW9uc09uU3VjY2Vzc1RvSGNsVGVycmFmb3JtKHN0cnVjdD86IEpvYldlYmhvb2tOb3RpZmljYXRpb25zT25TdWNjZXNzIHwgY2RrdGYuSVJlc29sdmFibGUpOiBhbnkge1xuICBpZiAoIWNka3RmLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0Zi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdGYuaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIGNvbnN0IGF0dHJzID0ge1xuICAgIGlkOiB7XG4gICAgICB2YWx1ZTogY2RrdGYuc3RyaW5nVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5pZCksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgIH0sXG4gIH07XG5cbiAgLy8gcmVtb3ZlIHVuZGVmaW5lZCBhdHRyaWJ1dGVzXG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoYXR0cnMpLmZpbHRlcigoW18sIHZhbHVlXSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZS52YWx1ZSAhPT0gdW5kZWZpbmVkKSk7XG59XG5cbmV4cG9ydCBjbGFzcyBKb2JXZWJob29rTm90aWZpY2F0aW9uc09uU3VjY2Vzc091dHB1dFJlZmVyZW5jZSBleHRlbmRzIGNka3RmLkNvbXBsZXhPYmplY3Qge1xuICBwcml2YXRlIGlzRW1wdHlPYmplY3QgPSBmYWxzZTtcbiAgcHJpdmF0ZSByZXNvbHZhYmxlVmFsdWU/OiBjZGt0Zi5JUmVzb2x2YWJsZTtcblxuICAvKipcbiAgKiBAcGFyYW0gdGVycmFmb3JtUmVzb3VyY2UgVGhlIHBhcmVudCByZXNvdXJjZVxuICAqIEBwYXJhbSB0ZXJyYWZvcm1BdHRyaWJ1dGUgVGhlIGF0dHJpYnV0ZSBvbiB0aGUgcGFyZW50IHJlc291cmNlIHRoaXMgY2xhc3MgaXMgcmVmZXJlbmNpbmdcbiAgKiBAcGFyYW0gY29tcGxleE9iamVjdEluZGV4IHRoZSBpbmRleCBvZiB0aGlzIGl0ZW0gaW4gdGhlIGxpc3RcbiAgKiBAcGFyYW0gY29tcGxleE9iamVjdElzRnJvbVNldCB3aGV0aGVyIHRoZSBsaXN0IGlzIHdyYXBwaW5nIGEgc2V0ICh3aWxsIGFkZCB0b2xpc3QoKSB0byBiZSBhYmxlIHRvIGFjY2VzcyBhbiBpdGVtIHZpYSBhbiBpbmRleClcbiAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHRlcnJhZm9ybVJlc291cmNlOiBjZGt0Zi5JSW50ZXJwb2xhdGluZ1BhcmVudCwgdGVycmFmb3JtQXR0cmlidXRlOiBzdHJpbmcsIGNvbXBsZXhPYmplY3RJbmRleDogbnVtYmVyLCBjb21wbGV4T2JqZWN0SXNGcm9tU2V0OiBib29sZWFuKSB7XG4gICAgc3VwZXIodGVycmFmb3JtUmVzb3VyY2UsIHRlcnJhZm9ybUF0dHJpYnV0ZSwgY29tcGxleE9iamVjdElzRnJvbVNldCwgY29tcGxleE9iamVjdEluZGV4KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW50ZXJuYWxWYWx1ZSgpOiBKb2JXZWJob29rTm90aWZpY2F0aW9uc09uU3VjY2VzcyB8IGNka3RmLklSZXNvbHZhYmxlIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5yZXNvbHZhYmxlVmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlc29sdmFibGVWYWx1ZTtcbiAgICB9XG4gICAgbGV0IGhhc0FueVZhbHVlcyA9IHRoaXMuaXNFbXB0eU9iamVjdDtcbiAgICBjb25zdCBpbnRlcm5hbFZhbHVlUmVzdWx0OiBhbnkgPSB7fTtcbiAgICBpZiAodGhpcy5faWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuaWQgPSB0aGlzLl9pZDtcbiAgICB9XG4gICAgcmV0dXJuIGhhc0FueVZhbHVlcyA/IGludGVybmFsVmFsdWVSZXN1bHQgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgc2V0IGludGVybmFsVmFsdWUodmFsdWU6IEpvYldlYmhvb2tOb3RpZmljYXRpb25zT25TdWNjZXNzIHwgY2RrdGYuSVJlc29sdmFibGUgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLnJlc29sdmFibGVWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX2lkID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBlbHNlIGlmIChjZGt0Zi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHZhbHVlKSkge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLnJlc29sdmFibGVWYWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGggPT09IDA7XG4gICAgICB0aGlzLnJlc29sdmFibGVWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX2lkID0gdmFsdWUuaWQ7XG4gICAgfVxuICB9XG5cbiAgLy8gaWQgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfaWQ/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IGlkKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnaWQnKTtcbiAgfVxuICBwdWJsaWMgc2V0IGlkKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9pZCA9IHZhbHVlO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBpZElucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9pZDtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgSm9iV2ViaG9va05vdGlmaWNhdGlvbnNPblN1Y2Nlc3NMaXN0IGV4dGVuZHMgY2RrdGYuQ29tcGxleExpc3Qge1xuICBwdWJsaWMgaW50ZXJuYWxWYWx1ZT8gOiBKb2JXZWJob29rTm90aWZpY2F0aW9uc09uU3VjY2Vzc1tdIHwgY2RrdGYuSVJlc29sdmFibGVcblxuICAvKipcbiAgKiBAcGFyYW0gdGVycmFmb3JtUmVzb3VyY2UgVGhlIHBhcmVudCByZXNvdXJjZVxuICAqIEBwYXJhbSB0ZXJyYWZvcm1BdHRyaWJ1dGUgVGhlIGF0dHJpYnV0ZSBvbiB0aGUgcGFyZW50IHJlc291cmNlIHRoaXMgY2xhc3MgaXMgcmVmZXJlbmNpbmdcbiAgKiBAcGFyYW0gd3JhcHNTZXQgd2hldGhlciB0aGUgbGlzdCBpcyB3cmFwcGluZyBhIHNldCAod2lsbCBhZGQgdG9saXN0KCkgdG8gYmUgYWJsZSB0byBhY2Nlc3MgYW4gaXRlbSB2aWEgYW4gaW5kZXgpXG4gICovXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCB0ZXJyYWZvcm1SZXNvdXJjZTogY2RrdGYuSUludGVycG9sYXRpbmdQYXJlbnQsIHByb3RlY3RlZCB0ZXJyYWZvcm1BdHRyaWJ1dGU6IHN0cmluZywgcHJvdGVjdGVkIHdyYXBzU2V0OiBib29sZWFuKSB7XG4gICAgc3VwZXIodGVycmFmb3JtUmVzb3VyY2UsIHRlcnJhZm9ybUF0dHJpYnV0ZSwgd3JhcHNTZXQpXG4gIH1cblxuICAvKipcbiAgKiBAcGFyYW0gaW5kZXggdGhlIGluZGV4IG9mIHRoZSBpdGVtIHRvIHJldHVyblxuICAqL1xuICBwdWJsaWMgZ2V0KGluZGV4OiBudW1iZXIpOiBKb2JXZWJob29rTm90aWZpY2F0aW9uc09uU3VjY2Vzc091dHB1dFJlZmVyZW5jZSB7XG4gICAgcmV0dXJuIG5ldyBKb2JXZWJob29rTm90aWZpY2F0aW9uc09uU3VjY2Vzc091dHB1dFJlZmVyZW5jZSh0aGlzLnRlcnJhZm9ybVJlc291cmNlLCB0aGlzLnRlcnJhZm9ybUF0dHJpYnV0ZSwgaW5kZXgsIHRoaXMud3JhcHNTZXQpO1xuICB9XG59XG5leHBvcnQgaW50ZXJmYWNlIEpvYldlYmhvb2tOb3RpZmljYXRpb25zIHtcbiAgLyoqXG4gICogb25fZHVyYXRpb25fd2FybmluZ190aHJlc2hvbGRfZXhjZWVkZWQgYmxvY2tcbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2RhdGFicmlja3MvZGF0YWJyaWNrcy8xLjk5LjAvZG9jcy9yZXNvdXJjZXMvam9iI29uX2R1cmF0aW9uX3dhcm5pbmdfdGhyZXNob2xkX2V4Y2VlZGVkIEpvYiNvbl9kdXJhdGlvbl93YXJuaW5nX3RocmVzaG9sZF9leGNlZWRlZH1cbiAgKi9cbiAgcmVhZG9ubHkgb25EdXJhdGlvbldhcm5pbmdUaHJlc2hvbGRFeGNlZWRlZD86IEpvYldlYmhvb2tOb3RpZmljYXRpb25zT25EdXJhdGlvbldhcm5pbmdUaHJlc2hvbGRFeGNlZWRlZFtdIHwgY2RrdGYuSVJlc29sdmFibGU7XG4gIC8qKlxuICAqIG9uX2ZhaWx1cmUgYmxvY2tcbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2RhdGFicmlja3MvZGF0YWJyaWNrcy8xLjk5LjAvZG9jcy9yZXNvdXJjZXMvam9iI29uX2ZhaWx1cmUgSm9iI29uX2ZhaWx1cmV9XG4gICovXG4gIHJlYWRvbmx5IG9uRmFpbHVyZT86IEpvYldlYmhvb2tOb3RpZmljYXRpb25zT25GYWlsdXJlW10gfCBjZGt0Zi5JUmVzb2x2YWJsZTtcbiAgLyoqXG4gICogb25fc3RhcnQgYmxvY2tcbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2RhdGFicmlja3MvZGF0YWJyaWNrcy8xLjk5LjAvZG9jcy9yZXNvdXJjZXMvam9iI29uX3N0YXJ0IEpvYiNvbl9zdGFydH1cbiAgKi9cbiAgcmVhZG9ubHkgb25TdGFydD86IEpvYldlYmhvb2tOb3RpZmljYXRpb25zT25TdGFydFtdIHwgY2RrdGYuSVJlc29sdmFibGU7XG4gIC8qKlxuICAqIG9uX3N0cmVhbWluZ19iYWNrbG9nX2V4Y2VlZGVkIGJsb2NrXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9kYXRhYnJpY2tzL2RhdGFicmlja3MvMS45OS4wL2RvY3MvcmVzb3VyY2VzL2pvYiNvbl9zdHJlYW1pbmdfYmFja2xvZ19leGNlZWRlZCBKb2Ijb25fc3RyZWFtaW5nX2JhY2tsb2dfZXhjZWVkZWR9XG4gICovXG4gIHJlYWRvbmx5IG9uU3RyZWFtaW5nQmFja2xvZ0V4Y2VlZGVkPzogSm9iV2ViaG9va05vdGlmaWNhdGlvbnNPblN0cmVhbWluZ0JhY2tsb2dFeGNlZWRlZFtdIHwgY2RrdGYuSVJlc29sdmFibGU7XG4gIC8qKlxuICAqIG9uX3N1Y2Nlc3MgYmxvY2tcbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2RhdGFicmlja3MvZGF0YWJyaWNrcy8xLjk5LjAvZG9jcy9yZXNvdXJjZXMvam9iI29uX3N1Y2Nlc3MgSm9iI29uX3N1Y2Nlc3N9XG4gICovXG4gIHJlYWRvbmx5IG9uU3VjY2Vzcz86IEpvYldlYmhvb2tOb3RpZmljYXRpb25zT25TdWNjZXNzW10gfCBjZGt0Zi5JUmVzb2x2YWJsZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGpvYldlYmhvb2tOb3RpZmljYXRpb25zVG9UZXJyYWZvcm0oc3RydWN0PzogSm9iV2ViaG9va05vdGlmaWNhdGlvbnNPdXRwdXRSZWZlcmVuY2UgfCBKb2JXZWJob29rTm90aWZpY2F0aW9ucyk6IGFueSB7XG4gIGlmICghY2RrdGYuY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RmLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0Zi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBvbl9kdXJhdGlvbl93YXJuaW5nX3RocmVzaG9sZF9leGNlZWRlZDogY2RrdGYubGlzdE1hcHBlcihqb2JXZWJob29rTm90aWZpY2F0aW9uc09uRHVyYXRpb25XYXJuaW5nVGhyZXNob2xkRXhjZWVkZWRUb1RlcnJhZm9ybSwgdHJ1ZSkoc3RydWN0IS5vbkR1cmF0aW9uV2FybmluZ1RocmVzaG9sZEV4Y2VlZGVkKSxcbiAgICBvbl9mYWlsdXJlOiBjZGt0Zi5saXN0TWFwcGVyKGpvYldlYmhvb2tOb3RpZmljYXRpb25zT25GYWlsdXJlVG9UZXJyYWZvcm0sIHRydWUpKHN0cnVjdCEub25GYWlsdXJlKSxcbiAgICBvbl9zdGFydDogY2RrdGYubGlzdE1hcHBlcihqb2JXZWJob29rTm90aWZpY2F0aW9uc09uU3RhcnRUb1RlcnJhZm9ybSwgdHJ1ZSkoc3RydWN0IS5vblN0YXJ0KSxcbiAgICBvbl9zdHJlYW1pbmdfYmFja2xvZ19leGNlZWRlZDogY2RrdGYubGlzdE1hcHBlcihqb2JXZWJob29rTm90aWZpY2F0aW9uc09uU3RyZWFtaW5nQmFja2xvZ0V4Y2VlZGVkVG9UZXJyYWZvcm0sIHRydWUpKHN0cnVjdCEub25TdHJlYW1pbmdCYWNrbG9nRXhjZWVkZWQpLFxuICAgIG9uX3N1Y2Nlc3M6IGNka3RmLmxpc3RNYXBwZXIoam9iV2ViaG9va05vdGlmaWNhdGlvbnNPblN1Y2Nlc3NUb1RlcnJhZm9ybSwgdHJ1ZSkoc3RydWN0IS5vblN1Y2Nlc3MpLFxuICB9XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGpvYldlYmhvb2tOb3RpZmljYXRpb25zVG9IY2xUZXJyYWZvcm0oc3RydWN0PzogSm9iV2ViaG9va05vdGlmaWNhdGlvbnNPdXRwdXRSZWZlcmVuY2UgfCBKb2JXZWJob29rTm90aWZpY2F0aW9ucyk6IGFueSB7XG4gIGlmICghY2RrdGYuY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RmLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0Zi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgY29uc3QgYXR0cnMgPSB7XG4gICAgb25fZHVyYXRpb25fd2FybmluZ190aHJlc2hvbGRfZXhjZWVkZWQ6IHtcbiAgICAgIHZhbHVlOiBjZGt0Zi5saXN0TWFwcGVySGNsKGpvYldlYmhvb2tOb3RpZmljYXRpb25zT25EdXJhdGlvbldhcm5pbmdUaHJlc2hvbGRFeGNlZWRlZFRvSGNsVGVycmFmb3JtLCB0cnVlKShzdHJ1Y3QhLm9uRHVyYXRpb25XYXJuaW5nVGhyZXNob2xkRXhjZWVkZWQpLFxuICAgICAgaXNCbG9jazogdHJ1ZSxcbiAgICAgIHR5cGU6IFwibGlzdFwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJKb2JXZWJob29rTm90aWZpY2F0aW9uc09uRHVyYXRpb25XYXJuaW5nVGhyZXNob2xkRXhjZWVkZWRMaXN0XCIsXG4gICAgfSxcbiAgICBvbl9mYWlsdXJlOiB7XG4gICAgICB2YWx1ZTogY2RrdGYubGlzdE1hcHBlckhjbChqb2JXZWJob29rTm90aWZpY2F0aW9uc09uRmFpbHVyZVRvSGNsVGVycmFmb3JtLCB0cnVlKShzdHJ1Y3QhLm9uRmFpbHVyZSksXG4gICAgICBpc0Jsb2NrOiB0cnVlLFxuICAgICAgdHlwZTogXCJsaXN0XCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIkpvYldlYmhvb2tOb3RpZmljYXRpb25zT25GYWlsdXJlTGlzdFwiLFxuICAgIH0sXG4gICAgb25fc3RhcnQ6IHtcbiAgICAgIHZhbHVlOiBjZGt0Zi5saXN0TWFwcGVySGNsKGpvYldlYmhvb2tOb3RpZmljYXRpb25zT25TdGFydFRvSGNsVGVycmFmb3JtLCB0cnVlKShzdHJ1Y3QhLm9uU3RhcnQpLFxuICAgICAgaXNCbG9jazogdHJ1ZSxcbiAgICAgIHR5cGU6IFwibGlzdFwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJKb2JXZWJob29rTm90aWZpY2F0aW9uc09uU3RhcnRMaXN0XCIsXG4gICAgfSxcbiAgICBvbl9zdHJlYW1pbmdfYmFja2xvZ19leGNlZWRlZDoge1xuICAgICAgdmFsdWU6IGNka3RmLmxpc3RNYXBwZXJIY2woam9iV2ViaG9va05vdGlmaWNhdGlvbnNPblN0cmVhbWluZ0JhY2tsb2dFeGNlZWRlZFRvSGNsVGVycmFmb3JtLCB0cnVlKShzdHJ1Y3QhLm9uU3RyZWFtaW5nQmFja2xvZ0V4Y2VlZGVkKSxcbiAgICAgIGlzQmxvY2s6IHRydWUsXG4gICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwiSm9iV2ViaG9va05vdGlmaWNhdGlvbnNPblN0cmVhbWluZ0JhY2tsb2dFeGNlZWRlZExpc3RcIixcbiAgICB9LFxuICAgIG9uX3N1Y2Nlc3M6IHtcbiAgICAgIHZhbHVlOiBjZGt0Zi5saXN0TWFwcGVySGNsKGpvYldlYmhvb2tOb3RpZmljYXRpb25zT25TdWNjZXNzVG9IY2xUZXJyYWZvcm0sIHRydWUpKHN0cnVjdCEub25TdWNjZXNzKSxcbiAgICAgIGlzQmxvY2s6IHRydWUsXG4gICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwiSm9iV2ViaG9va05vdGlmaWNhdGlvbnNPblN1Y2Nlc3NMaXN0XCIsXG4gICAgfSxcbiAgfTtcblxuICAvLyByZW1vdmUgdW5kZWZpbmVkIGF0dHJpYnV0ZXNcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhdHRycykuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWQpKTtcbn1cblxuZXhwb3J0IGNsYXNzIEpvYldlYmhvb2tOb3RpZmljYXRpb25zT3V0cHV0UmVmZXJlbmNlIGV4dGVuZHMgY2RrdGYuQ29tcGxleE9iamVjdCB7XG4gIHByaXZhdGUgaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuXG4gIC8qKlxuICAqIEBwYXJhbSB0ZXJyYWZvcm1SZXNvdXJjZSBUaGUgcGFyZW50IHJlc291cmNlXG4gICogQHBhcmFtIHRlcnJhZm9ybUF0dHJpYnV0ZSBUaGUgYXR0cmlidXRlIG9uIHRoZSBwYXJlbnQgcmVzb3VyY2UgdGhpcyBjbGFzcyBpcyByZWZlcmVuY2luZ1xuICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IodGVycmFmb3JtUmVzb3VyY2U6IGNka3RmLklJbnRlcnBvbGF0aW5nUGFyZW50LCB0ZXJyYWZvcm1BdHRyaWJ1dGU6IHN0cmluZykge1xuICAgIHN1cGVyKHRlcnJhZm9ybVJlc291cmNlLCB0ZXJyYWZvcm1BdHRyaWJ1dGUsIGZhbHNlLCAwKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW50ZXJuYWxWYWx1ZSgpOiBKb2JXZWJob29rTm90aWZpY2F0aW9ucyB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGhhc0FueVZhbHVlcyA9IHRoaXMuaXNFbXB0eU9iamVjdDtcbiAgICBjb25zdCBpbnRlcm5hbFZhbHVlUmVzdWx0OiBhbnkgPSB7fTtcbiAgICBpZiAodGhpcy5fb25EdXJhdGlvbldhcm5pbmdUaHJlc2hvbGRFeGNlZWRlZD8uaW50ZXJuYWxWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5vbkR1cmF0aW9uV2FybmluZ1RocmVzaG9sZEV4Y2VlZGVkID0gdGhpcy5fb25EdXJhdGlvbldhcm5pbmdUaHJlc2hvbGRFeGNlZWRlZD8uaW50ZXJuYWxWYWx1ZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX29uRmFpbHVyZT8uaW50ZXJuYWxWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5vbkZhaWx1cmUgPSB0aGlzLl9vbkZhaWx1cmU/LmludGVybmFsVmFsdWU7XG4gICAgfVxuICAgIGlmICh0aGlzLl9vblN0YXJ0Py5pbnRlcm5hbFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0Lm9uU3RhcnQgPSB0aGlzLl9vblN0YXJ0Py5pbnRlcm5hbFZhbHVlO1xuICAgIH1cbiAgICBpZiAodGhpcy5fb25TdHJlYW1pbmdCYWNrbG9nRXhjZWVkZWQ/LmludGVybmFsVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQub25TdHJlYW1pbmdCYWNrbG9nRXhjZWVkZWQgPSB0aGlzLl9vblN0cmVhbWluZ0JhY2tsb2dFeGNlZWRlZD8uaW50ZXJuYWxWYWx1ZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX29uU3VjY2Vzcz8uaW50ZXJuYWxWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5vblN1Y2Nlc3MgPSB0aGlzLl9vblN1Y2Nlc3M/LmludGVybmFsVmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBoYXNBbnlWYWx1ZXMgPyBpbnRlcm5hbFZhbHVlUmVzdWx0IDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHNldCBpbnRlcm5hbFZhbHVlKHZhbHVlOiBKb2JXZWJob29rTm90aWZpY2F0aW9ucyB8IHVuZGVmaW5lZCkge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBmYWxzZTtcbiAgICAgIHRoaXMuX29uRHVyYXRpb25XYXJuaW5nVGhyZXNob2xkRXhjZWVkZWQuaW50ZXJuYWxWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX29uRmFpbHVyZS5pbnRlcm5hbFZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fb25TdGFydC5pbnRlcm5hbFZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fb25TdHJlYW1pbmdCYWNrbG9nRXhjZWVkZWQuaW50ZXJuYWxWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX29uU3VjY2Vzcy5pbnRlcm5hbFZhbHVlID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGggPT09IDA7XG4gICAgICB0aGlzLl9vbkR1cmF0aW9uV2FybmluZ1RocmVzaG9sZEV4Y2VlZGVkLmludGVybmFsVmFsdWUgPSB2YWx1ZS5vbkR1cmF0aW9uV2FybmluZ1RocmVzaG9sZEV4Y2VlZGVkO1xuICAgICAgdGhpcy5fb25GYWlsdXJlLmludGVybmFsVmFsdWUgPSB2YWx1ZS5vbkZhaWx1cmU7XG4gICAgICB0aGlzLl9vblN0YXJ0LmludGVybmFsVmFsdWUgPSB2YWx1ZS5vblN0YXJ0O1xuICAgICAgdGhpcy5fb25TdHJlYW1pbmdCYWNrbG9nRXhjZWVkZWQuaW50ZXJuYWxWYWx1ZSA9IHZhbHVlLm9uU3RyZWFtaW5nQmFja2xvZ0V4Y2VlZGVkO1xuICAgICAgdGhpcy5fb25TdWNjZXNzLmludGVybmFsVmFsdWUgPSB2YWx1ZS5vblN1Y2Nlc3M7XG4gICAgfVxuICB9XG5cbiAgLy8gb25fZHVyYXRpb25fd2FybmluZ190aHJlc2hvbGRfZXhjZWVkZWQgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfb25EdXJhdGlvbldhcm5pbmdUaHJlc2hvbGRFeGNlZWRlZCA9IG5ldyBKb2JXZWJob29rTm90aWZpY2F0aW9uc09uRHVyYXRpb25XYXJuaW5nVGhyZXNob2xkRXhjZWVkZWRMaXN0KHRoaXMsIFwib25fZHVyYXRpb25fd2FybmluZ190aHJlc2hvbGRfZXhjZWVkZWRcIiwgZmFsc2UpO1xuICBwdWJsaWMgZ2V0IG9uRHVyYXRpb25XYXJuaW5nVGhyZXNob2xkRXhjZWVkZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX29uRHVyYXRpb25XYXJuaW5nVGhyZXNob2xkRXhjZWVkZWQ7XG4gIH1cbiAgcHVibGljIHB1dE9uRHVyYXRpb25XYXJuaW5nVGhyZXNob2xkRXhjZWVkZWQodmFsdWU6IEpvYldlYmhvb2tOb3RpZmljYXRpb25zT25EdXJhdGlvbldhcm5pbmdUaHJlc2hvbGRFeGNlZWRlZFtdIHwgY2RrdGYuSVJlc29sdmFibGUpIHtcbiAgICB0aGlzLl9vbkR1cmF0aW9uV2FybmluZ1RocmVzaG9sZEV4Y2VlZGVkLmludGVybmFsVmFsdWUgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRPbkR1cmF0aW9uV2FybmluZ1RocmVzaG9sZEV4Y2VlZGVkKCkge1xuICAgIHRoaXMuX29uRHVyYXRpb25XYXJuaW5nVGhyZXNob2xkRXhjZWVkZWQuaW50ZXJuYWxWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgb25EdXJhdGlvbldhcm5pbmdUaHJlc2hvbGRFeGNlZWRlZElucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9vbkR1cmF0aW9uV2FybmluZ1RocmVzaG9sZEV4Y2VlZGVkLmludGVybmFsVmFsdWU7XG4gIH1cblxuICAvLyBvbl9mYWlsdXJlIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX29uRmFpbHVyZSA9IG5ldyBKb2JXZWJob29rTm90aWZpY2F0aW9uc09uRmFpbHVyZUxpc3QodGhpcywgXCJvbl9mYWlsdXJlXCIsIGZhbHNlKTtcbiAgcHVibGljIGdldCBvbkZhaWx1cmUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX29uRmFpbHVyZTtcbiAgfVxuICBwdWJsaWMgcHV0T25GYWlsdXJlKHZhbHVlOiBKb2JXZWJob29rTm90aWZpY2F0aW9uc09uRmFpbHVyZVtdIHwgY2RrdGYuSVJlc29sdmFibGUpIHtcbiAgICB0aGlzLl9vbkZhaWx1cmUuaW50ZXJuYWxWYWx1ZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldE9uRmFpbHVyZSgpIHtcbiAgICB0aGlzLl9vbkZhaWx1cmUuaW50ZXJuYWxWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgb25GYWlsdXJlSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX29uRmFpbHVyZS5pbnRlcm5hbFZhbHVlO1xuICB9XG5cbiAgLy8gb25fc3RhcnQgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfb25TdGFydCA9IG5ldyBKb2JXZWJob29rTm90aWZpY2F0aW9uc09uU3RhcnRMaXN0KHRoaXMsIFwib25fc3RhcnRcIiwgZmFsc2UpO1xuICBwdWJsaWMgZ2V0IG9uU3RhcnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX29uU3RhcnQ7XG4gIH1cbiAgcHVibGljIHB1dE9uU3RhcnQodmFsdWU6IEpvYldlYmhvb2tOb3RpZmljYXRpb25zT25TdGFydFtdIHwgY2RrdGYuSVJlc29sdmFibGUpIHtcbiAgICB0aGlzLl9vblN0YXJ0LmludGVybmFsVmFsdWUgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRPblN0YXJ0KCkge1xuICAgIHRoaXMuX29uU3RhcnQuaW50ZXJuYWxWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgb25TdGFydElucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9vblN0YXJ0LmludGVybmFsVmFsdWU7XG4gIH1cblxuICAvLyBvbl9zdHJlYW1pbmdfYmFja2xvZ19leGNlZWRlZCAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9vblN0cmVhbWluZ0JhY2tsb2dFeGNlZWRlZCA9IG5ldyBKb2JXZWJob29rTm90aWZpY2F0aW9uc09uU3RyZWFtaW5nQmFja2xvZ0V4Y2VlZGVkTGlzdCh0aGlzLCBcIm9uX3N0cmVhbWluZ19iYWNrbG9nX2V4Y2VlZGVkXCIsIGZhbHNlKTtcbiAgcHVibGljIGdldCBvblN0cmVhbWluZ0JhY2tsb2dFeGNlZWRlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fb25TdHJlYW1pbmdCYWNrbG9nRXhjZWVkZWQ7XG4gIH1cbiAgcHVibGljIHB1dE9uU3RyZWFtaW5nQmFja2xvZ0V4Y2VlZGVkKHZhbHVlOiBKb2JXZWJob29rTm90aWZpY2F0aW9uc09uU3RyZWFtaW5nQmFja2xvZ0V4Y2VlZGVkW10gfCBjZGt0Zi5JUmVzb2x2YWJsZSkge1xuICAgIHRoaXMuX29uU3RyZWFtaW5nQmFja2xvZ0V4Y2VlZGVkLmludGVybmFsVmFsdWUgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRPblN0cmVhbWluZ0JhY2tsb2dFeGNlZWRlZCgpIHtcbiAgICB0aGlzLl9vblN0cmVhbWluZ0JhY2tsb2dFeGNlZWRlZC5pbnRlcm5hbFZhbHVlID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBvblN0cmVhbWluZ0JhY2tsb2dFeGNlZWRlZElucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9vblN0cmVhbWluZ0JhY2tsb2dFeGNlZWRlZC5pbnRlcm5hbFZhbHVlO1xuICB9XG5cbiAgLy8gb25fc3VjY2VzcyAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9vblN1Y2Nlc3MgPSBuZXcgSm9iV2ViaG9va05vdGlmaWNhdGlvbnNPblN1Y2Nlc3NMaXN0KHRoaXMsIFwib25fc3VjY2Vzc1wiLCBmYWxzZSk7XG4gIHB1YmxpYyBnZXQgb25TdWNjZXNzKCkge1xuICAgIHJldHVybiB0aGlzLl9vblN1Y2Nlc3M7XG4gIH1cbiAgcHVibGljIHB1dE9uU3VjY2Vzcyh2YWx1ZTogSm9iV2ViaG9va05vdGlmaWNhdGlvbnNPblN1Y2Nlc3NbXSB8IGNka3RmLklSZXNvbHZhYmxlKSB7XG4gICAgdGhpcy5fb25TdWNjZXNzLmludGVybmFsVmFsdWUgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRPblN1Y2Nlc3MoKSB7XG4gICAgdGhpcy5fb25TdWNjZXNzLmludGVybmFsVmFsdWUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IG9uU3VjY2Vzc0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9vblN1Y2Nlc3MuaW50ZXJuYWxWYWx1ZTtcbiAgfVxufVxuIl19