UNPKG

@cdktf/provider-aws

Version:

Prebuilt aws Provider for Terraform CDK (cdktf)

2,658 lines 445 kB
"use strict";
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u;
Object.defineProperty(exports, "__esModule", { value: true });
exports.ChimesdkmediapipelinesMediaInsightsPipelineConfigurationTimeoutsOutputReference = exports.chimesdkmediapipelinesMediaInsightsPipelineConfigurationTimeoutsToHclTerraform = exports.chimesdkmediapipelinesMediaInsightsPipelineConfigurationTimeoutsToTerraform = exports.ChimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationOutputReference = exports.chimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationToHclTerraform = exports.chimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationToTerraform = exports.ChimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationRulesList = exports.ChimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationRulesOutputReference = exports.chimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationRulesToHclTerraform = exports.chimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationRulesToTerraform = exports.ChimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationRulesSentimentConfigurationOutputReference = exports.chimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationRulesSentimentConfigurationToHclTerraform = exports.chimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationRulesSentimentConfigurationToTerraform = exports.ChimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationRulesKeywordMatchConfigurationOutputReference = exports.chimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationRulesKeywordMatchConfigurationToHclTerraform = exports.chimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationRulesKeywordMatchConfigurationToTerraform = exports.ChimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationRulesIssueDetectionConfigurationOutputReference = exports.chimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationRulesIssueDetectionConfigurationToHclTerraform = exports.chimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationRulesIssueDetectionConfigurationToTerraform = exports.ChimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsList = exports.ChimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsOutputReference = exports.chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsToHclTerraform = exports.chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsToTerraform = exports.ChimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsVoiceAnalyticsProcessorConfigurationOutputReference = exports.chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsVoiceAnalyticsProcessorConfigurationToHclTerraform = exports.chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsVoiceAnalyticsProcessorConfigurationToTerraform = exports.ChimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsSqsQueueSinkConfigurationOutputReference = exports.chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsSqsQueueSinkConfigurationToHclTerraform = exports.chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsSqsQueueSinkConfigurationToTerraform = exports.ChimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsSnsTopicSinkConfigurationOutputReference = exports.chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsSnsTopicSinkConfigurationToHclTerraform = exports.chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsSnsTopicSinkConfigurationToTerraform = exports.ChimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsS3RecordingSinkConfigurationOutputReference = exports.chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsS3RecordingSinkConfigurationToHclTerraform = exports.chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsS3RecordingSinkConfigurationToTerraform = exports.ChimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsLambdaFunctionSinkConfigurationOutputReference = exports.chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsLambdaFunctionSinkConfigurationToHclTerraform = exports.chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsLambdaFunctionSinkConfigurationToTerraform = exports.ChimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsKinesisDataStreamSinkConfigurationOutputReference = exports.chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsKinesisDataStreamSinkConfigurationToHclTerraform = exports.chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsKinesisDataStreamSinkConfigurationToTerraform = exports.ChimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsAmazonTranscribeProcessorConfigurationOutputReference = exports.chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsAmazonTranscribeProcessorConfigurationToHclTerraform = exports.chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsAmazonTranscribeProcessorConfigurationToTerraform = exports.ChimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsAmazonTranscribeCallAnalyticsProcessorConfigurationOutputReference = exports.chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsAmazonTranscribeCallAnalyticsProcessorConfigurationToHclTerraform = exports.chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsAmazonTranscribeCallAnalyticsProcessorConfigurationToTerraform = exports.ChimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsAmazonTranscribeCallAnalyticsProcessorConfigurationPostCallAnalyticsSettingsOutputReference = exports.chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsAmazonTranscribeCallAnalyticsProcessorConfigurationPostCallAnalyticsSettingsToHclTerraform = exports.chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsAmazonTranscribeCallAnalyticsProcessorConfigurationPostCallAnalyticsSettingsToTerraform = void 0;
exports.ChimesdkmediapipelinesMediaInsightsPipelineConfiguration = void 0;
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
const cdktf = require("cdktf");
function chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsAmazonTranscribeCallAnalyticsProcessorConfigurationPostCallAnalyticsSettingsToTerraform(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 {
        content_redaction_output: cdktf.stringToTerraform(struct.contentRedactionOutput),
        data_access_role_arn: cdktf.stringToTerraform(struct.dataAccessRoleArn),
        output_encryption_kms_key_id: cdktf.stringToTerraform(struct.outputEncryptionKmsKeyId),
        output_location: cdktf.stringToTerraform(struct.outputLocation),
    };
}
exports.chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsAmazonTranscribeCallAnalyticsProcessorConfigurationPostCallAnalyticsSettingsToTerraform = chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsAmazonTranscribeCallAnalyticsProcessorConfigurationPostCallAnalyticsSettingsToTerraform;
function chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsAmazonTranscribeCallAnalyticsProcessorConfigurationPostCallAnalyticsSettingsToHclTerraform(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 = {
        content_redaction_output: {
            value: cdktf.stringToHclTerraform(struct.contentRedactionOutput),
            isBlock: false,
            type: "simple",
            storageClassType: "string",
        },
        data_access_role_arn: {
            value: cdktf.stringToHclTerraform(struct.dataAccessRoleArn),
            isBlock: false,
            type: "simple",
            storageClassType: "string",
        },
        output_encryption_kms_key_id: {
            value: cdktf.stringToHclTerraform(struct.outputEncryptionKmsKeyId),
            isBlock: false,
            type: "simple",
            storageClassType: "string",
        },
        output_location: {
            value: cdktf.stringToHclTerraform(struct.outputLocation),
            isBlock: false,
            type: "simple",
            storageClassType: "string",
        },
    };
    // remove undefined attributes
    return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
}
exports.chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsAmazonTranscribeCallAnalyticsProcessorConfigurationPostCallAnalyticsSettingsToHclTerraform = chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsAmazonTranscribeCallAnalyticsProcessorConfigurationPostCallAnalyticsSettingsToHclTerraform;
class ChimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsAmazonTranscribeCallAnalyticsProcessorConfigurationPostCallAnalyticsSettingsOutputReference extends cdktf.ComplexObject {
    /**
    * @param terraformResource The parent resource
    * @param terraformAttribute The attribute on the parent resource this class is referencing
    */
    constructor(terraformResource, terraformAttribute) {
        super(terraformResource, terraformAttribute, false, 0);
        this.isEmptyObject = false;
    }
    get internalValue() {
        let hasAnyValues = this.isEmptyObject;
        const internalValueResult = {};
        if (this._contentRedactionOutput !== undefined) {
            hasAnyValues = true;
            internalValueResult.contentRedactionOutput = this._contentRedactionOutput;
        }
        if (this._dataAccessRoleArn !== undefined) {
            hasAnyValues = true;
            internalValueResult.dataAccessRoleArn = this._dataAccessRoleArn;
        }
        if (this._outputEncryptionKmsKeyId !== undefined) {
            hasAnyValues = true;
            internalValueResult.outputEncryptionKmsKeyId = this._outputEncryptionKmsKeyId;
        }
        if (this._outputLocation !== undefined) {
            hasAnyValues = true;
            internalValueResult.outputLocation = this._outputLocation;
        }
        return hasAnyValues ? internalValueResult : undefined;
    }
    set internalValue(value) {
        if (value === undefined) {
            this.isEmptyObject = false;
            this._contentRedactionOutput = undefined;
            this._dataAccessRoleArn = undefined;
            this._outputEncryptionKmsKeyId = undefined;
            this._outputLocation = undefined;
        }
        else {
            this.isEmptyObject = Object.keys(value).length === 0;
            this._contentRedactionOutput = value.contentRedactionOutput;
            this._dataAccessRoleArn = value.dataAccessRoleArn;
            this._outputEncryptionKmsKeyId = value.outputEncryptionKmsKeyId;
            this._outputLocation = value.outputLocation;
        }
    }
    get contentRedactionOutput() {
        return this.getStringAttribute('content_redaction_output');
    }
    set contentRedactionOutput(value) {
        this._contentRedactionOutput = value;
    }
    resetContentRedactionOutput() {
        this._contentRedactionOutput = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get contentRedactionOutputInput() {
        return this._contentRedactionOutput;
    }
    get dataAccessRoleArn() {
        return this.getStringAttribute('data_access_role_arn');
    }
    set dataAccessRoleArn(value) {
        this._dataAccessRoleArn = value;
    }
    // Temporarily expose input value. Use with caution.
    get dataAccessRoleArnInput() {
        return this._dataAccessRoleArn;
    }
    get outputEncryptionKmsKeyId() {
        return this.getStringAttribute('output_encryption_kms_key_id');
    }
    set outputEncryptionKmsKeyId(value) {
        this._outputEncryptionKmsKeyId = value;
    }
    resetOutputEncryptionKmsKeyId() {
        this._outputEncryptionKmsKeyId = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get outputEncryptionKmsKeyIdInput() {
        return this._outputEncryptionKmsKeyId;
    }
    get outputLocation() {
        return this.getStringAttribute('output_location');
    }
    set outputLocation(value) {
        this._outputLocation = value;
    }
    // Temporarily expose input value. Use with caution.
    get outputLocationInput() {
        return this._outputLocation;
    }
}
exports.ChimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsAmazonTranscribeCallAnalyticsProcessorConfigurationPostCallAnalyticsSettingsOutputReference = ChimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsAmazonTranscribeCallAnalyticsProcessorConfigurationPostCallAnalyticsSettingsOutputReference;
_a = JSII_RTTI_SYMBOL_1;
ChimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsAmazonTranscribeCallAnalyticsProcessorConfigurationPostCallAnalyticsSettingsOutputReference[_a] = { fqn: "@cdktf/provider-aws.chimesdkmediapipelinesMediaInsightsPipelineConfiguration.ChimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsAmazonTranscribeCallAnalyticsProcessorConfigurationPostCallAnalyticsSettingsOutputReference", version: "19.50.0" };
function chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsAmazonTranscribeCallAnalyticsProcessorConfigurationToTerraform(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 {
        call_analytics_stream_categories: cdktf.listMapper(cdktf.stringToTerraform, false)(struct.callAnalyticsStreamCategories),
        content_identification_type: cdktf.stringToTerraform(struct.contentIdentificationType),
        content_redaction_type: cdktf.stringToTerraform(struct.contentRedactionType),
        enable_partial_results_stabilization: cdktf.booleanToTerraform(struct.enablePartialResultsStabilization),
        filter_partial_results: cdktf.booleanToTerraform(struct.filterPartialResults),
        language_code: cdktf.stringToTerraform(struct.languageCode),
        language_model_name: cdktf.stringToTerraform(struct.languageModelName),
        partial_results_stability: cdktf.stringToTerraform(struct.partialResultsStability),
        pii_entity_types: cdktf.stringToTerraform(struct.piiEntityTypes),
        vocabulary_filter_method: cdktf.stringToTerraform(struct.vocabularyFilterMethod),
        vocabulary_filter_name: cdktf.stringToTerraform(struct.vocabularyFilterName),
        vocabulary_name: cdktf.stringToTerraform(struct.vocabularyName),
        post_call_analytics_settings: chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsAmazonTranscribeCallAnalyticsProcessorConfigurationPostCallAnalyticsSettingsToTerraform(struct.postCallAnalyticsSettings),
    };
}
exports.chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsAmazonTranscribeCallAnalyticsProcessorConfigurationToTerraform = chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsAmazonTranscribeCallAnalyticsProcessorConfigurationToTerraform;
function chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsAmazonTranscribeCallAnalyticsProcessorConfigurationToHclTerraform(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 = {
        call_analytics_stream_categories: {
            value: cdktf.listMapperHcl(cdktf.stringToHclTerraform, false)(struct.callAnalyticsStreamCategories),
            isBlock: false,
            type: "list",
            storageClassType: "stringList",
        },
        content_identification_type: {
            value: cdktf.stringToHclTerraform(struct.contentIdentificationType),
            isBlock: false,
            type: "simple",
            storageClassType: "string",
        },
        content_redaction_type: {
            value: cdktf.stringToHclTerraform(struct.contentRedactionType),
            isBlock: false,
            type: "simple",
            storageClassType: "string",
        },
        enable_partial_results_stabilization: {
            value: cdktf.booleanToHclTerraform(struct.enablePartialResultsStabilization),
            isBlock: false,
            type: "simple",
            storageClassType: "boolean",
        },
        filter_partial_results: {
            value: cdktf.booleanToHclTerraform(struct.filterPartialResults),
            isBlock: false,
            type: "simple",
            storageClassType: "boolean",
        },
        language_code: {
            value: cdktf.stringToHclTerraform(struct.languageCode),
            isBlock: false,
            type: "simple",
            storageClassType: "string",
        },
        language_model_name: {
            value: cdktf.stringToHclTerraform(struct.languageModelName),
            isBlock: false,
            type: "simple",
            storageClassType: "string",
        },
        partial_results_stability: {
            value: cdktf.stringToHclTerraform(struct.partialResultsStability),
            isBlock: false,
            type: "simple",
            storageClassType: "string",
        },
        pii_entity_types: {
            value: cdktf.stringToHclTerraform(struct.piiEntityTypes),
            isBlock: false,
            type: "simple",
            storageClassType: "string",
        },
        vocabulary_filter_method: {
            value: cdktf.stringToHclTerraform(struct.vocabularyFilterMethod),
            isBlock: false,
            type: "simple",
            storageClassType: "string",
        },
        vocabulary_filter_name: {
            value: cdktf.stringToHclTerraform(struct.vocabularyFilterName),
            isBlock: false,
            type: "simple",
            storageClassType: "string",
        },
        vocabulary_name: {
            value: cdktf.stringToHclTerraform(struct.vocabularyName),
            isBlock: false,
            type: "simple",
            storageClassType: "string",
        },
        post_call_analytics_settings: {
            value: chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsAmazonTranscribeCallAnalyticsProcessorConfigurationPostCallAnalyticsSettingsToHclTerraform(struct.postCallAnalyticsSettings),
            isBlock: true,
            type: "list",
            storageClassType: "ChimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsAmazonTranscribeCallAnalyticsProcessorConfigurationPostCallAnalyticsSettingsList",
        },
    };
    // remove undefined attributes
    return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
}
exports.chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsAmazonTranscribeCallAnalyticsProcessorConfigurationToHclTerraform = chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsAmazonTranscribeCallAnalyticsProcessorConfigurationToHclTerraform;
class ChimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsAmazonTranscribeCallAnalyticsProcessorConfigurationOutputReference 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;
        // post_call_analytics_settings - computed: false, optional: true, required: false
        this._postCallAnalyticsSettings = new ChimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsAmazonTranscribeCallAnalyticsProcessorConfigurationPostCallAnalyticsSettingsOutputReference(this, "post_call_analytics_settings");
    }
    get internalValue() {
        let hasAnyValues = this.isEmptyObject;
        const internalValueResult = {};
        if (this._callAnalyticsStreamCategories !== undefined) {
            hasAnyValues = true;
            internalValueResult.callAnalyticsStreamCategories = this._callAnalyticsStreamCategories;
        }
        if (this._contentIdentificationType !== undefined) {
            hasAnyValues = true;
            internalValueResult.contentIdentificationType = this._contentIdentificationType;
        }
        if (this._contentRedactionType !== undefined) {
            hasAnyValues = true;
            internalValueResult.contentRedactionType = this._contentRedactionType;
        }
        if (this._enablePartialResultsStabilization !== undefined) {
            hasAnyValues = true;
            internalValueResult.enablePartialResultsStabilization = this._enablePartialResultsStabilization;
        }
        if (this._filterPartialResults !== undefined) {
            hasAnyValues = true;
            internalValueResult.filterPartialResults = this._filterPartialResults;
        }
        if (this._languageCode !== undefined) {
            hasAnyValues = true;
            internalValueResult.languageCode = this._languageCode;
        }
        if (this._languageModelName !== undefined) {
            hasAnyValues = true;
            internalValueResult.languageModelName = this._languageModelName;
        }
        if (this._partialResultsStability !== undefined) {
            hasAnyValues = true;
            internalValueResult.partialResultsStability = this._partialResultsStability;
        }
        if (this._piiEntityTypes !== undefined) {
            hasAnyValues = true;
            internalValueResult.piiEntityTypes = this._piiEntityTypes;
        }
        if (this._vocabularyFilterMethod !== undefined) {
            hasAnyValues = true;
            internalValueResult.vocabularyFilterMethod = this._vocabularyFilterMethod;
        }
        if (this._vocabularyFilterName !== undefined) {
            hasAnyValues = true;
            internalValueResult.vocabularyFilterName = this._vocabularyFilterName;
        }
        if (this._vocabularyName !== undefined) {
            hasAnyValues = true;
            internalValueResult.vocabularyName = this._vocabularyName;
        }
        if (this._postCallAnalyticsSettings?.internalValue !== undefined) {
            hasAnyValues = true;
            internalValueResult.postCallAnalyticsSettings = this._postCallAnalyticsSettings?.internalValue;
        }
        return hasAnyValues ? internalValueResult : undefined;
    }
    set internalValue(value) {
        if (value === undefined) {
            this.isEmptyObject = false;
            this._callAnalyticsStreamCategories = undefined;
            this._contentIdentificationType = undefined;
            this._contentRedactionType = undefined;
            this._enablePartialResultsStabilization = undefined;
            this._filterPartialResults = undefined;
            this._languageCode = undefined;
            this._languageModelName = undefined;
            this._partialResultsStability = undefined;
            this._piiEntityTypes = undefined;
            this._vocabularyFilterMethod = undefined;
            this._vocabularyFilterName = undefined;
            this._vocabularyName = undefined;
            this._postCallAnalyticsSettings.internalValue = undefined;
        }
        else {
            this.isEmptyObject = Object.keys(value).length === 0;
            this._callAnalyticsStreamCategories = value.callAnalyticsStreamCategories;
            this._contentIdentificationType = value.contentIdentificationType;
            this._contentRedactionType = value.contentRedactionType;
            this._enablePartialResultsStabilization = value.enablePartialResultsStabilization;
            this._filterPartialResults = value.filterPartialResults;
            this._languageCode = value.languageCode;
            this._languageModelName = value.languageModelName;
            this._partialResultsStability = value.partialResultsStability;
            this._piiEntityTypes = value.piiEntityTypes;
            this._vocabularyFilterMethod = value.vocabularyFilterMethod;
            this._vocabularyFilterName = value.vocabularyFilterName;
            this._vocabularyName = value.vocabularyName;
            this._postCallAnalyticsSettings.internalValue = value.postCallAnalyticsSettings;
        }
    }
    get callAnalyticsStreamCategories() {
        return this.getListAttribute('call_analytics_stream_categories');
    }
    set callAnalyticsStreamCategories(value) {
        this._callAnalyticsStreamCategories = value;
    }
    resetCallAnalyticsStreamCategories() {
        this._callAnalyticsStreamCategories = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get callAnalyticsStreamCategoriesInput() {
        return this._callAnalyticsStreamCategories;
    }
    get contentIdentificationType() {
        return this.getStringAttribute('content_identification_type');
    }
    set contentIdentificationType(value) {
        this._contentIdentificationType = value;
    }
    resetContentIdentificationType() {
        this._contentIdentificationType = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get contentIdentificationTypeInput() {
        return this._contentIdentificationType;
    }
    get contentRedactionType() {
        return this.getStringAttribute('content_redaction_type');
    }
    set contentRedactionType(value) {
        this._contentRedactionType = value;
    }
    resetContentRedactionType() {
        this._contentRedactionType = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get contentRedactionTypeInput() {
        return this._contentRedactionType;
    }
    get enablePartialResultsStabilization() {
        return this.getBooleanAttribute('enable_partial_results_stabilization');
    }
    set enablePartialResultsStabilization(value) {
        this._enablePartialResultsStabilization = value;
    }
    resetEnablePartialResultsStabilization() {
        this._enablePartialResultsStabilization = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get enablePartialResultsStabilizationInput() {
        return this._enablePartialResultsStabilization;
    }
    get filterPartialResults() {
        return this.getBooleanAttribute('filter_partial_results');
    }
    set filterPartialResults(value) {
        this._filterPartialResults = value;
    }
    resetFilterPartialResults() {
        this._filterPartialResults = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get filterPartialResultsInput() {
        return this._filterPartialResults;
    }
    get languageCode() {
        return this.getStringAttribute('language_code');
    }
    set languageCode(value) {
        this._languageCode = value;
    }
    // Temporarily expose input value. Use with caution.
    get languageCodeInput() {
        return this._languageCode;
    }
    get languageModelName() {
        return this.getStringAttribute('language_model_name');
    }
    set languageModelName(value) {
        this._languageModelName = value;
    }
    resetLanguageModelName() {
        this._languageModelName = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get languageModelNameInput() {
        return this._languageModelName;
    }
    get partialResultsStability() {
        return this.getStringAttribute('partial_results_stability');
    }
    set partialResultsStability(value) {
        this._partialResultsStability = value;
    }
    resetPartialResultsStability() {
        this._partialResultsStability = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get partialResultsStabilityInput() {
        return this._partialResultsStability;
    }
    get piiEntityTypes() {
        return this.getStringAttribute('pii_entity_types');
    }
    set piiEntityTypes(value) {
        this._piiEntityTypes = value;
    }
    resetPiiEntityTypes() {
        this._piiEntityTypes = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get piiEntityTypesInput() {
        return this._piiEntityTypes;
    }
    get vocabularyFilterMethod() {
        return this.getStringAttribute('vocabulary_filter_method');
    }
    set vocabularyFilterMethod(value) {
        this._vocabularyFilterMethod = value;
    }
    resetVocabularyFilterMethod() {
        this._vocabularyFilterMethod = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get vocabularyFilterMethodInput() {
        return this._vocabularyFilterMethod;
    }
    get vocabularyFilterName() {
        return this.getStringAttribute('vocabulary_filter_name');
    }
    set vocabularyFilterName(value) {
        this._vocabularyFilterName = value;
    }
    resetVocabularyFilterName() {
        this._vocabularyFilterName = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get vocabularyFilterNameInput() {
        return this._vocabularyFilterName;
    }
    get vocabularyName() {
        return this.getStringAttribute('vocabulary_name');
    }
    set vocabularyName(value) {
        this._vocabularyName = value;
    }
    resetVocabularyName() {
        this._vocabularyName = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get vocabularyNameInput() {
        return this._vocabularyName;
    }
    get postCallAnalyticsSettings() {
        return this._postCallAnalyticsSettings;
    }
    putPostCallAnalyticsSettings(value) {
        this._postCallAnalyticsSettings.internalValue = value;
    }
    resetPostCallAnalyticsSettings() {
        this._postCallAnalyticsSettings.internalValue = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get postCallAnalyticsSettingsInput() {
        return this._postCallAnalyticsSettings.internalValue;
    }
}
exports.ChimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsAmazonTranscribeCallAnalyticsProcessorConfigurationOutputReference = ChimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsAmazonTranscribeCallAnalyticsProcessorConfigurationOutputReference;
_b = JSII_RTTI_SYMBOL_1;
ChimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsAmazonTranscribeCallAnalyticsProcessorConfigurationOutputReference[_b] = { fqn: "@cdktf/provider-aws.chimesdkmediapipelinesMediaInsightsPipelineConfiguration.ChimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsAmazonTranscribeCallAnalyticsProcessorConfigurationOutputReference", version: "19.50.0" };
function chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsAmazonTranscribeProcessorConfigurationToTerraform(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 {
        content_identification_type: cdktf.stringToTerraform(struct.contentIdentificationType),
        content_redaction_type: cdktf.stringToTerraform(struct.contentRedactionType),
        enable_partial_results_stabilization: cdktf.booleanToTerraform(struct.enablePartialResultsStabilization),
        filter_partial_results: cdktf.booleanToTerraform(struct.filterPartialResults),
        language_code: cdktf.stringToTerraform(struct.languageCode),
        language_model_name: cdktf.stringToTerraform(struct.languageModelName),
        partial_results_stability: cdktf.stringToTerraform(struct.partialResultsStability),
        pii_entity_types: cdktf.stringToTerraform(struct.piiEntityTypes),
        show_speaker_label: cdktf.booleanToTerraform(struct.showSpeakerLabel),
        vocabulary_filter_method: cdktf.stringToTerraform(struct.vocabularyFilterMethod),
        vocabulary_filter_name: cdktf.stringToTerraform(struct.vocabularyFilterName),
        vocabulary_name: cdktf.stringToTerraform(struct.vocabularyName),
    };
}
exports.chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsAmazonTranscribeProcessorConfigurationToTerraform = chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsAmazonTranscribeProcessorConfigurationToTerraform;
function chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsAmazonTranscribeProcessorConfigurationToHclTerraform(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 = {
        content_identification_type: {
            value: cdktf.stringToHclTerraform(struct.contentIdentificationType),
            isBlock: false,
            type: "simple",
            storageClassType: "string",
        },
        content_redaction_type: {
            value: cdktf.stringToHclTerraform(struct.contentRedactionType),
            isBlock: false,
            type: "simple",
            storageClassType: "string",
        },
        enable_partial_results_stabilization: {
            value: cdktf.booleanToHclTerraform(struct.enablePartialResultsStabilization),
            isBlock: false,
            type: "simple",
            storageClassType: "boolean",
        },
        filter_partial_results: {
            value: cdktf.booleanToHclTerraform(struct.filterPartialResults),
            isBlock: false,
            type: "simple",
            storageClassType: "boolean",
        },
        language_code: {
            value: cdktf.stringToHclTerraform(struct.languageCode),
            isBlock: false,
            type: "simple",
            storageClassType: "string",
        },
        language_model_name: {
            value: cdktf.stringToHclTerraform(struct.languageModelName),
            isBlock: false,
            type: "simple",
            storageClassType: "string",
        },
        partial_results_stability: {
            value: cdktf.stringToHclTerraform(struct.partialResultsStability),
            isBlock: false,
            type: "simple",
            storageClassType: "string",
        },
        pii_entity_types: {
            value: cdktf.stringToHclTerraform(struct.piiEntityTypes),
            isBlock: false,
            type: "simple",
            storageClassType: "string",
        },
        show_speaker_label: {
            value: cdktf.booleanToHclTerraform(struct.showSpeakerLabel),
            isBlock: false,
            type: "simple",
            storageClassType: "boolean",
        },
        vocabulary_filter_method: {
            value: cdktf.stringToHclTerraform(struct.vocabularyFilterMethod),
            isBlock: false,
            type: "simple",
            storageClassType: "string",
        },
        vocabulary_filter_name: {
            value: cdktf.stringToHclTerraform(struct.vocabularyFilterName),
            isBlock: false,
            type: "simple",
            storageClassType: "string",
        },
        vocabulary_name: {
            value: cdktf.stringToHclTerraform(struct.vocabularyName),
            isBlock: false,
            type: "simple",
            storageClassType: "string",
        },
    };
    // remove undefined attributes
    return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
}
exports.chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsAmazonTranscribeProcessorConfigurationToHclTerraform = chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsAmazonTranscribeProcessorConfigurationToHclTerraform;
class ChimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsAmazonTranscribeProcessorConfigurationOutputReference extends cdktf.ComplexObject {
    /**
    * @param terraformResource The parent resource
    * @param terraformAttribute The attribute on the parent resource this class is referencing
    */
    constructor(terraformResource, terraformAttribute) {
        super(terraformResource, terraformAttribute, false, 0);
        this.isEmptyObject = false;
    }
    get internalValue() {
        let hasAnyValues = this.isEmptyObject;
        const internalValueResult = {};
        if (this._contentIdentificationType !== undefined) {
            hasAnyValues = true;
            internalValueResult.contentIdentificationType = this._contentIdentificationType;
        }
        if (this._contentRedactionType !== undefined) {
            hasAnyValues = true;
            internalValueResult.contentRedactionType = this._contentRedactionType;
        }
        if (this._enablePartialResultsStabilization !== undefined) {
            hasAnyValues = true;
            internalValueResult.enablePartialResultsStabilization = this._enablePartialResultsStabilization;
        }
        if (this._filterPartialResults !== undefined) {
            hasAnyValues = true;
            internalValueResult.filterPartialResults = this._filterPartialResults;
        }
        if (this._languageCode !== undefined) {
            hasAnyValues = true;
            internalValueResult.languageCode = this._languageCode;
        }
        if (this._languageModelName !== undefined) {
            hasAnyValues = true;
            internalValueResult.languageModelName = this._languageModelName;
        }
        if (this._partialResultsStability !== undefined) {
            hasAnyValues = true;
            internalValueResult.partialResultsStability = this._partialResultsStability;
        }
        if (this._piiEntityTypes !== undefined) {
            hasAnyValues = true;
            internalValueResult.piiEntityTypes = this._piiEntityTypes;
        }
        if (this._showSpeakerLabel !== undefined) {
            hasAnyValues = true;
            internalValueResult.showSpeakerLabel = this._showSpeakerLabel;
        }
        if (this._vocabularyFilterMethod !== undefined) {
            hasAnyValues = true;
            internalValueResult.vocabularyFilterMethod = this._vocabularyFilterMethod;
        }
        if (this._vocabularyFilterName !== undefined) {
            hasAnyValues = true;
            internalValueResult.vocabularyFilterName = this._vocabularyFilterName;
        }
        if (this._vocabularyName !== undefined) {
            hasAnyValues = true;
            internalValueResult.vocabularyName = this._vocabularyName;
        }
        return hasAnyValues ? internalValueResult : undefined;
    }
    set internalValue(value) {
        if (value === undefined) {
            this.isEmptyObject = false;
            this._contentIdentificationType = undefined;
            this._contentRedactionType = undefined;
            this._enablePartialResultsStabilization = undefined;
            this._filterPartialResults = undefined;
            this._languageCode = undefined;
            this._languageModelName = undefined;
            this._partialResultsStability = undefined;
            this._piiEntityTypes = undefined;
            this._showSpeakerLabel = undefined;
            this._vocabularyFilterMethod = undefined;
            this._vocabularyFilterName = undefined;
            this._vocabularyName = undefined;
        }
        else {
            this.isEmptyObject = Object.keys(value).length === 0;
            this._contentIdentificationType = value.contentIdentificationType;
            this._contentRedactionType = value.contentRedactionType;
            this._enablePartialResultsStabilization = value.enablePartialResultsStabilization;
            this._filterPartialResults = value.filterPartialResults;
            this._languageCode = value.languageCode;
            this._languageModelName = value.languageModelName;
            this._partialResultsStability = value.partialResultsStability;
            this._piiEntityTypes = value.piiEntityTypes;
            this._showSpeakerLabel = value.showSpeakerLabel;
            this._vocabularyFilterMethod = value.vocabularyFilterMethod;
            this._vocabularyFilterName = value.vocabularyFilterName;
            this._vocabularyName = value.vocabularyName;
        }
    }
    get contentIdentificationType() {
        return this.getStringAttribute('content_identification_type');
    }
    set contentIdentificationType(value) {
        this._contentIdentificationType = value;
    }
    resetContentIdentificationType() {
        this._contentIdentificationType = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get contentIdentificationTypeInput() {
        return this._contentIdentificationType;
    }
    get contentRedactionType() {
        return this.getStringAttribute('content_redaction_type');
    }
    set contentRedactionType(value) {
        this._contentRedactionType = value;
    }
    resetContentRedactionType() {
        this._contentRedactionType = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get contentRedactionTypeInput() {
        return this._contentRedactionType;
    }
    get enablePartialResultsStabilization() {
        return this.getBooleanAttribute('enable_partial_results_stabilization');
    }
    set enablePartialResultsStabilization(value) {
        this._enablePartialResultsStabilization = value;
    }
    resetEnablePartialResultsStabilization() {
        this._enablePartialResultsStabilization = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get enablePartialResultsStabilizationInput() {
        return this._enablePartialResultsStabilization;
    }
    get filterPartialResults() {
        return this.getBooleanAttribute('filter_partial_results');
    }
    set filterPartialResults(value) {
        this._filterPartialResults = value;
    }
    resetFilterPartialResults() {
        this._filterPartialResults = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get filterPartialResultsInput() {
        return this._filterPartialResults;
    }
    get languageCode() {
        return this.getStringAttribute('language_code');
    }
    set languageCode(value) {
        this._languageCode = value;
    }
    // Temporarily expose input value. Use with caution.
    get languageCodeInput() {
        return this._languageCode;
    }
    get languageModelName() {
        return this.getStringAttribute('language_model_name');
    }
    set languageModelName(value) {
        this._languageModelName = value;
    }
    resetLanguageModelName() {
        this._languageModelName = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get languageModelNameInput() {
        return this._languageModelName;
    }
    get partialResultsStability() {
        return this.getStringAttribute('partial_results_stability');
    }
    set partialResultsStability(value) {
        this._partialResultsStability = value;
    }
    resetPartialResultsStability() {
        this._partialResultsStability = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get partialResultsStabilityInput() {
        return this._partialResultsStability;
    }
    get piiEntityTypes() {
        return this.getStringAttribute('pii_entity_types');
    }
    set piiEntityTypes(value) {
        this._piiEntityTypes = value;
    }
    resetPiiEntityTypes() {
        this._piiEntityTypes = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get piiEntityTypesInput() {
        return this._piiEntityTypes;
    }
    get showSpeakerLabel() {
        return this.getBooleanAttribute('show_speaker_label');
    }
    set showSpeakerLabel(value) {
        this._showSpeakerLabel = value;
    }
    resetShowSpeakerLabel() {
        this._showSpeakerLabel = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get showSpeakerLabelInput() {
        return this._showSpeakerLabel;
    }
    get vocabularyFilterMethod() {
        return this.getStringAttribute('vocabulary_filter_method');
    }
    set vocabularyFilterMethod(value) {
        this._vocabularyFilterMethod = value;
    }
    resetVocabularyFilterMethod() {
        this._vocabularyFilterMethod = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get vocabularyFilterMethodInput() {
        return this._vocabularyFilterMethod;
    }
    get vocabularyFilterName() {
        return this.getStringAttribute('vocabulary_filter_name');
    }
    set vocabularyFilterName(value) {
        this._vocabularyFilterName = value;
    }
    resetVocabularyFilterName() {
        this._vocabularyFilterName = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get vocabularyFilterNameInput() {
        return this._vocabularyFilterName;
    }
    get vocabularyName() {
        return this.getStringAttribute('vocabulary_name');
    }
    set vocabularyName(value) {
        this._vocabularyName = value;
    }
    resetVocabularyName() {
        this._vocabularyName = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get vocabularyNameInput() {
        return this._vocabularyName;
    }
}
exports.ChimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsAmazonTranscribeProcessorConfigurationOutputReference = ChimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsAmazonTranscribeProcessorConfigurationOutputReference;
_c = JSII_RTTI_SYMBOL_1;
ChimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsAmazonTranscribeProcessorConfigurationOutputReference[_c] = { fqn: "@cdktf/provider-aws.chimesdkmediapipelinesMediaInsightsPipelineConfiguration.ChimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsAmazonTranscribeProcessorConfigurationOutputReference", version: "19.50.0" };
function chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsKinesisDataStreamSinkConfigurationToTerraform(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 {
        insights_target: cdktf.stringToTerraform(struct.insightsTarget),
    };
}
exports.chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsKinesisDataStreamSinkConfigurationToTerraform = chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsKinesisDataStreamSinkConfigurationToTerraform;
function chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsKinesisDataStreamSinkConfigurationToHclTerraform(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 = {
        insights_target: {
            value: cdktf.stringToHclTerraform(struct.insightsTarget),
            isBlock: false,
            type: "simple",
            storageClassType: "string",
        },
    };
    // remove undefined attributes
    return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
}
exports.chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsKinesisDataStreamSinkConfigurationToHclTerraform = chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsKinesisDataStreamSinkConfigurationToHclTerraform;
class ChimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsKinesisDataStreamSinkConfigurationOutputReference extends cdktf.ComplexObject {
    /**
    * @param terraformResource The parent resource
    * @param terraformAttribute The attribute on the parent resource this class is referencing
    */
    constructor(terraformResource, terraformAttribute) {
        super(terraformResource, terraformAttribute, false, 0);
        this.isEmptyObject = false;
    }
    get internalValue() {
        let hasAnyValues = this.isEmptyObject;
        const internalValueResult = {};
        if (this._insightsTarget !== undefined) {
            hasAnyValues = true;
            internalValueResult.insightsTarget = this._insightsTarget;
        }
        return hasAnyValues ? internalValueResult : undefined;
    }
    set internalValue(value) {
        if (value === undefined) {
            this.isEmptyObject = false;
            this._insightsTarget = undefined;
        }
        else {
            this.isEmptyObject = Object.keys(value).length === 0;
            this._insightsTarget = value.insightsTarget;
        }
    }
    get insightsTarget() {
        return this.getStringAttribute('insights_target');
    }
    set insightsTarget(value) {
        this._insightsTarget = value;
    }
    // Temporarily expose input value. Use with caution.
    get insightsTargetInput() {
        return this._insightsTarget;
    }
}
exports.ChimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsKinesisDataStreamSinkConfigurationOutputReference = ChimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsKinesisDataStreamSinkConfigurationOutputReference;
_d = JSII_RTTI_SYMBOL_1;
ChimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsKinesisDataStreamSinkConfigurationOutputReference[_d] = { fqn: "@cdktf/provider-aws.chimesdkmediapipelinesMediaInsightsPipelineConfiguration.ChimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsKinesisDataStreamSinkConfigurationOutputReference", version: "19.50.0" };
function chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsLambdaFunctionSinkConfigurationToTerraform(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 {
        insights_target: cdktf.stringToTerraform(struct.insightsTarget),
    };
}
exports.chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsLambdaFunctionSinkConfigurationToTerraform = chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsLambdaFunctionSinkConfigurationToTerraform;
function chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsLambdaFunctionSinkConfigurationToHclTerraform(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 = {
        insights_target: {
            value: cdktf.stringToHclTerraform(struct.insightsTarget),
            isBlock: false,
            type: "simple",
            storageClassType: "string",
        },
    };
    // remove undefined attributes
    return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
}
exports.chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsLambdaFunctionSinkConfigurationToHclTerraform = chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsLambdaFunctionSinkConfigurationToHclTerraform;
class ChimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsLambdaFunctionSinkConfigurationOutputReference extends cdktf.ComplexObject {
    /**
    * @param terraformResource The parent resource
    * @param terraformAttribute The attribute on the parent resource this class is referencing
    */
    constructor(terraformResource, terraformAttribute) {
        super(terraformResource, terraformAttribute, false, 0);
        this.isEmptyObject = false;
    }
    get internalValue() {
        let hasAnyValues = this.isEmptyObject;
        const internalValueResult = {};
        if (this._insightsTarget !== undefined) {
            hasAnyValues = true;
            internalValueResult.insightsTarget = this._insightsTarget;
        }
        return hasAnyValues ? internalValueResult : undefined;
    }
    set internalValue(value) {
        if (value === undefined) {
            this.isEmptyObject = false;
            this._insightsTarget = undefined;
        }
        else {
            this.isEmptyObject = Object.keys(value).length === 0;
            this._insightsTarget = value.insightsTarget;
        }
    }
    get insightsTarget() {
        return this.getStringAttribute('insights_target');
    }
    set insightsTarget(value) {
        this._insightsTarget = value;
    }
    // Temporarily expose input value. Use with caution.
    get insightsTargetInput() {
        return this._insightsTarget;
    }
}
exports.ChimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsLambdaFunctionSinkConfigurationOutputReference = ChimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsLambdaFunctionSinkConfigurationOutputReference;
_e = JSII_RTTI_SYMBOL_1;
ChimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsLambdaFunctionSinkConfigurationOutputReference[_e] = { fqn: "@cdktf/provider-aws.chimesdkmediapipelinesMediaInsightsPipelineConfiguration.ChimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsLambdaFunctionSinkConfigurationOutputReference", version: "19.50.0" };
function chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsS3RecordingSinkConfigurationToTerraform(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 {
        destination: cdktf.stringToTerraform(struct.destination),
    };
}
exports.chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsS3RecordingSinkConfigurationToTerraform = chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsS3RecordingSinkConfigurationToTerraform;
function chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsS3RecordingSinkConfigurationToHclTerraform(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 = {
        destination: {
            value: cdktf.stringToHclTerraform(struct.destination),
            isBlock: false,
            type: "simple",
            storageClassType: "string",
        },
    };
    // remove undefined attributes
    return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
}
exports.chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsS3RecordingSinkConfigurationToHclTerraform = chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsS3RecordingSinkConfigurationToHclTerraform;
class ChimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsS3RecordingSinkConfigurationOutputReference extends cdktf.ComplexObject {
    /**
    * @param terraformResource The parent resource
    * @param terraformAttribute The attribute on the parent resource this class is referencing
    */
    constructor(terraformResource, terraformAttribute) {
        super(terraformResource, terraformAttribute, false, 0);
        this.isEmptyObject = false;
    }
    get internalValue() {
        let hasAnyValues = this.isEmptyObject;
        const internalValueResult = {};
        if (this._destination !== undefined) {
            hasAnyValues = true;
            internalValueResult.destination = this._destination;
        }
        return hasAnyValues ? internalValueResult : undefined;
    }
    set internalValue(value) {
        if (value === undefined) {
            this.isEmptyObject = false;
            this._destination = undefined;
        }
        else {
            this.isEmptyObject = Object.keys(value).length === 0;
            this._destination = value.destination;
        }
    }
    get destination() {
        return this.getStringAttribute('destination');
    }
    set destination(value) {
        this._destination = value;
    }
    resetDestination() {
        this._destination = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get destinationInput() {
        return this._destination;
    }
}
exports.ChimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsS3RecordingSinkConfigurationOutputReference = ChimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsS3RecordingSinkConfigurationOutputReference;
_f = JSII_RTTI_SYMBOL_1;
ChimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsS3RecordingSinkConfigurationOutputReference[_f] = { fqn: "@cdktf/provider-aws.chimesdkmediapipelinesMediaInsightsPipelineConfiguration.ChimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsS3RecordingSinkConfigurationOutputReference", version: "19.50.0" };
function chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsSnsTopicSinkConfigurationToTerraform(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 {
        insights_target: cdktf.stringToTerraform(struct.insightsTarget),
    };
}
exports.chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsSnsTopicSinkConfigurationToTerraform = chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsSnsTopicSinkConfigurationToTerraform;
function chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsSnsTopicSinkConfigurationToHclTerraform(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 = {
        insights_target: {
            value: cdktf.stringToHclTerraform(struct.insightsTarget),
            isBlock: false,
            type: "simple",
            storageClassType: "string",
        },
    };
    // remove undefined attributes
    return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
}
exports.chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsSnsTopicSinkConfigurationToHclTerraform = chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsSnsTopicSinkConfigurationToHclTerraform;
class ChimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsSnsTopicSinkConfigurationOutputReference extends cdktf.ComplexObject {
    /**
    * @param terraformResource The parent resource
    * @param terraformAttribute The attribute on the parent resource this class is referencing
    */
    constructor(terraformResource, terraformAttribute) {
        super(terraformResource, terraformAttribute, false, 0);
        this.isEmptyObject = false;
    }
    get internalValue() {
        let hasAnyValues = this.isEmptyObject;
        const internalValueResult = {};
        if (this._insightsTarget !== undefined) {
            hasAnyValues = true;
            internalValueResult.insightsTarget = this._insightsTarget;
        }
        return hasAnyValues ? internalValueResult : undefined;
    }
    set internalValue(value) {
        if (value === undefined) {
            this.isEmptyObject = false;
            this._insightsTarget = undefined;
        }
        else {
            this.isEmptyObject = Object.keys(value).length === 0;
            this._insightsTarget = value.insightsTarget;
        }
    }
    get insightsTarget() {
        return this.getStringAttribute('insights_target');
    }
    set insightsTarget(value) {
        this._insightsTarget = value;
    }
    // Temporarily expose input value. Use with caution.
    get insightsTargetInput() {
        return this._insightsTarget;
    }
}
exports.ChimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsSnsTopicSinkConfigurationOutputReference = ChimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsSnsTopicSinkConfigurationOutputReference;
_g = JSII_RTTI_SYMBOL_1;
ChimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsSnsTopicSinkConfigurationOutputReference[_g] = { fqn: "@cdktf/provider-aws.chimesdkmediapipelinesMediaInsightsPipelineConfiguration.ChimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsSnsTopicSinkConfigurationOutputReference", version: "19.50.0" };
function chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsSqsQueueSinkConfigurationToTerraform(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 {
        insights_target: cdktf.stringToTerraform(struct.insightsTarget),
    };
}
exports.chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsSqsQueueSinkConfigurationToTerraform = chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsSqsQueueSinkConfigurationToTerraform;
function chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsSqsQueueSinkConfigurationToHclTerraform(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 = {
        insights_target: {
            value: cdktf.stringToHclTerraform(struct.insightsTarget),
            isBlock: false,
            type: "simple",
            storageClassType: "string",
        },
    };
    // remove undefined attributes
    return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
}
exports.chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsSqsQueueSinkConfigurationToHclTerraform = chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsSqsQueueSinkConfigurationToHclTerraform;
class ChimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsSqsQueueSinkConfigurationOutputReference extends cdktf.ComplexObject {
    /**
    * @param terraformResource The parent resource
    * @param terraformAttribute The attribute on the parent resource this class is referencing
    */
    constructor(terraformResource, terraformAttribute) {
        super(terraformResource, terraformAttribute, false, 0);
        this.isEmptyObject = false;
    }
    get internalValue() {
        let hasAnyValues = this.isEmptyObject;
        const internalValueResult = {};
        if (this._insightsTarget !== undefined) {
            hasAnyValues = true;
            internalValueResult.insightsTarget = this._insightsTarget;
        }
        return hasAnyValues ? internalValueResult : undefined;
    }
    set internalValue(value) {
        if (value === undefined) {
            this.isEmptyObject = false;
            this._insightsTarget = undefined;
        }
        else {
            this.isEmptyObject = Object.keys(value).length === 0;
            this._insightsTarget = value.insightsTarget;
        }
    }
    get insightsTarget() {
        return this.getStringAttribute('insights_target');
    }
    set insightsTarget(value) {
        this._insightsTarget = value;
    }
    // Temporarily expose input value. Use with caution.
    get insightsTargetInput() {
        return this._insightsTarget;
    }
}
exports.ChimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsSqsQueueSinkConfigurationOutputReference = ChimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsSqsQueueSinkConfigurationOutputReference;
_h = JSII_RTTI_SYMBOL_1;
ChimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsSqsQueueSinkConfigurationOutputReference[_h] = { fqn: "@cdktf/provider-aws.chimesdkmediapipelinesMediaInsightsPipelineConfiguration.ChimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsSqsQueueSinkConfigurationOutputReference", version: "19.50.0" };
function chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsVoiceAnalyticsProcessorConfigurationToTerraform(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 {
        speaker_search_status: cdktf.stringToTerraform(struct.speakerSearchStatus),
        voice_tone_analysis_status: cdktf.stringToTerraform(struct.voiceToneAnalysisStatus),
    };
}
exports.chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsVoiceAnalyticsProcessorConfigurationToTerraform = chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsVoiceAnalyticsProcessorConfigurationToTerraform;
function chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsVoiceAnalyticsProcessorConfigurationToHclTerraform(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 = {
        speaker_search_status: {
            value: cdktf.stringToHclTerraform(struct.speakerSearchStatus),
            isBlock: false,
            type: "simple",
            storageClassType: "string",
        },
        voice_tone_analysis_status: {
            value: cdktf.stringToHclTerraform(struct.voiceToneAnalysisStatus),
            isBlock: false,
            type: "simple",
            storageClassType: "string",
        },
    };
    // remove undefined attributes
    return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
}
exports.chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsVoiceAnalyticsProcessorConfigurationToHclTerraform = chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsVoiceAnalyticsProcessorConfigurationToHclTerraform;
class ChimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsVoiceAnalyticsProcessorConfigurationOutputReference extends cdktf.ComplexObject {
    /**
    * @param terraformResource The parent resource
    * @param terraformAttribute The attribute on the parent resource this class is referencing
    */
    constructor(terraformResource, terraformAttribute) {
        super(terraformResource, terraformAttribute, false, 0);
        this.isEmptyObject = false;
    }
    get internalValue() {
        let hasAnyValues = this.isEmptyObject;
        const internalValueResult = {};
        if (this._speakerSearchStatus !== undefined) {
            hasAnyValues = true;
            internalValueResult.speakerSearchStatus = this._speakerSearchStatus;
        }
        if (this._voiceToneAnalysisStatus !== undefined) {
            hasAnyValues = true;
            internalValueResult.voiceToneAnalysisStatus = this._voiceToneAnalysisStatus;
        }
        return hasAnyValues ? internalValueResult : undefined;
    }
    set internalValue(value) {
        if (value === undefined) {
            this.isEmptyObject = false;
            this._speakerSearchStatus = undefined;
            this._voiceToneAnalysisStatus = undefined;
        }
        else {
            this.isEmptyObject = Object.keys(value).length === 0;
            this._speakerSearchStatus = value.speakerSearchStatus;
            this._voiceToneAnalysisStatus = value.voiceToneAnalysisStatus;
        }
    }
    get speakerSearchStatus() {
        return this.getStringAttribute('speaker_search_status');
    }
    set speakerSearchStatus(value) {
        this._speakerSearchStatus = value;
    }
    // Temporarily expose input value. Use with caution.
    get speakerSearchStatusInput() {
        return this._speakerSearchStatus;
    }
    get voiceToneAnalysisStatus() {
        return this.getStringAttribute('voice_tone_analysis_status');
    }
    set voiceToneAnalysisStatus(value) {
        this._voiceToneAnalysisStatus = value;
    }
    // Temporarily expose input value. Use with caution.
    get voiceToneAnalysisStatusInput() {
        return this._voiceToneAnalysisStatus;
    }
}
exports.ChimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsVoiceAnalyticsProcessorConfigurationOutputReference = ChimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsVoiceAnalyticsProcessorConfigurationOutputReference;
_j = JSII_RTTI_SYMBOL_1;
ChimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsVoiceAnalyticsProcessorConfigurationOutputReference[_j] = { fqn: "@cdktf/provider-aws.chimesdkmediapipelinesMediaInsightsPipelineConfiguration.ChimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsVoiceAnalyticsProcessorConfigurationOutputReference", version: "19.50.0" };
function chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsToTerraform(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 {
        type: cdktf.stringToTerraform(struct.type),
        amazon_transcribe_call_analytics_processor_configuration: chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsAmazonTranscribeCallAnalyticsProcessorConfigurationToTerraform(struct.amazonTranscribeCallAnalyticsProcessorConfiguration),
        amazon_transcribe_processor_configuration: chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsAmazonTranscribeProcessorConfigurationToTerraform(struct.amazonTranscribeProcessorConfiguration),
        kinesis_data_stream_sink_configuration: chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsKinesisDataStreamSinkConfigurationToTerraform(struct.kinesisDataStreamSinkConfiguration),
        lambda_function_sink_configuration: chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsLambdaFunctionSinkConfigurationToTerraform(struct.lambdaFunctionSinkConfiguration),
        s3_recording_sink_configuration: chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsS3RecordingSinkConfigurationToTerraform(struct.s3RecordingSinkConfiguration),
        sns_topic_sink_configuration: chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsSnsTopicSinkConfigurationToTerraform(struct.snsTopicSinkConfiguration),
        sqs_queue_sink_configuration: chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsSqsQueueSinkConfigurationToTerraform(struct.sqsQueueSinkConfiguration),
        voice_analytics_processor_configuration: chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsVoiceAnalyticsProcessorConfigurationToTerraform(struct.voiceAnalyticsProcessorConfiguration),
    };
}
exports.chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsToTerraform = chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsToTerraform;
function chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsToHclTerraform(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 = {
        type: {
            value: cdktf.stringToHclTerraform(struct.type),
            isBlock: false,
            type: "simple",
            storageClassType: "string",
        },
        amazon_transcribe_call_analytics_processor_configuration: {
            value: chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsAmazonTranscribeCallAnalyticsProcessorConfigurationToHclTerraform(struct.amazonTranscribeCallAnalyticsProcessorConfiguration),
            isBlock: true,
            type: "list",
            storageClassType: "ChimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsAmazonTranscribeCallAnalyticsProcessorConfigurationList",
        },
        amazon_transcribe_processor_configuration: {
            value: chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsAmazonTranscribeProcessorConfigurationToHclTerraform(struct.amazonTranscribeProcessorConfiguration),
            isBlock: true,
            type: "list",
            storageClassType: "ChimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsAmazonTranscribeProcessorConfigurationList",
        },
        kinesis_data_stream_sink_configuration: {
            value: chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsKinesisDataStreamSinkConfigurationToHclTerraform(struct.kinesisDataStreamSinkConfiguration),
            isBlock: true,
            type: "list",
            storageClassType: "ChimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsKinesisDataStreamSinkConfigurationList",
        },
        lambda_function_sink_configuration: {
            value: chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsLambdaFunctionSinkConfigurationToHclTerraform(struct.lambdaFunctionSinkConfiguration),
            isBlock: true,
            type: "list",
            storageClassType: "ChimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsLambdaFunctionSinkConfigurationList",
        },
        s3_recording_sink_configuration: {
            value: chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsS3RecordingSinkConfigurationToHclTerraform(struct.s3RecordingSinkConfiguration),
            isBlock: true,
            type: "list",
            storageClassType: "ChimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsS3RecordingSinkConfigurationList",
        },
        sns_topic_sink_configuration: {
            value: chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsSnsTopicSinkConfigurationToHclTerraform(struct.snsTopicSinkConfiguration),
            isBlock: true,
            type: "list",
            storageClassType: "ChimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsSnsTopicSinkConfigurationList",
        },
        sqs_queue_sink_configuration: {
            value: chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsSqsQueueSinkConfigurationToHclTerraform(struct.sqsQueueSinkConfiguration),
            isBlock: true,
            type: "list",
            storageClassType: "ChimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsSqsQueueSinkConfigurationList",
        },
        voice_analytics_processor_configuration: {
            value: chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsVoiceAnalyticsProcessorConfigurationToHclTerraform(struct.voiceAnalyticsProcessorConfiguration),
            isBlock: true,
            type: "list",
            storageClassType: "ChimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsVoiceAnalyticsProcessorConfigurationList",
        },
    };
    // remove undefined attributes
    return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
}
exports.chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsToHclTerraform = chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsToHclTerraform;
class ChimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsOutputReference 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;
        // amazon_transcribe_call_analytics_processor_configuration - computed: false, optional: true, required: false
        this._amazonTranscribeCallAnalyticsProcessorConfiguration = new ChimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsAmazonTranscribeCallAnalyticsProcessorConfigurationOutputReference(this, "amazon_transcribe_call_analytics_processor_configuration");
        // amazon_transcribe_processor_configuration - computed: false, optional: true, required: false
        this._amazonTranscribeProcessorConfiguration = new ChimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsAmazonTranscribeProcessorConfigurationOutputReference(this, "amazon_transcribe_processor_configuration");
        // kinesis_data_stream_sink_configuration - computed: false, optional: true, required: false
        this._kinesisDataStreamSinkConfiguration = new ChimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsKinesisDataStreamSinkConfigurationOutputReference(this, "kinesis_data_stream_sink_configuration");
        // lambda_function_sink_configuration - computed: false, optional: true, required: false
        this._lambdaFunctionSinkConfiguration = new ChimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsLambdaFunctionSinkConfigurationOutputReference(this, "lambda_function_sink_configuration");
        // s3_recording_sink_configuration - computed: false, optional: true, required: false
        this._s3RecordingSinkConfiguration = new ChimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsS3RecordingSinkConfigurationOutputReference(this, "s3_recording_sink_configuration");
        // sns_topic_sink_configuration - computed: false, optional: true, required: false
        this._snsTopicSinkConfiguration = new ChimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsSnsTopicSinkConfigurationOutputReference(this, "sns_topic_sink_configuration");
        // sqs_queue_sink_configuration - computed: false, optional: true, required: false
        this._sqsQueueSinkConfiguration = new ChimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsSqsQueueSinkConfigurationOutputReference(this, "sqs_queue_sink_configuration");
        // voice_analytics_processor_configuration - computed: false, optional: true, required: false
        this._voiceAnalyticsProcessorConfiguration = new ChimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsVoiceAnalyticsProcessorConfigurationOutputReference(this, "voice_analytics_processor_configuration");
    }
    get internalValue() {
        if (this.resolvableValue) {
            return this.resolvableValue;
        }
        let hasAnyValues = this.isEmptyObject;
        const internalValueResult = {};
        if (this._type !== undefined) {
            hasAnyValues = true;
            internalValueResult.type = this._type;
        }
        if (this._amazonTranscribeCallAnalyticsProcessorConfiguration?.internalValue !== undefined) {
            hasAnyValues = true;
            internalValueResult.amazonTranscribeCallAnalyticsProcessorConfiguration = this._amazonTranscribeCallAnalyticsProcessorConfiguration?.internalValue;
        }
        if (this._amazonTranscribeProcessorConfiguration?.internalValue !== undefined) {
            hasAnyValues = true;
            internalValueResult.amazonTranscribeProcessorConfiguration = this._amazonTranscribeProcessorConfiguration?.internalValue;
        }
        if (this._kinesisDataStreamSinkConfiguration?.internalValue !== undefined) {
            hasAnyValues = true;
            internalValueResult.kinesisDataStreamSinkConfiguration = this._kinesisDataStreamSinkConfiguration?.internalValue;
        }
        if (this._lambdaFunctionSinkConfiguration?.internalValue !== undefined) {
            hasAnyValues = true;
            internalValueResult.lambdaFunctionSinkConfiguration = this._lambdaFunctionSinkConfiguration?.internalValue;
        }
        if (this._s3RecordingSinkConfiguration?.internalValue !== undefined) {
            hasAnyValues = true;
            internalValueResult.s3RecordingSinkConfiguration = this._s3RecordingSinkConfiguration?.internalValue;
        }
        if (this._snsTopicSinkConfiguration?.internalValue !== undefined) {
            hasAnyValues = true;
            internalValueResult.snsTopicSinkConfiguration = this._snsTopicSinkConfiguration?.internalValue;
        }
        if (this._sqsQueueSinkConfiguration?.internalValue !== undefined) {
            hasAnyValues = true;
            internalValueResult.sqsQueueSinkConfiguration = this._sqsQueueSinkConfiguration?.internalValue;
        }
        if (this._voiceAnalyticsProcessorConfiguration?.internalValue !== undefined) {
            hasAnyValues = true;
            internalValueResult.voiceAnalyticsProcessorConfiguration = this._voiceAnalyticsProcessorConfiguration?.internalValue;
        }
        return hasAnyValues ? internalValueResult : undefined;
    }
    set internalValue(value) {
        if (value === undefined) {
            this.isEmptyObject = false;
            this.resolvableValue = undefined;
            this._type = undefined;
            this._amazonTranscribeCallAnalyticsProcessorConfiguration.internalValue = undefined;
            this._amazonTranscribeProcessorConfiguration.internalValue = undefined;
            this._kinesisDataStreamSinkConfiguration.internalValue = undefined;
            this._lambdaFunctionSinkConfiguration.internalValue = undefined;
            this._s3RecordingSinkConfiguration.internalValue = undefined;
            this._snsTopicSinkConfiguration.internalValue = undefined;
            this._sqsQueueSinkConfiguration.internalValue = undefined;
            this._voiceAnalyticsProcessorConfiguration.internalValue = 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._type = value.type;
            this._amazonTranscribeCallAnalyticsProcessorConfiguration.internalValue = value.amazonTranscribeCallAnalyticsProcessorConfiguration;
            this._amazonTranscribeProcessorConfiguration.internalValue = value.amazonTranscribeProcessorConfiguration;
            this._kinesisDataStreamSinkConfiguration.internalValue = value.kinesisDataStreamSinkConfiguration;
            this._lambdaFunctionSinkConfiguration.internalValue = value.lambdaFunctionSinkConfiguration;
            this._s3RecordingSinkConfiguration.internalValue = value.s3RecordingSinkConfiguration;
            this._snsTopicSinkConfiguration.internalValue = value.snsTopicSinkConfiguration;
            this._sqsQueueSinkConfiguration.internalValue = value.sqsQueueSinkConfiguration;
            this._voiceAnalyticsProcessorConfiguration.internalValue = value.voiceAnalyticsProcessorConfiguration;
        }
    }
    get type() {
        return this.getStringAttribute('type');
    }
    set type(value) {
        this._type = value;
    }
    // Temporarily expose input value. Use with caution.
    get typeInput() {
        return this._type;
    }
    get amazonTranscribeCallAnalyticsProcessorConfiguration() {
        return this._amazonTranscribeCallAnalyticsProcessorConfiguration;
    }
    putAmazonTranscribeCallAnalyticsProcessorConfiguration(value) {
        this._amazonTranscribeCallAnalyticsProcessorConfiguration.internalValue = value;
    }
    resetAmazonTranscribeCallAnalyticsProcessorConfiguration() {
        this._amazonTranscribeCallAnalyticsProcessorConfiguration.internalValue = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get amazonTranscribeCallAnalyticsProcessorConfigurationInput() {
        return this._amazonTranscribeCallAnalyticsProcessorConfiguration.internalValue;
    }
    get amazonTranscribeProcessorConfiguration() {
        return this._amazonTranscribeProcessorConfiguration;
    }
    putAmazonTranscribeProcessorConfiguration(value) {
        this._amazonTranscribeProcessorConfiguration.internalValue = value;
    }
    resetAmazonTranscribeProcessorConfiguration() {
        this._amazonTranscribeProcessorConfiguration.internalValue = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get amazonTranscribeProcessorConfigurationInput() {
        return this._amazonTranscribeProcessorConfiguration.internalValue;
    }
    get kinesisDataStreamSinkConfiguration() {
        return this._kinesisDataStreamSinkConfiguration;
    }
    putKinesisDataStreamSinkConfiguration(value) {
        this._kinesisDataStreamSinkConfiguration.internalValue = value;
    }
    resetKinesisDataStreamSinkConfiguration() {
        this._kinesisDataStreamSinkConfiguration.internalValue = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get kinesisDataStreamSinkConfigurationInput() {
        return this._kinesisDataStreamSinkConfiguration.internalValue;
    }
    get lambdaFunctionSinkConfiguration() {
        return this._lambdaFunctionSinkConfiguration;
    }
    putLambdaFunctionSinkConfiguration(value) {
        this._lambdaFunctionSinkConfiguration.internalValue = value;
    }
    resetLambdaFunctionSinkConfiguration() {
        this._lambdaFunctionSinkConfiguration.internalValue = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get lambdaFunctionSinkConfigurationInput() {
        return this._lambdaFunctionSinkConfiguration.internalValue;
    }
    get s3RecordingSinkConfiguration() {
        return this._s3RecordingSinkConfiguration;
    }
    putS3RecordingSinkConfiguration(value) {
        this._s3RecordingSinkConfiguration.internalValue = value;
    }
    resetS3RecordingSinkConfiguration() {
        this._s3RecordingSinkConfiguration.internalValue = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get s3RecordingSinkConfigurationInput() {
        return this._s3RecordingSinkConfiguration.internalValue;
    }
    get snsTopicSinkConfiguration() {
        return this._snsTopicSinkConfiguration;
    }
    putSnsTopicSinkConfiguration(value) {
        this._snsTopicSinkConfiguration.internalValue = value;
    }
    resetSnsTopicSinkConfiguration() {
        this._snsTopicSinkConfiguration.internalValue = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get snsTopicSinkConfigurationInput() {
        return this._snsTopicSinkConfiguration.internalValue;
    }
    get sqsQueueSinkConfiguration() {
        return this._sqsQueueSinkConfiguration;
    }
    putSqsQueueSinkConfiguration(value) {
        this._sqsQueueSinkConfiguration.internalValue = value;
    }
    resetSqsQueueSinkConfiguration() {
        this._sqsQueueSinkConfiguration.internalValue = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get sqsQueueSinkConfigurationInput() {
        return this._sqsQueueSinkConfiguration.internalValue;
    }
    get voiceAnalyticsProcessorConfiguration() {
        return this._voiceAnalyticsProcessorConfiguration;
    }
    putVoiceAnalyticsProcessorConfiguration(value) {
        this._voiceAnalyticsProcessorConfiguration.internalValue = value;
    }
    resetVoiceAnalyticsProcessorConfiguration() {
        this._voiceAnalyticsProcessorConfiguration.internalValue = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get voiceAnalyticsProcessorConfigurationInput() {
        return this._voiceAnalyticsProcessorConfiguration.internalValue;
    }
}
exports.ChimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsOutputReference = ChimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsOutputReference;
_k = JSII_RTTI_SYMBOL_1;
ChimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsOutputReference[_k] = { fqn: "@cdktf/provider-aws.chimesdkmediapipelinesMediaInsightsPipelineConfiguration.ChimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsOutputReference", version: "19.50.0" };
class ChimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsList 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 ChimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsOutputReference(this.terraformResource, this.terraformAttribute, index, this.wrapsSet);
    }
}
exports.ChimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsList = ChimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsList;
_l = JSII_RTTI_SYMBOL_1;
ChimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsList[_l] = { fqn: "@cdktf/provider-aws.chimesdkmediapipelinesMediaInsightsPipelineConfiguration.ChimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsList", version: "19.50.0" };
function chimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationRulesIssueDetectionConfigurationToTerraform(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 {
        rule_name: cdktf.stringToTerraform(struct.ruleName),
    };
}
exports.chimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationRulesIssueDetectionConfigurationToTerraform = chimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationRulesIssueDetectionConfigurationToTerraform;
function chimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationRulesIssueDetectionConfigurationToHclTerraform(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 = {
        rule_name: {
            value: cdktf.stringToHclTerraform(struct.ruleName),
            isBlock: false,
            type: "simple",
            storageClassType: "string",
        },
    };
    // remove undefined attributes
    return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
}
exports.chimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationRulesIssueDetectionConfigurationToHclTerraform = chimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationRulesIssueDetectionConfigurationToHclTerraform;
class ChimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationRulesIssueDetectionConfigurationOutputReference extends cdktf.ComplexObject {
    /**
    * @param terraformResource The parent resource
    * @param terraformAttribute The attribute on the parent resource this class is referencing
    */
    constructor(terraformResource, terraformAttribute) {
        super(terraformResource, terraformAttribute, false, 0);
        this.isEmptyObject = false;
    }
    get internalValue() {
        let hasAnyValues = this.isEmptyObject;
        const internalValueResult = {};
        if (this._ruleName !== undefined) {
            hasAnyValues = true;
            internalValueResult.ruleName = this._ruleName;
        }
        return hasAnyValues ? internalValueResult : undefined;
    }
    set internalValue(value) {
        if (value === undefined) {
            this.isEmptyObject = false;
            this._ruleName = undefined;
        }
        else {
            this.isEmptyObject = Object.keys(value).length === 0;
            this._ruleName = value.ruleName;
        }
    }
    get ruleName() {
        return this.getStringAttribute('rule_name');
    }
    set ruleName(value) {
        this._ruleName = value;
    }
    // Temporarily expose input value. Use with caution.
    get ruleNameInput() {
        return this._ruleName;
    }
}
exports.ChimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationRulesIssueDetectionConfigurationOutputReference = ChimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationRulesIssueDetectionConfigurationOutputReference;
_m = JSII_RTTI_SYMBOL_1;
ChimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationRulesIssueDetectionConfigurationOutputReference[_m] = { fqn: "@cdktf/provider-aws.chimesdkmediapipelinesMediaInsightsPipelineConfiguration.ChimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationRulesIssueDetectionConfigurationOutputReference", version: "19.50.0" };
function chimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationRulesKeywordMatchConfigurationToTerraform(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 {
        keywords: cdktf.listMapper(cdktf.stringToTerraform, false)(struct.keywords),
        negate: cdktf.booleanToTerraform(struct.negate),
        rule_name: cdktf.stringToTerraform(struct.ruleName),
    };
}
exports.chimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationRulesKeywordMatchConfigurationToTerraform = chimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationRulesKeywordMatchConfigurationToTerraform;
function chimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationRulesKeywordMatchConfigurationToHclTerraform(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 = {
        keywords: {
            value: cdktf.listMapperHcl(cdktf.stringToHclTerraform, false)(struct.keywords),
            isBlock: false,
            type: "list",
            storageClassType: "stringList",
        },
        negate: {
            value: cdktf.booleanToHclTerraform(struct.negate),
            isBlock: false,
            type: "simple",
            storageClassType: "boolean",
        },
        rule_name: {
            value: cdktf.stringToHclTerraform(struct.ruleName),
            isBlock: false,
            type: "simple",
            storageClassType: "string",
        },
    };
    // remove undefined attributes
    return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
}
exports.chimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationRulesKeywordMatchConfigurationToHclTerraform = chimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationRulesKeywordMatchConfigurationToHclTerraform;
class ChimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationRulesKeywordMatchConfigurationOutputReference extends cdktf.ComplexObject {
    /**
    * @param terraformResource The parent resource
    * @param terraformAttribute The attribute on the parent resource this class is referencing
    */
    constructor(terraformResource, terraformAttribute) {
        super(terraformResource, terraformAttribute, false, 0);
        this.isEmptyObject = false;
    }
    get internalValue() {
        let hasAnyValues = this.isEmptyObject;
        const internalValueResult = {};
        if (this._keywords !== undefined) {
            hasAnyValues = true;
            internalValueResult.keywords = this._keywords;
        }
        if (this._negate !== undefined) {
            hasAnyValues = true;
            internalValueResult.negate = this._negate;
        }
        if (this._ruleName !== undefined) {
            hasAnyValues = true;
            internalValueResult.ruleName = this._ruleName;
        }
        return hasAnyValues ? internalValueResult : undefined;
    }
    set internalValue(value) {
        if (value === undefined) {
            this.isEmptyObject = false;
            this._keywords = undefined;
            this._negate = undefined;
            this._ruleName = undefined;
        }
        else {
            this.isEmptyObject = Object.keys(value).length === 0;
            this._keywords = value.keywords;
            this._negate = value.negate;
            this._ruleName = value.ruleName;
        }
    }
    get keywords() {
        return this.getListAttribute('keywords');
    }
    set keywords(value) {
        this._keywords = value;
    }
    // Temporarily expose input value. Use with caution.
    get keywordsInput() {
        return this._keywords;
    }
    get negate() {
        return this.getBooleanAttribute('negate');
    }
    set negate(value) {
        this._negate = value;
    }
    resetNegate() {
        this._negate = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get negateInput() {
        return this._negate;
    }
    get ruleName() {
        return this.getStringAttribute('rule_name');
    }
    set ruleName(value) {
        this._ruleName = value;
    }
    // Temporarily expose input value. Use with caution.
    get ruleNameInput() {
        return this._ruleName;
    }
}
exports.ChimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationRulesKeywordMatchConfigurationOutputReference = ChimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationRulesKeywordMatchConfigurationOutputReference;
_o = JSII_RTTI_SYMBOL_1;
ChimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationRulesKeywordMatchConfigurationOutputReference[_o] = { fqn: "@cdktf/provider-aws.chimesdkmediapipelinesMediaInsightsPipelineConfiguration.ChimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationRulesKeywordMatchConfigurationOutputReference", version: "19.50.0" };
function chimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationRulesSentimentConfigurationToTerraform(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 {
        rule_name: cdktf.stringToTerraform(struct.ruleName),
        sentiment_type: cdktf.stringToTerraform(struct.sentimentType),
        time_period: cdktf.numberToTerraform(struct.timePeriod),
    };
}
exports.chimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationRulesSentimentConfigurationToTerraform = chimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationRulesSentimentConfigurationToTerraform;
function chimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationRulesSentimentConfigurationToHclTerraform(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 = {
        rule_name: {
            value: cdktf.stringToHclTerraform(struct.ruleName),
            isBlock: false,
            type: "simple",
            storageClassType: "string",
        },
        sentiment_type: {
            value: cdktf.stringToHclTerraform(struct.sentimentType),
            isBlock: false,
            type: "simple",
            storageClassType: "string",
        },
        time_period: {
            value: cdktf.numberToHclTerraform(struct.timePeriod),
            isBlock: false,
            type: "simple",
            storageClassType: "number",
        },
    };
    // remove undefined attributes
    return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
}
exports.chimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationRulesSentimentConfigurationToHclTerraform = chimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationRulesSentimentConfigurationToHclTerraform;
class ChimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationRulesSentimentConfigurationOutputReference extends cdktf.ComplexObject {
    /**
    * @param terraformResource The parent resource
    * @param terraformAttribute The attribute on the parent resource this class is referencing
    */
    constructor(terraformResource, terraformAttribute) {
        super(terraformResource, terraformAttribute, false, 0);
        this.isEmptyObject = false;
    }
    get internalValue() {
        let hasAnyValues = this.isEmptyObject;
        const internalValueResult = {};
        if (this._ruleName !== undefined) {
            hasAnyValues = true;
            internalValueResult.ruleName = this._ruleName;
        }
        if (this._sentimentType !== undefined) {
            hasAnyValues = true;
            internalValueResult.sentimentType = this._sentimentType;
        }
        if (this._timePeriod !== undefined) {
            hasAnyValues = true;
            internalValueResult.timePeriod = this._timePeriod;
        }
        return hasAnyValues ? internalValueResult : undefined;
    }
    set internalValue(value) {
        if (value === undefined) {
            this.isEmptyObject = false;
            this._ruleName = undefined;
            this._sentimentType = undefined;
            this._timePeriod = undefined;
        }
        else {
            this.isEmptyObject = Object.keys(value).length === 0;
            this._ruleName = value.ruleName;
            this._sentimentType = value.sentimentType;
            this._timePeriod = value.timePeriod;
        }
    }
    get ruleName() {
        return this.getStringAttribute('rule_name');
    }
    set ruleName(value) {
        this._ruleName = value;
    }
    // Temporarily expose input value. Use with caution.
    get ruleNameInput() {
        return this._ruleName;
    }
    get sentimentType() {
        return this.getStringAttribute('sentiment_type');
    }
    set sentimentType(value) {
        this._sentimentType = value;
    }
    // Temporarily expose input value. Use with caution.
    get sentimentTypeInput() {
        return this._sentimentType;
    }
    get timePeriod() {
        return this.getNumberAttribute('time_period');
    }
    set timePeriod(value) {
        this._timePeriod = value;
    }
    // Temporarily expose input value. Use with caution.
    get timePeriodInput() {
        return this._timePeriod;
    }
}
exports.ChimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationRulesSentimentConfigurationOutputReference = ChimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationRulesSentimentConfigurationOutputReference;
_p = JSII_RTTI_SYMBOL_1;
ChimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationRulesSentimentConfigurationOutputReference[_p] = { fqn: "@cdktf/provider-aws.chimesdkmediapipelinesMediaInsightsPipelineConfiguration.ChimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationRulesSentimentConfigurationOutputReference", version: "19.50.0" };
function chimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationRulesToTerraform(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 {
        type: cdktf.stringToTerraform(struct.type),
        issue_detection_configuration: chimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationRulesIssueDetectionConfigurationToTerraform(struct.issueDetectionConfiguration),
        keyword_match_configuration: chimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationRulesKeywordMatchConfigurationToTerraform(struct.keywordMatchConfiguration),
        sentiment_configuration: chimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationRulesSentimentConfigurationToTerraform(struct.sentimentConfiguration),
    };
}
exports.chimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationRulesToTerraform = chimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationRulesToTerraform;
function chimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationRulesToHclTerraform(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 = {
        type: {
            value: cdktf.stringToHclTerraform(struct.type),
            isBlock: false,
            type: "simple",
            storageClassType: "string",
        },
        issue_detection_configuration: {
            value: chimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationRulesIssueDetectionConfigurationToHclTerraform(struct.issueDetectionConfiguration),
            isBlock: true,
            type: "list",
            storageClassType: "ChimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationRulesIssueDetectionConfigurationList",
        },
        keyword_match_configuration: {
            value: chimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationRulesKeywordMatchConfigurationToHclTerraform(struct.keywordMatchConfiguration),
            isBlock: true,
            type: "list",
            storageClassType: "ChimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationRulesKeywordMatchConfigurationList",
        },
        sentiment_configuration: {
            value: chimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationRulesSentimentConfigurationToHclTerraform(struct.sentimentConfiguration),
            isBlock: true,
            type: "list",
            storageClassType: "ChimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationRulesSentimentConfigurationList",
        },
    };
    // remove undefined attributes
    return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
}
exports.chimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationRulesToHclTerraform = chimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationRulesToHclTerraform;
class ChimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationRulesOutputReference 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;
        // issue_detection_configuration - computed: false, optional: true, required: false
        this._issueDetectionConfiguration = new ChimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationRulesIssueDetectionConfigurationOutputReference(this, "issue_detection_configuration");
        // keyword_match_configuration - computed: false, optional: true, required: false
        this._keywordMatchConfiguration = new ChimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationRulesKeywordMatchConfigurationOutputReference(this, "keyword_match_configuration");
        // sentiment_configuration - computed: false, optional: true, required: false
        this._sentimentConfiguration = new ChimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationRulesSentimentConfigurationOutputReference(this, "sentiment_configuration");
    }
    get internalValue() {
        if (this.resolvableValue) {
            return this.resolvableValue;
        }
        let hasAnyValues = this.isEmptyObject;
        const internalValueResult = {};
        if (this._type !== undefined) {
            hasAnyValues = true;
            internalValueResult.type = this._type;
        }
        if (this._issueDetectionConfiguration?.internalValue !== undefined) {
            hasAnyValues = true;
            internalValueResult.issueDetectionConfiguration = this._issueDetectionConfiguration?.internalValue;
        }
        if (this._keywordMatchConfiguration?.internalValue !== undefined) {
            hasAnyValues = true;
            internalValueResult.keywordMatchConfiguration = this._keywordMatchConfiguration?.internalValue;
        }
        if (this._sentimentConfiguration?.internalValue !== undefined) {
            hasAnyValues = true;
            internalValueResult.sentimentConfiguration = this._sentimentConfiguration?.internalValue;
        }
        return hasAnyValues ? internalValueResult : undefined;
    }
    set internalValue(value) {
        if (value === undefined) {
            this.isEmptyObject = false;
            this.resolvableValue = undefined;
            this._type = undefined;
            this._issueDetectionConfiguration.internalValue = undefined;
            this._keywordMatchConfiguration.internalValue = undefined;
            this._sentimentConfiguration.internalValue = 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._type = value.type;
            this._issueDetectionConfiguration.internalValue = value.issueDetectionConfiguration;
            this._keywordMatchConfiguration.internalValue = value.keywordMatchConfiguration;
            this._sentimentConfiguration.internalValue = value.sentimentConfiguration;
        }
    }
    get type() {
        return this.getStringAttribute('type');
    }
    set type(value) {
        this._type = value;
    }
    // Temporarily expose input value. Use with caution.
    get typeInput() {
        return this._type;
    }
    get issueDetectionConfiguration() {
        return this._issueDetectionConfiguration;
    }
    putIssueDetectionConfiguration(value) {
        this._issueDetectionConfiguration.internalValue = value;
    }
    resetIssueDetectionConfiguration() {
        this._issueDetectionConfiguration.internalValue = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get issueDetectionConfigurationInput() {
        return this._issueDetectionConfiguration.internalValue;
    }
    get keywordMatchConfiguration() {
        return this._keywordMatchConfiguration;
    }
    putKeywordMatchConfiguration(value) {
        this._keywordMatchConfiguration.internalValue = value;
    }
    resetKeywordMatchConfiguration() {
        this._keywordMatchConfiguration.internalValue = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get keywordMatchConfigurationInput() {
        return this._keywordMatchConfiguration.internalValue;
    }
    get sentimentConfiguration() {
        return this._sentimentConfiguration;
    }
    putSentimentConfiguration(value) {
        this._sentimentConfiguration.internalValue = value;
    }
    resetSentimentConfiguration() {
        this._sentimentConfiguration.internalValue = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get sentimentConfigurationInput() {
        return this._sentimentConfiguration.internalValue;
    }
}
exports.ChimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationRulesOutputReference = ChimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationRulesOutputReference;
_q = JSII_RTTI_SYMBOL_1;
ChimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationRulesOutputReference[_q] = { fqn: "@cdktf/provider-aws.chimesdkmediapipelinesMediaInsightsPipelineConfiguration.ChimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationRulesOutputReference", version: "19.50.0" };
class ChimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationRulesList 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 ChimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationRulesOutputReference(this.terraformResource, this.terraformAttribute, index, this.wrapsSet);
    }
}
exports.ChimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationRulesList = ChimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationRulesList;
_r = JSII_RTTI_SYMBOL_1;
ChimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationRulesList[_r] = { fqn: "@cdktf/provider-aws.chimesdkmediapipelinesMediaInsightsPipelineConfiguration.ChimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationRulesList", version: "19.50.0" };
function chimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationToTerraform(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 {
        disabled: cdktf.booleanToTerraform(struct.disabled),
        rules: cdktf.listMapper(chimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationRulesToTerraform, true)(struct.rules),
    };
}
exports.chimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationToTerraform = chimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationToTerraform;
function chimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationToHclTerraform(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 = {
        disabled: {
            value: cdktf.booleanToHclTerraform(struct.disabled),
            isBlock: false,
            type: "simple",
            storageClassType: "boolean",
        },
        rules: {
            value: cdktf.listMapperHcl(chimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationRulesToHclTerraform, true)(struct.rules),
            isBlock: true,
            type: "list",
            storageClassType: "ChimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationRulesList",
        },
    };
    // remove undefined attributes
    return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
}
exports.chimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationToHclTerraform = chimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationToHclTerraform;
class ChimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationOutputReference 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;
        // rules - computed: false, optional: false, required: true
        this._rules = new ChimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationRulesList(this, "rules", false);
    }
    get internalValue() {
        let hasAnyValues = this.isEmptyObject;
        const internalValueResult = {};
        if (this._disabled !== undefined) {
            hasAnyValues = true;
            internalValueResult.disabled = this._disabled;
        }
        if (this._rules?.internalValue !== undefined) {
            hasAnyValues = true;
            internalValueResult.rules = this._rules?.internalValue;
        }
        return hasAnyValues ? internalValueResult : undefined;
    }
    set internalValue(value) {
        if (value === undefined) {
            this.isEmptyObject = false;
            this._disabled = undefined;
            this._rules.internalValue = undefined;
        }
        else {
            this.isEmptyObject = Object.keys(value).length === 0;
            this._disabled = value.disabled;
            this._rules.internalValue = value.rules;
        }
    }
    get disabled() {
        return this.getBooleanAttribute('disabled');
    }
    set disabled(value) {
        this._disabled = value;
    }
    resetDisabled() {
        this._disabled = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get disabledInput() {
        return this._disabled;
    }
    get rules() {
        return this._rules;
    }
    putRules(value) {
        this._rules.internalValue = value;
    }
    // Temporarily expose input value. Use with caution.
    get rulesInput() {
        return this._rules.internalValue;
    }
}
exports.ChimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationOutputReference = ChimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationOutputReference;
_s = JSII_RTTI_SYMBOL_1;
ChimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationOutputReference[_s] = { fqn: "@cdktf/provider-aws.chimesdkmediapipelinesMediaInsightsPipelineConfiguration.ChimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationOutputReference", version: "19.50.0" };
function chimesdkmediapipelinesMediaInsightsPipelineConfigurationTimeoutsToTerraform(struct) {
    if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
        return struct;
    }
    if (cdktf.isComplexElement(struct)) {
        throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
    }
    return {
        create: cdktf.stringToTerraform(struct.create),
        delete: cdktf.stringToTerraform(struct.delete),
        update: cdktf.stringToTerraform(struct.update),
    };
}
exports.chimesdkmediapipelinesMediaInsightsPipelineConfigurationTimeoutsToTerraform = chimesdkmediapipelinesMediaInsightsPipelineConfigurationTimeoutsToTerraform;
function chimesdkmediapipelinesMediaInsightsPipelineConfigurationTimeoutsToHclTerraform(struct) {
    if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
        return struct;
    }
    if (cdktf.isComplexElement(struct)) {
        throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
    }
    const attrs = {
        create: {
            value: cdktf.stringToHclTerraform(struct.create),
            isBlock: false,
            type: "simple",
            storageClassType: "string",
        },
        delete: {
            value: cdktf.stringToHclTerraform(struct.delete),
            isBlock: false,
            type: "simple",
            storageClassType: "string",
        },
        update: {
            value: cdktf.stringToHclTerraform(struct.update),
            isBlock: false,
            type: "simple",
            storageClassType: "string",
        },
    };
    // remove undefined attributes
    return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
}
exports.chimesdkmediapipelinesMediaInsightsPipelineConfigurationTimeoutsToHclTerraform = chimesdkmediapipelinesMediaInsightsPipelineConfigurationTimeoutsToHclTerraform;
class ChimesdkmediapipelinesMediaInsightsPipelineConfigurationTimeoutsOutputReference extends cdktf.ComplexObject {
    /**
    * @param terraformResource The parent resource
    * @param terraformAttribute The attribute on the parent resource this class is referencing
    */
    constructor(terraformResource, terraformAttribute) {
        super(terraformResource, terraformAttribute, false);
        this.isEmptyObject = false;
    }
    get internalValue() {
        if (this.resolvableValue) {
            return this.resolvableValue;
        }
        let hasAnyValues = this.isEmptyObject;
        const internalValueResult = {};
        if (this._create !== undefined) {
            hasAnyValues = true;
            internalValueResult.create = this._create;
        }
        if (this._delete !== undefined) {
            hasAnyValues = true;
            internalValueResult.delete = this._delete;
        }
        if (this._update !== undefined) {
            hasAnyValues = true;
            internalValueResult.update = this._update;
        }
        return hasAnyValues ? internalValueResult : undefined;
    }
    set internalValue(value) {
        if (value === undefined) {
            this.isEmptyObject = false;
            this.resolvableValue = undefined;
            this._create = undefined;
            this._delete = undefined;
            this._update = undefined;
        }
        else if (cdktf.Tokenization.isResolvable(value)) {
            this.isEmptyObject = false;
            this.resolvableValue = value;
        }
        else {
            this.isEmptyObject = Object.keys(value).length === 0;
            this.resolvableValue = undefined;
            this._create = value.create;
            this._delete = value.delete;
            this._update = value.update;
        }
    }
    get create() {
        return this.getStringAttribute('create');
    }
    set create(value) {
        this._create = value;
    }
    resetCreate() {
        this._create = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get createInput() {
        return this._create;
    }
    get delete() {
        return this.getStringAttribute('delete');
    }
    set delete(value) {
        this._delete = value;
    }
    resetDelete() {
        this._delete = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get deleteInput() {
        return this._delete;
    }
    get update() {
        return this.getStringAttribute('update');
    }
    set update(value) {
        this._update = value;
    }
    resetUpdate() {
        this._update = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get updateInput() {
        return this._update;
    }
}
exports.ChimesdkmediapipelinesMediaInsightsPipelineConfigurationTimeoutsOutputReference = ChimesdkmediapipelinesMediaInsightsPipelineConfigurationTimeoutsOutputReference;
_t = JSII_RTTI_SYMBOL_1;
ChimesdkmediapipelinesMediaInsightsPipelineConfigurationTimeoutsOutputReference[_t] = { fqn: "@cdktf/provider-aws.chimesdkmediapipelinesMediaInsightsPipelineConfiguration.ChimesdkmediapipelinesMediaInsightsPipelineConfigurationTimeoutsOutputReference", version: "19.50.0" };
/**
* Represents a {@link https://registry.terraform.io/providers/hashicorp/aws/5.84.0/docs/resources/chimesdkmediapipelines_media_insights_pipeline_configuration aws_chimesdkmediapipelines_media_insights_pipeline_configuration}
*/
class ChimesdkmediapipelinesMediaInsightsPipelineConfiguration extends cdktf.TerraformResource {
    // ==============
    // STATIC Methods
    // ==============
    /**
    * Generates CDKTF code for importing a ChimesdkmediapipelinesMediaInsightsPipelineConfiguration 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 ChimesdkmediapipelinesMediaInsightsPipelineConfiguration to import
    * @param importFromId The id of the existing ChimesdkmediapipelinesMediaInsightsPipelineConfiguration that should be imported. Refer to the {@link https://registry.terraform.io/providers/hashicorp/aws/5.84.0/docs/resources/chimesdkmediapipelines_media_insights_pipeline_configuration#import import section} in the documentation of this resource for the id to use
    * @param provider? Optional instance of the provider where the ChimesdkmediapipelinesMediaInsightsPipelineConfiguration to import is found
    */
    static generateConfigForImport(scope, importToId, importFromId, provider) {
        return new cdktf.ImportableResource(scope, importToId, { terraformResourceType: "aws_chimesdkmediapipelines_media_insights_pipeline_configuration", importId: importFromId, provider });
    }
    // ===========
    // INITIALIZER
    // ===========
    /**
    * Create a new {@link https://registry.terraform.io/providers/hashicorp/aws/5.84.0/docs/resources/chimesdkmediapipelines_media_insights_pipeline_configuration aws_chimesdkmediapipelines_media_insights_pipeline_configuration} Resource
    *
    * @param scope The scope in which to define this construct
    * @param id The scoped construct ID. Must be unique amongst siblings in the same scope
    * @param options ChimesdkmediapipelinesMediaInsightsPipelineConfigurationConfig
    */
    constructor(scope, id, config) {
        super(scope, id, {
            terraformResourceType: 'aws_chimesdkmediapipelines_media_insights_pipeline_configuration',
            terraformGeneratorMetadata: {
                providerName: 'aws',
                providerVersion: '5.84.0',
                providerVersionConstraint: '~> 5.0'
            },
            provider: config.provider,
            dependsOn: config.dependsOn,
            count: config.count,
            lifecycle: config.lifecycle,
            provisioners: config.provisioners,
            connection: config.connection,
            forEach: config.forEach
        });
        // elements - computed: false, optional: false, required: true
        this._elements = new ChimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsList(this, "elements", false);
        // real_time_alert_configuration - computed: false, optional: true, required: false
        this._realTimeAlertConfiguration = new ChimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationOutputReference(this, "real_time_alert_configuration");
        // timeouts - computed: false, optional: true, required: false
        this._timeouts = new ChimesdkmediapipelinesMediaInsightsPipelineConfigurationTimeoutsOutputReference(this, "timeouts");
        this._name = config.name;
        this._resourceAccessRoleArn = config.resourceAccessRoleArn;
        this._tags = config.tags;
        this._tagsAll = config.tagsAll;
        this._elements.internalValue = config.elements;
        this._realTimeAlertConfiguration.internalValue = config.realTimeAlertConfiguration;
        this._timeouts.internalValue = config.timeouts;
    }
    // ==========
    // ATTRIBUTES
    // ==========
    // arn - computed: true, optional: false, required: false
    get arn() {
        return this.getStringAttribute('arn');
    }
    // id - computed: true, optional: false, required: false
    get id() {
        return this.getStringAttribute('id');
    }
    get name() {
        return this.getStringAttribute('name');
    }
    set name(value) {
        this._name = value;
    }
    // Temporarily expose input value. Use with caution.
    get nameInput() {
        return this._name;
    }
    get resourceAccessRoleArn() {
        return this.getStringAttribute('resource_access_role_arn');
    }
    set resourceAccessRoleArn(value) {
        this._resourceAccessRoleArn = value;
    }
    // Temporarily expose input value. Use with caution.
    get resourceAccessRoleArnInput() {
        return this._resourceAccessRoleArn;
    }
    get tags() {
        return this.getStringMapAttribute('tags');
    }
    set tags(value) {
        this._tags = value;
    }
    resetTags() {
        this._tags = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get tagsInput() {
        return this._tags;
    }
    get tagsAll() {
        return this.getStringMapAttribute('tags_all');
    }
    set tagsAll(value) {
        this._tagsAll = value;
    }
    resetTagsAll() {
        this._tagsAll = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get tagsAllInput() {
        return this._tagsAll;
    }
    get elements() {
        return this._elements;
    }
    putElements(value) {
        this._elements.internalValue = value;
    }
    // Temporarily expose input value. Use with caution.
    get elementsInput() {
        return this._elements.internalValue;
    }
    get realTimeAlertConfiguration() {
        return this._realTimeAlertConfiguration;
    }
    putRealTimeAlertConfiguration(value) {
        this._realTimeAlertConfiguration.internalValue = value;
    }
    resetRealTimeAlertConfiguration() {
        this._realTimeAlertConfiguration.internalValue = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get realTimeAlertConfigurationInput() {
        return this._realTimeAlertConfiguration.internalValue;
    }
    get timeouts() {
        return this._timeouts;
    }
    putTimeouts(value) {
        this._timeouts.internalValue = value;
    }
    resetTimeouts() {
        this._timeouts.internalValue = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get timeoutsInput() {
        return this._timeouts.internalValue;
    }
    // =========
    // SYNTHESIS
    // =========
    synthesizeAttributes() {
        return {
            name: cdktf.stringToTerraform(this._name),
            resource_access_role_arn: cdktf.stringToTerraform(this._resourceAccessRoleArn),
            tags: cdktf.hashMapper(cdktf.stringToTerraform)(this._tags),
            tags_all: cdktf.hashMapper(cdktf.stringToTerraform)(this._tagsAll),
            elements: cdktf.listMapper(chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsToTerraform, true)(this._elements.internalValue),
            real_time_alert_configuration: chimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationToTerraform(this._realTimeAlertConfiguration.internalValue),
            timeouts: chimesdkmediapipelinesMediaInsightsPipelineConfigurationTimeoutsToTerraform(this._timeouts.internalValue),
        };
    }
    synthesizeHclAttributes() {
        const attrs = {
            name: {
                value: cdktf.stringToHclTerraform(this._name),
                isBlock: false,
                type: "simple",
                storageClassType: "string",
            },
            resource_access_role_arn: {
                value: cdktf.stringToHclTerraform(this._resourceAccessRoleArn),
                isBlock: false,
                type: "simple",
                storageClassType: "string",
            },
            tags: {
                value: cdktf.hashMapperHcl(cdktf.stringToHclTerraform)(this._tags),
                isBlock: false,
                type: "map",
                storageClassType: "stringMap",
            },
            tags_all: {
                value: cdktf.hashMapperHcl(cdktf.stringToHclTerraform)(this._tagsAll),
                isBlock: false,
                type: "map",
                storageClassType: "stringMap",
            },
            elements: {
                value: cdktf.listMapperHcl(chimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsToHclTerraform, true)(this._elements.internalValue),
                isBlock: true,
                type: "list",
                storageClassType: "ChimesdkmediapipelinesMediaInsightsPipelineConfigurationElementsList",
            },
            real_time_alert_configuration: {
                value: chimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationToHclTerraform(this._realTimeAlertConfiguration.internalValue),
                isBlock: true,
                type: "list",
                storageClassType: "ChimesdkmediapipelinesMediaInsightsPipelineConfigurationRealTimeAlertConfigurationList",
            },
            timeouts: {
                value: chimesdkmediapipelinesMediaInsightsPipelineConfigurationTimeoutsToHclTerraform(this._timeouts.internalValue),
                isBlock: true,
                type: "struct",
                storageClassType: "ChimesdkmediapipelinesMediaInsightsPipelineConfigurationTimeouts",
            },
        };
        // remove undefined attributes
        return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
    }
}
exports.ChimesdkmediapipelinesMediaInsightsPipelineConfiguration = ChimesdkmediapipelinesMediaInsightsPipelineConfiguration;
_u = JSII_RTTI_SYMBOL_1;
ChimesdkmediapipelinesMediaInsightsPipelineConfiguration[_u] = { fqn: "@cdktf/provider-aws.chimesdkmediapipelinesMediaInsightsPipelineConfiguration.ChimesdkmediapipelinesMediaInsightsPipelineConfiguration", version: "19.50.0" };
// =================
// STATIC PROPERTIES
// =================
ChimesdkmediapipelinesMediaInsightsPipelineConfiguration.tfResourceType = "aws_chimesdkmediapipelines_media_insights_pipeline_configuration";
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2hpbWVzZGttZWRpYXBpcGVsaW5lcy1tZWRpYS1pbnNpZ2h0cy1waXBlbGluZS1jb25maWd1cmF0aW9uL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQVNBLCtCQUErQjtBQTJEL0IsU0FBZ0IsdUpBQXVKLENBQUMsTUFBbVQ7SUFDemQsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUFDLE9BQU8sTUFBTSxDQUFDO0lBQUMsQ0FBQztJQUM1RixJQUFJLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQ25DLE1BQU0sSUFBSSxLQUFLLENBQUMsb0hBQW9ILENBQUMsQ0FBQztJQUN4SSxDQUFDO0lBQ0QsT0FBTztRQUNMLHdCQUF3QixFQUFFLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxNQUFPLENBQUMsc0JBQXNCLENBQUM7UUFDakYsb0JBQW9CLEVBQUUsS0FBSyxDQUFDLGlCQUFpQixDQUFDLE1BQU8sQ0FBQyxpQkFBaUIsQ0FBQztRQUN4RSw0QkFBNEIsRUFBRSxLQUFLLENBQUMsaUJBQWlCLENBQUMsTUFBTyxDQUFDLHdCQUF3QixDQUFDO1FBQ3ZGLGVBQWUsRUFBRSxLQUFLLENBQUMsaUJBQWlCLENBQUMsTUFBTyxDQUFDLGNBQWMsQ0FBQztLQUNqRSxDQUFBO0FBQ0gsQ0FBQztBQVhELDBUQVdDO0FBR0QsU0FBZ0IsMEpBQTBKLENBQUMsTUFBbVQ7SUFDNWQsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUFDLE9BQU8sTUFBTSxDQUFDO0lBQUMsQ0FBQztJQUM1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QkFBZ0IsRUFBRSx3RkFBd0Y7YUFDM0c7WUFDRCxRQUFRLEVBQUU7Z0JBQ1IsS0FBSyxFQUFFLDhFQUE4RSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDO2dCQUNuSCxPQUFPLEVBQUUsSUFBSTtnQkFDYixJQUFJLEVBQUUsUUFBUTtnQkFDZCxnQkFBZ0IsRUFBRSxrRUFBa0U7YUFDckY7U0FDRixDQUFDO1FBRUYsOEJBQThCO1FBQzlCLE9BQU8sTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssQ0FBQyxLQUFLLEtBQUssU0FBUyxDQUFFLENBQUMsQ0FBQTtJQUM1SCxDQUFDOztBQTlPSCw0SEErT0M7OztBQTdPQyxvQkFBb0I7QUFDcEIsb0JBQW9CO0FBQ3BCLG9CQUFvQjtBQUNHLHVFQUFjLEdBQUcsa0VBQWtFLEFBQXJFLENBQXNFIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIEhhc2hpQ29ycCwgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1QTC0yLjBcbiAqL1xuXG4vLyBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F3cy81Ljg0LjAvZG9jcy9yZXNvdXJjZXMvY2hpbWVzZGttZWRpYXBpcGVsaW5lc19tZWRpYV9pbnNpZ2h0c19waXBlbGluZV9jb25maWd1cmF0aW9uXG4vLyBnZW5lcmF0ZWQgZnJvbSB0ZXJyYWZvcm0gcmVzb3VyY2Ugc2NoZW1hXG5cbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0ICogYXMgY2RrdGYgZnJvbSAnY2RrdGYnO1xuXG4vLyBDb25maWd1cmF0aW9uXG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb25Db25maWcgZXh0ZW5kcyBjZGt0Zi5UZXJyYWZvcm1NZXRhQXJndW1lbnRzIHtcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F3cy81Ljg0LjAvZG9jcy9yZXNvdXJjZXMvY2hpbWVzZGttZWRpYXBpcGVsaW5lc19tZWRpYV9pbnNpZ2h0c19waXBlbGluZV9jb25maWd1cmF0aW9uI25hbWUgQ2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb24jbmFtZX1cbiAgKi9cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXdzLzUuODQuMC9kb2NzL3Jlc291cmNlcy9jaGltZXNka21lZGlhcGlwZWxpbmVzX21lZGlhX2luc2lnaHRzX3BpcGVsaW5lX2NvbmZpZ3VyYXRpb24jcmVzb3VyY2VfYWNjZXNzX3JvbGVfYXJuIENoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uI3Jlc291cmNlX2FjY2Vzc19yb2xlX2Fybn1cbiAgKi9cbiAgcmVhZG9ubHkgcmVzb3VyY2VBY2Nlc3NSb2xlQXJuOiBzdHJpbmc7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9hd3MvNS44NC4wL2RvY3MvcmVzb3VyY2VzL2NoaW1lc2RrbWVkaWFwaXBlbGluZXNfbWVkaWFfaW5zaWdodHNfcGlwZWxpbmVfY29uZmlndXJhdGlvbiN0YWdzIENoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uI3RhZ3N9XG4gICovXG4gIHJlYWRvbmx5IHRhZ3M/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXdzLzUuODQuMC9kb2NzL3Jlc291cmNlcy9jaGltZXNka21lZGlhcGlwZWxpbmVzX21lZGlhX2luc2lnaHRzX3BpcGVsaW5lX2NvbmZpZ3VyYXRpb24jdGFnc19hbGwgQ2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb24jdGFnc19hbGx9XG4gICovXG4gIHJlYWRvbmx5IHRhZ3NBbGw/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuICAvKipcbiAgKiBlbGVtZW50cyBibG9ja1xuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F3cy81Ljg0LjAvZG9jcy9yZXNvdXJjZXMvY2hpbWVzZGttZWRpYXBpcGVsaW5lc19tZWRpYV9pbnNpZ2h0c19waXBlbGluZV9jb25maWd1cmF0aW9uI2VsZW1lbnRzIENoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uI2VsZW1lbnRzfVxuICAqL1xuICByZWFkb25seSBlbGVtZW50czogQ2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb25FbGVtZW50c1tdIHwgY2RrdGYuSVJlc29sdmFibGU7XG4gIC8qKlxuICAqIHJlYWxfdGltZV9hbGVydF9jb25maWd1cmF0aW9uIGJsb2NrXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXdzLzUuODQuMC9kb2NzL3Jlc291cmNlcy9jaGltZXNka21lZGlhcGlwZWxpbmVzX21lZGlhX2luc2lnaHRzX3BpcGVsaW5lX2NvbmZpZ3VyYXRpb24jcmVhbF90aW1lX2FsZXJ0X2NvbmZpZ3VyYXRpb24gQ2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb24jcmVhbF90aW1lX2FsZXJ0X2NvbmZpZ3VyYXRpb259XG4gICovXG4gIHJlYWRvbmx5IHJlYWxUaW1lQWxlcnRDb25maWd1cmF0aW9uPzogQ2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb25SZWFsVGltZUFsZXJ0Q29uZmlndXJhdGlvbjtcbiAgLyoqXG4gICogdGltZW91dHMgYmxvY2tcbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9hd3MvNS44NC4wL2RvY3MvcmVzb3VyY2VzL2NoaW1lc2RrbWVkaWFwaXBlbGluZXNfbWVkaWFfaW5zaWdodHNfcGlwZWxpbmVfY29uZmlndXJhdGlvbiN0aW1lb3V0cyBDaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvbiN0aW1lb3V0c31cbiAgKi9cbiAgcmVhZG9ubHkgdGltZW91dHM/OiBDaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvblRpbWVvdXRzO1xufVxuZXhwb3J0IGludGVyZmFjZSBDaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvbkVsZW1lbnRzQW1hem9uVHJhbnNjcmliZUNhbGxBbmFseXRpY3NQcm9jZXNzb3JDb25maWd1cmF0aW9uUG9zdENhbGxBbmFseXRpY3NTZXR0aW5ncyB7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9hd3MvNS44NC4wL2RvY3MvcmVzb3VyY2VzL2NoaW1lc2RrbWVkaWFwaXBlbGluZXNfbWVkaWFfaW5zaWdodHNfcGlwZWxpbmVfY29uZmlndXJhdGlvbiNjb250ZW50X3JlZGFjdGlvbl9vdXRwdXQgQ2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb24jY29udGVudF9yZWRhY3Rpb25fb3V0cHV0fVxuICAqL1xuICByZWFkb25seSBjb250ZW50UmVkYWN0aW9uT3V0cHV0Pzogc3RyaW5nO1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXdzLzUuODQuMC9kb2NzL3Jlc291cmNlcy9jaGltZXNka21lZGlhcGlwZWxpbmVzX21lZGlhX2luc2lnaHRzX3BpcGVsaW5lX2NvbmZpZ3VyYXRpb24jZGF0YV9hY2Nlc3Nfcm9sZV9hcm4gQ2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb24jZGF0YV9hY2Nlc3Nfcm9sZV9hcm59XG4gICovXG4gIHJlYWRvbmx5IGRhdGFBY2Nlc3NSb2xlQXJuOiBzdHJpbmc7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9hd3MvNS44NC4wL2RvY3MvcmVzb3VyY2VzL2NoaW1lc2RrbWVkaWFwaXBlbGluZXNfbWVkaWFfaW5zaWdodHNfcGlwZWxpbmVfY29uZmlndXJhdGlvbiNvdXRwdXRfZW5jcnlwdGlvbl9rbXNfa2V5X2lkIENoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uI291dHB1dF9lbmNyeXB0aW9uX2ttc19rZXlfaWR9XG4gICovXG4gIHJlYWRvbmx5IG91dHB1dEVuY3J5cHRpb25LbXNLZXlJZD86IHN0cmluZztcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F3cy81Ljg0LjAvZG9jcy9yZXNvdXJjZXMvY2hpbWVzZGttZWRpYXBpcGVsaW5lc19tZWRpYV9pbnNpZ2h0c19waXBlbGluZV9jb25maWd1cmF0aW9uI291dHB1dF9sb2NhdGlvbiBDaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvbiNvdXRwdXRfbG9jYXRpb259XG4gICovXG4gIHJlYWRvbmx5IG91dHB1dExvY2F0aW9uOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvbkVsZW1lbnRzQW1hem9uVHJhbnNjcmliZUNhbGxBbmFseXRpY3NQcm9jZXNzb3JDb25maWd1cmF0aW9uUG9zdENhbGxBbmFseXRpY3NTZXR0aW5nc1RvVGVycmFmb3JtKHN0cnVjdD86IENoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uRWxlbWVudHNBbWF6b25UcmFuc2NyaWJlQ2FsbEFuYWx5dGljc1Byb2Nlc3NvckNvbmZpZ3VyYXRpb25Qb3N0Q2FsbEFuYWx5dGljc1NldHRpbmdzT3V0cHV0UmVmZXJlbmNlIHwgQ2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb25FbGVtZW50c0FtYXpvblRyYW5zY3JpYmVDYWxsQW5hbHl0aWNzUHJvY2Vzc29yQ29uZmlndXJhdGlvblBvc3RDYWxsQW5hbHl0aWNzU2V0dGluZ3MpOiBhbnkge1xuICBpZiAoIWNka3RmLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0Zi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdGYuaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIHJldHVybiB7XG4gICAgY29udGVudF9yZWRhY3Rpb25fb3V0cHV0OiBjZGt0Zi5zdHJpbmdUb1RlcnJhZm9ybShzdHJ1Y3QhLmNvbnRlbnRSZWRhY3Rpb25PdXRwdXQpLFxuICAgIGRhdGFfYWNjZXNzX3JvbGVfYXJuOiBjZGt0Zi5zdHJpbmdUb1RlcnJhZm9ybShzdHJ1Y3QhLmRhdGFBY2Nlc3NSb2xlQXJuKSxcbiAgICBvdXRwdXRfZW5jcnlwdGlvbl9rbXNfa2V5X2lkOiBjZGt0Zi5zdHJpbmdUb1RlcnJhZm9ybShzdHJ1Y3QhLm91dHB1dEVuY3J5cHRpb25LbXNLZXlJZCksXG4gICAgb3V0cHV0X2xvY2F0aW9uOiBjZGt0Zi5zdHJpbmdUb1RlcnJhZm9ybShzdHJ1Y3QhLm91dHB1dExvY2F0aW9uKSxcbiAgfVxufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBjaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvbkVsZW1lbnRzQW1hem9uVHJhbnNjcmliZUNhbGxBbmFseXRpY3NQcm9jZXNzb3JDb25maWd1cmF0aW9uUG9zdENhbGxBbmFseXRpY3NTZXR0aW5nc1RvSGNsVGVycmFmb3JtKHN0cnVjdD86IENoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uRWxlbWVudHNBbWF6b25UcmFuc2NyaWJlQ2FsbEFuYWx5dGljc1Byb2Nlc3NvckNvbmZpZ3VyYXRpb25Qb3N0Q2FsbEFuYWx5dGljc1NldHRpbmdzT3V0cHV0UmVmZXJlbmNlIHwgQ2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb25FbGVtZW50c0FtYXpvblRyYW5zY3JpYmVDYWxsQW5hbHl0aWNzUHJvY2Vzc29yQ29uZmlndXJhdGlvblBvc3RDYWxsQW5hbHl0aWNzU2V0dGluZ3MpOiBhbnkge1xuICBpZiAoIWNka3RmLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0Zi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdGYuaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIGNvbnN0IGF0dHJzID0ge1xuICAgIGNvbnRlbnRfcmVkYWN0aW9uX291dHB1dDoge1xuICAgICAgdmFsdWU6IGNka3RmLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEuY29udGVudFJlZGFjdGlvbk91dHB1dCksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgIH0sXG4gICAgZGF0YV9hY2Nlc3Nfcm9sZV9hcm46IHtcbiAgICAgIHZhbHVlOiBjZGt0Zi5zdHJpbmdUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLmRhdGFBY2Nlc3NSb2xlQXJuKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgICBvdXRwdXRfZW5jcnlwdGlvbl9rbXNfa2V5X2lkOiB7XG4gICAgICB2YWx1ZTogY2RrdGYuc3RyaW5nVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5vdXRwdXRFbmNyeXB0aW9uS21zS2V5SWQpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICB9LFxuICAgIG91dHB1dF9sb2NhdGlvbjoge1xuICAgICAgdmFsdWU6IGNka3RmLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEub3V0cHV0TG9jYXRpb24pLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICB9LFxuICB9O1xuXG4gIC8vIHJlbW92ZSB1bmRlZmluZWQgYXR0cmlidXRlc1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKGF0dHJzKS5maWx0ZXIoKFtfLCB2YWx1ZV0pID0+IHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUudmFsdWUgIT09IHVuZGVmaW5lZCkpO1xufVxuXG5leHBvcnQgY2xhc3MgQ2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb25FbGVtZW50c0FtYXpvblRyYW5zY3JpYmVDYWxsQW5hbHl0aWNzUHJvY2Vzc29yQ29uZmlndXJhdGlvblBvc3RDYWxsQW5hbHl0aWNzU2V0dGluZ3NPdXRwdXRSZWZlcmVuY2UgZXh0ZW5kcyBjZGt0Zi5Db21wbGV4T2JqZWN0IHtcbiAgcHJpdmF0ZSBpc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG5cbiAgLyoqXG4gICogQHBhcmFtIHRlcnJhZm9ybVJlc291cmNlIFRoZSBwYXJlbnQgcmVzb3VyY2VcbiAgKiBAcGFyYW0gdGVycmFmb3JtQXR0cmlidXRlIFRoZSBhdHRyaWJ1dGUgb24gdGhlIHBhcmVudCByZXNvdXJjZSB0aGlzIGNsYXNzIGlzIHJlZmVyZW5jaW5nXG4gICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih0ZXJyYWZvcm1SZXNvdXJjZTogY2RrdGYuSUludGVycG9sYXRpbmdQYXJlbnQsIHRlcnJhZm9ybUF0dHJpYnV0ZTogc3RyaW5nKSB7XG4gICAgc3VwZXIodGVycmFmb3JtUmVzb3VyY2UsIHRlcnJhZm9ybUF0dHJpYnV0ZSwgZmFsc2UsIDApO1xuICB9XG5cbiAgcHVibGljIGdldCBpbnRlcm5hbFZhbHVlKCk6IENoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uRWxlbWVudHNBbWF6b25UcmFuc2NyaWJlQ2FsbEFuYWx5dGljc1Byb2Nlc3NvckNvbmZpZ3VyYXRpb25Qb3N0Q2FsbEFuYWx5dGljc1NldHRpbmdzIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgaGFzQW55VmFsdWVzID0gdGhpcy5pc0VtcHR5T2JqZWN0O1xuICAgIGNvbnN0IGludGVybmFsVmFsdWVSZXN1bHQ6IGFueSA9IHt9O1xuICAgIGlmICh0aGlzLl9jb250ZW50UmVkYWN0aW9uT3V0cHV0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmNvbnRlbnRSZWRhY3Rpb25PdXRwdXQgPSB0aGlzLl9jb250ZW50UmVkYWN0aW9uT3V0cHV0O1xuICAgIH1cbiAgICBpZiAodGhpcy5fZGF0YUFjY2Vzc1JvbGVBcm4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuZGF0YUFjY2Vzc1JvbGVBcm4gPSB0aGlzLl9kYXRhQWNjZXNzUm9sZUFybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuX291dHB1dEVuY3J5cHRpb25LbXNLZXlJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5vdXRwdXRFbmNyeXB0aW9uS21zS2V5SWQgPSB0aGlzLl9vdXRwdXRFbmNyeXB0aW9uS21zS2V5SWQ7XG4gICAgfVxuICAgIGlmICh0aGlzLl9vdXRwdXRMb2NhdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5vdXRwdXRMb2NhdGlvbiA9IHRoaXMuX291dHB1dExvY2F0aW9uO1xuICAgIH1cbiAgICByZXR1cm4gaGFzQW55VmFsdWVzID8gaW50ZXJuYWxWYWx1ZVJlc3VsdCA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgaW50ZXJuYWxWYWx1ZSh2YWx1ZTogQ2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb25FbGVtZW50c0FtYXpvblRyYW5zY3JpYmVDYWxsQW5hbHl0aWNzUHJvY2Vzc29yQ29uZmlndXJhdGlvblBvc3RDYWxsQW5hbHl0aWNzU2V0dGluZ3MgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLl9jb250ZW50UmVkYWN0aW9uT3V0cHV0ID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fZGF0YUFjY2Vzc1JvbGVBcm4gPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9vdXRwdXRFbmNyeXB0aW9uS21zS2V5SWQgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9vdXRwdXRMb2NhdGlvbiA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSAwO1xuICAgICAgdGhpcy5fY29udGVudFJlZGFjdGlvbk91dHB1dCA9IHZhbHVlLmNvbnRlbnRSZWRhY3Rpb25PdXRwdXQ7XG4gICAgICB0aGlzLl9kYXRhQWNjZXNzUm9sZUFybiA9IHZhbHVlLmRhdGFBY2Nlc3NSb2xlQXJuO1xuICAgICAgdGhpcy5fb3V0cHV0RW5jcnlwdGlvbkttc0tleUlkID0gdmFsdWUub3V0cHV0RW5jcnlwdGlvbkttc0tleUlkO1xuICAgICAgdGhpcy5fb3V0cHV0TG9jYXRpb24gPSB2YWx1ZS5vdXRwdXRMb2NhdGlvbjtcbiAgICB9XG4gIH1cblxuICAvLyBjb250ZW50X3JlZGFjdGlvbl9vdXRwdXQgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfY29udGVudFJlZGFjdGlvbk91dHB1dD86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgY29udGVudFJlZGFjdGlvbk91dHB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ2NvbnRlbnRfcmVkYWN0aW9uX291dHB1dCcpO1xuICB9XG4gIHB1YmxpYyBzZXQgY29udGVudFJlZGFjdGlvbk91dHB1dCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fY29udGVudFJlZGFjdGlvbk91dHB1dCA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldENvbnRlbnRSZWRhY3Rpb25PdXRwdXQoKSB7XG4gICAgdGhpcy5fY29udGVudFJlZGFjdGlvbk91dHB1dCA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgY29udGVudFJlZGFjdGlvbk91dHB1dElucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9jb250ZW50UmVkYWN0aW9uT3V0cHV0O1xuICB9XG5cbiAgLy8gZGF0YV9hY2Nlc3Nfcm9sZV9hcm4gLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfZGF0YUFjY2Vzc1JvbGVBcm4/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IGRhdGFBY2Nlc3NSb2xlQXJuKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnZGF0YV9hY2Nlc3Nfcm9sZV9hcm4nKTtcbiAgfVxuICBwdWJsaWMgc2V0IGRhdGFBY2Nlc3NSb2xlQXJuKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9kYXRhQWNjZXNzUm9sZUFybiA9IHZhbHVlO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBkYXRhQWNjZXNzUm9sZUFybklucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9kYXRhQWNjZXNzUm9sZUFybjtcbiAgfVxuXG4gIC8vIG91dHB1dF9lbmNyeXB0aW9uX2ttc19rZXlfaWQgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfb3V0cHV0RW5jcnlwdGlvbkttc0tleUlkPzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBvdXRwdXRFbmNyeXB0aW9uS21zS2V5SWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdvdXRwdXRfZW5jcnlwdGlvbl9rbXNfa2V5X2lkJyk7XG4gIH1cbiAgcHVibGljIHNldCBvdXRwdXRFbmNyeXB0aW9uS21zS2V5SWQodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX291dHB1dEVuY3J5cHRpb25LbXNLZXlJZCA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldE91dHB1dEVuY3J5cHRpb25LbXNLZXlJZCgpIHtcbiAgICB0aGlzLl9vdXRwdXRFbmNyeXB0aW9uS21zS2V5SWQgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IG91dHB1dEVuY3J5cHRpb25LbXNLZXlJZElucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9vdXRwdXRFbmNyeXB0aW9uS21zS2V5SWQ7XG4gIH1cblxuICAvLyBvdXRwdXRfbG9jYXRpb24gLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfb3V0cHV0TG9jYXRpb24/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IG91dHB1dExvY2F0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnb3V0cHV0X2xvY2F0aW9uJyk7XG4gIH1cbiAgcHVibGljIHNldCBvdXRwdXRMb2NhdGlvbih2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fb3V0cHV0TG9jYXRpb24gPSB2YWx1ZTtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgb3V0cHV0TG9jYXRpb25JbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fb3V0cHV0TG9jYXRpb247XG4gIH1cbn1cbmV4cG9ydCBpbnRlcmZhY2UgQ2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb25FbGVtZW50c0FtYXpvblRyYW5zY3JpYmVDYWxsQW5hbHl0aWNzUHJvY2Vzc29yQ29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9hd3MvNS44NC4wL2RvY3MvcmVzb3VyY2VzL2NoaW1lc2RrbWVkaWFwaXBlbGluZXNfbWVkaWFfaW5zaWdodHNfcGlwZWxpbmVfY29uZmlndXJhdGlvbiNjYWxsX2FuYWx5dGljc19zdHJlYW1fY2F0ZWdvcmllcyBDaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvbiNjYWxsX2FuYWx5dGljc19zdHJlYW1fY2F0ZWdvcmllc31cbiAgKi9cbiAgcmVhZG9ubHkgY2FsbEFuYWx5dGljc1N0cmVhbUNhdGVnb3JpZXM/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F3cy81Ljg0LjAvZG9jcy9yZXNvdXJjZXMvY2hpbWVzZGttZWRpYXBpcGVsaW5lc19tZWRpYV9pbnNpZ2h0c19waXBlbGluZV9jb25maWd1cmF0aW9uI2NvbnRlbnRfaWRlbnRpZmljYXRpb25fdHlwZSBDaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvbiNjb250ZW50X2lkZW50aWZpY2F0aW9uX3R5cGV9XG4gICovXG4gIHJlYWRvbmx5IGNvbnRlbnRJZGVudGlmaWNhdGlvblR5cGU/OiBzdHJpbmc7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9hd3MvNS44NC4wL2RvY3MvcmVzb3VyY2VzL2NoaW1lc2RrbWVkaWFwaXBlbGluZXNfbWVkaWFfaW5zaWdodHNfcGlwZWxpbmVfY29uZmlndXJhdGlvbiNjb250ZW50X3JlZGFjdGlvbl90eXBlIENoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uI2NvbnRlbnRfcmVkYWN0aW9uX3R5cGV9XG4gICovXG4gIHJlYWRvbmx5IGNvbnRlbnRSZWRhY3Rpb25UeXBlPzogc3RyaW5nO1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXdzLzUuODQuMC9kb2NzL3Jlc291cmNlcy9jaGltZXNka21lZGlhcGlwZWxpbmVzX21lZGlhX2luc2lnaHRzX3BpcGVsaW5lX2NvbmZpZ3VyYXRpb24jZW5hYmxlX3BhcnRpYWxfcmVzdWx0c19zdGFiaWxpemF0aW9uIENoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uI2VuYWJsZV9wYXJ0aWFsX3Jlc3VsdHNfc3RhYmlsaXphdGlvbn1cbiAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlUGFydGlhbFJlc3VsdHNTdGFiaWxpemF0aW9uPzogYm9vbGVhbiB8IGNka3RmLklSZXNvbHZhYmxlO1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXdzLzUuODQuMC9kb2NzL3Jlc291cmNlcy9jaGltZXNka21lZGlhcGlwZWxpbmVzX21lZGlhX2luc2lnaHRzX3BpcGVsaW5lX2NvbmZpZ3VyYXRpb24jZmlsdGVyX3BhcnRpYWxfcmVzdWx0cyBDaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvbiNmaWx0ZXJfcGFydGlhbF9yZXN1bHRzfVxuICAqL1xuICByZWFkb25seSBmaWx0ZXJQYXJ0aWFsUmVzdWx0cz86IGJvb2xlYW4gfCBjZGt0Zi5JUmVzb2x2YWJsZTtcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F3cy81Ljg0LjAvZG9jcy9yZXNvdXJjZXMvY2hpbWVzZGttZWRpYXBpcGVsaW5lc19tZWRpYV9pbnNpZ2h0c19waXBlbGluZV9jb25maWd1cmF0aW9uI2xhbmd1YWdlX2NvZGUgQ2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb24jbGFuZ3VhZ2VfY29kZX1cbiAgKi9cbiAgcmVhZG9ubHkgbGFuZ3VhZ2VDb2RlOiBzdHJpbmc7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9hd3MvNS44NC4wL2RvY3MvcmVzb3VyY2VzL2NoaW1lc2RrbWVkaWFwaXBlbGluZXNfbWVkaWFfaW5zaWdodHNfcGlwZWxpbmVfY29uZmlndXJhdGlvbiNsYW5ndWFnZV9tb2RlbF9uYW1lIENoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uI2xhbmd1YWdlX21vZGVsX25hbWV9XG4gICovXG4gIHJlYWRvbmx5IGxhbmd1YWdlTW9kZWxOYW1lPzogc3RyaW5nO1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXdzLzUuODQuMC9kb2NzL3Jlc291cmNlcy9jaGltZXNka21lZGlhcGlwZWxpbmVzX21lZGlhX2luc2lnaHRzX3BpcGVsaW5lX2NvbmZpZ3VyYXRpb24jcGFydGlhbF9yZXN1bHRzX3N0YWJpbGl0eSBDaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvbiNwYXJ0aWFsX3Jlc3VsdHNfc3RhYmlsaXR5fVxuICAqL1xuICByZWFkb25seSBwYXJ0aWFsUmVzdWx0c1N0YWJpbGl0eT86IHN0cmluZztcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F3cy81Ljg0LjAvZG9jcy9yZXNvdXJjZXMvY2hpbWVzZGttZWRpYXBpcGVsaW5lc19tZWRpYV9pbnNpZ2h0c19waXBlbGluZV9jb25maWd1cmF0aW9uI3BpaV9lbnRpdHlfdHlwZXMgQ2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb24jcGlpX2VudGl0eV90eXBlc31cbiAgKi9cbiAgcmVhZG9ubHkgcGlpRW50aXR5VHlwZXM/OiBzdHJpbmc7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9hd3MvNS44NC4wL2RvY3MvcmVzb3VyY2VzL2NoaW1lc2RrbWVkaWFwaXBlbGluZXNfbWVkaWFfaW5zaWdodHNfcGlwZWxpbmVfY29uZmlndXJhdGlvbiN2b2NhYnVsYXJ5X2ZpbHRlcl9tZXRob2QgQ2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb24jdm9jYWJ1bGFyeV9maWx0ZXJfbWV0aG9kfVxuICAqL1xuICByZWFkb25seSB2b2NhYnVsYXJ5RmlsdGVyTWV0aG9kPzogc3RyaW5nO1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXdzLzUuODQuMC9kb2NzL3Jlc291cmNlcy9jaGltZXNka21lZGlhcGlwZWxpbmVzX21lZGlhX2luc2lnaHRzX3BpcGVsaW5lX2NvbmZpZ3VyYXRpb24jdm9jYWJ1bGFyeV9maWx0ZXJfbmFtZSBDaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvbiN2b2NhYnVsYXJ5X2ZpbHRlcl9uYW1lfVxuICAqL1xuICByZWFkb25seSB2b2NhYnVsYXJ5RmlsdGVyTmFtZT86IHN0cmluZztcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F3cy81Ljg0LjAvZG9jcy9yZXNvdXJjZXMvY2hpbWVzZGttZWRpYXBpcGVsaW5lc19tZWRpYV9pbnNpZ2h0c19waXBlbGluZV9jb25maWd1cmF0aW9uI3ZvY2FidWxhcnlfbmFtZSBDaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvbiN2b2NhYnVsYXJ5X25hbWV9XG4gICovXG4gIHJlYWRvbmx5IHZvY2FidWxhcnlOYW1lPzogc3RyaW5nO1xuICAvKipcbiAgKiBwb3N0X2NhbGxfYW5hbHl0aWNzX3NldHRpbmdzIGJsb2NrXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXdzLzUuODQuMC9kb2NzL3Jlc291cmNlcy9jaGltZXNka21lZGlhcGlwZWxpbmVzX21lZGlhX2luc2lnaHRzX3BpcGVsaW5lX2NvbmZpZ3VyYXRpb24jcG9zdF9jYWxsX2FuYWx5dGljc19zZXR0aW5ncyBDaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvbiNwb3N0X2NhbGxfYW5hbHl0aWNzX3NldHRpbmdzfVxuICAqL1xuICByZWFkb25seSBwb3N0Q2FsbEFuYWx5dGljc1NldHRpbmdzPzogQ2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb25FbGVtZW50c0FtYXpvblRyYW5zY3JpYmVDYWxsQW5hbHl0aWNzUHJvY2Vzc29yQ29uZmlndXJhdGlvblBvc3RDYWxsQW5hbHl0aWNzU2V0dGluZ3M7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvbkVsZW1lbnRzQW1hem9uVHJhbnNjcmliZUNhbGxBbmFseXRpY3NQcm9jZXNzb3JDb25maWd1cmF0aW9uVG9UZXJyYWZvcm0oc3RydWN0PzogQ2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb25FbGVtZW50c0FtYXpvblRyYW5zY3JpYmVDYWxsQW5hbHl0aWNzUHJvY2Vzc29yQ29uZmlndXJhdGlvbk91dHB1dFJlZmVyZW5jZSB8IENoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uRWxlbWVudHNBbWF6b25UcmFuc2NyaWJlQ2FsbEFuYWx5dGljc1Byb2Nlc3NvckNvbmZpZ3VyYXRpb24pOiBhbnkge1xuICBpZiAoIWNka3RmLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0Zi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdGYuaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIHJldHVybiB7XG4gICAgY2FsbF9hbmFseXRpY3Nfc3RyZWFtX2NhdGVnb3JpZXM6IGNka3RmLmxpc3RNYXBwZXIoY2RrdGYuc3RyaW5nVG9UZXJyYWZvcm0sIGZhbHNlKShzdHJ1Y3QhLmNhbGxBbmFseXRpY3NTdHJlYW1DYXRlZ29yaWVzKSxcbiAgICBjb250ZW50X2lkZW50aWZpY2F0aW9uX3R5cGU6IGNka3RmLnN0cmluZ1RvVGVycmFmb3JtKHN0cnVjdCEuY29udGVudElkZW50aWZpY2F0aW9uVHlwZSksXG4gICAgY29udGVudF9yZWRhY3Rpb25fdHlwZTogY2RrdGYuc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS5jb250ZW50UmVkYWN0aW9uVHlwZSksXG4gICAgZW5hYmxlX3BhcnRpYWxfcmVzdWx0c19zdGFiaWxpemF0aW9uOiBjZGt0Zi5ib29sZWFuVG9UZXJyYWZvcm0oc3RydWN0IS5lbmFibGVQYXJ0aWFsUmVzdWx0c1N0YWJpbGl6YXRpb24pLFxuICAgIGZpbHRlcl9wYXJ0aWFsX3Jlc3VsdHM6IGNka3RmLmJvb2xlYW5Ub1RlcnJhZm9ybShzdHJ1Y3QhLmZpbHRlclBhcnRpYWxSZXN1bHRzKSxcbiAgICBsYW5ndWFnZV9jb2RlOiBjZGt0Zi5zdHJpbmdUb1RlcnJhZm9ybShzdHJ1Y3QhLmxhbmd1YWdlQ29kZSksXG4gICAgbGFuZ3VhZ2VfbW9kZWxfbmFtZTogY2RrdGYuc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS5sYW5ndWFnZU1vZGVsTmFtZSksXG4gICAgcGFydGlhbF9yZXN1bHRzX3N0YWJpbGl0eTogY2RrdGYuc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS5wYXJ0aWFsUmVzdWx0c1N0YWJpbGl0eSksXG4gICAgcGlpX2VudGl0eV90eXBlczogY2RrdGYuc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS5waWlFbnRpdHlUeXBlcyksXG4gICAgdm9jYWJ1bGFyeV9maWx0ZXJfbWV0aG9kOiBjZGt0Zi5zdHJpbmdUb1RlcnJhZm9ybShzdHJ1Y3QhLnZvY2FidWxhcnlGaWx0ZXJNZXRob2QpLFxuICAgIHZvY2FidWxhcnlfZmlsdGVyX25hbWU6IGNka3RmLnN0cmluZ1RvVGVycmFmb3JtKHN0cnVjdCEudm9jYWJ1bGFyeUZpbHRlck5hbWUpLFxuICAgIHZvY2FidWxhcnlfbmFtZTogY2RrdGYuc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS52b2NhYnVsYXJ5TmFtZSksXG4gICAgcG9zdF9jYWxsX2FuYWx5dGljc19zZXR0aW5nczogY2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb25FbGVtZW50c0FtYXpvblRyYW5zY3JpYmVDYWxsQW5hbHl0aWNzUHJvY2Vzc29yQ29uZmlndXJhdGlvblBvc3RDYWxsQW5hbHl0aWNzU2V0dGluZ3NUb1RlcnJhZm9ybShzdHJ1Y3QhLnBvc3RDYWxsQW5hbHl0aWNzU2V0dGluZ3MpLFxuICB9XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGNoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uRWxlbWVudHNBbWF6b25UcmFuc2NyaWJlQ2FsbEFuYWx5dGljc1Byb2Nlc3NvckNvbmZpZ3VyYXRpb25Ub0hjbFRlcnJhZm9ybShzdHJ1Y3Q/OiBDaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvbkVsZW1lbnRzQW1hem9uVHJhbnNjcmliZUNhbGxBbmFseXRpY3NQcm9jZXNzb3JDb25maWd1cmF0aW9uT3V0cHV0UmVmZXJlbmNlIHwgQ2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb25FbGVtZW50c0FtYXpvblRyYW5zY3JpYmVDYWxsQW5hbHl0aWNzUHJvY2Vzc29yQ29uZmlndXJhdGlvbik6IGFueSB7XG4gIGlmICghY2RrdGYuY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RmLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0Zi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgY29uc3QgYXR0cnMgPSB7XG4gICAgY2FsbF9hbmFseXRpY3Nfc3RyZWFtX2NhdGVnb3JpZXM6IHtcbiAgICAgIHZhbHVlOiBjZGt0Zi5saXN0TWFwcGVySGNsKGNka3RmLnN0cmluZ1RvSGNsVGVycmFmb3JtLCBmYWxzZSkoc3RydWN0IS5jYWxsQW5hbHl0aWNzU3RyZWFtQ2F0ZWdvcmllcyksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwibGlzdFwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdMaXN0XCIsXG4gICAgfSxcbiAgICBjb250ZW50X2lkZW50aWZpY2F0aW9uX3R5cGU6IHtcbiAgICAgIHZhbHVlOiBjZGt0Zi5zdHJpbmdUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLmNvbnRlbnRJZGVudGlmaWNhdGlvblR5cGUpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICB9LFxuICAgIGNvbnRlbnRfcmVkYWN0aW9uX3R5cGU6IHtcbiAgICAgIHZhbHVlOiBjZGt0Zi5zdHJpbmdUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLmNvbnRlbnRSZWRhY3Rpb25UeXBlKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgICBlbmFibGVfcGFydGlhbF9yZXN1bHRzX3N0YWJpbGl6YXRpb246IHtcbiAgICAgIHZhbHVlOiBjZGt0Zi5ib29sZWFuVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5lbmFibGVQYXJ0aWFsUmVzdWx0c1N0YWJpbGl6YXRpb24pLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJib29sZWFuXCIsXG4gICAgfSxcbiAgICBmaWx0ZXJfcGFydGlhbF9yZXN1bHRzOiB7XG4gICAgICB2YWx1ZTogY2RrdGYuYm9vbGVhblRvSGNsVGVycmFmb3JtKHN0cnVjdCEuZmlsdGVyUGFydGlhbFJlc3VsdHMpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJib29sZWFuXCIsXG4gICAgfSxcbiAgICBsYW5ndWFnZV9jb2RlOiB7XG4gICAgICB2YWx1ZTogY2RrdGYuc3RyaW5nVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5sYW5ndWFnZUNvZGUpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICB9LFxuICAgIGxhbmd1YWdlX21vZGVsX25hbWU6IHtcbiAgICAgIHZhbHVlOiBjZGt0Zi5zdHJpbmdUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLmxhbmd1YWdlTW9kZWxOYW1lKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgICBwYXJ0aWFsX3Jlc3VsdHNfc3RhYmlsaXR5OiB7XG4gICAgICB2YWx1ZTogY2RrdGYuc3RyaW5nVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5wYXJ0aWFsUmVzdWx0c1N0YWJpbGl0eSksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgIH0sXG4gICAgcGlpX2VudGl0eV90eXBlczoge1xuICAgICAgdmFsdWU6IGNka3RmLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEucGlpRW50aXR5VHlwZXMpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICB9LFxuICAgIHZvY2FidWxhcnlfZmlsdGVyX21ldGhvZDoge1xuICAgICAgdmFsdWU6IGNka3RmLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEudm9jYWJ1bGFyeUZpbHRlck1ldGhvZCksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgIH0sXG4gICAgdm9jYWJ1bGFyeV9maWx0ZXJfbmFtZToge1xuICAgICAgdmFsdWU6IGNka3RmLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEudm9jYWJ1bGFyeUZpbHRlck5hbWUpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICB9LFxuICAgIHZvY2FidWxhcnlfbmFtZToge1xuICAgICAgdmFsdWU6IGNka3RmLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEudm9jYWJ1bGFyeU5hbWUpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICB9LFxuICAgIHBvc3RfY2FsbF9hbmFseXRpY3Nfc2V0dGluZ3M6IHtcbiAgICAgIHZhbHVlOiBjaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvbkVsZW1lbnRzQW1hem9uVHJhbnNjcmliZUNhbGxBbmFseXRpY3NQcm9jZXNzb3JDb25maWd1cmF0aW9uUG9zdENhbGxBbmFseXRpY3NTZXR0aW5nc1RvSGNsVGVycmFmb3JtKHN0cnVjdCEucG9zdENhbGxBbmFseXRpY3NTZXR0aW5ncyksXG4gICAgICBpc0Jsb2NrOiB0cnVlLFxuICAgICAgdHlwZTogXCJsaXN0XCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIkNoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uRWxlbWVudHNBbWF6b25UcmFuc2NyaWJlQ2FsbEFuYWx5dGljc1Byb2Nlc3NvckNvbmZpZ3VyYXRpb25Qb3N0Q2FsbEFuYWx5dGljc1NldHRpbmdzTGlzdFwiLFxuICAgIH0sXG4gIH07XG5cbiAgLy8gcmVtb3ZlIHVuZGVmaW5lZCBhdHRyaWJ1dGVzXG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoYXR0cnMpLmZpbHRlcigoW18sIHZhbHVlXSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZS52YWx1ZSAhPT0gdW5kZWZpbmVkKSk7XG59XG5cbmV4cG9ydCBjbGFzcyBDaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvbkVsZW1lbnRzQW1hem9uVHJhbnNjcmliZUNhbGxBbmFseXRpY3NQcm9jZXNzb3JDb25maWd1cmF0aW9uT3V0cHV0UmVmZXJlbmNlIGV4dGVuZHMgY2RrdGYuQ29tcGxleE9iamVjdCB7XG4gIHByaXZhdGUgaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuXG4gIC8qKlxuICAqIEBwYXJhbSB0ZXJyYWZvcm1SZXNvdXJjZSBUaGUgcGFyZW50IHJlc291cmNlXG4gICogQHBhcmFtIHRlcnJhZm9ybUF0dHJpYnV0ZSBUaGUgYXR0cmlidXRlIG9uIHRoZSBwYXJlbnQgcmVzb3VyY2UgdGhpcyBjbGFzcyBpcyByZWZlcmVuY2luZ1xuICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IodGVycmFmb3JtUmVzb3VyY2U6IGNka3RmLklJbnRlcnBvbGF0aW5nUGFyZW50LCB0ZXJyYWZvcm1BdHRyaWJ1dGU6IHN0cmluZykge1xuICAgIHN1cGVyKHRlcnJhZm9ybVJlc291cmNlLCB0ZXJyYWZvcm1BdHRyaWJ1dGUsIGZhbHNlLCAwKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW50ZXJuYWxWYWx1ZSgpOiBDaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvbkVsZW1lbnRzQW1hem9uVHJhbnNjcmliZUNhbGxBbmFseXRpY3NQcm9jZXNzb3JDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgaGFzQW55VmFsdWVzID0gdGhpcy5pc0VtcHR5T2JqZWN0O1xuICAgIGNvbnN0IGludGVybmFsVmFsdWVSZXN1bHQ6IGFueSA9IHt9O1xuICAgIGlmICh0aGlzLl9jYWxsQW5hbHl0aWNzU3RyZWFtQ2F0ZWdvcmllcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5jYWxsQW5hbHl0aWNzU3RyZWFtQ2F0ZWdvcmllcyA9IHRoaXMuX2NhbGxBbmFseXRpY3NTdHJlYW1DYXRlZ29yaWVzO1xuICAgIH1cbiAgICBpZiAodGhpcy5fY29udGVudElkZW50aWZpY2F0aW9uVHlwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5jb250ZW50SWRlbnRpZmljYXRpb25UeXBlID0gdGhpcy5fY29udGVudElkZW50aWZpY2F0aW9uVHlwZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2NvbnRlbnRSZWRhY3Rpb25UeXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmNvbnRlbnRSZWRhY3Rpb25UeXBlID0gdGhpcy5fY29udGVudFJlZGFjdGlvblR5cGU7XG4gICAgfVxuICAgIGlmICh0aGlzLl9lbmFibGVQYXJ0aWFsUmVzdWx0c1N0YWJpbGl6YXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuZW5hYmxlUGFydGlhbFJlc3VsdHNTdGFiaWxpemF0aW9uID0gdGhpcy5fZW5hYmxlUGFydGlhbFJlc3VsdHNTdGFiaWxpemF0aW9uO1xuICAgIH1cbiAgICBpZiAodGhpcy5fZmlsdGVyUGFydGlhbFJlc3VsdHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuZmlsdGVyUGFydGlhbFJlc3VsdHMgPSB0aGlzLl9maWx0ZXJQYXJ0aWFsUmVzdWx0cztcbiAgICB9XG4gICAgaWYgKHRoaXMuX2xhbmd1YWdlQ29kZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5sYW5ndWFnZUNvZGUgPSB0aGlzLl9sYW5ndWFnZUNvZGU7XG4gICAgfVxuICAgIGlmICh0aGlzLl9sYW5ndWFnZU1vZGVsTmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5sYW5ndWFnZU1vZGVsTmFtZSA9IHRoaXMuX2xhbmd1YWdlTW9kZWxOYW1lO1xuICAgIH1cbiAgICBpZiAodGhpcy5fcGFydGlhbFJlc3VsdHNTdGFiaWxpdHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQucGFydGlhbFJlc3VsdHNTdGFiaWxpdHkgPSB0aGlzLl9wYXJ0aWFsUmVzdWx0c1N0YWJpbGl0eTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3BpaUVudGl0eVR5cGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LnBpaUVudGl0eVR5cGVzID0gdGhpcy5fcGlpRW50aXR5VHlwZXM7XG4gICAgfVxuICAgIGlmICh0aGlzLl92b2NhYnVsYXJ5RmlsdGVyTWV0aG9kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LnZvY2FidWxhcnlGaWx0ZXJNZXRob2QgPSB0aGlzLl92b2NhYnVsYXJ5RmlsdGVyTWV0aG9kO1xuICAgIH1cbiAgICBpZiAodGhpcy5fdm9jYWJ1bGFyeUZpbHRlck5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQudm9jYWJ1bGFyeUZpbHRlck5hbWUgPSB0aGlzLl92b2NhYnVsYXJ5RmlsdGVyTmFtZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3ZvY2FidWxhcnlOYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LnZvY2FidWxhcnlOYW1lID0gdGhpcy5fdm9jYWJ1bGFyeU5hbWU7XG4gICAgfVxuICAgIGlmICh0aGlzLl9wb3N0Q2FsbEFuYWx5dGljc1NldHRpbmdzPy5pbnRlcm5hbFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LnBvc3RDYWxsQW5hbHl0aWNzU2V0dGluZ3MgPSB0aGlzLl9wb3N0Q2FsbEFuYWx5dGljc1NldHRpbmdzPy5pbnRlcm5hbFZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gaGFzQW55VmFsdWVzID8gaW50ZXJuYWxWYWx1ZVJlc3VsdCA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgaW50ZXJuYWxWYWx1ZSh2YWx1ZTogQ2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb25FbGVtZW50c0FtYXpvblRyYW5zY3JpYmVDYWxsQW5hbHl0aWNzUHJvY2Vzc29yQ29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZCkge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBmYWxzZTtcbiAgICAgIHRoaXMuX2NhbGxBbmFseXRpY3NTdHJlYW1DYXRlZ29yaWVzID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fY29udGVudElkZW50aWZpY2F0aW9uVHlwZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX2NvbnRlbnRSZWRhY3Rpb25UeXBlID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fZW5hYmxlUGFydGlhbFJlc3VsdHNTdGFiaWxpemF0aW9uID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fZmlsdGVyUGFydGlhbFJlc3VsdHMgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9sYW5ndWFnZUNvZGUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9sYW5ndWFnZU1vZGVsTmFtZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3BhcnRpYWxSZXN1bHRzU3RhYmlsaXR5ID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fcGlpRW50aXR5VHlwZXMgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl92b2NhYnVsYXJ5RmlsdGVyTWV0aG9kID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fdm9jYWJ1bGFyeUZpbHRlck5hbWUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl92b2NhYnVsYXJ5TmFtZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3Bvc3RDYWxsQW5hbHl0aWNzU2V0dGluZ3MuaW50ZXJuYWxWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSAwO1xuICAgICAgdGhpcy5fY2FsbEFuYWx5dGljc1N0cmVhbUNhdGVnb3JpZXMgPSB2YWx1ZS5jYWxsQW5hbHl0aWNzU3RyZWFtQ2F0ZWdvcmllcztcbiAgICAgIHRoaXMuX2NvbnRlbnRJZGVudGlmaWNhdGlvblR5cGUgPSB2YWx1ZS5jb250ZW50SWRlbnRpZmljYXRpb25UeXBlO1xuICAgICAgdGhpcy5fY29udGVudFJlZGFjdGlvblR5cGUgPSB2YWx1ZS5jb250ZW50UmVkYWN0aW9uVHlwZTtcbiAgICAgIHRoaXMuX2VuYWJsZVBhcnRpYWxSZXN1bHRzU3RhYmlsaXphdGlvbiA9IHZhbHVlLmVuYWJsZVBhcnRpYWxSZXN1bHRzU3RhYmlsaXphdGlvbjtcbiAgICAgIHRoaXMuX2ZpbHRlclBhcnRpYWxSZXN1bHRzID0gdmFsdWUuZmlsdGVyUGFydGlhbFJlc3VsdHM7XG4gICAgICB0aGlzLl9sYW5ndWFnZUNvZGUgPSB2YWx1ZS5sYW5ndWFnZUNvZGU7XG4gICAgICB0aGlzLl9sYW5ndWFnZU1vZGVsTmFtZSA9IHZhbHVlLmxhbmd1YWdlTW9kZWxOYW1lO1xuICAgICAgdGhpcy5fcGFydGlhbFJlc3VsdHNTdGFiaWxpdHkgPSB2YWx1ZS5wYXJ0aWFsUmVzdWx0c1N0YWJpbGl0eTtcbiAgICAgIHRoaXMuX3BpaUVudGl0eVR5cGVzID0gdmFsdWUucGlpRW50aXR5VHlwZXM7XG4gICAgICB0aGlzLl92b2NhYnVsYXJ5RmlsdGVyTWV0aG9kID0gdmFsdWUudm9jYWJ1bGFyeUZpbHRlck1ldGhvZDtcbiAgICAgIHRoaXMuX3ZvY2FidWxhcnlGaWx0ZXJOYW1lID0gdmFsdWUudm9jYWJ1bGFyeUZpbHRlck5hbWU7XG4gICAgICB0aGlzLl92b2NhYnVsYXJ5TmFtZSA9IHZhbHVlLnZvY2FidWxhcnlOYW1lO1xuICAgICAgdGhpcy5fcG9zdENhbGxBbmFseXRpY3NTZXR0aW5ncy5pbnRlcm5hbFZhbHVlID0gdmFsdWUucG9zdENhbGxBbmFseXRpY3NTZXR0aW5ncztcbiAgICB9XG4gIH1cblxuICAvLyBjYWxsX2FuYWx5dGljc19zdHJlYW1fY2F0ZWdvcmllcyAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9jYWxsQW5hbHl0aWNzU3RyZWFtQ2F0ZWdvcmllcz86IHN0cmluZ1tdOyBcbiAgcHVibGljIGdldCBjYWxsQW5hbHl0aWNzU3RyZWFtQ2F0ZWdvcmllcygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMaXN0QXR0cmlidXRlKCdjYWxsX2FuYWx5dGljc19zdHJlYW1fY2F0ZWdvcmllcycpO1xuICB9XG4gIHB1YmxpYyBzZXQgY2FsbEFuYWx5dGljc1N0cmVhbUNhdGVnb3JpZXModmFsdWU6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5fY2FsbEFuYWx5dGljc1N0cmVhbUNhdGVnb3JpZXMgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRDYWxsQW5hbHl0aWNzU3RyZWFtQ2F0ZWdvcmllcygpIHtcbiAgICB0aGlzLl9jYWxsQW5hbHl0aWNzU3RyZWFtQ2F0ZWdvcmllcyA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgY2FsbEFuYWx5dGljc1N0cmVhbUNhdGVnb3JpZXNJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fY2FsbEFuYWx5dGljc1N0cmVhbUNhdGVnb3JpZXM7XG4gIH1cblxuICAvLyBjb250ZW50X2lkZW50aWZpY2F0aW9uX3R5cGUgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfY29udGVudElkZW50aWZpY2F0aW9uVHlwZT86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgY29udGVudElkZW50aWZpY2F0aW9uVHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ2NvbnRlbnRfaWRlbnRpZmljYXRpb25fdHlwZScpO1xuICB9XG4gIHB1YmxpYyBzZXQgY29udGVudElkZW50aWZpY2F0aW9uVHlwZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fY29udGVudElkZW50aWZpY2F0aW9uVHlwZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldENvbnRlbnRJZGVudGlmaWNhdGlvblR5cGUoKSB7XG4gICAgdGhpcy5fY29udGVudElkZW50aWZpY2F0aW9uVHlwZSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgY29udGVudElkZW50aWZpY2F0aW9uVHlwZUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9jb250ZW50SWRlbnRpZmljYXRpb25UeXBlO1xuICB9XG5cbiAgLy8gY29udGVudF9yZWRhY3Rpb25fdHlwZSAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9jb250ZW50UmVkYWN0aW9uVHlwZT86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgY29udGVudFJlZGFjdGlvblR5cGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdjb250ZW50X3JlZGFjdGlvbl90eXBlJyk7XG4gIH1cbiAgcHVibGljIHNldCBjb250ZW50UmVkYWN0aW9uVHlwZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fY29udGVudFJlZGFjdGlvblR5cGUgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRDb250ZW50UmVkYWN0aW9uVHlwZSgpIHtcbiAgICB0aGlzLl9jb250ZW50UmVkYWN0aW9uVHlwZSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgY29udGVudFJlZGFjdGlvblR5cGVJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fY29udGVudFJlZGFjdGlvblR5cGU7XG4gIH1cblxuICAvLyBlbmFibGVfcGFydGlhbF9yZXN1bHRzX3N0YWJpbGl6YXRpb24gLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfZW5hYmxlUGFydGlhbFJlc3VsdHNTdGFiaWxpemF0aW9uPzogYm9vbGVhbiB8IGNka3RmLklSZXNvbHZhYmxlOyBcbiAgcHVibGljIGdldCBlbmFibGVQYXJ0aWFsUmVzdWx0c1N0YWJpbGl6YXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Qm9vbGVhbkF0dHJpYnV0ZSgnZW5hYmxlX3BhcnRpYWxfcmVzdWx0c19zdGFiaWxpemF0aW9uJyk7XG4gIH1cbiAgcHVibGljIHNldCBlbmFibGVQYXJ0aWFsUmVzdWx0c1N0YWJpbGl6YXRpb24odmFsdWU6IGJvb2xlYW4gfCBjZGt0Zi5JUmVzb2x2YWJsZSkge1xuICAgIHRoaXMuX2VuYWJsZVBhcnRpYWxSZXN1bHRzU3RhYmlsaXphdGlvbiA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldEVuYWJsZVBhcnRpYWxSZXN1bHRzU3RhYmlsaXphdGlvbigpIHtcbiAgICB0aGlzLl9lbmFibGVQYXJ0aWFsUmVzdWx0c1N0YWJpbGl6YXRpb24gPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGVuYWJsZVBhcnRpYWxSZXN1bHRzU3RhYmlsaXphdGlvbklucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9lbmFibGVQYXJ0aWFsUmVzdWx0c1N0YWJpbGl6YXRpb247XG4gIH1cblxuICAvLyBmaWx0ZXJfcGFydGlhbF9yZXN1bHRzIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2ZpbHRlclBhcnRpYWxSZXN1bHRzPzogYm9vbGVhbiB8IGNka3RmLklSZXNvbHZhYmxlOyBcbiAgcHVibGljIGdldCBmaWx0ZXJQYXJ0aWFsUmVzdWx0cygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRCb29sZWFuQXR0cmlidXRlKCdmaWx0ZXJfcGFydGlhbF9yZXN1bHRzJyk7XG4gIH1cbiAgcHVibGljIHNldCBmaWx0ZXJQYXJ0aWFsUmVzdWx0cyh2YWx1ZTogYm9vbGVhbiB8IGNka3RmLklSZXNvbHZhYmxlKSB7XG4gICAgdGhpcy5fZmlsdGVyUGFydGlhbFJlc3VsdHMgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRGaWx0ZXJQYXJ0aWFsUmVzdWx0cygpIHtcbiAgICB0aGlzLl9maWx0ZXJQYXJ0aWFsUmVzdWx0cyA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgZmlsdGVyUGFydGlhbFJlc3VsdHNJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZmlsdGVyUGFydGlhbFJlc3VsdHM7XG4gIH1cblxuICAvLyBsYW5ndWFnZV9jb2RlIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiB0cnVlXG4gIHByaXZhdGUgX2xhbmd1YWdlQ29kZT86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgbGFuZ3VhZ2VDb2RlKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnbGFuZ3VhZ2VfY29kZScpO1xuICB9XG4gIHB1YmxpYyBzZXQgbGFuZ3VhZ2VDb2RlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9sYW5ndWFnZUNvZGUgPSB2YWx1ZTtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgbGFuZ3VhZ2VDb2RlSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2xhbmd1YWdlQ29kZTtcbiAgfVxuXG4gIC8vIGxhbmd1YWdlX21vZGVsX25hbWUgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfbGFuZ3VhZ2VNb2RlbE5hbWU/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IGxhbmd1YWdlTW9kZWxOYW1lKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnbGFuZ3VhZ2VfbW9kZWxfbmFtZScpO1xuICB9XG4gIHB1YmxpYyBzZXQgbGFuZ3VhZ2VNb2RlbE5hbWUodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2xhbmd1YWdlTW9kZWxOYW1lID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0TGFuZ3VhZ2VNb2RlbE5hbWUoKSB7XG4gICAgdGhpcy5fbGFuZ3VhZ2VNb2RlbE5hbWUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGxhbmd1YWdlTW9kZWxOYW1lSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2xhbmd1YWdlTW9kZWxOYW1lO1xuICB9XG5cbiAgLy8gcGFydGlhbF9yZXN1bHRzX3N0YWJpbGl0eSAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9wYXJ0aWFsUmVzdWx0c1N0YWJpbGl0eT86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgcGFydGlhbFJlc3VsdHNTdGFiaWxpdHkoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdwYXJ0aWFsX3Jlc3VsdHNfc3RhYmlsaXR5Jyk7XG4gIH1cbiAgcHVibGljIHNldCBwYXJ0aWFsUmVzdWx0c1N0YWJpbGl0eSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fcGFydGlhbFJlc3VsdHNTdGFiaWxpdHkgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRQYXJ0aWFsUmVzdWx0c1N0YWJpbGl0eSgpIHtcbiAgICB0aGlzLl9wYXJ0aWFsUmVzdWx0c1N0YWJpbGl0eSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgcGFydGlhbFJlc3VsdHNTdGFiaWxpdHlJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcGFydGlhbFJlc3VsdHNTdGFiaWxpdHk7XG4gIH1cblxuICAvLyBwaWlfZW50aXR5X3R5cGVzIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX3BpaUVudGl0eVR5cGVzPzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBwaWlFbnRpdHlUeXBlcygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ3BpaV9lbnRpdHlfdHlwZXMnKTtcbiAgfVxuICBwdWJsaWMgc2V0IHBpaUVudGl0eVR5cGVzKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9waWlFbnRpdHlUeXBlcyA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldFBpaUVudGl0eVR5cGVzKCkge1xuICAgIHRoaXMuX3BpaUVudGl0eVR5cGVzID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBwaWlFbnRpdHlUeXBlc0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9waWlFbnRpdHlUeXBlcztcbiAgfVxuXG4gIC8vIHZvY2FidWxhcnlfZmlsdGVyX21ldGhvZCAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF92b2NhYnVsYXJ5RmlsdGVyTWV0aG9kPzogc3RyaW5nOyBcbiAgcHVibGljIGdldCB2b2NhYnVsYXJ5RmlsdGVyTWV0aG9kKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgndm9jYWJ1bGFyeV9maWx0ZXJfbWV0aG9kJyk7XG4gIH1cbiAgcHVibGljIHNldCB2b2NhYnVsYXJ5RmlsdGVyTWV0aG9kKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl92b2NhYnVsYXJ5RmlsdGVyTWV0aG9kID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0Vm9jYWJ1bGFyeUZpbHRlck1ldGhvZCgpIHtcbiAgICB0aGlzLl92b2NhYnVsYXJ5RmlsdGVyTWV0aG9kID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCB2b2NhYnVsYXJ5RmlsdGVyTWV0aG9kSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZvY2FidWxhcnlGaWx0ZXJNZXRob2Q7XG4gIH1cblxuICAvLyB2b2NhYnVsYXJ5X2ZpbHRlcl9uYW1lIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX3ZvY2FidWxhcnlGaWx0ZXJOYW1lPzogc3RyaW5nOyBcbiAgcHVibGljIGdldCB2b2NhYnVsYXJ5RmlsdGVyTmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ3ZvY2FidWxhcnlfZmlsdGVyX25hbWUnKTtcbiAgfVxuICBwdWJsaWMgc2V0IHZvY2FidWxhcnlGaWx0ZXJOYW1lKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl92b2NhYnVsYXJ5RmlsdGVyTmFtZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldFZvY2FidWxhcnlGaWx0ZXJOYW1lKCkge1xuICAgIHRoaXMuX3ZvY2FidWxhcnlGaWx0ZXJOYW1lID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCB2b2NhYnVsYXJ5RmlsdGVyTmFtZUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl92b2NhYnVsYXJ5RmlsdGVyTmFtZTtcbiAgfVxuXG4gIC8vIHZvY2FidWxhcnlfbmFtZSAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF92b2NhYnVsYXJ5TmFtZT86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgdm9jYWJ1bGFyeU5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCd2b2NhYnVsYXJ5X25hbWUnKTtcbiAgfVxuICBwdWJsaWMgc2V0IHZvY2FidWxhcnlOYW1lKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl92b2NhYnVsYXJ5TmFtZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldFZvY2FidWxhcnlOYW1lKCkge1xuICAgIHRoaXMuX3ZvY2FidWxhcnlOYW1lID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCB2b2NhYnVsYXJ5TmFtZUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl92b2NhYnVsYXJ5TmFtZTtcbiAgfVxuXG4gIC8vIHBvc3RfY2FsbF9hbmFseXRpY3Nfc2V0dGluZ3MgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfcG9zdENhbGxBbmFseXRpY3NTZXR0aW5ncyA9IG5ldyBDaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvbkVsZW1lbnRzQW1hem9uVHJhbnNjcmliZUNhbGxBbmFseXRpY3NQcm9jZXNzb3JDb25maWd1cmF0aW9uUG9zdENhbGxBbmFseXRpY3NTZXR0aW5nc091dHB1dFJlZmVyZW5jZSh0aGlzLCBcInBvc3RfY2FsbF9hbmFseXRpY3Nfc2V0dGluZ3NcIik7XG4gIHB1YmxpYyBnZXQgcG9zdENhbGxBbmFseXRpY3NTZXR0aW5ncygpIHtcbiAgICByZXR1cm4gdGhpcy5fcG9zdENhbGxBbmFseXRpY3NTZXR0aW5ncztcbiAgfVxuICBwdWJsaWMgcHV0UG9zdENhbGxBbmFseXRpY3NTZXR0aW5ncyh2YWx1ZTogQ2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb25FbGVtZW50c0FtYXpvblRyYW5zY3JpYmVDYWxsQW5hbHl0aWNzUHJvY2Vzc29yQ29uZmlndXJhdGlvblBvc3RDYWxsQW5hbHl0aWNzU2V0dGluZ3MpIHtcbiAgICB0aGlzLl9wb3N0Q2FsbEFuYWx5dGljc1NldHRpbmdzLmludGVybmFsVmFsdWUgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRQb3N0Q2FsbEFuYWx5dGljc1NldHRpbmdzKCkge1xuICAgIHRoaXMuX3Bvc3RDYWxsQW5hbHl0aWNzU2V0dGluZ3MuaW50ZXJuYWxWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgcG9zdENhbGxBbmFseXRpY3NTZXR0aW5nc0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9wb3N0Q2FsbEFuYWx5dGljc1NldHRpbmdzLmludGVybmFsVmFsdWU7XG4gIH1cbn1cbmV4cG9ydCBpbnRlcmZhY2UgQ2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb25FbGVtZW50c0FtYXpvblRyYW5zY3JpYmVQcm9jZXNzb3JDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F3cy81Ljg0LjAvZG9jcy9yZXNvdXJjZXMvY2hpbWVzZGttZWRpYXBpcGVsaW5lc19tZWRpYV9pbnNpZ2h0c19waXBlbGluZV9jb25maWd1cmF0aW9uI2NvbnRlbnRfaWRlbnRpZmljYXRpb25fdHlwZSBDaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvbiNjb250ZW50X2lkZW50aWZpY2F0aW9uX3R5cGV9XG4gICovXG4gIHJlYWRvbmx5IGNvbnRlbnRJZGVudGlmaWNhdGlvblR5cGU/OiBzdHJpbmc7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9hd3MvNS44NC4wL2RvY3MvcmVzb3VyY2VzL2NoaW1lc2RrbWVkaWFwaXBlbGluZXNfbWVkaWFfaW5zaWdodHNfcGlwZWxpbmVfY29uZmlndXJhdGlvbiNjb250ZW50X3JlZGFjdGlvbl90eXBlIENoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uI2NvbnRlbnRfcmVkYWN0aW9uX3R5cGV9XG4gICovXG4gIHJlYWRvbmx5IGNvbnRlbnRSZWRhY3Rpb25UeXBlPzogc3RyaW5nO1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXdzLzUuODQuMC9kb2NzL3Jlc291cmNlcy9jaGltZXNka21lZGlhcGlwZWxpbmVzX21lZGlhX2luc2lnaHRzX3BpcGVsaW5lX2NvbmZpZ3VyYXRpb24jZW5hYmxlX3BhcnRpYWxfcmVzdWx0c19zdGFiaWxpemF0aW9uIENoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uI2VuYWJsZV9wYXJ0aWFsX3Jlc3VsdHNfc3RhYmlsaXphdGlvbn1cbiAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlUGFydGlhbFJlc3VsdHNTdGFiaWxpemF0aW9uPzogYm9vbGVhbiB8IGNka3RmLklSZXNvbHZhYmxlO1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXdzLzUuODQuMC9kb2NzL3Jlc291cmNlcy9jaGltZXNka21lZGlhcGlwZWxpbmVzX21lZGlhX2luc2lnaHRzX3BpcGVsaW5lX2NvbmZpZ3VyYXRpb24jZmlsdGVyX3BhcnRpYWxfcmVzdWx0cyBDaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvbiNmaWx0ZXJfcGFydGlhbF9yZXN1bHRzfVxuICAqL1xuICByZWFkb25seSBmaWx0ZXJQYXJ0aWFsUmVzdWx0cz86IGJvb2xlYW4gfCBjZGt0Zi5JUmVzb2x2YWJsZTtcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F3cy81Ljg0LjAvZG9jcy9yZXNvdXJjZXMvY2hpbWVzZGttZWRpYXBpcGVsaW5lc19tZWRpYV9pbnNpZ2h0c19waXBlbGluZV9jb25maWd1cmF0aW9uI2xhbmd1YWdlX2NvZGUgQ2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb24jbGFuZ3VhZ2VfY29kZX1cbiAgKi9cbiAgcmVhZG9ubHkgbGFuZ3VhZ2VDb2RlOiBzdHJpbmc7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9hd3MvNS44NC4wL2RvY3MvcmVzb3VyY2VzL2NoaW1lc2RrbWVkaWFwaXBlbGluZXNfbWVkaWFfaW5zaWdodHNfcGlwZWxpbmVfY29uZmlndXJhdGlvbiNsYW5ndWFnZV9tb2RlbF9uYW1lIENoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uI2xhbmd1YWdlX21vZGVsX25hbWV9XG4gICovXG4gIHJlYWRvbmx5IGxhbmd1YWdlTW9kZWxOYW1lPzogc3RyaW5nO1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXdzLzUuODQuMC9kb2NzL3Jlc291cmNlcy9jaGltZXNka21lZGlhcGlwZWxpbmVzX21lZGlhX2luc2lnaHRzX3BpcGVsaW5lX2NvbmZpZ3VyYXRpb24jcGFydGlhbF9yZXN1bHRzX3N0YWJpbGl0eSBDaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvbiNwYXJ0aWFsX3Jlc3VsdHNfc3RhYmlsaXR5fVxuICAqL1xuICByZWFkb25seSBwYXJ0aWFsUmVzdWx0c1N0YWJpbGl0eT86IHN0cmluZztcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F3cy81Ljg0LjAvZG9jcy9yZXNvdXJjZXMvY2hpbWVzZGttZWRpYXBpcGVsaW5lc19tZWRpYV9pbnNpZ2h0c19waXBlbGluZV9jb25maWd1cmF0aW9uI3BpaV9lbnRpdHlfdHlwZXMgQ2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb24jcGlpX2VudGl0eV90eXBlc31cbiAgKi9cbiAgcmVhZG9ubHkgcGlpRW50aXR5VHlwZXM/OiBzdHJpbmc7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9hd3MvNS44NC4wL2RvY3MvcmVzb3VyY2VzL2NoaW1lc2RrbWVkaWFwaXBlbGluZXNfbWVkaWFfaW5zaWdodHNfcGlwZWxpbmVfY29uZmlndXJhdGlvbiNzaG93X3NwZWFrZXJfbGFiZWwgQ2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb24jc2hvd19zcGVha2VyX2xhYmVsfVxuICAqL1xuICByZWFkb25seSBzaG93U3BlYWtlckxhYmVsPzogYm9vbGVhbiB8IGNka3RmLklSZXNvbHZhYmxlO1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXdzLzUuODQuMC9kb2NzL3Jlc291cmNlcy9jaGltZXNka21lZGlhcGlwZWxpbmVzX21lZGlhX2luc2lnaHRzX3BpcGVsaW5lX2NvbmZpZ3VyYXRpb24jdm9jYWJ1bGFyeV9maWx0ZXJfbWV0aG9kIENoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uI3ZvY2FidWxhcnlfZmlsdGVyX21ldGhvZH1cbiAgKi9cbiAgcmVhZG9ubHkgdm9jYWJ1bGFyeUZpbHRlck1ldGhvZD86IHN0cmluZztcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F3cy81Ljg0LjAvZG9jcy9yZXNvdXJjZXMvY2hpbWVzZGttZWRpYXBpcGVsaW5lc19tZWRpYV9pbnNpZ2h0c19waXBlbGluZV9jb25maWd1cmF0aW9uI3ZvY2FidWxhcnlfZmlsdGVyX25hbWUgQ2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb24jdm9jYWJ1bGFyeV9maWx0ZXJfbmFtZX1cbiAgKi9cbiAgcmVhZG9ubHkgdm9jYWJ1bGFyeUZpbHRlck5hbWU/OiBzdHJpbmc7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9hd3MvNS44NC4wL2RvY3MvcmVzb3VyY2VzL2NoaW1lc2RrbWVkaWFwaXBlbGluZXNfbWVkaWFfaW5zaWdodHNfcGlwZWxpbmVfY29uZmlndXJhdGlvbiN2b2NhYnVsYXJ5X25hbWUgQ2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb24jdm9jYWJ1bGFyeV9uYW1lfVxuICAqL1xuICByZWFkb25seSB2b2NhYnVsYXJ5TmFtZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uRWxlbWVudHNBbWF6b25UcmFuc2NyaWJlUHJvY2Vzc29yQ29uZmlndXJhdGlvblRvVGVycmFmb3JtKHN0cnVjdD86IENoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uRWxlbWVudHNBbWF6b25UcmFuc2NyaWJlUHJvY2Vzc29yQ29uZmlndXJhdGlvbk91dHB1dFJlZmVyZW5jZSB8IENoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uRWxlbWVudHNBbWF6b25UcmFuc2NyaWJlUHJvY2Vzc29yQ29uZmlndXJhdGlvbik6IGFueSB7XG4gIGlmICghY2RrdGYuY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RmLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0Zi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBjb250ZW50X2lkZW50aWZpY2F0aW9uX3R5cGU6IGNka3RmLnN0cmluZ1RvVGVycmFmb3JtKHN0cnVjdCEuY29udGVudElkZW50aWZpY2F0aW9uVHlwZSksXG4gICAgY29udGVudF9yZWRhY3Rpb25fdHlwZTogY2RrdGYuc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS5jb250ZW50UmVkYWN0aW9uVHlwZSksXG4gICAgZW5hYmxlX3BhcnRpYWxfcmVzdWx0c19zdGFiaWxpemF0aW9uOiBjZGt0Zi5ib29sZWFuVG9UZXJyYWZvcm0oc3RydWN0IS5lbmFibGVQYXJ0aWFsUmVzdWx0c1N0YWJpbGl6YXRpb24pLFxuICAgIGZpbHRlcl9wYXJ0aWFsX3Jlc3VsdHM6IGNka3RmLmJvb2xlYW5Ub1RlcnJhZm9ybShzdHJ1Y3QhLmZpbHRlclBhcnRpYWxSZXN1bHRzKSxcbiAgICBsYW5ndWFnZV9jb2RlOiBjZGt0Zi5zdHJpbmdUb1RlcnJhZm9ybShzdHJ1Y3QhLmxhbmd1YWdlQ29kZSksXG4gICAgbGFuZ3VhZ2VfbW9kZWxfbmFtZTogY2RrdGYuc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS5sYW5ndWFnZU1vZGVsTmFtZSksXG4gICAgcGFydGlhbF9yZXN1bHRzX3N0YWJpbGl0eTogY2RrdGYuc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS5wYXJ0aWFsUmVzdWx0c1N0YWJpbGl0eSksXG4gICAgcGlpX2VudGl0eV90eXBlczogY2RrdGYuc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS5waWlFbnRpdHlUeXBlcyksXG4gICAgc2hvd19zcGVha2VyX2xhYmVsOiBjZGt0Zi5ib29sZWFuVG9UZXJyYWZvcm0oc3RydWN0IS5zaG93U3BlYWtlckxhYmVsKSxcbiAgICB2b2NhYnVsYXJ5X2ZpbHRlcl9tZXRob2Q6IGNka3RmLnN0cmluZ1RvVGVycmFmb3JtKHN0cnVjdCEudm9jYWJ1bGFyeUZpbHRlck1ldGhvZCksXG4gICAgdm9jYWJ1bGFyeV9maWx0ZXJfbmFtZTogY2RrdGYuc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS52b2NhYnVsYXJ5RmlsdGVyTmFtZSksXG4gICAgdm9jYWJ1bGFyeV9uYW1lOiBjZGt0Zi5zdHJpbmdUb1RlcnJhZm9ybShzdHJ1Y3QhLnZvY2FidWxhcnlOYW1lKSxcbiAgfVxufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBjaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvbkVsZW1lbnRzQW1hem9uVHJhbnNjcmliZVByb2Nlc3NvckNvbmZpZ3VyYXRpb25Ub0hjbFRlcnJhZm9ybShzdHJ1Y3Q/OiBDaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvbkVsZW1lbnRzQW1hem9uVHJhbnNjcmliZVByb2Nlc3NvckNvbmZpZ3VyYXRpb25PdXRwdXRSZWZlcmVuY2UgfCBDaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvbkVsZW1lbnRzQW1hem9uVHJhbnNjcmliZVByb2Nlc3NvckNvbmZpZ3VyYXRpb24pOiBhbnkge1xuICBpZiAoIWNka3RmLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0Zi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdGYuaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIGNvbnN0IGF0dHJzID0ge1xuICAgIGNvbnRlbnRfaWRlbnRpZmljYXRpb25fdHlwZToge1xuICAgICAgdmFsdWU6IGNka3RmLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEuY29udGVudElkZW50aWZpY2F0aW9uVHlwZSksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgIH0sXG4gICAgY29udGVudF9yZWRhY3Rpb25fdHlwZToge1xuICAgICAgdmFsdWU6IGNka3RmLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEuY29udGVudFJlZGFjdGlvblR5cGUpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICB9LFxuICAgIGVuYWJsZV9wYXJ0aWFsX3Jlc3VsdHNfc3RhYmlsaXphdGlvbjoge1xuICAgICAgdmFsdWU6IGNka3RmLmJvb2xlYW5Ub0hjbFRlcnJhZm9ybShzdHJ1Y3QhLmVuYWJsZVBhcnRpYWxSZXN1bHRzU3RhYmlsaXphdGlvbiksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcImJvb2xlYW5cIixcbiAgICB9LFxuICAgIGZpbHRlcl9wYXJ0aWFsX3Jlc3VsdHM6IHtcbiAgICAgIHZhbHVlOiBjZGt0Zi5ib29sZWFuVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5maWx0ZXJQYXJ0aWFsUmVzdWx0cyksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcImJvb2xlYW5cIixcbiAgICB9LFxuICAgIGxhbmd1YWdlX2NvZGU6IHtcbiAgICAgIHZhbHVlOiBjZGt0Zi5zdHJpbmdUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLmxhbmd1YWdlQ29kZSksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgIH0sXG4gICAgbGFuZ3VhZ2VfbW9kZWxfbmFtZToge1xuICAgICAgdmFsdWU6IGNka3RmLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEubGFuZ3VhZ2VNb2RlbE5hbWUpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICB9LFxuICAgIHBhcnRpYWxfcmVzdWx0c19zdGFiaWxpdHk6IHtcbiAgICAgIHZhbHVlOiBjZGt0Zi5zdHJpbmdUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLnBhcnRpYWxSZXN1bHRzU3RhYmlsaXR5KSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgICBwaWlfZW50aXR5X3R5cGVzOiB7XG4gICAgICB2YWx1ZTogY2RrdGYuc3RyaW5nVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5waWlFbnRpdHlUeXBlcyksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgIH0sXG4gICAgc2hvd19zcGVha2VyX2xhYmVsOiB7XG4gICAgICB2YWx1ZTogY2RrdGYuYm9vbGVhblRvSGNsVGVycmFmb3JtKHN0cnVjdCEuc2hvd1NwZWFrZXJMYWJlbCksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcImJvb2xlYW5cIixcbiAgICB9LFxuICAgIHZvY2FidWxhcnlfZmlsdGVyX21ldGhvZDoge1xuICAgICAgdmFsdWU6IGNka3RmLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEudm9jYWJ1bGFyeUZpbHRlck1ldGhvZCksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgIH0sXG4gICAgdm9jYWJ1bGFyeV9maWx0ZXJfbmFtZToge1xuICAgICAgdmFsdWU6IGNka3RmLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEudm9jYWJ1bGFyeUZpbHRlck5hbWUpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICB9LFxuICAgIHZvY2FidWxhcnlfbmFtZToge1xuICAgICAgdmFsdWU6IGNka3RmLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEudm9jYWJ1bGFyeU5hbWUpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICB9LFxuICB9O1xuXG4gIC8vIHJlbW92ZSB1bmRlZmluZWQgYXR0cmlidXRlc1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKGF0dHJzKS5maWx0ZXIoKFtfLCB2YWx1ZV0pID0+IHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUudmFsdWUgIT09IHVuZGVmaW5lZCkpO1xufVxuXG5leHBvcnQgY2xhc3MgQ2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb25FbGVtZW50c0FtYXpvblRyYW5zY3JpYmVQcm9jZXNzb3JDb25maWd1cmF0aW9uT3V0cHV0UmVmZXJlbmNlIGV4dGVuZHMgY2RrdGYuQ29tcGxleE9iamVjdCB7XG4gIHByaXZhdGUgaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuXG4gIC8qKlxuICAqIEBwYXJhbSB0ZXJyYWZvcm1SZXNvdXJjZSBUaGUgcGFyZW50IHJlc291cmNlXG4gICogQHBhcmFtIHRlcnJhZm9ybUF0dHJpYnV0ZSBUaGUgYXR0cmlidXRlIG9uIHRoZSBwYXJlbnQgcmVzb3VyY2UgdGhpcyBjbGFzcyBpcyByZWZlcmVuY2luZ1xuICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IodGVycmFmb3JtUmVzb3VyY2U6IGNka3RmLklJbnRlcnBvbGF0aW5nUGFyZW50LCB0ZXJyYWZvcm1BdHRyaWJ1dGU6IHN0cmluZykge1xuICAgIHN1cGVyKHRlcnJhZm9ybVJlc291cmNlLCB0ZXJyYWZvcm1BdHRyaWJ1dGUsIGZhbHNlLCAwKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW50ZXJuYWxWYWx1ZSgpOiBDaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvbkVsZW1lbnRzQW1hem9uVHJhbnNjcmliZVByb2Nlc3NvckNvbmZpZ3VyYXRpb24gfCB1bmRlZmluZWQge1xuICAgIGxldCBoYXNBbnlWYWx1ZXMgPSB0aGlzLmlzRW1wdHlPYmplY3Q7XG4gICAgY29uc3QgaW50ZXJuYWxWYWx1ZVJlc3VsdDogYW55ID0ge307XG4gICAgaWYgKHRoaXMuX2NvbnRlbnRJZGVudGlmaWNhdGlvblR5cGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuY29udGVudElkZW50aWZpY2F0aW9uVHlwZSA9IHRoaXMuX2NvbnRlbnRJZGVudGlmaWNhdGlvblR5cGU7XG4gICAgfVxuICAgIGlmICh0aGlzLl9jb250ZW50UmVkYWN0aW9uVHlwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5jb250ZW50UmVkYWN0aW9uVHlwZSA9IHRoaXMuX2NvbnRlbnRSZWRhY3Rpb25UeXBlO1xuICAgIH1cbiAgICBpZiAodGhpcy5fZW5hYmxlUGFydGlhbFJlc3VsdHNTdGFiaWxpemF0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmVuYWJsZVBhcnRpYWxSZXN1bHRzU3RhYmlsaXphdGlvbiA9IHRoaXMuX2VuYWJsZVBhcnRpYWxSZXN1bHRzU3RhYmlsaXphdGlvbjtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2ZpbHRlclBhcnRpYWxSZXN1bHRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmZpbHRlclBhcnRpYWxSZXN1bHRzID0gdGhpcy5fZmlsdGVyUGFydGlhbFJlc3VsdHM7XG4gICAgfVxuICAgIGlmICh0aGlzLl9sYW5ndWFnZUNvZGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQubGFuZ3VhZ2VDb2RlID0gdGhpcy5fbGFuZ3VhZ2VDb2RlO1xuICAgIH1cbiAgICBpZiAodGhpcy5fbGFuZ3VhZ2VNb2RlbE5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQubGFuZ3VhZ2VNb2RlbE5hbWUgPSB0aGlzLl9sYW5ndWFnZU1vZGVsTmFtZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3BhcnRpYWxSZXN1bHRzU3RhYmlsaXR5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LnBhcnRpYWxSZXN1bHRzU3RhYmlsaXR5ID0gdGhpcy5fcGFydGlhbFJlc3VsdHNTdGFiaWxpdHk7XG4gICAgfVxuICAgIGlmICh0aGlzLl9waWlFbnRpdHlUeXBlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5waWlFbnRpdHlUeXBlcyA9IHRoaXMuX3BpaUVudGl0eVR5cGVzO1xuICAgIH1cbiAgICBpZiAodGhpcy5fc2hvd1NwZWFrZXJMYWJlbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5zaG93U3BlYWtlckxhYmVsID0gdGhpcy5fc2hvd1NwZWFrZXJMYWJlbDtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3ZvY2FidWxhcnlGaWx0ZXJNZXRob2QgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQudm9jYWJ1bGFyeUZpbHRlck1ldGhvZCA9IHRoaXMuX3ZvY2FidWxhcnlGaWx0ZXJNZXRob2Q7XG4gICAgfVxuICAgIGlmICh0aGlzLl92b2NhYnVsYXJ5RmlsdGVyTmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC52b2NhYnVsYXJ5RmlsdGVyTmFtZSA9IHRoaXMuX3ZvY2FidWxhcnlGaWx0ZXJOYW1lO1xuICAgIH1cbiAgICBpZiAodGhpcy5fdm9jYWJ1bGFyeU5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQudm9jYWJ1bGFyeU5hbWUgPSB0aGlzLl92b2NhYnVsYXJ5TmFtZTtcbiAgICB9XG4gICAgcmV0dXJuIGhhc0FueVZhbHVlcyA/IGludGVybmFsVmFsdWVSZXN1bHQgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgc2V0IGludGVybmFsVmFsdWUodmFsdWU6IENoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uRWxlbWVudHNBbWF6b25UcmFuc2NyaWJlUHJvY2Vzc29yQ29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZCkge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBmYWxzZTtcbiAgICAgIHRoaXMuX2NvbnRlbnRJZGVudGlmaWNhdGlvblR5cGUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9jb250ZW50UmVkYWN0aW9uVHlwZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX2VuYWJsZVBhcnRpYWxSZXN1bHRzU3RhYmlsaXphdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX2ZpbHRlclBhcnRpYWxSZXN1bHRzID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fbGFuZ3VhZ2VDb2RlID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fbGFuZ3VhZ2VNb2RlbE5hbWUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9wYXJ0aWFsUmVzdWx0c1N0YWJpbGl0eSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3BpaUVudGl0eVR5cGVzID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fc2hvd1NwZWFrZXJMYWJlbCA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3ZvY2FidWxhcnlGaWx0ZXJNZXRob2QgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl92b2NhYnVsYXJ5RmlsdGVyTmFtZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3ZvY2FidWxhcnlOYW1lID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGggPT09IDA7XG4gICAgICB0aGlzLl9jb250ZW50SWRlbnRpZmljYXRpb25UeXBlID0gdmFsdWUuY29udGVudElkZW50aWZpY2F0aW9uVHlwZTtcbiAgICAgIHRoaXMuX2NvbnRlbnRSZWRhY3Rpb25UeXBlID0gdmFsdWUuY29udGVudFJlZGFjdGlvblR5cGU7XG4gICAgICB0aGlzLl9lbmFibGVQYXJ0aWFsUmVzdWx0c1N0YWJpbGl6YXRpb24gPSB2YWx1ZS5lbmFibGVQYXJ0aWFsUmVzdWx0c1N0YWJpbGl6YXRpb247XG4gICAgICB0aGlzLl9maWx0ZXJQYXJ0aWFsUmVzdWx0cyA9IHZhbHVlLmZpbHRlclBhcnRpYWxSZXN1bHRzO1xuICAgICAgdGhpcy5fbGFuZ3VhZ2VDb2RlID0gdmFsdWUubGFuZ3VhZ2VDb2RlO1xuICAgICAgdGhpcy5fbGFuZ3VhZ2VNb2RlbE5hbWUgPSB2YWx1ZS5sYW5ndWFnZU1vZGVsTmFtZTtcbiAgICAgIHRoaXMuX3BhcnRpYWxSZXN1bHRzU3RhYmlsaXR5ID0gdmFsdWUucGFydGlhbFJlc3VsdHNTdGFiaWxpdHk7XG4gICAgICB0aGlzLl9waWlFbnRpdHlUeXBlcyA9IHZhbHVlLnBpaUVudGl0eVR5cGVzO1xuICAgICAgdGhpcy5fc2hvd1NwZWFrZXJMYWJlbCA9IHZhbHVlLnNob3dTcGVha2VyTGFiZWw7XG4gICAgICB0aGlzLl92b2NhYnVsYXJ5RmlsdGVyTWV0aG9kID0gdmFsdWUudm9jYWJ1bGFyeUZpbHRlck1ldGhvZDtcbiAgICAgIHRoaXMuX3ZvY2FidWxhcnlGaWx0ZXJOYW1lID0gdmFsdWUudm9jYWJ1bGFyeUZpbHRlck5hbWU7XG4gICAgICB0aGlzLl92b2NhYnVsYXJ5TmFtZSA9IHZhbHVlLnZvY2FidWxhcnlOYW1lO1xuICAgIH1cbiAgfVxuXG4gIC8vIGNvbnRlbnRfaWRlbnRpZmljYXRpb25fdHlwZSAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9jb250ZW50SWRlbnRpZmljYXRpb25UeXBlPzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBjb250ZW50SWRlbnRpZmljYXRpb25UeXBlKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnY29udGVudF9pZGVudGlmaWNhdGlvbl90eXBlJyk7XG4gIH1cbiAgcHVibGljIHNldCBjb250ZW50SWRlbnRpZmljYXRpb25UeXBlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9jb250ZW50SWRlbnRpZmljYXRpb25UeXBlID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0Q29udGVudElkZW50aWZpY2F0aW9uVHlwZSgpIHtcbiAgICB0aGlzLl9jb250ZW50SWRlbnRpZmljYXRpb25UeXBlID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBjb250ZW50SWRlbnRpZmljYXRpb25UeXBlSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbnRlbnRJZGVudGlmaWNhdGlvblR5cGU7XG4gIH1cblxuICAvLyBjb250ZW50X3JlZGFjdGlvbl90eXBlIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2NvbnRlbnRSZWRhY3Rpb25UeXBlPzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBjb250ZW50UmVkYWN0aW9uVHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ2NvbnRlbnRfcmVkYWN0aW9uX3R5cGUnKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNvbnRlbnRSZWRhY3Rpb25UeXBlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9jb250ZW50UmVkYWN0aW9uVHlwZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldENvbnRlbnRSZWRhY3Rpb25UeXBlKCkge1xuICAgIHRoaXMuX2NvbnRlbnRSZWRhY3Rpb25UeXBlID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBjb250ZW50UmVkYWN0aW9uVHlwZUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9jb250ZW50UmVkYWN0aW9uVHlwZTtcbiAgfVxuXG4gIC8vIGVuYWJsZV9wYXJ0aWFsX3Jlc3VsdHNfc3RhYmlsaXphdGlvbiAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9lbmFibGVQYXJ0aWFsUmVzdWx0c1N0YWJpbGl6YXRpb24/OiBib29sZWFuIHwgY2RrdGYuSVJlc29sdmFibGU7IFxuICBwdWJsaWMgZ2V0IGVuYWJsZVBhcnRpYWxSZXN1bHRzU3RhYmlsaXphdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRCb29sZWFuQXR0cmlidXRlKCdlbmFibGVfcGFydGlhbF9yZXN1bHRzX3N0YWJpbGl6YXRpb24nKTtcbiAgfVxuICBwdWJsaWMgc2V0IGVuYWJsZVBhcnRpYWxSZXN1bHRzU3RhYmlsaXphdGlvbih2YWx1ZTogYm9vbGVhbiB8IGNka3RmLklSZXNvbHZhYmxlKSB7XG4gICAgdGhpcy5fZW5hYmxlUGFydGlhbFJlc3VsdHNTdGFiaWxpemF0aW9uID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0RW5hYmxlUGFydGlhbFJlc3VsdHNTdGFiaWxpemF0aW9uKCkge1xuICAgIHRoaXMuX2VuYWJsZVBhcnRpYWxSZXN1bHRzU3RhYmlsaXphdGlvbiA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgZW5hYmxlUGFydGlhbFJlc3VsdHNTdGFiaWxpemF0aW9uSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2VuYWJsZVBhcnRpYWxSZXN1bHRzU3RhYmlsaXphdGlvbjtcbiAgfVxuXG4gIC8vIGZpbHRlcl9wYXJ0aWFsX3Jlc3VsdHMgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfZmlsdGVyUGFydGlhbFJlc3VsdHM/OiBib29sZWFuIHwgY2RrdGYuSVJlc29sdmFibGU7IFxuICBwdWJsaWMgZ2V0IGZpbHRlclBhcnRpYWxSZXN1bHRzKCkge1xuICAgIHJldHVybiB0aGlzLmdldEJvb2xlYW5BdHRyaWJ1dGUoJ2ZpbHRlcl9wYXJ0aWFsX3Jlc3VsdHMnKTtcbiAgfVxuICBwdWJsaWMgc2V0IGZpbHRlclBhcnRpYWxSZXN1bHRzKHZhbHVlOiBib29sZWFuIHwgY2RrdGYuSVJlc29sdmFibGUpIHtcbiAgICB0aGlzLl9maWx0ZXJQYXJ0aWFsUmVzdWx0cyA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldEZpbHRlclBhcnRpYWxSZXN1bHRzKCkge1xuICAgIHRoaXMuX2ZpbHRlclBhcnRpYWxSZXN1bHRzID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBmaWx0ZXJQYXJ0aWFsUmVzdWx0c0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9maWx0ZXJQYXJ0aWFsUmVzdWx0cztcbiAgfVxuXG4gIC8vIGxhbmd1YWdlX2NvZGUgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfbGFuZ3VhZ2VDb2RlPzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBsYW5ndWFnZUNvZGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdsYW5ndWFnZV9jb2RlJyk7XG4gIH1cbiAgcHVibGljIHNldCBsYW5ndWFnZUNvZGUodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2xhbmd1YWdlQ29kZSA9IHZhbHVlO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBsYW5ndWFnZUNvZGVJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fbGFuZ3VhZ2VDb2RlO1xuICB9XG5cbiAgLy8gbGFuZ3VhZ2VfbW9kZWxfbmFtZSAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9sYW5ndWFnZU1vZGVsTmFtZT86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgbGFuZ3VhZ2VNb2RlbE5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdsYW5ndWFnZV9tb2RlbF9uYW1lJyk7XG4gIH1cbiAgcHVibGljIHNldCBsYW5ndWFnZU1vZGVsTmFtZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fbGFuZ3VhZ2VNb2RlbE5hbWUgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRMYW5ndWFnZU1vZGVsTmFtZSgpIHtcbiAgICB0aGlzLl9sYW5ndWFnZU1vZGVsTmFtZSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgbGFuZ3VhZ2VNb2RlbE5hbWVJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fbGFuZ3VhZ2VNb2RlbE5hbWU7XG4gIH1cblxuICAvLyBwYXJ0aWFsX3Jlc3VsdHNfc3RhYmlsaXR5IC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX3BhcnRpYWxSZXN1bHRzU3RhYmlsaXR5Pzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBwYXJ0aWFsUmVzdWx0c1N0YWJpbGl0eSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ3BhcnRpYWxfcmVzdWx0c19zdGFiaWxpdHknKTtcbiAgfVxuICBwdWJsaWMgc2V0IHBhcnRpYWxSZXN1bHRzU3RhYmlsaXR5KHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9wYXJ0aWFsUmVzdWx0c1N0YWJpbGl0eSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldFBhcnRpYWxSZXN1bHRzU3RhYmlsaXR5KCkge1xuICAgIHRoaXMuX3BhcnRpYWxSZXN1bHRzU3RhYmlsaXR5ID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBwYXJ0aWFsUmVzdWx0c1N0YWJpbGl0eUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9wYXJ0aWFsUmVzdWx0c1N0YWJpbGl0eTtcbiAgfVxuXG4gIC8vIHBpaV9lbnRpdHlfdHlwZXMgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfcGlpRW50aXR5VHlwZXM/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IHBpaUVudGl0eVR5cGVzKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgncGlpX2VudGl0eV90eXBlcycpO1xuICB9XG4gIHB1YmxpYyBzZXQgcGlpRW50aXR5VHlwZXModmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX3BpaUVudGl0eVR5cGVzID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0UGlpRW50aXR5VHlwZXMoKSB7XG4gICAgdGhpcy5fcGlpRW50aXR5VHlwZXMgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHBpaUVudGl0eVR5cGVzSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3BpaUVudGl0eVR5cGVzO1xuICB9XG5cbiAgLy8gc2hvd19zcGVha2VyX2xhYmVsIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX3Nob3dTcGVha2VyTGFiZWw/OiBib29sZWFuIHwgY2RrdGYuSVJlc29sdmFibGU7IFxuICBwdWJsaWMgZ2V0IHNob3dTcGVha2VyTGFiZWwoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Qm9vbGVhbkF0dHJpYnV0ZSgnc2hvd19zcGVha2VyX2xhYmVsJyk7XG4gIH1cbiAgcHVibGljIHNldCBzaG93U3BlYWtlckxhYmVsKHZhbHVlOiBib29sZWFuIHwgY2RrdGYuSVJlc29sdmFibGUpIHtcbiAgICB0aGlzLl9zaG93U3BlYWtlckxhYmVsID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0U2hvd1NwZWFrZXJMYWJlbCgpIHtcbiAgICB0aGlzLl9zaG93U3BlYWtlckxhYmVsID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBzaG93U3BlYWtlckxhYmVsSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Nob3dTcGVha2VyTGFiZWw7XG4gIH1cblxuICAvLyB2b2NhYnVsYXJ5X2ZpbHRlcl9tZXRob2QgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfdm9jYWJ1bGFyeUZpbHRlck1ldGhvZD86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgdm9jYWJ1bGFyeUZpbHRlck1ldGhvZCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ3ZvY2FidWxhcnlfZmlsdGVyX21ldGhvZCcpO1xuICB9XG4gIHB1YmxpYyBzZXQgdm9jYWJ1bGFyeUZpbHRlck1ldGhvZCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fdm9jYWJ1bGFyeUZpbHRlck1ldGhvZCA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldFZvY2FidWxhcnlGaWx0ZXJNZXRob2QoKSB7XG4gICAgdGhpcy5fdm9jYWJ1bGFyeUZpbHRlck1ldGhvZCA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgdm9jYWJ1bGFyeUZpbHRlck1ldGhvZElucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl92b2NhYnVsYXJ5RmlsdGVyTWV0aG9kO1xuICB9XG5cbiAgLy8gdm9jYWJ1bGFyeV9maWx0ZXJfbmFtZSAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF92b2NhYnVsYXJ5RmlsdGVyTmFtZT86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgdm9jYWJ1bGFyeUZpbHRlck5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCd2b2NhYnVsYXJ5X2ZpbHRlcl9uYW1lJyk7XG4gIH1cbiAgcHVibGljIHNldCB2b2NhYnVsYXJ5RmlsdGVyTmFtZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fdm9jYWJ1bGFyeUZpbHRlck5hbWUgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRWb2NhYnVsYXJ5RmlsdGVyTmFtZSgpIHtcbiAgICB0aGlzLl92b2NhYnVsYXJ5RmlsdGVyTmFtZSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgdm9jYWJ1bGFyeUZpbHRlck5hbWVJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdm9jYWJ1bGFyeUZpbHRlck5hbWU7XG4gIH1cblxuICAvLyB2b2NhYnVsYXJ5X25hbWUgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfdm9jYWJ1bGFyeU5hbWU/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IHZvY2FidWxhcnlOYW1lKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgndm9jYWJ1bGFyeV9uYW1lJyk7XG4gIH1cbiAgcHVibGljIHNldCB2b2NhYnVsYXJ5TmFtZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fdm9jYWJ1bGFyeU5hbWUgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRWb2NhYnVsYXJ5TmFtZSgpIHtcbiAgICB0aGlzLl92b2NhYnVsYXJ5TmFtZSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgdm9jYWJ1bGFyeU5hbWVJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdm9jYWJ1bGFyeU5hbWU7XG4gIH1cbn1cbmV4cG9ydCBpbnRlcmZhY2UgQ2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb25FbGVtZW50c0tpbmVzaXNEYXRhU3RyZWFtU2lua0NvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXdzLzUuODQuMC9kb2NzL3Jlc291cmNlcy9jaGltZXNka21lZGlhcGlwZWxpbmVzX21lZGlhX2luc2lnaHRzX3BpcGVsaW5lX2NvbmZpZ3VyYXRpb24jaW5zaWdodHNfdGFyZ2V0IENoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uI2luc2lnaHRzX3RhcmdldH1cbiAgKi9cbiAgcmVhZG9ubHkgaW5zaWdodHNUYXJnZXQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uRWxlbWVudHNLaW5lc2lzRGF0YVN0cmVhbVNpbmtDb25maWd1cmF0aW9uVG9UZXJyYWZvcm0oc3RydWN0PzogQ2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb25FbGVtZW50c0tpbmVzaXNEYXRhU3RyZWFtU2lua0NvbmZpZ3VyYXRpb25PdXRwdXRSZWZlcmVuY2UgfCBDaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvbkVsZW1lbnRzS2luZXNpc0RhdGFTdHJlYW1TaW5rQ29uZmlndXJhdGlvbik6IGFueSB7XG4gIGlmICghY2RrdGYuY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RmLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0Zi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBpbnNpZ2h0c190YXJnZXQ6IGNka3RmLnN0cmluZ1RvVGVycmFmb3JtKHN0cnVjdCEuaW5zaWdodHNUYXJnZXQpLFxuICB9XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGNoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uRWxlbWVudHNLaW5lc2lzRGF0YVN0cmVhbVNpbmtDb25maWd1cmF0aW9uVG9IY2xUZXJyYWZvcm0oc3RydWN0PzogQ2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb25FbGVtZW50c0tpbmVzaXNEYXRhU3RyZWFtU2lua0NvbmZpZ3VyYXRpb25PdXRwdXRSZWZlcmVuY2UgfCBDaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvbkVsZW1lbnRzS2luZXNpc0RhdGFTdHJlYW1TaW5rQ29uZmlndXJhdGlvbik6IGFueSB7XG4gIGlmICghY2RrdGYuY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RmLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0Zi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgY29uc3QgYXR0cnMgPSB7XG4gICAgaW5zaWdodHNfdGFyZ2V0OiB7XG4gICAgICB2YWx1ZTogY2RrdGYuc3RyaW5nVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5pbnNpZ2h0c1RhcmdldCksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgIH0sXG4gIH07XG5cbiAgLy8gcmVtb3ZlIHVuZGVmaW5lZCBhdHRyaWJ1dGVzXG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoYXR0cnMpLmZpbHRlcigoW18sIHZhbHVlXSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZS52YWx1ZSAhPT0gdW5kZWZpbmVkKSk7XG59XG5cbmV4cG9ydCBjbGFzcyBDaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvbkVsZW1lbnRzS2luZXNpc0RhdGFTdHJlYW1TaW5rQ29uZmlndXJhdGlvbk91dHB1dFJlZmVyZW5jZSBleHRlbmRzIGNka3RmLkNvbXBsZXhPYmplY3Qge1xuICBwcml2YXRlIGlzRW1wdHlPYmplY3QgPSBmYWxzZTtcblxuICAvKipcbiAgKiBAcGFyYW0gdGVycmFmb3JtUmVzb3VyY2UgVGhlIHBhcmVudCByZXNvdXJjZVxuICAqIEBwYXJhbSB0ZXJyYWZvcm1BdHRyaWJ1dGUgVGhlIGF0dHJpYnV0ZSBvbiB0aGUgcGFyZW50IHJlc291cmNlIHRoaXMgY2xhc3MgaXMgcmVmZXJlbmNpbmdcbiAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHRlcnJhZm9ybVJlc291cmNlOiBjZGt0Zi5JSW50ZXJwb2xhdGluZ1BhcmVudCwgdGVycmFmb3JtQXR0cmlidXRlOiBzdHJpbmcpIHtcbiAgICBzdXBlcih0ZXJyYWZvcm1SZXNvdXJjZSwgdGVycmFmb3JtQXR0cmlidXRlLCBmYWxzZSwgMCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGludGVybmFsVmFsdWUoKTogQ2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb25FbGVtZW50c0tpbmVzaXNEYXRhU3RyZWFtU2lua0NvbmZpZ3VyYXRpb24gfCB1bmRlZmluZWQge1xuICAgIGxldCBoYXNBbnlWYWx1ZXMgPSB0aGlzLmlzRW1wdHlPYmplY3Q7XG4gICAgY29uc3QgaW50ZXJuYWxWYWx1ZVJlc3VsdDogYW55ID0ge307XG4gICAgaWYgKHRoaXMuX2luc2lnaHRzVGFyZ2V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0Lmluc2lnaHRzVGFyZ2V0ID0gdGhpcy5faW5zaWdodHNUYXJnZXQ7XG4gICAgfVxuICAgIHJldHVybiBoYXNBbnlWYWx1ZXMgPyBpbnRlcm5hbFZhbHVlUmVzdWx0IDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHNldCBpbnRlcm5hbFZhbHVlKHZhbHVlOiBDaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvbkVsZW1lbnRzS2luZXNpc0RhdGFTdHJlYW1TaW5rQ29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZCkge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBmYWxzZTtcbiAgICAgIHRoaXMuX2luc2lnaHRzVGFyZ2V0ID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGggPT09IDA7XG4gICAgICB0aGlzLl9pbnNpZ2h0c1RhcmdldCA9IHZhbHVlLmluc2lnaHRzVGFyZ2V0O1xuICAgIH1cbiAgfVxuXG4gIC8vIGluc2lnaHRzX3RhcmdldCAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogdHJ1ZVxuICBwcml2YXRlIF9pbnNpZ2h0c1RhcmdldD86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgaW5zaWdodHNUYXJnZXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdpbnNpZ2h0c190YXJnZXQnKTtcbiAgfVxuICBwdWJsaWMgc2V0IGluc2lnaHRzVGFyZ2V0KHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9pbnNpZ2h0c1RhcmdldCA9IHZhbHVlO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBpbnNpZ2h0c1RhcmdldElucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9pbnNpZ2h0c1RhcmdldDtcbiAgfVxufVxuZXhwb3J0IGludGVyZmFjZSBDaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvbkVsZW1lbnRzTGFtYmRhRnVuY3Rpb25TaW5rQ29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9hd3MvNS44NC4wL2RvY3MvcmVzb3VyY2VzL2NoaW1lc2RrbWVkaWFwaXBlbGluZXNfbWVkaWFfaW5zaWdodHNfcGlwZWxpbmVfY29uZmlndXJhdGlvbiNpbnNpZ2h0c190YXJnZXQgQ2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb24jaW5zaWdodHNfdGFyZ2V0fVxuICAqL1xuICByZWFkb25seSBpbnNpZ2h0c1RhcmdldDogc3RyaW5nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb25FbGVtZW50c0xhbWJkYUZ1bmN0aW9uU2lua0NvbmZpZ3VyYXRpb25Ub1RlcnJhZm9ybShzdHJ1Y3Q/OiBDaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvbkVsZW1lbnRzTGFtYmRhRnVuY3Rpb25TaW5rQ29uZmlndXJhdGlvbk91dHB1dFJlZmVyZW5jZSB8IENoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uRWxlbWVudHNMYW1iZGFGdW5jdGlvblNpbmtDb25maWd1cmF0aW9uKTogYW55IHtcbiAgaWYgKCFjZGt0Zi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdGYuVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RmLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGluc2lnaHRzX3RhcmdldDogY2RrdGYuc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS5pbnNpZ2h0c1RhcmdldCksXG4gIH1cbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gY2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb25FbGVtZW50c0xhbWJkYUZ1bmN0aW9uU2lua0NvbmZpZ3VyYXRpb25Ub0hjbFRlcnJhZm9ybShzdHJ1Y3Q/OiBDaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvbkVsZW1lbnRzTGFtYmRhRnVuY3Rpb25TaW5rQ29uZmlndXJhdGlvbk91dHB1dFJlZmVyZW5jZSB8IENoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uRWxlbWVudHNMYW1iZGFGdW5jdGlvblNpbmtDb25maWd1cmF0aW9uKTogYW55IHtcbiAgaWYgKCFjZGt0Zi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdGYuVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RmLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICBjb25zdCBhdHRycyA9IHtcbiAgICBpbnNpZ2h0c190YXJnZXQ6IHtcbiAgICAgIHZhbHVlOiBjZGt0Zi5zdHJpbmdUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLmluc2lnaHRzVGFyZ2V0KSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgfTtcblxuICAvLyByZW1vdmUgdW5kZWZpbmVkIGF0dHJpYnV0ZXNcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhdHRycykuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWQpKTtcbn1cblxuZXhwb3J0IGNsYXNzIENoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uRWxlbWVudHNMYW1iZGFGdW5jdGlvblNpbmtDb25maWd1cmF0aW9uT3V0cHV0UmVmZXJlbmNlIGV4dGVuZHMgY2RrdGYuQ29tcGxleE9iamVjdCB7XG4gIHByaXZhdGUgaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuXG4gIC8qKlxuICAqIEBwYXJhbSB0ZXJyYWZvcm1SZXNvdXJjZSBUaGUgcGFyZW50IHJlc291cmNlXG4gICogQHBhcmFtIHRlcnJhZm9ybUF0dHJpYnV0ZSBUaGUgYXR0cmlidXRlIG9uIHRoZSBwYXJlbnQgcmVzb3VyY2UgdGhpcyBjbGFzcyBpcyByZWZlcmVuY2luZ1xuICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IodGVycmFmb3JtUmVzb3VyY2U6IGNka3RmLklJbnRlcnBvbGF0aW5nUGFyZW50LCB0ZXJyYWZvcm1BdHRyaWJ1dGU6IHN0cmluZykge1xuICAgIHN1cGVyKHRlcnJhZm9ybVJlc291cmNlLCB0ZXJyYWZvcm1BdHRyaWJ1dGUsIGZhbHNlLCAwKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW50ZXJuYWxWYWx1ZSgpOiBDaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvbkVsZW1lbnRzTGFtYmRhRnVuY3Rpb25TaW5rQ29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGhhc0FueVZhbHVlcyA9IHRoaXMuaXNFbXB0eU9iamVjdDtcbiAgICBjb25zdCBpbnRlcm5hbFZhbHVlUmVzdWx0OiBhbnkgPSB7fTtcbiAgICBpZiAodGhpcy5faW5zaWdodHNUYXJnZXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuaW5zaWdodHNUYXJnZXQgPSB0aGlzLl9pbnNpZ2h0c1RhcmdldDtcbiAgICB9XG4gICAgcmV0dXJuIGhhc0FueVZhbHVlcyA/IGludGVybmFsVmFsdWVSZXN1bHQgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgc2V0IGludGVybmFsVmFsdWUodmFsdWU6IENoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uRWxlbWVudHNMYW1iZGFGdW5jdGlvblNpbmtDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuICAgICAgdGhpcy5faW5zaWdodHNUYXJnZXQgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA9PT0gMDtcbiAgICAgIHRoaXMuX2luc2lnaHRzVGFyZ2V0ID0gdmFsdWUuaW5zaWdodHNUYXJnZXQ7XG4gICAgfVxuICB9XG5cbiAgLy8gaW5zaWdodHNfdGFyZ2V0IC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiB0cnVlXG4gIHByaXZhdGUgX2luc2lnaHRzVGFyZ2V0Pzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBpbnNpZ2h0c1RhcmdldCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ2luc2lnaHRzX3RhcmdldCcpO1xuICB9XG4gIHB1YmxpYyBzZXQgaW5zaWdodHNUYXJnZXQodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2luc2lnaHRzVGFyZ2V0ID0gdmFsdWU7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGluc2lnaHRzVGFyZ2V0SW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2luc2lnaHRzVGFyZ2V0O1xuICB9XG59XG5leHBvcnQgaW50ZXJmYWNlIENoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uRWxlbWVudHNTM1JlY29yZGluZ1NpbmtDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F3cy81Ljg0LjAvZG9jcy9yZXNvdXJjZXMvY2hpbWVzZGttZWRpYXBpcGVsaW5lc19tZWRpYV9pbnNpZ2h0c19waXBlbGluZV9jb25maWd1cmF0aW9uI2Rlc3RpbmF0aW9uIENoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uI2Rlc3RpbmF0aW9ufVxuICAqL1xuICByZWFkb25seSBkZXN0aW5hdGlvbj86IHN0cmluZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uRWxlbWVudHNTM1JlY29yZGluZ1NpbmtDb25maWd1cmF0aW9uVG9UZXJyYWZvcm0oc3RydWN0PzogQ2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb25FbGVtZW50c1MzUmVjb3JkaW5nU2lua0NvbmZpZ3VyYXRpb25PdXRwdXRSZWZlcmVuY2UgfCBDaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvbkVsZW1lbnRzUzNSZWNvcmRpbmdTaW5rQ29uZmlndXJhdGlvbik6IGFueSB7XG4gIGlmICghY2RrdGYuY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RmLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0Zi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBkZXN0aW5hdGlvbjogY2RrdGYuc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS5kZXN0aW5hdGlvbiksXG4gIH1cbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gY2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb25FbGVtZW50c1MzUmVjb3JkaW5nU2lua0NvbmZpZ3VyYXRpb25Ub0hjbFRlcnJhZm9ybShzdHJ1Y3Q/OiBDaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvbkVsZW1lbnRzUzNSZWNvcmRpbmdTaW5rQ29uZmlndXJhdGlvbk91dHB1dFJlZmVyZW5jZSB8IENoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uRWxlbWVudHNTM1JlY29yZGluZ1NpbmtDb25maWd1cmF0aW9uKTogYW55IHtcbiAgaWYgKCFjZGt0Zi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdGYuVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RmLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICBjb25zdCBhdHRycyA9IHtcbiAgICBkZXN0aW5hdGlvbjoge1xuICAgICAgdmFsdWU6IGNka3RmLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEuZGVzdGluYXRpb24pLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICB9LFxuICB9O1xuXG4gIC8vIHJlbW92ZSB1bmRlZmluZWQgYXR0cmlidXRlc1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKGF0dHJzKS5maWx0ZXIoKFtfLCB2YWx1ZV0pID0+IHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUudmFsdWUgIT09IHVuZGVmaW5lZCkpO1xufVxuXG5leHBvcnQgY2xhc3MgQ2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb25FbGVtZW50c1MzUmVjb3JkaW5nU2lua0NvbmZpZ3VyYXRpb25PdXRwdXRSZWZlcmVuY2UgZXh0ZW5kcyBjZGt0Zi5Db21wbGV4T2JqZWN0IHtcbiAgcHJpdmF0ZSBpc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG5cbiAgLyoqXG4gICogQHBhcmFtIHRlcnJhZm9ybVJlc291cmNlIFRoZSBwYXJlbnQgcmVzb3VyY2VcbiAgKiBAcGFyYW0gdGVycmFmb3JtQXR0cmlidXRlIFRoZSBhdHRyaWJ1dGUgb24gdGhlIHBhcmVudCByZXNvdXJjZSB0aGlzIGNsYXNzIGlzIHJlZmVyZW5jaW5nXG4gICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih0ZXJyYWZvcm1SZXNvdXJjZTogY2RrdGYuSUludGVycG9sYXRpbmdQYXJlbnQsIHRlcnJhZm9ybUF0dHJpYnV0ZTogc3RyaW5nKSB7XG4gICAgc3VwZXIodGVycmFmb3JtUmVzb3VyY2UsIHRlcnJhZm9ybUF0dHJpYnV0ZSwgZmFsc2UsIDApO1xuICB9XG5cbiAgcHVibGljIGdldCBpbnRlcm5hbFZhbHVlKCk6IENoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uRWxlbWVudHNTM1JlY29yZGluZ1NpbmtDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgaGFzQW55VmFsdWVzID0gdGhpcy5pc0VtcHR5T2JqZWN0O1xuICAgIGNvbnN0IGludGVybmFsVmFsdWVSZXN1bHQ6IGFueSA9IHt9O1xuICAgIGlmICh0aGlzLl9kZXN0aW5hdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5kZXN0aW5hdGlvbiA9IHRoaXMuX2Rlc3RpbmF0aW9uO1xuICAgIH1cbiAgICByZXR1cm4gaGFzQW55VmFsdWVzID8gaW50ZXJuYWxWYWx1ZVJlc3VsdCA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgaW50ZXJuYWxWYWx1ZSh2YWx1ZTogQ2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb25FbGVtZW50c1MzUmVjb3JkaW5nU2lua0NvbmZpZ3VyYXRpb24gfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLl9kZXN0aW5hdGlvbiA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSAwO1xuICAgICAgdGhpcy5fZGVzdGluYXRpb24gPSB2YWx1ZS5kZXN0aW5hdGlvbjtcbiAgICB9XG4gIH1cblxuICAvLyBkZXN0aW5hdGlvbiAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9kZXN0aW5hdGlvbj86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgZGVzdGluYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdkZXN0aW5hdGlvbicpO1xuICB9XG4gIHB1YmxpYyBzZXQgZGVzdGluYXRpb24odmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2Rlc3RpbmF0aW9uID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0RGVzdGluYXRpb24oKSB7XG4gICAgdGhpcy5fZGVzdGluYXRpb24gPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGRlc3RpbmF0aW9uSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Rlc3RpbmF0aW9uO1xuICB9XG59XG5leHBvcnQgaW50ZXJmYWNlIENoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uRWxlbWVudHNTbnNUb3BpY1NpbmtDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F3cy81Ljg0LjAvZG9jcy9yZXNvdXJjZXMvY2hpbWVzZGttZWRpYXBpcGVsaW5lc19tZWRpYV9pbnNpZ2h0c19waXBlbGluZV9jb25maWd1cmF0aW9uI2luc2lnaHRzX3RhcmdldCBDaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvbiNpbnNpZ2h0c190YXJnZXR9XG4gICovXG4gIHJlYWRvbmx5IGluc2lnaHRzVGFyZ2V0OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvbkVsZW1lbnRzU25zVG9waWNTaW5rQ29uZmlndXJhdGlvblRvVGVycmFmb3JtKHN0cnVjdD86IENoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uRWxlbWVudHNTbnNUb3BpY1NpbmtDb25maWd1cmF0aW9uT3V0cHV0UmVmZXJlbmNlIHwgQ2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb25FbGVtZW50c1Nuc1RvcGljU2lua0NvbmZpZ3VyYXRpb24pOiBhbnkge1xuICBpZiAoIWNka3RmLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0Zi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdGYuaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIHJldHVybiB7XG4gICAgaW5zaWdodHNfdGFyZ2V0OiBjZGt0Zi5zdHJpbmdUb1RlcnJhZm9ybShzdHJ1Y3QhLmluc2lnaHRzVGFyZ2V0KSxcbiAgfVxufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBjaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvbkVsZW1lbnRzU25zVG9waWNTaW5rQ29uZmlndXJhdGlvblRvSGNsVGVycmFmb3JtKHN0cnVjdD86IENoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uRWxlbWVudHNTbnNUb3BpY1NpbmtDb25maWd1cmF0aW9uT3V0cHV0UmVmZXJlbmNlIHwgQ2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb25FbGVtZW50c1Nuc1RvcGljU2lua0NvbmZpZ3VyYXRpb24pOiBhbnkge1xuICBpZiAoIWNka3RmLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0Zi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdGYuaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIGNvbnN0IGF0dHJzID0ge1xuICAgIGluc2lnaHRzX3RhcmdldDoge1xuICAgICAgdmFsdWU6IGNka3RmLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEuaW5zaWdodHNUYXJnZXQpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICB9LFxuICB9O1xuXG4gIC8vIHJlbW92ZSB1bmRlZmluZWQgYXR0cmlidXRlc1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKGF0dHJzKS5maWx0ZXIoKFtfLCB2YWx1ZV0pID0+IHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUudmFsdWUgIT09IHVuZGVmaW5lZCkpO1xufVxuXG5leHBvcnQgY2xhc3MgQ2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb25FbGVtZW50c1Nuc1RvcGljU2lua0NvbmZpZ3VyYXRpb25PdXRwdXRSZWZlcmVuY2UgZXh0ZW5kcyBjZGt0Zi5Db21wbGV4T2JqZWN0IHtcbiAgcHJpdmF0ZSBpc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG5cbiAgLyoqXG4gICogQHBhcmFtIHRlcnJhZm9ybVJlc291cmNlIFRoZSBwYXJlbnQgcmVzb3VyY2VcbiAgKiBAcGFyYW0gdGVycmFmb3JtQXR0cmlidXRlIFRoZSBhdHRyaWJ1dGUgb24gdGhlIHBhcmVudCByZXNvdXJjZSB0aGlzIGNsYXNzIGlzIHJlZmVyZW5jaW5nXG4gICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih0ZXJyYWZvcm1SZXNvdXJjZTogY2RrdGYuSUludGVycG9sYXRpbmdQYXJlbnQsIHRlcnJhZm9ybUF0dHJpYnV0ZTogc3RyaW5nKSB7XG4gICAgc3VwZXIodGVycmFmb3JtUmVzb3VyY2UsIHRlcnJhZm9ybUF0dHJpYnV0ZSwgZmFsc2UsIDApO1xuICB9XG5cbiAgcHVibGljIGdldCBpbnRlcm5hbFZhbHVlKCk6IENoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uRWxlbWVudHNTbnNUb3BpY1NpbmtDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgaGFzQW55VmFsdWVzID0gdGhpcy5pc0VtcHR5T2JqZWN0O1xuICAgIGNvbnN0IGludGVybmFsVmFsdWVSZXN1bHQ6IGFueSA9IHt9O1xuICAgIGlmICh0aGlzLl9pbnNpZ2h0c1RhcmdldCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5pbnNpZ2h0c1RhcmdldCA9IHRoaXMuX2luc2lnaHRzVGFyZ2V0O1xuICAgIH1cbiAgICByZXR1cm4gaGFzQW55VmFsdWVzID8gaW50ZXJuYWxWYWx1ZVJlc3VsdCA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgaW50ZXJuYWxWYWx1ZSh2YWx1ZTogQ2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb25FbGVtZW50c1Nuc1RvcGljU2lua0NvbmZpZ3VyYXRpb24gfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLl9pbnNpZ2h0c1RhcmdldCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSAwO1xuICAgICAgdGhpcy5faW5zaWdodHNUYXJnZXQgPSB2YWx1ZS5pbnNpZ2h0c1RhcmdldDtcbiAgICB9XG4gIH1cblxuICAvLyBpbnNpZ2h0c190YXJnZXQgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfaW5zaWdodHNUYXJnZXQ/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IGluc2lnaHRzVGFyZ2V0KCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnaW5zaWdodHNfdGFyZ2V0Jyk7XG4gIH1cbiAgcHVibGljIHNldCBpbnNpZ2h0c1RhcmdldCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5faW5zaWdodHNUYXJnZXQgPSB2YWx1ZTtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgaW5zaWdodHNUYXJnZXRJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5faW5zaWdodHNUYXJnZXQ7XG4gIH1cbn1cbmV4cG9ydCBpbnRlcmZhY2UgQ2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb25FbGVtZW50c1Nxc1F1ZXVlU2lua0NvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXdzLzUuODQuMC9kb2NzL3Jlc291cmNlcy9jaGltZXNka21lZGlhcGlwZWxpbmVzX21lZGlhX2luc2lnaHRzX3BpcGVsaW5lX2NvbmZpZ3VyYXRpb24jaW5zaWdodHNfdGFyZ2V0IENoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uI2luc2lnaHRzX3RhcmdldH1cbiAgKi9cbiAgcmVhZG9ubHkgaW5zaWdodHNUYXJnZXQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uRWxlbWVudHNTcXNRdWV1ZVNpbmtDb25maWd1cmF0aW9uVG9UZXJyYWZvcm0oc3RydWN0PzogQ2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb25FbGVtZW50c1Nxc1F1ZXVlU2lua0NvbmZpZ3VyYXRpb25PdXRwdXRSZWZlcmVuY2UgfCBDaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvbkVsZW1lbnRzU3FzUXVldWVTaW5rQ29uZmlndXJhdGlvbik6IGFueSB7XG4gIGlmICghY2RrdGYuY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RmLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0Zi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBpbnNpZ2h0c190YXJnZXQ6IGNka3RmLnN0cmluZ1RvVGVycmFmb3JtKHN0cnVjdCEuaW5zaWdodHNUYXJnZXQpLFxuICB9XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGNoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uRWxlbWVudHNTcXNRdWV1ZVNpbmtDb25maWd1cmF0aW9uVG9IY2xUZXJyYWZvcm0oc3RydWN0PzogQ2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb25FbGVtZW50c1Nxc1F1ZXVlU2lua0NvbmZpZ3VyYXRpb25PdXRwdXRSZWZlcmVuY2UgfCBDaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvbkVsZW1lbnRzU3FzUXVldWVTaW5rQ29uZmlndXJhdGlvbik6IGFueSB7XG4gIGlmICghY2RrdGYuY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RmLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0Zi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgY29uc3QgYXR0cnMgPSB7XG4gICAgaW5zaWdodHNfdGFyZ2V0OiB7XG4gICAgICB2YWx1ZTogY2RrdGYuc3RyaW5nVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5pbnNpZ2h0c1RhcmdldCksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgIH0sXG4gIH07XG5cbiAgLy8gcmVtb3ZlIHVuZGVmaW5lZCBhdHRyaWJ1dGVzXG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoYXR0cnMpLmZpbHRlcigoW18sIHZhbHVlXSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZS52YWx1ZSAhPT0gdW5kZWZpbmVkKSk7XG59XG5cbmV4cG9ydCBjbGFzcyBDaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvbkVsZW1lbnRzU3FzUXVldWVTaW5rQ29uZmlndXJhdGlvbk91dHB1dFJlZmVyZW5jZSBleHRlbmRzIGNka3RmLkNvbXBsZXhPYmplY3Qge1xuICBwcml2YXRlIGlzRW1wdHlPYmplY3QgPSBmYWxzZTtcblxuICAvKipcbiAgKiBAcGFyYW0gdGVycmFmb3JtUmVzb3VyY2UgVGhlIHBhcmVudCByZXNvdXJjZVxuICAqIEBwYXJhbSB0ZXJyYWZvcm1BdHRyaWJ1dGUgVGhlIGF0dHJpYnV0ZSBvbiB0aGUgcGFyZW50IHJlc291cmNlIHRoaXMgY2xhc3MgaXMgcmVmZXJlbmNpbmdcbiAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHRlcnJhZm9ybVJlc291cmNlOiBjZGt0Zi5JSW50ZXJwb2xhdGluZ1BhcmVudCwgdGVycmFmb3JtQXR0cmlidXRlOiBzdHJpbmcpIHtcbiAgICBzdXBlcih0ZXJyYWZvcm1SZXNvdXJjZSwgdGVycmFmb3JtQXR0cmlidXRlLCBmYWxzZSwgMCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGludGVybmFsVmFsdWUoKTogQ2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb25FbGVtZW50c1Nxc1F1ZXVlU2lua0NvbmZpZ3VyYXRpb24gfCB1bmRlZmluZWQge1xuICAgIGxldCBoYXNBbnlWYWx1ZXMgPSB0aGlzLmlzRW1wdHlPYmplY3Q7XG4gICAgY29uc3QgaW50ZXJuYWxWYWx1ZVJlc3VsdDogYW55ID0ge307XG4gICAgaWYgKHRoaXMuX2luc2lnaHRzVGFyZ2V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0Lmluc2lnaHRzVGFyZ2V0ID0gdGhpcy5faW5zaWdodHNUYXJnZXQ7XG4gICAgfVxuICAgIHJldHVybiBoYXNBbnlWYWx1ZXMgPyBpbnRlcm5hbFZhbHVlUmVzdWx0IDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHNldCBpbnRlcm5hbFZhbHVlKHZhbHVlOiBDaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvbkVsZW1lbnRzU3FzUXVldWVTaW5rQ29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZCkge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBmYWxzZTtcbiAgICAgIHRoaXMuX2luc2lnaHRzVGFyZ2V0ID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGggPT09IDA7XG4gICAgICB0aGlzLl9pbnNpZ2h0c1RhcmdldCA9IHZhbHVlLmluc2lnaHRzVGFyZ2V0O1xuICAgIH1cbiAgfVxuXG4gIC8vIGluc2lnaHRzX3RhcmdldCAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogdHJ1ZVxuICBwcml2YXRlIF9pbnNpZ2h0c1RhcmdldD86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgaW5zaWdodHNUYXJnZXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdpbnNpZ2h0c190YXJnZXQnKTtcbiAgfVxuICBwdWJsaWMgc2V0IGluc2lnaHRzVGFyZ2V0KHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9pbnNpZ2h0c1RhcmdldCA9IHZhbHVlO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBpbnNpZ2h0c1RhcmdldElucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9pbnNpZ2h0c1RhcmdldDtcbiAgfVxufVxuZXhwb3J0IGludGVyZmFjZSBDaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvbkVsZW1lbnRzVm9pY2VBbmFseXRpY3NQcm9jZXNzb3JDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F3cy81Ljg0LjAvZG9jcy9yZXNvdXJjZXMvY2hpbWVzZGttZWRpYXBpcGVsaW5lc19tZWRpYV9pbnNpZ2h0c19waXBlbGluZV9jb25maWd1cmF0aW9uI3NwZWFrZXJfc2VhcmNoX3N0YXR1cyBDaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvbiNzcGVha2VyX3NlYXJjaF9zdGF0dXN9XG4gICovXG4gIHJlYWRvbmx5IHNwZWFrZXJTZWFyY2hTdGF0dXM6IHN0cmluZztcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F3cy81Ljg0LjAvZG9jcy9yZXNvdXJjZXMvY2hpbWVzZGttZWRpYXBpcGVsaW5lc19tZWRpYV9pbnNpZ2h0c19waXBlbGluZV9jb25maWd1cmF0aW9uI3ZvaWNlX3RvbmVfYW5hbHlzaXNfc3RhdHVzIENoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uI3ZvaWNlX3RvbmVfYW5hbHlzaXNfc3RhdHVzfVxuICAqL1xuICByZWFkb25seSB2b2ljZVRvbmVBbmFseXNpc1N0YXR1czogc3RyaW5nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb25FbGVtZW50c1ZvaWNlQW5hbHl0aWNzUHJvY2Vzc29yQ29uZmlndXJhdGlvblRvVGVycmFmb3JtKHN0cnVjdD86IENoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uRWxlbWVudHNWb2ljZUFuYWx5dGljc1Byb2Nlc3NvckNvbmZpZ3VyYXRpb25PdXRwdXRSZWZlcmVuY2UgfCBDaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvbkVsZW1lbnRzVm9pY2VBbmFseXRpY3NQcm9jZXNzb3JDb25maWd1cmF0aW9uKTogYW55IHtcbiAgaWYgKCFjZGt0Zi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdGYuVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RmLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIHNwZWFrZXJfc2VhcmNoX3N0YXR1czogY2RrdGYuc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS5zcGVha2VyU2VhcmNoU3RhdHVzKSxcbiAgICB2b2ljZV90b25lX2FuYWx5c2lzX3N0YXR1czogY2RrdGYuc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS52b2ljZVRvbmVBbmFseXNpc1N0YXR1cyksXG4gIH1cbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gY2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb25FbGVtZW50c1ZvaWNlQW5hbHl0aWNzUHJvY2Vzc29yQ29uZmlndXJhdGlvblRvSGNsVGVycmFmb3JtKHN0cnVjdD86IENoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uRWxlbWVudHNWb2ljZUFuYWx5dGljc1Byb2Nlc3NvckNvbmZpZ3VyYXRpb25PdXRwdXRSZWZlcmVuY2UgfCBDaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvbkVsZW1lbnRzVm9pY2VBbmFseXRpY3NQcm9jZXNzb3JDb25maWd1cmF0aW9uKTogYW55IHtcbiAgaWYgKCFjZGt0Zi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdGYuVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RmLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICBjb25zdCBhdHRycyA9IHtcbiAgICBzcGVha2VyX3NlYXJjaF9zdGF0dXM6IHtcbiAgICAgIHZhbHVlOiBjZGt0Zi5zdHJpbmdUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLnNwZWFrZXJTZWFyY2hTdGF0dXMpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICB9LFxuICAgIHZvaWNlX3RvbmVfYW5hbHlzaXNfc3RhdHVzOiB7XG4gICAgICB2YWx1ZTogY2RrdGYuc3RyaW5nVG9IY2xUZXJyYWZvcm0oc3RydWN0IS52b2ljZVRvbmVBbmFseXNpc1N0YXR1cyksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgIH0sXG4gIH07XG5cbiAgLy8gcmVtb3ZlIHVuZGVmaW5lZCBhdHRyaWJ1dGVzXG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoYXR0cnMpLmZpbHRlcigoW18sIHZhbHVlXSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZS52YWx1ZSAhPT0gdW5kZWZpbmVkKSk7XG59XG5cbmV4cG9ydCBjbGFzcyBDaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvbkVsZW1lbnRzVm9pY2VBbmFseXRpY3NQcm9jZXNzb3JDb25maWd1cmF0aW9uT3V0cHV0UmVmZXJlbmNlIGV4dGVuZHMgY2RrdGYuQ29tcGxleE9iamVjdCB7XG4gIHByaXZhdGUgaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuXG4gIC8qKlxuICAqIEBwYXJhbSB0ZXJyYWZvcm1SZXNvdXJjZSBUaGUgcGFyZW50IHJlc291cmNlXG4gICogQHBhcmFtIHRlcnJhZm9ybUF0dHJpYnV0ZSBUaGUgYXR0cmlidXRlIG9uIHRoZSBwYXJlbnQgcmVzb3VyY2UgdGhpcyBjbGFzcyBpcyByZWZlcmVuY2luZ1xuICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IodGVycmFmb3JtUmVzb3VyY2U6IGNka3RmLklJbnRlcnBvbGF0aW5nUGFyZW50LCB0ZXJyYWZvcm1BdHRyaWJ1dGU6IHN0cmluZykge1xuICAgIHN1cGVyKHRlcnJhZm9ybVJlc291cmNlLCB0ZXJyYWZvcm1BdHRyaWJ1dGUsIGZhbHNlLCAwKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW50ZXJuYWxWYWx1ZSgpOiBDaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvbkVsZW1lbnRzVm9pY2VBbmFseXRpY3NQcm9jZXNzb3JDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgaGFzQW55VmFsdWVzID0gdGhpcy5pc0VtcHR5T2JqZWN0O1xuICAgIGNvbnN0IGludGVybmFsVmFsdWVSZXN1bHQ6IGFueSA9IHt9O1xuICAgIGlmICh0aGlzLl9zcGVha2VyU2VhcmNoU3RhdHVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LnNwZWFrZXJTZWFyY2hTdGF0dXMgPSB0aGlzLl9zcGVha2VyU2VhcmNoU3RhdHVzO1xuICAgIH1cbiAgICBpZiAodGhpcy5fdm9pY2VUb25lQW5hbHlzaXNTdGF0dXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQudm9pY2VUb25lQW5hbHlzaXNTdGF0dXMgPSB0aGlzLl92b2ljZVRvbmVBbmFseXNpc1N0YXR1cztcbiAgICB9XG4gICAgcmV0dXJuIGhhc0FueVZhbHVlcyA/IGludGVybmFsVmFsdWVSZXN1bHQgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgc2V0IGludGVybmFsVmFsdWUodmFsdWU6IENoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uRWxlbWVudHNWb2ljZUFuYWx5dGljc1Byb2Nlc3NvckNvbmZpZ3VyYXRpb24gfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLl9zcGVha2VyU2VhcmNoU3RhdHVzID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fdm9pY2VUb25lQW5hbHlzaXNTdGF0dXMgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA9PT0gMDtcbiAgICAgIHRoaXMuX3NwZWFrZXJTZWFyY2hTdGF0dXMgPSB2YWx1ZS5zcGVha2VyU2VhcmNoU3RhdHVzO1xuICAgICAgdGhpcy5fdm9pY2VUb25lQW5hbHlzaXNTdGF0dXMgPSB2YWx1ZS52b2ljZVRvbmVBbmFseXNpc1N0YXR1cztcbiAgICB9XG4gIH1cblxuICAvLyBzcGVha2VyX3NlYXJjaF9zdGF0dXMgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfc3BlYWtlclNlYXJjaFN0YXR1cz86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgc3BlYWtlclNlYXJjaFN0YXR1cygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ3NwZWFrZXJfc2VhcmNoX3N0YXR1cycpO1xuICB9XG4gIHB1YmxpYyBzZXQgc3BlYWtlclNlYXJjaFN0YXR1cyh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fc3BlYWtlclNlYXJjaFN0YXR1cyA9IHZhbHVlO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBzcGVha2VyU2VhcmNoU3RhdHVzSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NwZWFrZXJTZWFyY2hTdGF0dXM7XG4gIH1cblxuICAvLyB2b2ljZV90b25lX2FuYWx5c2lzX3N0YXR1cyAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogdHJ1ZVxuICBwcml2YXRlIF92b2ljZVRvbmVBbmFseXNpc1N0YXR1cz86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgdm9pY2VUb25lQW5hbHlzaXNTdGF0dXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCd2b2ljZV90b25lX2FuYWx5c2lzX3N0YXR1cycpO1xuICB9XG4gIHB1YmxpYyBzZXQgdm9pY2VUb25lQW5hbHlzaXNTdGF0dXModmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX3ZvaWNlVG9uZUFuYWx5c2lzU3RhdHVzID0gdmFsdWU7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHZvaWNlVG9uZUFuYWx5c2lzU3RhdHVzSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZvaWNlVG9uZUFuYWx5c2lzU3RhdHVzO1xuICB9XG59XG5leHBvcnQgaW50ZXJmYWNlIENoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uRWxlbWVudHMge1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXdzLzUuODQuMC9kb2NzL3Jlc291cmNlcy9jaGltZXNka21lZGlhcGlwZWxpbmVzX21lZGlhX2luc2lnaHRzX3BpcGVsaW5lX2NvbmZpZ3VyYXRpb24jdHlwZSBDaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvbiN0eXBlfVxuICAqL1xuICByZWFkb25seSB0eXBlOiBzdHJpbmc7XG4gIC8qKlxuICAqIGFtYXpvbl90cmFuc2NyaWJlX2NhbGxfYW5hbHl0aWNzX3Byb2Nlc3Nvcl9jb25maWd1cmF0aW9uIGJsb2NrXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXdzLzUuODQuMC9kb2NzL3Jlc291cmNlcy9jaGltZXNka21lZGlhcGlwZWxpbmVzX21lZGlhX2luc2lnaHRzX3BpcGVsaW5lX2NvbmZpZ3VyYXRpb24jYW1hem9uX3RyYW5zY3JpYmVfY2FsbF9hbmFseXRpY3NfcHJvY2Vzc29yX2NvbmZpZ3VyYXRpb24gQ2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb24jYW1hem9uX3RyYW5zY3JpYmVfY2FsbF9hbmFseXRpY3NfcHJvY2Vzc29yX2NvbmZpZ3VyYXRpb259XG4gICovXG4gIHJlYWRvbmx5IGFtYXpvblRyYW5zY3JpYmVDYWxsQW5hbHl0aWNzUHJvY2Vzc29yQ29uZmlndXJhdGlvbj86IENoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uRWxlbWVudHNBbWF6b25UcmFuc2NyaWJlQ2FsbEFuYWx5dGljc1Byb2Nlc3NvckNvbmZpZ3VyYXRpb247XG4gIC8qKlxuICAqIGFtYXpvbl90cmFuc2NyaWJlX3Byb2Nlc3Nvcl9jb25maWd1cmF0aW9uIGJsb2NrXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXdzLzUuODQuMC9kb2NzL3Jlc291cmNlcy9jaGltZXNka21lZGlhcGlwZWxpbmVzX21lZGlhX2luc2lnaHRzX3BpcGVsaW5lX2NvbmZpZ3VyYXRpb24jYW1hem9uX3RyYW5zY3JpYmVfcHJvY2Vzc29yX2NvbmZpZ3VyYXRpb24gQ2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb24jYW1hem9uX3RyYW5zY3JpYmVfcHJvY2Vzc29yX2NvbmZpZ3VyYXRpb259XG4gICovXG4gIHJlYWRvbmx5IGFtYXpvblRyYW5zY3JpYmVQcm9jZXNzb3JDb25maWd1cmF0aW9uPzogQ2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb25FbGVtZW50c0FtYXpvblRyYW5zY3JpYmVQcm9jZXNzb3JDb25maWd1cmF0aW9uO1xuICAvKipcbiAgKiBraW5lc2lzX2RhdGFfc3RyZWFtX3NpbmtfY29uZmlndXJhdGlvbiBibG9ja1xuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F3cy81Ljg0LjAvZG9jcy9yZXNvdXJjZXMvY2hpbWVzZGttZWRpYXBpcGVsaW5lc19tZWRpYV9pbnNpZ2h0c19waXBlbGluZV9jb25maWd1cmF0aW9uI2tpbmVzaXNfZGF0YV9zdHJlYW1fc2lua19jb25maWd1cmF0aW9uIENoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uI2tpbmVzaXNfZGF0YV9zdHJlYW1fc2lua19jb25maWd1cmF0aW9ufVxuICAqL1xuICByZWFkb25seSBraW5lc2lzRGF0YVN0cmVhbVNpbmtDb25maWd1cmF0aW9uPzogQ2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb25FbGVtZW50c0tpbmVzaXNEYXRhU3RyZWFtU2lua0NvbmZpZ3VyYXRpb247XG4gIC8qKlxuICAqIGxhbWJkYV9mdW5jdGlvbl9zaW5rX2NvbmZpZ3VyYXRpb24gYmxvY2tcbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9hd3MvNS44NC4wL2RvY3MvcmVzb3VyY2VzL2NoaW1lc2RrbWVkaWFwaXBlbGluZXNfbWVkaWFfaW5zaWdodHNfcGlwZWxpbmVfY29uZmlndXJhdGlvbiNsYW1iZGFfZnVuY3Rpb25fc2lua19jb25maWd1cmF0aW9uIENoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uI2xhbWJkYV9mdW5jdGlvbl9zaW5rX2NvbmZpZ3VyYXRpb259XG4gICovXG4gIHJlYWRvbmx5IGxhbWJkYUZ1bmN0aW9uU2lua0NvbmZpZ3VyYXRpb24/OiBDaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvbkVsZW1lbnRzTGFtYmRhRnVuY3Rpb25TaW5rQ29uZmlndXJhdGlvbjtcbiAgLyoqXG4gICogczNfcmVjb3JkaW5nX3NpbmtfY29uZmlndXJhdGlvbiBibG9ja1xuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F3cy81Ljg0LjAvZG9jcy9yZXNvdXJjZXMvY2hpbWVzZGttZWRpYXBpcGVsaW5lc19tZWRpYV9pbnNpZ2h0c19waXBlbGluZV9jb25maWd1cmF0aW9uI3MzX3JlY29yZGluZ19zaW5rX2NvbmZpZ3VyYXRpb24gQ2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb24jczNfcmVjb3JkaW5nX3NpbmtfY29uZmlndXJhdGlvbn1cbiAgKi9cbiAgcmVhZG9ubHkgczNSZWNvcmRpbmdTaW5rQ29uZmlndXJhdGlvbj86IENoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uRWxlbWVudHNTM1JlY29yZGluZ1NpbmtDb25maWd1cmF0aW9uO1xuICAvKipcbiAgKiBzbnNfdG9waWNfc2lua19jb25maWd1cmF0aW9uIGJsb2NrXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXdzLzUuODQuMC9kb2NzL3Jlc291cmNlcy9jaGltZXNka21lZGlhcGlwZWxpbmVzX21lZGlhX2luc2lnaHRzX3BpcGVsaW5lX2NvbmZpZ3VyYXRpb24jc25zX3RvcGljX3NpbmtfY29uZmlndXJhdGlvbiBDaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvbiNzbnNfdG9waWNfc2lua19jb25maWd1cmF0aW9ufVxuICAqL1xuICByZWFkb25seSBzbnNUb3BpY1NpbmtDb25maWd1cmF0aW9uPzogQ2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb25FbGVtZW50c1Nuc1RvcGljU2lua0NvbmZpZ3VyYXRpb247XG4gIC8qKlxuICAqIHNxc19xdWV1ZV9zaW5rX2NvbmZpZ3VyYXRpb24gYmxvY2tcbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9hd3MvNS44NC4wL2RvY3MvcmVzb3VyY2VzL2NoaW1lc2RrbWVkaWFwaXBlbGluZXNfbWVkaWFfaW5zaWdodHNfcGlwZWxpbmVfY29uZmlndXJhdGlvbiNzcXNfcXVldWVfc2lua19jb25maWd1cmF0aW9uIENoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uI3Nxc19xdWV1ZV9zaW5rX2NvbmZpZ3VyYXRpb259XG4gICovXG4gIHJlYWRvbmx5IHNxc1F1ZXVlU2lua0NvbmZpZ3VyYXRpb24/OiBDaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvbkVsZW1lbnRzU3FzUXVldWVTaW5rQ29uZmlndXJhdGlvbjtcbiAgLyoqXG4gICogdm9pY2VfYW5hbHl0aWNzX3Byb2Nlc3Nvcl9jb25maWd1cmF0aW9uIGJsb2NrXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXdzLzUuODQuMC9kb2NzL3Jlc291cmNlcy9jaGltZXNka21lZGlhcGlwZWxpbmVzX21lZGlhX2luc2lnaHRzX3BpcGVsaW5lX2NvbmZpZ3VyYXRpb24jdm9pY2VfYW5hbHl0aWNzX3Byb2Nlc3Nvcl9jb25maWd1cmF0aW9uIENoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uI3ZvaWNlX2FuYWx5dGljc19wcm9jZXNzb3JfY29uZmlndXJhdGlvbn1cbiAgKi9cbiAgcmVhZG9ubHkgdm9pY2VBbmFseXRpY3NQcm9jZXNzb3JDb25maWd1cmF0aW9uPzogQ2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb25FbGVtZW50c1ZvaWNlQW5hbHl0aWNzUHJvY2Vzc29yQ29uZmlndXJhdGlvbjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uRWxlbWVudHNUb1RlcnJhZm9ybShzdHJ1Y3Q/OiBDaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvbkVsZW1lbnRzIHwgY2RrdGYuSVJlc29sdmFibGUpOiBhbnkge1xuICBpZiAoIWNka3RmLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0Zi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdGYuaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIHJldHVybiB7XG4gICAgdHlwZTogY2RrdGYuc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS50eXBlKSxcbiAgICBhbWF6b25fdHJhbnNjcmliZV9jYWxsX2FuYWx5dGljc19wcm9jZXNzb3JfY29uZmlndXJhdGlvbjogY2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb25FbGVtZW50c0FtYXpvblRyYW5zY3JpYmVDYWxsQW5hbHl0aWNzUHJvY2Vzc29yQ29uZmlndXJhdGlvblRvVGVycmFmb3JtKHN0cnVjdCEuYW1hem9uVHJhbnNjcmliZUNhbGxBbmFseXRpY3NQcm9jZXNzb3JDb25maWd1cmF0aW9uKSxcbiAgICBhbWF6b25fdHJhbnNjcmliZV9wcm9jZXNzb3JfY29uZmlndXJhdGlvbjogY2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb25FbGVtZW50c0FtYXpvblRyYW5zY3JpYmVQcm9jZXNzb3JDb25maWd1cmF0aW9uVG9UZXJyYWZvcm0oc3RydWN0IS5hbWF6b25UcmFuc2NyaWJlUHJvY2Vzc29yQ29uZmlndXJhdGlvbiksXG4gICAga2luZXNpc19kYXRhX3N0cmVhbV9zaW5rX2NvbmZpZ3VyYXRpb246IGNoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uRWxlbWVudHNLaW5lc2lzRGF0YVN0cmVhbVNpbmtDb25maWd1cmF0aW9uVG9UZXJyYWZvcm0oc3RydWN0IS5raW5lc2lzRGF0YVN0cmVhbVNpbmtDb25maWd1cmF0aW9uKSxcbiAgICBsYW1iZGFfZnVuY3Rpb25fc2lua19jb25maWd1cmF0aW9uOiBjaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvbkVsZW1lbnRzTGFtYmRhRnVuY3Rpb25TaW5rQ29uZmlndXJhdGlvblRvVGVycmFmb3JtKHN0cnVjdCEubGFtYmRhRnVuY3Rpb25TaW5rQ29uZmlndXJhdGlvbiksXG4gICAgczNfcmVjb3JkaW5nX3NpbmtfY29uZmlndXJhdGlvbjogY2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb25FbGVtZW50c1MzUmVjb3JkaW5nU2lua0NvbmZpZ3VyYXRpb25Ub1RlcnJhZm9ybShzdHJ1Y3QhLnMzUmVjb3JkaW5nU2lua0NvbmZpZ3VyYXRpb24pLFxuICAgIHNuc190b3BpY19zaW5rX2NvbmZpZ3VyYXRpb246IGNoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uRWxlbWVudHNTbnNUb3BpY1NpbmtDb25maWd1cmF0aW9uVG9UZXJyYWZvcm0oc3RydWN0IS5zbnNUb3BpY1NpbmtDb25maWd1cmF0aW9uKSxcbiAgICBzcXNfcXVldWVfc2lua19jb25maWd1cmF0aW9uOiBjaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvbkVsZW1lbnRzU3FzUXVldWVTaW5rQ29uZmlndXJhdGlvblRvVGVycmFmb3JtKHN0cnVjdCEuc3FzUXVldWVTaW5rQ29uZmlndXJhdGlvbiksXG4gICAgdm9pY2VfYW5hbHl0aWNzX3Byb2Nlc3Nvcl9jb25maWd1cmF0aW9uOiBjaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvbkVsZW1lbnRzVm9pY2VBbmFseXRpY3NQcm9jZXNzb3JDb25maWd1cmF0aW9uVG9UZXJyYWZvcm0oc3RydWN0IS52b2ljZUFuYWx5dGljc1Byb2Nlc3NvckNvbmZpZ3VyYXRpb24pLFxuICB9XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGNoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uRWxlbWVudHNUb0hjbFRlcnJhZm9ybShzdHJ1Y3Q/OiBDaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvbkVsZW1lbnRzIHwgY2RrdGYuSVJlc29sdmFibGUpOiBhbnkge1xuICBpZiAoIWNka3RmLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0Zi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdGYuaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIGNvbnN0IGF0dHJzID0ge1xuICAgIHR5cGU6IHtcbiAgICAgIHZhbHVlOiBjZGt0Zi5zdHJpbmdUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLnR5cGUpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICB9LFxuICAgIGFtYXpvbl90cmFuc2NyaWJlX2NhbGxfYW5hbHl0aWNzX3Byb2Nlc3Nvcl9jb25maWd1cmF0aW9uOiB7XG4gICAgICB2YWx1ZTogY2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb25FbGVtZW50c0FtYXpvblRyYW5zY3JpYmVDYWxsQW5hbHl0aWNzUHJvY2Vzc29yQ29uZmlndXJhdGlvblRvSGNsVGVycmFmb3JtKHN0cnVjdCEuYW1hem9uVHJhbnNjcmliZUNhbGxBbmFseXRpY3NQcm9jZXNzb3JDb25maWd1cmF0aW9uKSxcbiAgICAgIGlzQmxvY2s6IHRydWUsXG4gICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwiQ2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb25FbGVtZW50c0FtYXpvblRyYW5zY3JpYmVDYWxsQW5hbHl0aWNzUHJvY2Vzc29yQ29uZmlndXJhdGlvbkxpc3RcIixcbiAgICB9LFxuICAgIGFtYXpvbl90cmFuc2NyaWJlX3Byb2Nlc3Nvcl9jb25maWd1cmF0aW9uOiB7XG4gICAgICB2YWx1ZTogY2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb25FbGVtZW50c0FtYXpvblRyYW5zY3JpYmVQcm9jZXNzb3JDb25maWd1cmF0aW9uVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5hbWF6b25UcmFuc2NyaWJlUHJvY2Vzc29yQ29uZmlndXJhdGlvbiksXG4gICAgICBpc0Jsb2NrOiB0cnVlLFxuICAgICAgdHlwZTogXCJsaXN0XCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIkNoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uRWxlbWVudHNBbWF6b25UcmFuc2NyaWJlUHJvY2Vzc29yQ29uZmlndXJhdGlvbkxpc3RcIixcbiAgICB9LFxuICAgIGtpbmVzaXNfZGF0YV9zdHJlYW1fc2lua19jb25maWd1cmF0aW9uOiB7XG4gICAgICB2YWx1ZTogY2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb25FbGVtZW50c0tpbmVzaXNEYXRhU3RyZWFtU2lua0NvbmZpZ3VyYXRpb25Ub0hjbFRlcnJhZm9ybShzdHJ1Y3QhLmtpbmVzaXNEYXRhU3RyZWFtU2lua0NvbmZpZ3VyYXRpb24pLFxuICAgICAgaXNCbG9jazogdHJ1ZSxcbiAgICAgIHR5cGU6IFwibGlzdFwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJDaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvbkVsZW1lbnRzS2luZXNpc0RhdGFTdHJlYW1TaW5rQ29uZmlndXJhdGlvbkxpc3RcIixcbiAgICB9LFxuICAgIGxhbWJkYV9mdW5jdGlvbl9zaW5rX2NvbmZpZ3VyYXRpb246IHtcbiAgICAgIHZhbHVlOiBjaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvbkVsZW1lbnRzTGFtYmRhRnVuY3Rpb25TaW5rQ29uZmlndXJhdGlvblRvSGNsVGVycmFmb3JtKHN0cnVjdCEubGFtYmRhRnVuY3Rpb25TaW5rQ29uZmlndXJhdGlvbiksXG4gICAgICBpc0Jsb2NrOiB0cnVlLFxuICAgICAgdHlwZTogXCJsaXN0XCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIkNoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uRWxlbWVudHNMYW1iZGFGdW5jdGlvblNpbmtDb25maWd1cmF0aW9uTGlzdFwiLFxuICAgIH0sXG4gICAgczNfcmVjb3JkaW5nX3NpbmtfY29uZmlndXJhdGlvbjoge1xuICAgICAgdmFsdWU6IGNoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uRWxlbWVudHNTM1JlY29yZGluZ1NpbmtDb25maWd1cmF0aW9uVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5zM1JlY29yZGluZ1NpbmtDb25maWd1cmF0aW9uKSxcbiAgICAgIGlzQmxvY2s6IHRydWUsXG4gICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwiQ2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb25FbGVtZW50c1MzUmVjb3JkaW5nU2lua0NvbmZpZ3VyYXRpb25MaXN0XCIsXG4gICAgfSxcbiAgICBzbnNfdG9waWNfc2lua19jb25maWd1cmF0aW9uOiB7XG4gICAgICB2YWx1ZTogY2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb25FbGVtZW50c1Nuc1RvcGljU2lua0NvbmZpZ3VyYXRpb25Ub0hjbFRlcnJhZm9ybShzdHJ1Y3QhLnNuc1RvcGljU2lua0NvbmZpZ3VyYXRpb24pLFxuICAgICAgaXNCbG9jazogdHJ1ZSxcbiAgICAgIHR5cGU6IFwibGlzdFwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJDaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvbkVsZW1lbnRzU25zVG9waWNTaW5rQ29uZmlndXJhdGlvbkxpc3RcIixcbiAgICB9LFxuICAgIHNxc19xdWV1ZV9zaW5rX2NvbmZpZ3VyYXRpb246IHtcbiAgICAgIHZhbHVlOiBjaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvbkVsZW1lbnRzU3FzUXVldWVTaW5rQ29uZmlndXJhdGlvblRvSGNsVGVycmFmb3JtKHN0cnVjdCEuc3FzUXVldWVTaW5rQ29uZmlndXJhdGlvbiksXG4gICAgICBpc0Jsb2NrOiB0cnVlLFxuICAgICAgdHlwZTogXCJsaXN0XCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIkNoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uRWxlbWVudHNTcXNRdWV1ZVNpbmtDb25maWd1cmF0aW9uTGlzdFwiLFxuICAgIH0sXG4gICAgdm9pY2VfYW5hbHl0aWNzX3Byb2Nlc3Nvcl9jb25maWd1cmF0aW9uOiB7XG4gICAgICB2YWx1ZTogY2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb25FbGVtZW50c1ZvaWNlQW5hbHl0aWNzUHJvY2Vzc29yQ29uZmlndXJhdGlvblRvSGNsVGVycmFmb3JtKHN0cnVjdCEudm9pY2VBbmFseXRpY3NQcm9jZXNzb3JDb25maWd1cmF0aW9uKSxcbiAgICAgIGlzQmxvY2s6IHRydWUsXG4gICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwiQ2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb25FbGVtZW50c1ZvaWNlQW5hbHl0aWNzUHJvY2Vzc29yQ29uZmlndXJhdGlvbkxpc3RcIixcbiAgICB9LFxuICB9O1xuXG4gIC8vIHJlbW92ZSB1bmRlZmluZWQgYXR0cmlidXRlc1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKGF0dHJzKS5maWx0ZXIoKFtfLCB2YWx1ZV0pID0+IHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUudmFsdWUgIT09IHVuZGVmaW5lZCkpO1xufVxuXG5leHBvcnQgY2xhc3MgQ2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb25FbGVtZW50c091dHB1dFJlZmVyZW5jZSBleHRlbmRzIGNka3RmLkNvbXBsZXhPYmplY3Qge1xuICBwcml2YXRlIGlzRW1wdHlPYmplY3QgPSBmYWxzZTtcbiAgcHJpdmF0ZSByZXNvbHZhYmxlVmFsdWU/OiBjZGt0Zi5JUmVzb2x2YWJsZTtcblxuICAvKipcbiAgKiBAcGFyYW0gdGVycmFmb3JtUmVzb3VyY2UgVGhlIHBhcmVudCByZXNvdXJjZVxuICAqIEBwYXJhbSB0ZXJyYWZvcm1BdHRyaWJ1dGUgVGhlIGF0dHJpYnV0ZSBvbiB0aGUgcGFyZW50IHJlc291cmNlIHRoaXMgY2xhc3MgaXMgcmVmZXJlbmNpbmdcbiAgKiBAcGFyYW0gY29tcGxleE9iamVjdEluZGV4IHRoZSBpbmRleCBvZiB0aGlzIGl0ZW0gaW4gdGhlIGxpc3RcbiAgKiBAcGFyYW0gY29tcGxleE9iamVjdElzRnJvbVNldCB3aGV0aGVyIHRoZSBsaXN0IGlzIHdyYXBwaW5nIGEgc2V0ICh3aWxsIGFkZCB0b2xpc3QoKSB0byBiZSBhYmxlIHRvIGFjY2VzcyBhbiBpdGVtIHZpYSBhbiBpbmRleClcbiAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHRlcnJhZm9ybVJlc291cmNlOiBjZGt0Zi5JSW50ZXJwb2xhdGluZ1BhcmVudCwgdGVycmFmb3JtQXR0cmlidXRlOiBzdHJpbmcsIGNvbXBsZXhPYmplY3RJbmRleDogbnVtYmVyLCBjb21wbGV4T2JqZWN0SXNGcm9tU2V0OiBib29sZWFuKSB7XG4gICAgc3VwZXIodGVycmFmb3JtUmVzb3VyY2UsIHRlcnJhZm9ybUF0dHJpYnV0ZSwgY29tcGxleE9iamVjdElzRnJvbVNldCwgY29tcGxleE9iamVjdEluZGV4KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW50ZXJuYWxWYWx1ZSgpOiBDaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvbkVsZW1lbnRzIHwgY2RrdGYuSVJlc29sdmFibGUgfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLnJlc29sdmFibGVWYWx1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMucmVzb2x2YWJsZVZhbHVlO1xuICAgIH1cbiAgICBsZXQgaGFzQW55VmFsdWVzID0gdGhpcy5pc0VtcHR5T2JqZWN0O1xuICAgIGNvbnN0IGludGVybmFsVmFsdWVSZXN1bHQ6IGFueSA9IHt9O1xuICAgIGlmICh0aGlzLl90eXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LnR5cGUgPSB0aGlzLl90eXBlO1xuICAgIH1cbiAgICBpZiAodGhpcy5fYW1hem9uVHJhbnNjcmliZUNhbGxBbmFseXRpY3NQcm9jZXNzb3JDb25maWd1cmF0aW9uPy5pbnRlcm5hbFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmFtYXpvblRyYW5zY3JpYmVDYWxsQW5hbHl0aWNzUHJvY2Vzc29yQ29uZmlndXJhdGlvbiA9IHRoaXMuX2FtYXpvblRyYW5zY3JpYmVDYWxsQW5hbHl0aWNzUHJvY2Vzc29yQ29uZmlndXJhdGlvbj8uaW50ZXJuYWxWYWx1ZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2FtYXpvblRyYW5zY3JpYmVQcm9jZXNzb3JDb25maWd1cmF0aW9uPy5pbnRlcm5hbFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmFtYXpvblRyYW5zY3JpYmVQcm9jZXNzb3JDb25maWd1cmF0aW9uID0gdGhpcy5fYW1hem9uVHJhbnNjcmliZVByb2Nlc3NvckNvbmZpZ3VyYXRpb24/LmludGVybmFsVmFsdWU7XG4gICAgfVxuICAgIGlmICh0aGlzLl9raW5lc2lzRGF0YVN0cmVhbVNpbmtDb25maWd1cmF0aW9uPy5pbnRlcm5hbFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmtpbmVzaXNEYXRhU3RyZWFtU2lua0NvbmZpZ3VyYXRpb24gPSB0aGlzLl9raW5lc2lzRGF0YVN0cmVhbVNpbmtDb25maWd1cmF0aW9uPy5pbnRlcm5hbFZhbHVlO1xuICAgIH1cbiAgICBpZiAodGhpcy5fbGFtYmRhRnVuY3Rpb25TaW5rQ29uZmlndXJhdGlvbj8uaW50ZXJuYWxWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5sYW1iZGFGdW5jdGlvblNpbmtDb25maWd1cmF0aW9uID0gdGhpcy5fbGFtYmRhRnVuY3Rpb25TaW5rQ29uZmlndXJhdGlvbj8uaW50ZXJuYWxWYWx1ZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3MzUmVjb3JkaW5nU2lua0NvbmZpZ3VyYXRpb24/LmludGVybmFsVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuczNSZWNvcmRpbmdTaW5rQ29uZmlndXJhdGlvbiA9IHRoaXMuX3MzUmVjb3JkaW5nU2lua0NvbmZpZ3VyYXRpb24/LmludGVybmFsVmFsdWU7XG4gICAgfVxuICAgIGlmICh0aGlzLl9zbnNUb3BpY1NpbmtDb25maWd1cmF0aW9uPy5pbnRlcm5hbFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LnNuc1RvcGljU2lua0NvbmZpZ3VyYXRpb24gPSB0aGlzLl9zbnNUb3BpY1NpbmtDb25maWd1cmF0aW9uPy5pbnRlcm5hbFZhbHVlO1xuICAgIH1cbiAgICBpZiAodGhpcy5fc3FzUXVldWVTaW5rQ29uZmlndXJhdGlvbj8uaW50ZXJuYWxWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5zcXNRdWV1ZVNpbmtDb25maWd1cmF0aW9uID0gdGhpcy5fc3FzUXVldWVTaW5rQ29uZmlndXJhdGlvbj8uaW50ZXJuYWxWYWx1ZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3ZvaWNlQW5hbHl0aWNzUHJvY2Vzc29yQ29uZmlndXJhdGlvbj8uaW50ZXJuYWxWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC52b2ljZUFuYWx5dGljc1Byb2Nlc3NvckNvbmZpZ3VyYXRpb24gPSB0aGlzLl92b2ljZUFuYWx5dGljc1Byb2Nlc3NvckNvbmZpZ3VyYXRpb24/LmludGVybmFsVmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBoYXNBbnlWYWx1ZXMgPyBpbnRlcm5hbFZhbHVlUmVzdWx0IDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHNldCBpbnRlcm5hbFZhbHVlKHZhbHVlOiBDaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvbkVsZW1lbnRzIHwgY2RrdGYuSVJlc29sdmFibGUgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLnJlc29sdmFibGVWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3R5cGUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9hbWF6b25UcmFuc2NyaWJlQ2FsbEFuYWx5dGljc1Byb2Nlc3NvckNvbmZpZ3VyYXRpb24uaW50ZXJuYWxWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX2FtYXpvblRyYW5zY3JpYmVQcm9jZXNzb3JDb25maWd1cmF0aW9uLmludGVybmFsVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9raW5lc2lzRGF0YVN0cmVhbVNpbmtDb25maWd1cmF0aW9uLmludGVybmFsVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9sYW1iZGFGdW5jdGlvblNpbmtDb25maWd1cmF0aW9uLmludGVybmFsVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9zM1JlY29yZGluZ1NpbmtDb25maWd1cmF0aW9uLmludGVybmFsVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9zbnNUb3BpY1NpbmtDb25maWd1cmF0aW9uLmludGVybmFsVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9zcXNRdWV1ZVNpbmtDb25maWd1cmF0aW9uLmludGVybmFsVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl92b2ljZUFuYWx5dGljc1Byb2Nlc3NvckNvbmZpZ3VyYXRpb24uaW50ZXJuYWxWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZWxzZSBpZiAoY2RrdGYuVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZSh2YWx1ZSkpIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuICAgICAgdGhpcy5yZXNvbHZhYmxlVmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSAwO1xuICAgICAgdGhpcy5yZXNvbHZhYmxlVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl90eXBlID0gdmFsdWUudHlwZTtcbiAgICAgIHRoaXMuX2FtYXpvblRyYW5zY3JpYmVDYWxsQW5hbHl0aWNzUHJvY2Vzc29yQ29uZmlndXJhdGlvbi5pbnRlcm5hbFZhbHVlID0gdmFsdWUuYW1hem9uVHJhbnNjcmliZUNhbGxBbmFseXRpY3NQcm9jZXNzb3JDb25maWd1cmF0aW9uO1xuICAgICAgdGhpcy5fYW1hem9uVHJhbnNjcmliZVByb2Nlc3NvckNvbmZpZ3VyYXRpb24uaW50ZXJuYWxWYWx1ZSA9IHZhbHVlLmFtYXpvblRyYW5zY3JpYmVQcm9jZXNzb3JDb25maWd1cmF0aW9uO1xuICAgICAgdGhpcy5fa2luZXNpc0RhdGFTdHJlYW1TaW5rQ29uZmlndXJhdGlvbi5pbnRlcm5hbFZhbHVlID0gdmFsdWUua2luZXNpc0RhdGFTdHJlYW1TaW5rQ29uZmlndXJhdGlvbjtcbiAgICAgIHRoaXMuX2xhbWJkYUZ1bmN0aW9uU2lua0NvbmZpZ3VyYXRpb24uaW50ZXJuYWxWYWx1ZSA9IHZhbHVlLmxhbWJkYUZ1bmN0aW9uU2lua0NvbmZpZ3VyYXRpb247XG4gICAgICB0aGlzLl9zM1JlY29yZGluZ1NpbmtDb25maWd1cmF0aW9uLmludGVybmFsVmFsdWUgPSB2YWx1ZS5zM1JlY29yZGluZ1NpbmtDb25maWd1cmF0aW9uO1xuICAgICAgdGhpcy5fc25zVG9waWNTaW5rQ29uZmlndXJhdGlvbi5pbnRlcm5hbFZhbHVlID0gdmFsdWUuc25zVG9waWNTaW5rQ29uZmlndXJhdGlvbjtcbiAgICAgIHRoaXMuX3Nxc1F1ZXVlU2lua0NvbmZpZ3VyYXRpb24uaW50ZXJuYWxWYWx1ZSA9IHZhbHVlLnNxc1F1ZXVlU2lua0NvbmZpZ3VyYXRpb247XG4gICAgICB0aGlzLl92b2ljZUFuYWx5dGljc1Byb2Nlc3NvckNvbmZpZ3VyYXRpb24uaW50ZXJuYWxWYWx1ZSA9IHZhbHVlLnZvaWNlQW5hbHl0aWNzUHJvY2Vzc29yQ29uZmlndXJhdGlvbjtcbiAgICB9XG4gIH1cblxuICAvLyB0eXBlIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiB0cnVlXG4gIHByaXZhdGUgX3R5cGU/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IHR5cGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCd0eXBlJyk7XG4gIH1cbiAgcHVibGljIHNldCB0eXBlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl90eXBlID0gdmFsdWU7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHR5cGVJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdHlwZTtcbiAgfVxuXG4gIC8vIGFtYXpvbl90cmFuc2NyaWJlX2NhbGxfYW5hbHl0aWNzX3Byb2Nlc3Nvcl9jb25maWd1cmF0aW9uIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2FtYXpvblRyYW5zY3JpYmVDYWxsQW5hbHl0aWNzUHJvY2Vzc29yQ29uZmlndXJhdGlvbiA9IG5ldyBDaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvbkVsZW1lbnRzQW1hem9uVHJhbnNjcmliZUNhbGxBbmFseXRpY3NQcm9jZXNzb3JDb25maWd1cmF0aW9uT3V0cHV0UmVmZXJlbmNlKHRoaXMsIFwiYW1hem9uX3RyYW5zY3JpYmVfY2FsbF9hbmFseXRpY3NfcHJvY2Vzc29yX2NvbmZpZ3VyYXRpb25cIik7XG4gIHB1YmxpYyBnZXQgYW1hem9uVHJhbnNjcmliZUNhbGxBbmFseXRpY3NQcm9jZXNzb3JDb25maWd1cmF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLl9hbWF6b25UcmFuc2NyaWJlQ2FsbEFuYWx5dGljc1Byb2Nlc3NvckNvbmZpZ3VyYXRpb247XG4gIH1cbiAgcHVibGljIHB1dEFtYXpvblRyYW5zY3JpYmVDYWxsQW5hbHl0aWNzUHJvY2Vzc29yQ29uZmlndXJhdGlvbih2YWx1ZTogQ2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb25FbGVtZW50c0FtYXpvblRyYW5zY3JpYmVDYWxsQW5hbHl0aWNzUHJvY2Vzc29yQ29uZmlndXJhdGlvbikge1xuICAgIHRoaXMuX2FtYXpvblRyYW5zY3JpYmVDYWxsQW5hbHl0aWNzUHJvY2Vzc29yQ29uZmlndXJhdGlvbi5pbnRlcm5hbFZhbHVlID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0QW1hem9uVHJhbnNjcmliZUNhbGxBbmFseXRpY3NQcm9jZXNzb3JDb25maWd1cmF0aW9uKCkge1xuICAgIHRoaXMuX2FtYXpvblRyYW5zY3JpYmVDYWxsQW5hbHl0aWNzUHJvY2Vzc29yQ29uZmlndXJhdGlvbi5pbnRlcm5hbFZhbHVlID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBhbWF6b25UcmFuc2NyaWJlQ2FsbEFuYWx5dGljc1Byb2Nlc3NvckNvbmZpZ3VyYXRpb25JbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fYW1hem9uVHJhbnNjcmliZUNhbGxBbmFseXRpY3NQcm9jZXNzb3JDb25maWd1cmF0aW9uLmludGVybmFsVmFsdWU7XG4gIH1cblxuICAvLyBhbWF6b25fdHJhbnNjcmliZV9wcm9jZXNzb3JfY29uZmlndXJhdGlvbiAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9hbWF6b25UcmFuc2NyaWJlUHJvY2Vzc29yQ29uZmlndXJhdGlvbiA9IG5ldyBDaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvbkVsZW1lbnRzQW1hem9uVHJhbnNjcmliZVByb2Nlc3NvckNvbmZpZ3VyYXRpb25PdXRwdXRSZWZlcmVuY2UodGhpcywgXCJhbWF6b25fdHJhbnNjcmliZV9wcm9jZXNzb3JfY29uZmlndXJhdGlvblwiKTtcbiAgcHVibGljIGdldCBhbWF6b25UcmFuc2NyaWJlUHJvY2Vzc29yQ29uZmlndXJhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5fYW1hem9uVHJhbnNjcmliZVByb2Nlc3NvckNvbmZpZ3VyYXRpb247XG4gIH1cbiAgcHVibGljIHB1dEFtYXpvblRyYW5zY3JpYmVQcm9jZXNzb3JDb25maWd1cmF0aW9uKHZhbHVlOiBDaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvbkVsZW1lbnRzQW1hem9uVHJhbnNjcmliZVByb2Nlc3NvckNvbmZpZ3VyYXRpb24pIHtcbiAgICB0aGlzLl9hbWF6b25UcmFuc2NyaWJlUHJvY2Vzc29yQ29uZmlndXJhdGlvbi5pbnRlcm5hbFZhbHVlID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0QW1hem9uVHJhbnNjcmliZVByb2Nlc3NvckNvbmZpZ3VyYXRpb24oKSB7XG4gICAgdGhpcy5fYW1hem9uVHJhbnNjcmliZVByb2Nlc3NvckNvbmZpZ3VyYXRpb24uaW50ZXJuYWxWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgYW1hem9uVHJhbnNjcmliZVByb2Nlc3NvckNvbmZpZ3VyYXRpb25JbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fYW1hem9uVHJhbnNjcmliZVByb2Nlc3NvckNvbmZpZ3VyYXRpb24uaW50ZXJuYWxWYWx1ZTtcbiAgfVxuXG4gIC8vIGtpbmVzaXNfZGF0YV9zdHJlYW1fc2lua19jb25maWd1cmF0aW9uIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2tpbmVzaXNEYXRhU3RyZWFtU2lua0NvbmZpZ3VyYXRpb24gPSBuZXcgQ2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb25FbGVtZW50c0tpbmVzaXNEYXRhU3RyZWFtU2lua0NvbmZpZ3VyYXRpb25PdXRwdXRSZWZlcmVuY2UodGhpcywgXCJraW5lc2lzX2RhdGFfc3RyZWFtX3NpbmtfY29uZmlndXJhdGlvblwiKTtcbiAgcHVibGljIGdldCBraW5lc2lzRGF0YVN0cmVhbVNpbmtDb25maWd1cmF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLl9raW5lc2lzRGF0YVN0cmVhbVNpbmtDb25maWd1cmF0aW9uO1xuICB9XG4gIHB1YmxpYyBwdXRLaW5lc2lzRGF0YVN0cmVhbVNpbmtDb25maWd1cmF0aW9uKHZhbHVlOiBDaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvbkVsZW1lbnRzS2luZXNpc0RhdGFTdHJlYW1TaW5rQ29uZmlndXJhdGlvbikge1xuICAgIHRoaXMuX2tpbmVzaXNEYXRhU3RyZWFtU2lua0NvbmZpZ3VyYXRpb24uaW50ZXJuYWxWYWx1ZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldEtpbmVzaXNEYXRhU3RyZWFtU2lua0NvbmZpZ3VyYXRpb24oKSB7XG4gICAgdGhpcy5fa2luZXNpc0RhdGFTdHJlYW1TaW5rQ29uZmlndXJhdGlvbi5pbnRlcm5hbFZhbHVlID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBraW5lc2lzRGF0YVN0cmVhbVNpbmtDb25maWd1cmF0aW9uSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2tpbmVzaXNEYXRhU3RyZWFtU2lua0NvbmZpZ3VyYXRpb24uaW50ZXJuYWxWYWx1ZTtcbiAgfVxuXG4gIC8vIGxhbWJkYV9mdW5jdGlvbl9zaW5rX2NvbmZpZ3VyYXRpb24gLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfbGFtYmRhRnVuY3Rpb25TaW5rQ29uZmlndXJhdGlvbiA9IG5ldyBDaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvbkVsZW1lbnRzTGFtYmRhRnVuY3Rpb25TaW5rQ29uZmlndXJhdGlvbk91dHB1dFJlZmVyZW5jZSh0aGlzLCBcImxhbWJkYV9mdW5jdGlvbl9zaW5rX2NvbmZpZ3VyYXRpb25cIik7XG4gIHB1YmxpYyBnZXQgbGFtYmRhRnVuY3Rpb25TaW5rQ29uZmlndXJhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5fbGFtYmRhRnVuY3Rpb25TaW5rQ29uZmlndXJhdGlvbjtcbiAgfVxuICBwdWJsaWMgcHV0TGFtYmRhRnVuY3Rpb25TaW5rQ29uZmlndXJhdGlvbih2YWx1ZTogQ2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb25FbGVtZW50c0xhbWJkYUZ1bmN0aW9uU2lua0NvbmZpZ3VyYXRpb24pIHtcbiAgICB0aGlzLl9sYW1iZGFGdW5jdGlvblNpbmtDb25maWd1cmF0aW9uLmludGVybmFsVmFsdWUgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRMYW1iZGFGdW5jdGlvblNpbmtDb25maWd1cmF0aW9uKCkge1xuICAgIHRoaXMuX2xhbWJkYUZ1bmN0aW9uU2lua0NvbmZpZ3VyYXRpb24uaW50ZXJuYWxWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgbGFtYmRhRnVuY3Rpb25TaW5rQ29uZmlndXJhdGlvbklucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9sYW1iZGFGdW5jdGlvblNpbmtDb25maWd1cmF0aW9uLmludGVybmFsVmFsdWU7XG4gIH1cblxuICAvLyBzM19yZWNvcmRpbmdfc2lua19jb25maWd1cmF0aW9uIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX3MzUmVjb3JkaW5nU2lua0NvbmZpZ3VyYXRpb24gPSBuZXcgQ2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb25FbGVtZW50c1MzUmVjb3JkaW5nU2lua0NvbmZpZ3VyYXRpb25PdXRwdXRSZWZlcmVuY2UodGhpcywgXCJzM19yZWNvcmRpbmdfc2lua19jb25maWd1cmF0aW9uXCIpO1xuICBwdWJsaWMgZ2V0IHMzUmVjb3JkaW5nU2lua0NvbmZpZ3VyYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuX3MzUmVjb3JkaW5nU2lua0NvbmZpZ3VyYXRpb247XG4gIH1cbiAgcHVibGljIHB1dFMzUmVjb3JkaW5nU2lua0NvbmZpZ3VyYXRpb24odmFsdWU6IENoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uRWxlbWVudHNTM1JlY29yZGluZ1NpbmtDb25maWd1cmF0aW9uKSB7XG4gICAgdGhpcy5fczNSZWNvcmRpbmdTaW5rQ29uZmlndXJhdGlvbi5pbnRlcm5hbFZhbHVlID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0UzNSZWNvcmRpbmdTaW5rQ29uZmlndXJhdGlvbigpIHtcbiAgICB0aGlzLl9zM1JlY29yZGluZ1NpbmtDb25maWd1cmF0aW9uLmludGVybmFsVmFsdWUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHMzUmVjb3JkaW5nU2lua0NvbmZpZ3VyYXRpb25JbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fczNSZWNvcmRpbmdTaW5rQ29uZmlndXJhdGlvbi5pbnRlcm5hbFZhbHVlO1xuICB9XG5cbiAgLy8gc25zX3RvcGljX3NpbmtfY29uZmlndXJhdGlvbiAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9zbnNUb3BpY1NpbmtDb25maWd1cmF0aW9uID0gbmV3IENoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uRWxlbWVudHNTbnNUb3BpY1NpbmtDb25maWd1cmF0aW9uT3V0cHV0UmVmZXJlbmNlKHRoaXMsIFwic25zX3RvcGljX3NpbmtfY29uZmlndXJhdGlvblwiKTtcbiAgcHVibGljIGdldCBzbnNUb3BpY1NpbmtDb25maWd1cmF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLl9zbnNUb3BpY1NpbmtDb25maWd1cmF0aW9uO1xuICB9XG4gIHB1YmxpYyBwdXRTbnNUb3BpY1NpbmtDb25maWd1cmF0aW9uKHZhbHVlOiBDaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvbkVsZW1lbnRzU25zVG9waWNTaW5rQ29uZmlndXJhdGlvbikge1xuICAgIHRoaXMuX3Nuc1RvcGljU2lua0NvbmZpZ3VyYXRpb24uaW50ZXJuYWxWYWx1ZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldFNuc1RvcGljU2lua0NvbmZpZ3VyYXRpb24oKSB7XG4gICAgdGhpcy5fc25zVG9waWNTaW5rQ29uZmlndXJhdGlvbi5pbnRlcm5hbFZhbHVlID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBzbnNUb3BpY1NpbmtDb25maWd1cmF0aW9uSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Nuc1RvcGljU2lua0NvbmZpZ3VyYXRpb24uaW50ZXJuYWxWYWx1ZTtcbiAgfVxuXG4gIC8vIHNxc19xdWV1ZV9zaW5rX2NvbmZpZ3VyYXRpb24gLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfc3FzUXVldWVTaW5rQ29uZmlndXJhdGlvbiA9IG5ldyBDaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvbkVsZW1lbnRzU3FzUXVldWVTaW5rQ29uZmlndXJhdGlvbk91dHB1dFJlZmVyZW5jZSh0aGlzLCBcInNxc19xdWV1ZV9zaW5rX2NvbmZpZ3VyYXRpb25cIik7XG4gIHB1YmxpYyBnZXQgc3FzUXVldWVTaW5rQ29uZmlndXJhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5fc3FzUXVldWVTaW5rQ29uZmlndXJhdGlvbjtcbiAgfVxuICBwdWJsaWMgcHV0U3FzUXVldWVTaW5rQ29uZmlndXJhdGlvbih2YWx1ZTogQ2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb25FbGVtZW50c1Nxc1F1ZXVlU2lua0NvbmZpZ3VyYXRpb24pIHtcbiAgICB0aGlzLl9zcXNRdWV1ZVNpbmtDb25maWd1cmF0aW9uLmludGVybmFsVmFsdWUgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRTcXNRdWV1ZVNpbmtDb25maWd1cmF0aW9uKCkge1xuICAgIHRoaXMuX3Nxc1F1ZXVlU2lua0NvbmZpZ3VyYXRpb24uaW50ZXJuYWxWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgc3FzUXVldWVTaW5rQ29uZmlndXJhdGlvbklucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9zcXNRdWV1ZVNpbmtDb25maWd1cmF0aW9uLmludGVybmFsVmFsdWU7XG4gIH1cblxuICAvLyB2b2ljZV9hbmFseXRpY3NfcHJvY2Vzc29yX2NvbmZpZ3VyYXRpb24gLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfdm9pY2VBbmFseXRpY3NQcm9jZXNzb3JDb25maWd1cmF0aW9uID0gbmV3IENoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uRWxlbWVudHNWb2ljZUFuYWx5dGljc1Byb2Nlc3NvckNvbmZpZ3VyYXRpb25PdXRwdXRSZWZlcmVuY2UodGhpcywgXCJ2b2ljZV9hbmFseXRpY3NfcHJvY2Vzc29yX2NvbmZpZ3VyYXRpb25cIik7XG4gIHB1YmxpYyBnZXQgdm9pY2VBbmFseXRpY3NQcm9jZXNzb3JDb25maWd1cmF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLl92b2ljZUFuYWx5dGljc1Byb2Nlc3NvckNvbmZpZ3VyYXRpb247XG4gIH1cbiAgcHVibGljIHB1dFZvaWNlQW5hbHl0aWNzUHJvY2Vzc29yQ29uZmlndXJhdGlvbih2YWx1ZTogQ2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb25FbGVtZW50c1ZvaWNlQW5hbHl0aWNzUHJvY2Vzc29yQ29uZmlndXJhdGlvbikge1xuICAgIHRoaXMuX3ZvaWNlQW5hbHl0aWNzUHJvY2Vzc29yQ29uZmlndXJhdGlvbi5pbnRlcm5hbFZhbHVlID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0Vm9pY2VBbmFseXRpY3NQcm9jZXNzb3JDb25maWd1cmF0aW9uKCkge1xuICAgIHRoaXMuX3ZvaWNlQW5hbHl0aWNzUHJvY2Vzc29yQ29uZmlndXJhdGlvbi5pbnRlcm5hbFZhbHVlID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCB2b2ljZUFuYWx5dGljc1Byb2Nlc3NvckNvbmZpZ3VyYXRpb25JbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdm9pY2VBbmFseXRpY3NQcm9jZXNzb3JDb25maWd1cmF0aW9uLmludGVybmFsVmFsdWU7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIENoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uRWxlbWVudHNMaXN0IGV4dGVuZHMgY2RrdGYuQ29tcGxleExpc3Qge1xuICBwdWJsaWMgaW50ZXJuYWxWYWx1ZT8gOiBDaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvbkVsZW1lbnRzW10gfCBjZGt0Zi5JUmVzb2x2YWJsZVxuXG4gIC8qKlxuICAqIEBwYXJhbSB0ZXJyYWZvcm1SZXNvdXJjZSBUaGUgcGFyZW50IHJlc291cmNlXG4gICogQHBhcmFtIHRlcnJhZm9ybUF0dHJpYnV0ZSBUaGUgYXR0cmlidXRlIG9uIHRoZSBwYXJlbnQgcmVzb3VyY2UgdGhpcyBjbGFzcyBpcyByZWZlcmVuY2luZ1xuICAqIEBwYXJhbSB3cmFwc1NldCB3aGV0aGVyIHRoZSBsaXN0IGlzIHdyYXBwaW5nIGEgc2V0ICh3aWxsIGFkZCB0b2xpc3QoKSB0byBiZSBhYmxlIHRvIGFjY2VzcyBhbiBpdGVtIHZpYSBhbiBpbmRleClcbiAgKi9cbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIHRlcnJhZm9ybVJlc291cmNlOiBjZGt0Zi5JSW50ZXJwb2xhdGluZ1BhcmVudCwgcHJvdGVjdGVkIHRlcnJhZm9ybUF0dHJpYnV0ZTogc3RyaW5nLCBwcm90ZWN0ZWQgd3JhcHNTZXQ6IGJvb2xlYW4pIHtcbiAgICBzdXBlcih0ZXJyYWZvcm1SZXNvdXJjZSwgdGVycmFmb3JtQXR0cmlidXRlLCB3cmFwc1NldClcbiAgfVxuXG4gIC8qKlxuICAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggb2YgdGhlIGl0ZW0gdG8gcmV0dXJuXG4gICovXG4gIHB1YmxpYyBnZXQoaW5kZXg6IG51bWJlcik6IENoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uRWxlbWVudHNPdXRwdXRSZWZlcmVuY2Uge1xuICAgIHJldHVybiBuZXcgQ2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb25FbGVtZW50c091dHB1dFJlZmVyZW5jZSh0aGlzLnRlcnJhZm9ybVJlc291cmNlLCB0aGlzLnRlcnJhZm9ybUF0dHJpYnV0ZSwgaW5kZXgsIHRoaXMud3JhcHNTZXQpO1xuICB9XG59XG5leHBvcnQgaW50ZXJmYWNlIENoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uUmVhbFRpbWVBbGVydENvbmZpZ3VyYXRpb25SdWxlc0lzc3VlRGV0ZWN0aW9uQ29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9hd3MvNS44NC4wL2RvY3MvcmVzb3VyY2VzL2NoaW1lc2RrbWVkaWFwaXBlbGluZXNfbWVkaWFfaW5zaWdodHNfcGlwZWxpbmVfY29uZmlndXJhdGlvbiNydWxlX25hbWUgQ2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb24jcnVsZV9uYW1lfVxuICAqL1xuICByZWFkb25seSBydWxlTmFtZTogc3RyaW5nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb25SZWFsVGltZUFsZXJ0Q29uZmlndXJhdGlvblJ1bGVzSXNzdWVEZXRlY3Rpb25Db25maWd1cmF0aW9uVG9UZXJyYWZvcm0oc3RydWN0PzogQ2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb25SZWFsVGltZUFsZXJ0Q29uZmlndXJhdGlvblJ1bGVzSXNzdWVEZXRlY3Rpb25Db25maWd1cmF0aW9uT3V0cHV0UmVmZXJlbmNlIHwgQ2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb25SZWFsVGltZUFsZXJ0Q29uZmlndXJhdGlvblJ1bGVzSXNzdWVEZXRlY3Rpb25Db25maWd1cmF0aW9uKTogYW55IHtcbiAgaWYgKCFjZGt0Zi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdGYuVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RmLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIHJ1bGVfbmFtZTogY2RrdGYuc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS5ydWxlTmFtZSksXG4gIH1cbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gY2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb25SZWFsVGltZUFsZXJ0Q29uZmlndXJhdGlvblJ1bGVzSXNzdWVEZXRlY3Rpb25Db25maWd1cmF0aW9uVG9IY2xUZXJyYWZvcm0oc3RydWN0PzogQ2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb25SZWFsVGltZUFsZXJ0Q29uZmlndXJhdGlvblJ1bGVzSXNzdWVEZXRlY3Rpb25Db25maWd1cmF0aW9uT3V0cHV0UmVmZXJlbmNlIHwgQ2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb25SZWFsVGltZUFsZXJ0Q29uZmlndXJhdGlvblJ1bGVzSXNzdWVEZXRlY3Rpb25Db25maWd1cmF0aW9uKTogYW55IHtcbiAgaWYgKCFjZGt0Zi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdGYuVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RmLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICBjb25zdCBhdHRycyA9IHtcbiAgICBydWxlX25hbWU6IHtcbiAgICAgIHZhbHVlOiBjZGt0Zi5zdHJpbmdUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLnJ1bGVOYW1lKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgfTtcblxuICAvLyByZW1vdmUgdW5kZWZpbmVkIGF0dHJpYnV0ZXNcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhdHRycykuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWQpKTtcbn1cblxuZXhwb3J0IGNsYXNzIENoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uUmVhbFRpbWVBbGVydENvbmZpZ3VyYXRpb25SdWxlc0lzc3VlRGV0ZWN0aW9uQ29uZmlndXJhdGlvbk91dHB1dFJlZmVyZW5jZSBleHRlbmRzIGNka3RmLkNvbXBsZXhPYmplY3Qge1xuICBwcml2YXRlIGlzRW1wdHlPYmplY3QgPSBmYWxzZTtcblxuICAvKipcbiAgKiBAcGFyYW0gdGVycmFmb3JtUmVzb3VyY2UgVGhlIHBhcmVudCByZXNvdXJjZVxuICAqIEBwYXJhbSB0ZXJyYWZvcm1BdHRyaWJ1dGUgVGhlIGF0dHJpYnV0ZSBvbiB0aGUgcGFyZW50IHJlc291cmNlIHRoaXMgY2xhc3MgaXMgcmVmZXJlbmNpbmdcbiAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHRlcnJhZm9ybVJlc291cmNlOiBjZGt0Zi5JSW50ZXJwb2xhdGluZ1BhcmVudCwgdGVycmFmb3JtQXR0cmlidXRlOiBzdHJpbmcpIHtcbiAgICBzdXBlcih0ZXJyYWZvcm1SZXNvdXJjZSwgdGVycmFmb3JtQXR0cmlidXRlLCBmYWxzZSwgMCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGludGVybmFsVmFsdWUoKTogQ2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb25SZWFsVGltZUFsZXJ0Q29uZmlndXJhdGlvblJ1bGVzSXNzdWVEZXRlY3Rpb25Db25maWd1cmF0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgaGFzQW55VmFsdWVzID0gdGhpcy5pc0VtcHR5T2JqZWN0O1xuICAgIGNvbnN0IGludGVybmFsVmFsdWVSZXN1bHQ6IGFueSA9IHt9O1xuICAgIGlmICh0aGlzLl9ydWxlTmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5ydWxlTmFtZSA9IHRoaXMuX3J1bGVOYW1lO1xuICAgIH1cbiAgICByZXR1cm4gaGFzQW55VmFsdWVzID8gaW50ZXJuYWxWYWx1ZVJlc3VsdCA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgaW50ZXJuYWxWYWx1ZSh2YWx1ZTogQ2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb25SZWFsVGltZUFsZXJ0Q29uZmlndXJhdGlvblJ1bGVzSXNzdWVEZXRlY3Rpb25Db25maWd1cmF0aW9uIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuICAgICAgdGhpcy5fcnVsZU5hbWUgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA9PT0gMDtcbiAgICAgIHRoaXMuX3J1bGVOYW1lID0gdmFsdWUucnVsZU5hbWU7XG4gICAgfVxuICB9XG5cbiAgLy8gcnVsZV9uYW1lIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiB0cnVlXG4gIHByaXZhdGUgX3J1bGVOYW1lPzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBydWxlTmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ3J1bGVfbmFtZScpO1xuICB9XG4gIHB1YmxpYyBzZXQgcnVsZU5hbWUodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX3J1bGVOYW1lID0gdmFsdWU7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHJ1bGVOYW1lSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3J1bGVOYW1lO1xuICB9XG59XG5leHBvcnQgaW50ZXJmYWNlIENoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uUmVhbFRpbWVBbGVydENvbmZpZ3VyYXRpb25SdWxlc0tleXdvcmRNYXRjaENvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXdzLzUuODQuMC9kb2NzL3Jlc291cmNlcy9jaGltZXNka21lZGlhcGlwZWxpbmVzX21lZGlhX2luc2lnaHRzX3BpcGVsaW5lX2NvbmZpZ3VyYXRpb24ja2V5d29yZHMgQ2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb24ja2V5d29yZHN9XG4gICovXG4gIHJlYWRvbmx5IGtleXdvcmRzOiBzdHJpbmdbXTtcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F3cy81Ljg0LjAvZG9jcy9yZXNvdXJjZXMvY2hpbWVzZGttZWRpYXBpcGVsaW5lc19tZWRpYV9pbnNpZ2h0c19waXBlbGluZV9jb25maWd1cmF0aW9uI25lZ2F0ZSBDaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvbiNuZWdhdGV9XG4gICovXG4gIHJlYWRvbmx5IG5lZ2F0ZT86IGJvb2xlYW4gfCBjZGt0Zi5JUmVzb2x2YWJsZTtcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F3cy81Ljg0LjAvZG9jcy9yZXNvdXJjZXMvY2hpbWVzZGttZWRpYXBpcGVsaW5lc19tZWRpYV9pbnNpZ2h0c19waXBlbGluZV9jb25maWd1cmF0aW9uI3J1bGVfbmFtZSBDaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvbiNydWxlX25hbWV9XG4gICovXG4gIHJlYWRvbmx5IHJ1bGVOYW1lOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvblJlYWxUaW1lQWxlcnRDb25maWd1cmF0aW9uUnVsZXNLZXl3b3JkTWF0Y2hDb25maWd1cmF0aW9uVG9UZXJyYWZvcm0oc3RydWN0PzogQ2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb25SZWFsVGltZUFsZXJ0Q29uZmlndXJhdGlvblJ1bGVzS2V5d29yZE1hdGNoQ29uZmlndXJhdGlvbk91dHB1dFJlZmVyZW5jZSB8IENoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uUmVhbFRpbWVBbGVydENvbmZpZ3VyYXRpb25SdWxlc0tleXdvcmRNYXRjaENvbmZpZ3VyYXRpb24pOiBhbnkge1xuICBpZiAoIWNka3RmLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0Zi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdGYuaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIHJldHVybiB7XG4gICAga2V5d29yZHM6IGNka3RmLmxpc3RNYXBwZXIoY2RrdGYuc3RyaW5nVG9UZXJyYWZvcm0sIGZhbHNlKShzdHJ1Y3QhLmtleXdvcmRzKSxcbiAgICBuZWdhdGU6IGNka3RmLmJvb2xlYW5Ub1RlcnJhZm9ybShzdHJ1Y3QhLm5lZ2F0ZSksXG4gICAgcnVsZV9uYW1lOiBjZGt0Zi5zdHJpbmdUb1RlcnJhZm9ybShzdHJ1Y3QhLnJ1bGVOYW1lKSxcbiAgfVxufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBjaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvblJlYWxUaW1lQWxlcnRDb25maWd1cmF0aW9uUnVsZXNLZXl3b3JkTWF0Y2hDb25maWd1cmF0aW9uVG9IY2xUZXJyYWZvcm0oc3RydWN0PzogQ2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb25SZWFsVGltZUFsZXJ0Q29uZmlndXJhdGlvblJ1bGVzS2V5d29yZE1hdGNoQ29uZmlndXJhdGlvbk91dHB1dFJlZmVyZW5jZSB8IENoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uUmVhbFRpbWVBbGVydENvbmZpZ3VyYXRpb25SdWxlc0tleXdvcmRNYXRjaENvbmZpZ3VyYXRpb24pOiBhbnkge1xuICBpZiAoIWNka3RmLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0Zi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdGYuaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIGNvbnN0IGF0dHJzID0ge1xuICAgIGtleXdvcmRzOiB7XG4gICAgICB2YWx1ZTogY2RrdGYubGlzdE1hcHBlckhjbChjZGt0Zi5zdHJpbmdUb0hjbFRlcnJhZm9ybSwgZmFsc2UpKHN0cnVjdCEua2V5d29yZHMpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nTGlzdFwiLFxuICAgIH0sXG4gICAgbmVnYXRlOiB7XG4gICAgICB2YWx1ZTogY2RrdGYuYm9vbGVhblRvSGNsVGVycmFmb3JtKHN0cnVjdCEubmVnYXRlKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwiYm9vbGVhblwiLFxuICAgIH0sXG4gICAgcnVsZV9uYW1lOiB7XG4gICAgICB2YWx1ZTogY2RrdGYuc3RyaW5nVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5ydWxlTmFtZSksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgIH0sXG4gIH07XG5cbiAgLy8gcmVtb3ZlIHVuZGVmaW5lZCBhdHRyaWJ1dGVzXG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoYXR0cnMpLmZpbHRlcigoW18sIHZhbHVlXSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZS52YWx1ZSAhPT0gdW5kZWZpbmVkKSk7XG59XG5cbmV4cG9ydCBjbGFzcyBDaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvblJlYWxUaW1lQWxlcnRDb25maWd1cmF0aW9uUnVsZXNLZXl3b3JkTWF0Y2hDb25maWd1cmF0aW9uT3V0cHV0UmVmZXJlbmNlIGV4dGVuZHMgY2RrdGYuQ29tcGxleE9iamVjdCB7XG4gIHByaXZhdGUgaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuXG4gIC8qKlxuICAqIEBwYXJhbSB0ZXJyYWZvcm1SZXNvdXJjZSBUaGUgcGFyZW50IHJlc291cmNlXG4gICogQHBhcmFtIHRlcnJhZm9ybUF0dHJpYnV0ZSBUaGUgYXR0cmlidXRlIG9uIHRoZSBwYXJlbnQgcmVzb3VyY2UgdGhpcyBjbGFzcyBpcyByZWZlcmVuY2luZ1xuICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IodGVycmFmb3JtUmVzb3VyY2U6IGNka3RmLklJbnRlcnBvbGF0aW5nUGFyZW50LCB0ZXJyYWZvcm1BdHRyaWJ1dGU6IHN0cmluZykge1xuICAgIHN1cGVyKHRlcnJhZm9ybVJlc291cmNlLCB0ZXJyYWZvcm1BdHRyaWJ1dGUsIGZhbHNlLCAwKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW50ZXJuYWxWYWx1ZSgpOiBDaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvblJlYWxUaW1lQWxlcnRDb25maWd1cmF0aW9uUnVsZXNLZXl3b3JkTWF0Y2hDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgaGFzQW55VmFsdWVzID0gdGhpcy5pc0VtcHR5T2JqZWN0O1xuICAgIGNvbnN0IGludGVybmFsVmFsdWVSZXN1bHQ6IGFueSA9IHt9O1xuICAgIGlmICh0aGlzLl9rZXl3b3JkcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5rZXl3b3JkcyA9IHRoaXMuX2tleXdvcmRzO1xuICAgIH1cbiAgICBpZiAodGhpcy5fbmVnYXRlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0Lm5lZ2F0ZSA9IHRoaXMuX25lZ2F0ZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3J1bGVOYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LnJ1bGVOYW1lID0gdGhpcy5fcnVsZU5hbWU7XG4gICAgfVxuICAgIHJldHVybiBoYXNBbnlWYWx1ZXMgPyBpbnRlcm5hbFZhbHVlUmVzdWx0IDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHNldCBpbnRlcm5hbFZhbHVlKHZhbHVlOiBDaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvblJlYWxUaW1lQWxlcnRDb25maWd1cmF0aW9uUnVsZXNLZXl3b3JkTWF0Y2hDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuICAgICAgdGhpcy5fa2V5d29yZHMgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9uZWdhdGUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9ydWxlTmFtZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSAwO1xuICAgICAgdGhpcy5fa2V5d29yZHMgPSB2YWx1ZS5rZXl3b3JkcztcbiAgICAgIHRoaXMuX25lZ2F0ZSA9IHZhbHVlLm5lZ2F0ZTtcbiAgICAgIHRoaXMuX3J1bGVOYW1lID0gdmFsdWUucnVsZU5hbWU7XG4gICAgfVxuICB9XG5cbiAgLy8ga2V5d29yZHMgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfa2V5d29yZHM/OiBzdHJpbmdbXTsgXG4gIHB1YmxpYyBnZXQga2V5d29yZHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TGlzdEF0dHJpYnV0ZSgna2V5d29yZHMnKTtcbiAgfVxuICBwdWJsaWMgc2V0IGtleXdvcmRzKHZhbHVlOiBzdHJpbmdbXSkge1xuICAgIHRoaXMuX2tleXdvcmRzID0gdmFsdWU7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGtleXdvcmRzSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2tleXdvcmRzO1xuICB9XG5cbiAgLy8gbmVnYXRlIC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfbmVnYXRlPzogYm9vbGVhbiB8IGNka3RmLklSZXNvbHZhYmxlOyBcbiAgcHVibGljIGdldCBuZWdhdGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Qm9vbGVhbkF0dHJpYnV0ZSgnbmVnYXRlJyk7XG4gIH1cbiAgcHVibGljIHNldCBuZWdhdGUodmFsdWU6IGJvb2xlYW4gfCBjZGt0Zi5JUmVzb2x2YWJsZSkge1xuICAgIHRoaXMuX25lZ2F0ZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldE5lZ2F0ZSgpIHtcbiAgICB0aGlzLl9uZWdhdGUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IG5lZ2F0ZUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9uZWdhdGU7XG4gIH1cblxuICAvLyBydWxlX25hbWUgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfcnVsZU5hbWU/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IHJ1bGVOYW1lKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgncnVsZV9uYW1lJyk7XG4gIH1cbiAgcHVibGljIHNldCBydWxlTmFtZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fcnVsZU5hbWUgPSB2YWx1ZTtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgcnVsZU5hbWVJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcnVsZU5hbWU7XG4gIH1cbn1cbmV4cG9ydCBpbnRlcmZhY2UgQ2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb25SZWFsVGltZUFsZXJ0Q29uZmlndXJhdGlvblJ1bGVzU2VudGltZW50Q29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9hd3MvNS44NC4wL2RvY3MvcmVzb3VyY2VzL2NoaW1lc2RrbWVkaWFwaXBlbGluZXNfbWVkaWFfaW5zaWdodHNfcGlwZWxpbmVfY29uZmlndXJhdGlvbiNydWxlX25hbWUgQ2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb24jcnVsZV9uYW1lfVxuICAqL1xuICByZWFkb25seSBydWxlTmFtZTogc3RyaW5nO1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXdzLzUuODQuMC9kb2NzL3Jlc291cmNlcy9jaGltZXNka21lZGlhcGlwZWxpbmVzX21lZGlhX2luc2lnaHRzX3BpcGVsaW5lX2NvbmZpZ3VyYXRpb24jc2VudGltZW50X3R5cGUgQ2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb24jc2VudGltZW50X3R5cGV9XG4gICovXG4gIHJlYWRvbmx5IHNlbnRpbWVudFR5cGU6IHN0cmluZztcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F3cy81Ljg0LjAvZG9jcy9yZXNvdXJjZXMvY2hpbWVzZGttZWRpYXBpcGVsaW5lc19tZWRpYV9pbnNpZ2h0c19waXBlbGluZV9jb25maWd1cmF0aW9uI3RpbWVfcGVyaW9kIENoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uI3RpbWVfcGVyaW9kfVxuICAqL1xuICByZWFkb25seSB0aW1lUGVyaW9kOiBudW1iZXI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvblJlYWxUaW1lQWxlcnRDb25maWd1cmF0aW9uUnVsZXNTZW50aW1lbnRDb25maWd1cmF0aW9uVG9UZXJyYWZvcm0oc3RydWN0PzogQ2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb25SZWFsVGltZUFsZXJ0Q29uZmlndXJhdGlvblJ1bGVzU2VudGltZW50Q29uZmlndXJhdGlvbk91dHB1dFJlZmVyZW5jZSB8IENoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uUmVhbFRpbWVBbGVydENvbmZpZ3VyYXRpb25SdWxlc1NlbnRpbWVudENvbmZpZ3VyYXRpb24pOiBhbnkge1xuICBpZiAoIWNka3RmLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0Zi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdGYuaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIHJldHVybiB7XG4gICAgcnVsZV9uYW1lOiBjZGt0Zi5zdHJpbmdUb1RlcnJhZm9ybShzdHJ1Y3QhLnJ1bGVOYW1lKSxcbiAgICBzZW50aW1lbnRfdHlwZTogY2RrdGYuc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS5zZW50aW1lbnRUeXBlKSxcbiAgICB0aW1lX3BlcmlvZDogY2RrdGYubnVtYmVyVG9UZXJyYWZvcm0oc3RydWN0IS50aW1lUGVyaW9kKSxcbiAgfVxufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBjaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvblJlYWxUaW1lQWxlcnRDb25maWd1cmF0aW9uUnVsZXNTZW50aW1lbnRDb25maWd1cmF0aW9uVG9IY2xUZXJyYWZvcm0oc3RydWN0PzogQ2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb25SZWFsVGltZUFsZXJ0Q29uZmlndXJhdGlvblJ1bGVzU2VudGltZW50Q29uZmlndXJhdGlvbk91dHB1dFJlZmVyZW5jZSB8IENoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uUmVhbFRpbWVBbGVydENvbmZpZ3VyYXRpb25SdWxlc1NlbnRpbWVudENvbmZpZ3VyYXRpb24pOiBhbnkge1xuICBpZiAoIWNka3RmLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0Zi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdGYuaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIGNvbnN0IGF0dHJzID0ge1xuICAgIHJ1bGVfbmFtZToge1xuICAgICAgdmFsdWU6IGNka3RmLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEucnVsZU5hbWUpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICB9LFxuICAgIHNlbnRpbWVudF90eXBlOiB7XG4gICAgICB2YWx1ZTogY2RrdGYuc3RyaW5nVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5zZW50aW1lbnRUeXBlKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgICB0aW1lX3BlcmlvZDoge1xuICAgICAgdmFsdWU6IGNka3RmLm51bWJlclRvSGNsVGVycmFmb3JtKHN0cnVjdCEudGltZVBlcmlvZCksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIm51bWJlclwiLFxuICAgIH0sXG4gIH07XG5cbiAgLy8gcmVtb3ZlIHVuZGVmaW5lZCBhdHRyaWJ1dGVzXG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoYXR0cnMpLmZpbHRlcigoW18sIHZhbHVlXSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZS52YWx1ZSAhPT0gdW5kZWZpbmVkKSk7XG59XG5cbmV4cG9ydCBjbGFzcyBDaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvblJlYWxUaW1lQWxlcnRDb25maWd1cmF0aW9uUnVsZXNTZW50aW1lbnRDb25maWd1cmF0aW9uT3V0cHV0UmVmZXJlbmNlIGV4dGVuZHMgY2RrdGYuQ29tcGxleE9iamVjdCB7XG4gIHByaXZhdGUgaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuXG4gIC8qKlxuICAqIEBwYXJhbSB0ZXJyYWZvcm1SZXNvdXJjZSBUaGUgcGFyZW50IHJlc291cmNlXG4gICogQHBhcmFtIHRlcnJhZm9ybUF0dHJpYnV0ZSBUaGUgYXR0cmlidXRlIG9uIHRoZSBwYXJlbnQgcmVzb3VyY2UgdGhpcyBjbGFzcyBpcyByZWZlcmVuY2luZ1xuICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IodGVycmFmb3JtUmVzb3VyY2U6IGNka3RmLklJbnRlcnBvbGF0aW5nUGFyZW50LCB0ZXJyYWZvcm1BdHRyaWJ1dGU6IHN0cmluZykge1xuICAgIHN1cGVyKHRlcnJhZm9ybVJlc291cmNlLCB0ZXJyYWZvcm1BdHRyaWJ1dGUsIGZhbHNlLCAwKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW50ZXJuYWxWYWx1ZSgpOiBDaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvblJlYWxUaW1lQWxlcnRDb25maWd1cmF0aW9uUnVsZXNTZW50aW1lbnRDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgaGFzQW55VmFsdWVzID0gdGhpcy5pc0VtcHR5T2JqZWN0O1xuICAgIGNvbnN0IGludGVybmFsVmFsdWVSZXN1bHQ6IGFueSA9IHt9O1xuICAgIGlmICh0aGlzLl9ydWxlTmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5ydWxlTmFtZSA9IHRoaXMuX3J1bGVOYW1lO1xuICAgIH1cbiAgICBpZiAodGhpcy5fc2VudGltZW50VHlwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5zZW50aW1lbnRUeXBlID0gdGhpcy5fc2VudGltZW50VHlwZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3RpbWVQZXJpb2QgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQudGltZVBlcmlvZCA9IHRoaXMuX3RpbWVQZXJpb2Q7XG4gICAgfVxuICAgIHJldHVybiBoYXNBbnlWYWx1ZXMgPyBpbnRlcm5hbFZhbHVlUmVzdWx0IDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHNldCBpbnRlcm5hbFZhbHVlKHZhbHVlOiBDaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvblJlYWxUaW1lQWxlcnRDb25maWd1cmF0aW9uUnVsZXNTZW50aW1lbnRDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuICAgICAgdGhpcy5fcnVsZU5hbWUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9zZW50aW1lbnRUeXBlID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fdGltZVBlcmlvZCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSAwO1xuICAgICAgdGhpcy5fcnVsZU5hbWUgPSB2YWx1ZS5ydWxlTmFtZTtcbiAgICAgIHRoaXMuX3NlbnRpbWVudFR5cGUgPSB2YWx1ZS5zZW50aW1lbnRUeXBlO1xuICAgICAgdGhpcy5fdGltZVBlcmlvZCA9IHZhbHVlLnRpbWVQZXJpb2Q7XG4gICAgfVxuICB9XG5cbiAgLy8gcnVsZV9uYW1lIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiB0cnVlXG4gIHByaXZhdGUgX3J1bGVOYW1lPzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBydWxlTmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ3J1bGVfbmFtZScpO1xuICB9XG4gIHB1YmxpYyBzZXQgcnVsZU5hbWUodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX3J1bGVOYW1lID0gdmFsdWU7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHJ1bGVOYW1lSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3J1bGVOYW1lO1xuICB9XG5cbiAgLy8gc2VudGltZW50X3R5cGUgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfc2VudGltZW50VHlwZT86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgc2VudGltZW50VHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ3NlbnRpbWVudF90eXBlJyk7XG4gIH1cbiAgcHVibGljIHNldCBzZW50aW1lbnRUeXBlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9zZW50aW1lbnRUeXBlID0gdmFsdWU7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHNlbnRpbWVudFR5cGVJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fc2VudGltZW50VHlwZTtcbiAgfVxuXG4gIC8vIHRpbWVfcGVyaW9kIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiB0cnVlXG4gIHByaXZhdGUgX3RpbWVQZXJpb2Q/OiBudW1iZXI7IFxuICBwdWJsaWMgZ2V0IHRpbWVQZXJpb2QoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TnVtYmVyQXR0cmlidXRlKCd0aW1lX3BlcmlvZCcpO1xuICB9XG4gIHB1YmxpYyBzZXQgdGltZVBlcmlvZCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fdGltZVBlcmlvZCA9IHZhbHVlO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCB0aW1lUGVyaW9kSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RpbWVQZXJpb2Q7XG4gIH1cbn1cbmV4cG9ydCBpbnRlcmZhY2UgQ2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb25SZWFsVGltZUFsZXJ0Q29uZmlndXJhdGlvblJ1bGVzIHtcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F3cy81Ljg0LjAvZG9jcy9yZXNvdXJjZXMvY2hpbWVzZGttZWRpYXBpcGVsaW5lc19tZWRpYV9pbnNpZ2h0c19waXBlbGluZV9jb25maWd1cmF0aW9uI3R5cGUgQ2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb24jdHlwZX1cbiAgKi9cbiAgcmVhZG9ubHkgdHlwZTogc3RyaW5nO1xuICAvKipcbiAgKiBpc3N1ZV9kZXRlY3Rpb25fY29uZmlndXJhdGlvbiBibG9ja1xuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F3cy81Ljg0LjAvZG9jcy9yZXNvdXJjZXMvY2hpbWVzZGttZWRpYXBpcGVsaW5lc19tZWRpYV9pbnNpZ2h0c19waXBlbGluZV9jb25maWd1cmF0aW9uI2lzc3VlX2RldGVjdGlvbl9jb25maWd1cmF0aW9uIENoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uI2lzc3VlX2RldGVjdGlvbl9jb25maWd1cmF0aW9ufVxuICAqL1xuICByZWFkb25seSBpc3N1ZURldGVjdGlvbkNvbmZpZ3VyYXRpb24/OiBDaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvblJlYWxUaW1lQWxlcnRDb25maWd1cmF0aW9uUnVsZXNJc3N1ZURldGVjdGlvbkNvbmZpZ3VyYXRpb247XG4gIC8qKlxuICAqIGtleXdvcmRfbWF0Y2hfY29uZmlndXJhdGlvbiBibG9ja1xuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F3cy81Ljg0LjAvZG9jcy9yZXNvdXJjZXMvY2hpbWVzZGttZWRpYXBpcGVsaW5lc19tZWRpYV9pbnNpZ2h0c19waXBlbGluZV9jb25maWd1cmF0aW9uI2tleXdvcmRfbWF0Y2hfY29uZmlndXJhdGlvbiBDaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvbiNrZXl3b3JkX21hdGNoX2NvbmZpZ3VyYXRpb259XG4gICovXG4gIHJlYWRvbmx5IGtleXdvcmRNYXRjaENvbmZpZ3VyYXRpb24/OiBDaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvblJlYWxUaW1lQWxlcnRDb25maWd1cmF0aW9uUnVsZXNLZXl3b3JkTWF0Y2hDb25maWd1cmF0aW9uO1xuICAvKipcbiAgKiBzZW50aW1lbnRfY29uZmlndXJhdGlvbiBibG9ja1xuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F3cy81Ljg0LjAvZG9jcy9yZXNvdXJjZXMvY2hpbWVzZGttZWRpYXBpcGVsaW5lc19tZWRpYV9pbnNpZ2h0c19waXBlbGluZV9jb25maWd1cmF0aW9uI3NlbnRpbWVudF9jb25maWd1cmF0aW9uIENoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uI3NlbnRpbWVudF9jb25maWd1cmF0aW9ufVxuICAqL1xuICByZWFkb25seSBzZW50aW1lbnRDb25maWd1cmF0aW9uPzogQ2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb25SZWFsVGltZUFsZXJ0Q29uZmlndXJhdGlvblJ1bGVzU2VudGltZW50Q29uZmlndXJhdGlvbjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uUmVhbFRpbWVBbGVydENvbmZpZ3VyYXRpb25SdWxlc1RvVGVycmFmb3JtKHN0cnVjdD86IENoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uUmVhbFRpbWVBbGVydENvbmZpZ3VyYXRpb25SdWxlcyB8IGNka3RmLklSZXNvbHZhYmxlKTogYW55IHtcbiAgaWYgKCFjZGt0Zi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdGYuVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RmLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIHR5cGU6IGNka3RmLnN0cmluZ1RvVGVycmFmb3JtKHN0cnVjdCEudHlwZSksXG4gICAgaXNzdWVfZGV0ZWN0aW9uX2NvbmZpZ3VyYXRpb246IGNoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uUmVhbFRpbWVBbGVydENvbmZpZ3VyYXRpb25SdWxlc0lzc3VlRGV0ZWN0aW9uQ29uZmlndXJhdGlvblRvVGVycmFmb3JtKHN0cnVjdCEuaXNzdWVEZXRlY3Rpb25Db25maWd1cmF0aW9uKSxcbiAgICBrZXl3b3JkX21hdGNoX2NvbmZpZ3VyYXRpb246IGNoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uUmVhbFRpbWVBbGVydENvbmZpZ3VyYXRpb25SdWxlc0tleXdvcmRNYXRjaENvbmZpZ3VyYXRpb25Ub1RlcnJhZm9ybShzdHJ1Y3QhLmtleXdvcmRNYXRjaENvbmZpZ3VyYXRpb24pLFxuICAgIHNlbnRpbWVudF9jb25maWd1cmF0aW9uOiBjaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvblJlYWxUaW1lQWxlcnRDb25maWd1cmF0aW9uUnVsZXNTZW50aW1lbnRDb25maWd1cmF0aW9uVG9UZXJyYWZvcm0oc3RydWN0IS5zZW50aW1lbnRDb25maWd1cmF0aW9uKSxcbiAgfVxufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBjaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvblJlYWxUaW1lQWxlcnRDb25maWd1cmF0aW9uUnVsZXNUb0hjbFRlcnJhZm9ybShzdHJ1Y3Q/OiBDaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvblJlYWxUaW1lQWxlcnRDb25maWd1cmF0aW9uUnVsZXMgfCBjZGt0Zi5JUmVzb2x2YWJsZSk6IGFueSB7XG4gIGlmICghY2RrdGYuY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RmLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0Zi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgY29uc3QgYXR0cnMgPSB7XG4gICAgdHlwZToge1xuICAgICAgdmFsdWU6IGNka3RmLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEudHlwZSksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgIH0sXG4gICAgaXNzdWVfZGV0ZWN0aW9uX2NvbmZpZ3VyYXRpb246IHtcbiAgICAgIHZhbHVlOiBjaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvblJlYWxUaW1lQWxlcnRDb25maWd1cmF0aW9uUnVsZXNJc3N1ZURldGVjdGlvbkNvbmZpZ3VyYXRpb25Ub0hjbFRlcnJhZm9ybShzdHJ1Y3QhLmlzc3VlRGV0ZWN0aW9uQ29uZmlndXJhdGlvbiksXG4gICAgICBpc0Jsb2NrOiB0cnVlLFxuICAgICAgdHlwZTogXCJsaXN0XCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIkNoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uUmVhbFRpbWVBbGVydENvbmZpZ3VyYXRpb25SdWxlc0lzc3VlRGV0ZWN0aW9uQ29uZmlndXJhdGlvbkxpc3RcIixcbiAgICB9LFxuICAgIGtleXdvcmRfbWF0Y2hfY29uZmlndXJhdGlvbjoge1xuICAgICAgdmFsdWU6IGNoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uUmVhbFRpbWVBbGVydENvbmZpZ3VyYXRpb25SdWxlc0tleXdvcmRNYXRjaENvbmZpZ3VyYXRpb25Ub0hjbFRlcnJhZm9ybShzdHJ1Y3QhLmtleXdvcmRNYXRjaENvbmZpZ3VyYXRpb24pLFxuICAgICAgaXNCbG9jazogdHJ1ZSxcbiAgICAgIHR5cGU6IFwibGlzdFwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJDaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvblJlYWxUaW1lQWxlcnRDb25maWd1cmF0aW9uUnVsZXNLZXl3b3JkTWF0Y2hDb25maWd1cmF0aW9uTGlzdFwiLFxuICAgIH0sXG4gICAgc2VudGltZW50X2NvbmZpZ3VyYXRpb246IHtcbiAgICAgIHZhbHVlOiBjaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvblJlYWxUaW1lQWxlcnRDb25maWd1cmF0aW9uUnVsZXNTZW50aW1lbnRDb25maWd1cmF0aW9uVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5zZW50aW1lbnRDb25maWd1cmF0aW9uKSxcbiAgICAgIGlzQmxvY2s6IHRydWUsXG4gICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwiQ2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb25SZWFsVGltZUFsZXJ0Q29uZmlndXJhdGlvblJ1bGVzU2VudGltZW50Q29uZmlndXJhdGlvbkxpc3RcIixcbiAgICB9LFxuICB9O1xuXG4gIC8vIHJlbW92ZSB1bmRlZmluZWQgYXR0cmlidXRlc1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKGF0dHJzKS5maWx0ZXIoKFtfLCB2YWx1ZV0pID0+IHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUudmFsdWUgIT09IHVuZGVmaW5lZCkpO1xufVxuXG5leHBvcnQgY2xhc3MgQ2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb25SZWFsVGltZUFsZXJ0Q29uZmlndXJhdGlvblJ1bGVzT3V0cHV0UmVmZXJlbmNlIGV4dGVuZHMgY2RrdGYuQ29tcGxleE9iamVjdCB7XG4gIHByaXZhdGUgaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuICBwcml2YXRlIHJlc29sdmFibGVWYWx1ZT86IGNka3RmLklSZXNvbHZhYmxlO1xuXG4gIC8qKlxuICAqIEBwYXJhbSB0ZXJyYWZvcm1SZXNvdXJjZSBUaGUgcGFyZW50IHJlc291cmNlXG4gICogQHBhcmFtIHRlcnJhZm9ybUF0dHJpYnV0ZSBUaGUgYXR0cmlidXRlIG9uIHRoZSBwYXJlbnQgcmVzb3VyY2UgdGhpcyBjbGFzcyBpcyByZWZlcmVuY2luZ1xuICAqIEBwYXJhbSBjb21wbGV4T2JqZWN0SW5kZXggdGhlIGluZGV4IG9mIHRoaXMgaXRlbSBpbiB0aGUgbGlzdFxuICAqIEBwYXJhbSBjb21wbGV4T2JqZWN0SXNGcm9tU2V0IHdoZXRoZXIgdGhlIGxpc3QgaXMgd3JhcHBpbmcgYSBzZXQgKHdpbGwgYWRkIHRvbGlzdCgpIHRvIGJlIGFibGUgdG8gYWNjZXNzIGFuIGl0ZW0gdmlhIGFuIGluZGV4KVxuICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IodGVycmFmb3JtUmVzb3VyY2U6IGNka3RmLklJbnRlcnBvbGF0aW5nUGFyZW50LCB0ZXJyYWZvcm1BdHRyaWJ1dGU6IHN0cmluZywgY29tcGxleE9iamVjdEluZGV4OiBudW1iZXIsIGNvbXBsZXhPYmplY3RJc0Zyb21TZXQ6IGJvb2xlYW4pIHtcbiAgICBzdXBlcih0ZXJyYWZvcm1SZXNvdXJjZSwgdGVycmFmb3JtQXR0cmlidXRlLCBjb21wbGV4T2JqZWN0SXNGcm9tU2V0LCBjb21wbGV4T2JqZWN0SW5kZXgpO1xuICB9XG5cbiAgcHVibGljIGdldCBpbnRlcm5hbFZhbHVlKCk6IENoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uUmVhbFRpbWVBbGVydENvbmZpZ3VyYXRpb25SdWxlcyB8IGNka3RmLklSZXNvbHZhYmxlIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5yZXNvbHZhYmxlVmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlc29sdmFibGVWYWx1ZTtcbiAgICB9XG4gICAgbGV0IGhhc0FueVZhbHVlcyA9IHRoaXMuaXNFbXB0eU9iamVjdDtcbiAgICBjb25zdCBpbnRlcm5hbFZhbHVlUmVzdWx0OiBhbnkgPSB7fTtcbiAgICBpZiAodGhpcy5fdHlwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC50eXBlID0gdGhpcy5fdHlwZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2lzc3VlRGV0ZWN0aW9uQ29uZmlndXJhdGlvbj8uaW50ZXJuYWxWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5pc3N1ZURldGVjdGlvbkNvbmZpZ3VyYXRpb24gPSB0aGlzLl9pc3N1ZURldGVjdGlvbkNvbmZpZ3VyYXRpb24/LmludGVybmFsVmFsdWU7XG4gICAgfVxuICAgIGlmICh0aGlzLl9rZXl3b3JkTWF0Y2hDb25maWd1cmF0aW9uPy5pbnRlcm5hbFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmtleXdvcmRNYXRjaENvbmZpZ3VyYXRpb24gPSB0aGlzLl9rZXl3b3JkTWF0Y2hDb25maWd1cmF0aW9uPy5pbnRlcm5hbFZhbHVlO1xuICAgIH1cbiAgICBpZiAodGhpcy5fc2VudGltZW50Q29uZmlndXJhdGlvbj8uaW50ZXJuYWxWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5zZW50aW1lbnRDb25maWd1cmF0aW9uID0gdGhpcy5fc2VudGltZW50Q29uZmlndXJhdGlvbj8uaW50ZXJuYWxWYWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGhhc0FueVZhbHVlcyA/IGludGVybmFsVmFsdWVSZXN1bHQgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgc2V0IGludGVybmFsVmFsdWUodmFsdWU6IENoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uUmVhbFRpbWVBbGVydENvbmZpZ3VyYXRpb25SdWxlcyB8IGNka3RmLklSZXNvbHZhYmxlIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuICAgICAgdGhpcy5yZXNvbHZhYmxlVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl90eXBlID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5faXNzdWVEZXRlY3Rpb25Db25maWd1cmF0aW9uLmludGVybmFsVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9rZXl3b3JkTWF0Y2hDb25maWd1cmF0aW9uLmludGVybmFsVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9zZW50aW1lbnRDb25maWd1cmF0aW9uLmludGVybmFsVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGVsc2UgaWYgKGNka3RmLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUodmFsdWUpKSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBmYWxzZTtcbiAgICAgIHRoaXMucmVzb2x2YWJsZVZhbHVlID0gdmFsdWU7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA9PT0gMDtcbiAgICAgIHRoaXMucmVzb2x2YWJsZVZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fdHlwZSA9IHZhbHVlLnR5cGU7XG4gICAgICB0aGlzLl9pc3N1ZURldGVjdGlvbkNvbmZpZ3VyYXRpb24uaW50ZXJuYWxWYWx1ZSA9IHZhbHVlLmlzc3VlRGV0ZWN0aW9uQ29uZmlndXJhdGlvbjtcbiAgICAgIHRoaXMuX2tleXdvcmRNYXRjaENvbmZpZ3VyYXRpb24uaW50ZXJuYWxWYWx1ZSA9IHZhbHVlLmtleXdvcmRNYXRjaENvbmZpZ3VyYXRpb247XG4gICAgICB0aGlzLl9zZW50aW1lbnRDb25maWd1cmF0aW9uLmludGVybmFsVmFsdWUgPSB2YWx1ZS5zZW50aW1lbnRDb25maWd1cmF0aW9uO1xuICAgIH1cbiAgfVxuXG4gIC8vIHR5cGUgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfdHlwZT86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgdHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ3R5cGUnKTtcbiAgfVxuICBwdWJsaWMgc2V0IHR5cGUodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX3R5cGUgPSB2YWx1ZTtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgdHlwZUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl90eXBlO1xuICB9XG5cbiAgLy8gaXNzdWVfZGV0ZWN0aW9uX2NvbmZpZ3VyYXRpb24gLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfaXNzdWVEZXRlY3Rpb25Db25maWd1cmF0aW9uID0gbmV3IENoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uUmVhbFRpbWVBbGVydENvbmZpZ3VyYXRpb25SdWxlc0lzc3VlRGV0ZWN0aW9uQ29uZmlndXJhdGlvbk91dHB1dFJlZmVyZW5jZSh0aGlzLCBcImlzc3VlX2RldGVjdGlvbl9jb25maWd1cmF0aW9uXCIpO1xuICBwdWJsaWMgZ2V0IGlzc3VlRGV0ZWN0aW9uQ29uZmlndXJhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5faXNzdWVEZXRlY3Rpb25Db25maWd1cmF0aW9uO1xuICB9XG4gIHB1YmxpYyBwdXRJc3N1ZURldGVjdGlvbkNvbmZpZ3VyYXRpb24odmFsdWU6IENoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uUmVhbFRpbWVBbGVydENvbmZpZ3VyYXRpb25SdWxlc0lzc3VlRGV0ZWN0aW9uQ29uZmlndXJhdGlvbikge1xuICAgIHRoaXMuX2lzc3VlRGV0ZWN0aW9uQ29uZmlndXJhdGlvbi5pbnRlcm5hbFZhbHVlID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0SXNzdWVEZXRlY3Rpb25Db25maWd1cmF0aW9uKCkge1xuICAgIHRoaXMuX2lzc3VlRGV0ZWN0aW9uQ29uZmlndXJhdGlvbi5pbnRlcm5hbFZhbHVlID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBpc3N1ZURldGVjdGlvbkNvbmZpZ3VyYXRpb25JbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5faXNzdWVEZXRlY3Rpb25Db25maWd1cmF0aW9uLmludGVybmFsVmFsdWU7XG4gIH1cblxuICAvLyBrZXl3b3JkX21hdGNoX2NvbmZpZ3VyYXRpb24gLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfa2V5d29yZE1hdGNoQ29uZmlndXJhdGlvbiA9IG5ldyBDaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvblJlYWxUaW1lQWxlcnRDb25maWd1cmF0aW9uUnVsZXNLZXl3b3JkTWF0Y2hDb25maWd1cmF0aW9uT3V0cHV0UmVmZXJlbmNlKHRoaXMsIFwia2V5d29yZF9tYXRjaF9jb25maWd1cmF0aW9uXCIpO1xuICBwdWJsaWMgZ2V0IGtleXdvcmRNYXRjaENvbmZpZ3VyYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuX2tleXdvcmRNYXRjaENvbmZpZ3VyYXRpb247XG4gIH1cbiAgcHVibGljIHB1dEtleXdvcmRNYXRjaENvbmZpZ3VyYXRpb24odmFsdWU6IENoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uUmVhbFRpbWVBbGVydENvbmZpZ3VyYXRpb25SdWxlc0tleXdvcmRNYXRjaENvbmZpZ3VyYXRpb24pIHtcbiAgICB0aGlzLl9rZXl3b3JkTWF0Y2hDb25maWd1cmF0aW9uLmludGVybmFsVmFsdWUgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRLZXl3b3JkTWF0Y2hDb25maWd1cmF0aW9uKCkge1xuICAgIHRoaXMuX2tleXdvcmRNYXRjaENvbmZpZ3VyYXRpb24uaW50ZXJuYWxWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQga2V5d29yZE1hdGNoQ29uZmlndXJhdGlvbklucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9rZXl3b3JkTWF0Y2hDb25maWd1cmF0aW9uLmludGVybmFsVmFsdWU7XG4gIH1cblxuICAvLyBzZW50aW1lbnRfY29uZmlndXJhdGlvbiAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9zZW50aW1lbnRDb25maWd1cmF0aW9uID0gbmV3IENoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uUmVhbFRpbWVBbGVydENvbmZpZ3VyYXRpb25SdWxlc1NlbnRpbWVudENvbmZpZ3VyYXRpb25PdXRwdXRSZWZlcmVuY2UodGhpcywgXCJzZW50aW1lbnRfY29uZmlndXJhdGlvblwiKTtcbiAgcHVibGljIGdldCBzZW50aW1lbnRDb25maWd1cmF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLl9zZW50aW1lbnRDb25maWd1cmF0aW9uO1xuICB9XG4gIHB1YmxpYyBwdXRTZW50aW1lbnRDb25maWd1cmF0aW9uKHZhbHVlOiBDaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvblJlYWxUaW1lQWxlcnRDb25maWd1cmF0aW9uUnVsZXNTZW50aW1lbnRDb25maWd1cmF0aW9uKSB7XG4gICAgdGhpcy5fc2VudGltZW50Q29uZmlndXJhdGlvbi5pbnRlcm5hbFZhbHVlID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0U2VudGltZW50Q29uZmlndXJhdGlvbigpIHtcbiAgICB0aGlzLl9zZW50aW1lbnRDb25maWd1cmF0aW9uLmludGVybmFsVmFsdWUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHNlbnRpbWVudENvbmZpZ3VyYXRpb25JbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fc2VudGltZW50Q29uZmlndXJhdGlvbi5pbnRlcm5hbFZhbHVlO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvblJlYWxUaW1lQWxlcnRDb25maWd1cmF0aW9uUnVsZXNMaXN0IGV4dGVuZHMgY2RrdGYuQ29tcGxleExpc3Qge1xuICBwdWJsaWMgaW50ZXJuYWxWYWx1ZT8gOiBDaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvblJlYWxUaW1lQWxlcnRDb25maWd1cmF0aW9uUnVsZXNbXSB8IGNka3RmLklSZXNvbHZhYmxlXG5cbiAgLyoqXG4gICogQHBhcmFtIHRlcnJhZm9ybVJlc291cmNlIFRoZSBwYXJlbnQgcmVzb3VyY2VcbiAgKiBAcGFyYW0gdGVycmFmb3JtQXR0cmlidXRlIFRoZSBhdHRyaWJ1dGUgb24gdGhlIHBhcmVudCByZXNvdXJjZSB0aGlzIGNsYXNzIGlzIHJlZmVyZW5jaW5nXG4gICogQHBhcmFtIHdyYXBzU2V0IHdoZXRoZXIgdGhlIGxpc3QgaXMgd3JhcHBpbmcgYSBzZXQgKHdpbGwgYWRkIHRvbGlzdCgpIHRvIGJlIGFibGUgdG8gYWNjZXNzIGFuIGl0ZW0gdmlhIGFuIGluZGV4KVxuICAqL1xuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgdGVycmFmb3JtUmVzb3VyY2U6IGNka3RmLklJbnRlcnBvbGF0aW5nUGFyZW50LCBwcm90ZWN0ZWQgdGVycmFmb3JtQXR0cmlidXRlOiBzdHJpbmcsIHByb3RlY3RlZCB3cmFwc1NldDogYm9vbGVhbikge1xuICAgIHN1cGVyKHRlcnJhZm9ybVJlc291cmNlLCB0ZXJyYWZvcm1BdHRyaWJ1dGUsIHdyYXBzU2V0KVxuICB9XG5cbiAgLyoqXG4gICogQHBhcmFtIGluZGV4IHRoZSBpbmRleCBvZiB0aGUgaXRlbSB0byByZXR1cm5cbiAgKi9cbiAgcHVibGljIGdldChpbmRleDogbnVtYmVyKTogQ2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb25SZWFsVGltZUFsZXJ0Q29uZmlndXJhdGlvblJ1bGVzT3V0cHV0UmVmZXJlbmNlIHtcbiAgICByZXR1cm4gbmV3IENoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uUmVhbFRpbWVBbGVydENvbmZpZ3VyYXRpb25SdWxlc091dHB1dFJlZmVyZW5jZSh0aGlzLnRlcnJhZm9ybVJlc291cmNlLCB0aGlzLnRlcnJhZm9ybUF0dHJpYnV0ZSwgaW5kZXgsIHRoaXMud3JhcHNTZXQpO1xuICB9XG59XG5leHBvcnQgaW50ZXJmYWNlIENoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uUmVhbFRpbWVBbGVydENvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXdzLzUuODQuMC9kb2NzL3Jlc291cmNlcy9jaGltZXNka21lZGlhcGlwZWxpbmVzX21lZGlhX2luc2lnaHRzX3BpcGVsaW5lX2NvbmZpZ3VyYXRpb24jZGlzYWJsZWQgQ2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb24jZGlzYWJsZWR9XG4gICovXG4gIHJlYWRvbmx5IGRpc2FibGVkPzogYm9vbGVhbiB8IGNka3RmLklSZXNvbHZhYmxlO1xuICAvKipcbiAgKiBydWxlcyBibG9ja1xuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F3cy81Ljg0LjAvZG9jcy9yZXNvdXJjZXMvY2hpbWVzZGttZWRpYXBpcGVsaW5lc19tZWRpYV9pbnNpZ2h0c19waXBlbGluZV9jb25maWd1cmF0aW9uI3J1bGVzIENoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uI3J1bGVzfVxuICAqL1xuICByZWFkb25seSBydWxlczogQ2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb25SZWFsVGltZUFsZXJ0Q29uZmlndXJhdGlvblJ1bGVzW10gfCBjZGt0Zi5JUmVzb2x2YWJsZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uUmVhbFRpbWVBbGVydENvbmZpZ3VyYXRpb25Ub1RlcnJhZm9ybShzdHJ1Y3Q/OiBDaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvblJlYWxUaW1lQWxlcnRDb25maWd1cmF0aW9uT3V0cHV0UmVmZXJlbmNlIHwgQ2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb25SZWFsVGltZUFsZXJ0Q29uZmlndXJhdGlvbik6IGFueSB7XG4gIGlmICghY2RrdGYuY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RmLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0Zi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBkaXNhYmxlZDogY2RrdGYuYm9vbGVhblRvVGVycmFmb3JtKHN0cnVjdCEuZGlzYWJsZWQpLFxuICAgIHJ1bGVzOiBjZGt0Zi5saXN0TWFwcGVyKGNoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uUmVhbFRpbWVBbGVydENvbmZpZ3VyYXRpb25SdWxlc1RvVGVycmFmb3JtLCB0cnVlKShzdHJ1Y3QhLnJ1bGVzKSxcbiAgfVxufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBjaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvblJlYWxUaW1lQWxlcnRDb25maWd1cmF0aW9uVG9IY2xUZXJyYWZvcm0oc3RydWN0PzogQ2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb25SZWFsVGltZUFsZXJ0Q29uZmlndXJhdGlvbk91dHB1dFJlZmVyZW5jZSB8IENoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uUmVhbFRpbWVBbGVydENvbmZpZ3VyYXRpb24pOiBhbnkge1xuICBpZiAoIWNka3RmLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0Zi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdGYuaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIGNvbnN0IGF0dHJzID0ge1xuICAgIGRpc2FibGVkOiB7XG4gICAgICB2YWx1ZTogY2RrdGYuYm9vbGVhblRvSGNsVGVycmFmb3JtKHN0cnVjdCEuZGlzYWJsZWQpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJib29sZWFuXCIsXG4gICAgfSxcbiAgICBydWxlczoge1xuICAgICAgdmFsdWU6IGNka3RmLmxpc3RNYXBwZXJIY2woY2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb25SZWFsVGltZUFsZXJ0Q29uZmlndXJhdGlvblJ1bGVzVG9IY2xUZXJyYWZvcm0sIHRydWUpKHN0cnVjdCEucnVsZXMpLFxuICAgICAgaXNCbG9jazogdHJ1ZSxcbiAgICAgIHR5cGU6IFwibGlzdFwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJDaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvblJlYWxUaW1lQWxlcnRDb25maWd1cmF0aW9uUnVsZXNMaXN0XCIsXG4gICAgfSxcbiAgfTtcblxuICAvLyByZW1vdmUgdW5kZWZpbmVkIGF0dHJpYnV0ZXNcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhdHRycykuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWQpKTtcbn1cblxuZXhwb3J0IGNsYXNzIENoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uUmVhbFRpbWVBbGVydENvbmZpZ3VyYXRpb25PdXRwdXRSZWZlcmVuY2UgZXh0ZW5kcyBjZGt0Zi5Db21wbGV4T2JqZWN0IHtcbiAgcHJpdmF0ZSBpc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG5cbiAgLyoqXG4gICogQHBhcmFtIHRlcnJhZm9ybVJlc291cmNlIFRoZSBwYXJlbnQgcmVzb3VyY2VcbiAgKiBAcGFyYW0gdGVycmFmb3JtQXR0cmlidXRlIFRoZSBhdHRyaWJ1dGUgb24gdGhlIHBhcmVudCByZXNvdXJjZSB0aGlzIGNsYXNzIGlzIHJlZmVyZW5jaW5nXG4gICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih0ZXJyYWZvcm1SZXNvdXJjZTogY2RrdGYuSUludGVycG9sYXRpbmdQYXJlbnQsIHRlcnJhZm9ybUF0dHJpYnV0ZTogc3RyaW5nKSB7XG4gICAgc3VwZXIodGVycmFmb3JtUmVzb3VyY2UsIHRlcnJhZm9ybUF0dHJpYnV0ZSwgZmFsc2UsIDApO1xuICB9XG5cbiAgcHVibGljIGdldCBpbnRlcm5hbFZhbHVlKCk6IENoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uUmVhbFRpbWVBbGVydENvbmZpZ3VyYXRpb24gfCB1bmRlZmluZWQge1xuICAgIGxldCBoYXNBbnlWYWx1ZXMgPSB0aGlzLmlzRW1wdHlPYmplY3Q7XG4gICAgY29uc3QgaW50ZXJuYWxWYWx1ZVJlc3VsdDogYW55ID0ge307XG4gICAgaWYgKHRoaXMuX2Rpc2FibGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmRpc2FibGVkID0gdGhpcy5fZGlzYWJsZWQ7XG4gICAgfVxuICAgIGlmICh0aGlzLl9ydWxlcz8uaW50ZXJuYWxWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5ydWxlcyA9IHRoaXMuX3J1bGVzPy5pbnRlcm5hbFZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gaGFzQW55VmFsdWVzID8gaW50ZXJuYWxWYWx1ZVJlc3VsdCA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgaW50ZXJuYWxWYWx1ZSh2YWx1ZTogQ2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb25SZWFsVGltZUFsZXJ0Q29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZCkge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBmYWxzZTtcbiAgICAgIHRoaXMuX2Rpc2FibGVkID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fcnVsZXMuaW50ZXJuYWxWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSAwO1xuICAgICAgdGhpcy5fZGlzYWJsZWQgPSB2YWx1ZS5kaXNhYmxlZDtcbiAgICAgIHRoaXMuX3J1bGVzLmludGVybmFsVmFsdWUgPSB2YWx1ZS5ydWxlcztcbiAgICB9XG4gIH1cblxuICAvLyBkaXNhYmxlZCAtIGNvbXB1dGVkOiB0cnVlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2Rpc2FibGVkPzogYm9vbGVhbiB8IGNka3RmLklSZXNvbHZhYmxlOyBcbiAgcHVibGljIGdldCBkaXNhYmxlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRCb29sZWFuQXR0cmlidXRlKCdkaXNhYmxlZCcpO1xuICB9XG4gIHB1YmxpYyBzZXQgZGlzYWJsZWQodmFsdWU6IGJvb2xlYW4gfCBjZGt0Zi5JUmVzb2x2YWJsZSkge1xuICAgIHRoaXMuX2Rpc2FibGVkID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0RGlzYWJsZWQoKSB7XG4gICAgdGhpcy5fZGlzYWJsZWQgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGRpc2FibGVkSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Rpc2FibGVkO1xuICB9XG5cbiAgLy8gcnVsZXMgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfcnVsZXMgPSBuZXcgQ2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb25SZWFsVGltZUFsZXJ0Q29uZmlndXJhdGlvblJ1bGVzTGlzdCh0aGlzLCBcInJ1bGVzXCIsIGZhbHNlKTtcbiAgcHVibGljIGdldCBydWxlcygpIHtcbiAgICByZXR1cm4gdGhpcy5fcnVsZXM7XG4gIH1cbiAgcHVibGljIHB1dFJ1bGVzKHZhbHVlOiBDaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvblJlYWxUaW1lQWxlcnRDb25maWd1cmF0aW9uUnVsZXNbXSB8IGNka3RmLklSZXNvbHZhYmxlKSB7XG4gICAgdGhpcy5fcnVsZXMuaW50ZXJuYWxWYWx1ZSA9IHZhbHVlO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBydWxlc0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9ydWxlcy5pbnRlcm5hbFZhbHVlO1xuICB9XG59XG5leHBvcnQgaW50ZXJmYWNlIENoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uVGltZW91dHMge1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXdzLzUuODQuMC9kb2NzL3Jlc291cmNlcy9jaGltZXNka21lZGlhcGlwZWxpbmVzX21lZGlhX2luc2lnaHRzX3BpcGVsaW5lX2NvbmZpZ3VyYXRpb24jY3JlYXRlIENoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uI2NyZWF0ZX1cbiAgKi9cbiAgcmVhZG9ubHkgY3JlYXRlPzogc3RyaW5nO1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXdzLzUuODQuMC9kb2NzL3Jlc291cmNlcy9jaGltZXNka21lZGlhcGlwZWxpbmVzX21lZGlhX2luc2lnaHRzX3BpcGVsaW5lX2NvbmZpZ3VyYXRpb24jZGVsZXRlIENoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uI2RlbGV0ZX1cbiAgKi9cbiAgcmVhZG9ubHkgZGVsZXRlPzogc3RyaW5nO1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXdzLzUuODQuMC9kb2NzL3Jlc291cmNlcy9jaGltZXNka21lZGlhcGlwZWxpbmVzX21lZGlhX2luc2lnaHRzX3BpcGVsaW5lX2NvbmZpZ3VyYXRpb24jdXBkYXRlIENoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uI3VwZGF0ZX1cbiAgKi9cbiAgcmVhZG9ubHkgdXBkYXRlPzogc3RyaW5nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb25UaW1lb3V0c1RvVGVycmFmb3JtKHN0cnVjdD86IENoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uVGltZW91dHMgfCBjZGt0Zi5JUmVzb2x2YWJsZSk6IGFueSB7XG4gIGlmICghY2RrdGYuY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RmLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0Zi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBjcmVhdGU6IGNka3RmLnN0cmluZ1RvVGVycmFmb3JtKHN0cnVjdCEuY3JlYXRlKSxcbiAgICBkZWxldGU6IGNka3RmLnN0cmluZ1RvVGVycmFmb3JtKHN0cnVjdCEuZGVsZXRlKSxcbiAgICB1cGRhdGU6IGNka3RmLnN0cmluZ1RvVGVycmFmb3JtKHN0cnVjdCEudXBkYXRlKSxcbiAgfVxufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBjaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvblRpbWVvdXRzVG9IY2xUZXJyYWZvcm0oc3RydWN0PzogQ2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb25UaW1lb3V0cyB8IGNka3RmLklSZXNvbHZhYmxlKTogYW55IHtcbiAgaWYgKCFjZGt0Zi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdGYuVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RmLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICBjb25zdCBhdHRycyA9IHtcbiAgICBjcmVhdGU6IHtcbiAgICAgIHZhbHVlOiBjZGt0Zi5zdHJpbmdUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLmNyZWF0ZSksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgIH0sXG4gICAgZGVsZXRlOiB7XG4gICAgICB2YWx1ZTogY2RrdGYuc3RyaW5nVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5kZWxldGUpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICB9LFxuICAgIHVwZGF0ZToge1xuICAgICAgdmFsdWU6IGNka3RmLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEudXBkYXRlKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgfTtcblxuICAvLyByZW1vdmUgdW5kZWZpbmVkIGF0dHJpYnV0ZXNcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhdHRycykuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWQpKTtcbn1cblxuZXhwb3J0IGNsYXNzIENoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uVGltZW91dHNPdXRwdXRSZWZlcmVuY2UgZXh0ZW5kcyBjZGt0Zi5Db21wbGV4T2JqZWN0IHtcbiAgcHJpdmF0ZSBpc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gIHByaXZhdGUgcmVzb2x2YWJsZVZhbHVlPzogY2RrdGYuSVJlc29sdmFibGU7XG5cbiAgLyoqXG4gICogQHBhcmFtIHRlcnJhZm9ybVJlc291cmNlIFRoZSBwYXJlbnQgcmVzb3VyY2VcbiAgKiBAcGFyYW0gdGVycmFmb3JtQXR0cmlidXRlIFRoZSBhdHRyaWJ1dGUgb24gdGhlIHBhcmVudCByZXNvdXJjZSB0aGlzIGNsYXNzIGlzIHJlZmVyZW5jaW5nXG4gICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih0ZXJyYWZvcm1SZXNvdXJjZTogY2RrdGYuSUludGVycG9sYXRpbmdQYXJlbnQsIHRlcnJhZm9ybUF0dHJpYnV0ZTogc3RyaW5nKSB7XG4gICAgc3VwZXIodGVycmFmb3JtUmVzb3VyY2UsIHRlcnJhZm9ybUF0dHJpYnV0ZSwgZmFsc2UpO1xuICB9XG5cbiAgcHVibGljIGdldCBpbnRlcm5hbFZhbHVlKCk6IENoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uVGltZW91dHMgfCBjZGt0Zi5JUmVzb2x2YWJsZSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMucmVzb2x2YWJsZVZhbHVlKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZXNvbHZhYmxlVmFsdWU7XG4gICAgfVxuICAgIGxldCBoYXNBbnlWYWx1ZXMgPSB0aGlzLmlzRW1wdHlPYmplY3Q7XG4gICAgY29uc3QgaW50ZXJuYWxWYWx1ZVJlc3VsdDogYW55ID0ge307XG4gICAgaWYgKHRoaXMuX2NyZWF0ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5jcmVhdGUgPSB0aGlzLl9jcmVhdGU7XG4gICAgfVxuICAgIGlmICh0aGlzLl9kZWxldGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuZGVsZXRlID0gdGhpcy5fZGVsZXRlO1xuICAgIH1cbiAgICBpZiAodGhpcy5fdXBkYXRlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LnVwZGF0ZSA9IHRoaXMuX3VwZGF0ZTtcbiAgICB9XG4gICAgcmV0dXJuIGhhc0FueVZhbHVlcyA/IGludGVybmFsVmFsdWVSZXN1bHQgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgc2V0IGludGVybmFsVmFsdWUodmFsdWU6IENoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uVGltZW91dHMgfCBjZGt0Zi5JUmVzb2x2YWJsZSB8IHVuZGVmaW5lZCkge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBmYWxzZTtcbiAgICAgIHRoaXMucmVzb2x2YWJsZVZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fY3JlYXRlID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fZGVsZXRlID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fdXBkYXRlID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBlbHNlIGlmIChjZGt0Zi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHZhbHVlKSkge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLnJlc29sdmFibGVWYWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGggPT09IDA7XG4gICAgICB0aGlzLnJlc29sdmFibGVWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX2NyZWF0ZSA9IHZhbHVlLmNyZWF0ZTtcbiAgICAgIHRoaXMuX2RlbGV0ZSA9IHZhbHVlLmRlbGV0ZTtcbiAgICAgIHRoaXMuX3VwZGF0ZSA9IHZhbHVlLnVwZGF0ZTtcbiAgICB9XG4gIH1cblxuICAvLyBjcmVhdGUgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfY3JlYXRlPzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBjcmVhdGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdjcmVhdGUnKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNyZWF0ZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fY3JlYXRlID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0Q3JlYXRlKCkge1xuICAgIHRoaXMuX2NyZWF0ZSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgY3JlYXRlSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NyZWF0ZTtcbiAgfVxuXG4gIC8vIGRlbGV0ZSAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9kZWxldGU/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IGRlbGV0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ2RlbGV0ZScpO1xuICB9XG4gIHB1YmxpYyBzZXQgZGVsZXRlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9kZWxldGUgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXREZWxldGUoKSB7XG4gICAgdGhpcy5fZGVsZXRlID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBkZWxldGVJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZGVsZXRlO1xuICB9XG5cbiAgLy8gdXBkYXRlIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX3VwZGF0ZT86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgdXBkYXRlKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgndXBkYXRlJyk7XG4gIH1cbiAgcHVibGljIHNldCB1cGRhdGUodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX3VwZGF0ZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldFVwZGF0ZSgpIHtcbiAgICB0aGlzLl91cGRhdGUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHVwZGF0ZUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl91cGRhdGU7XG4gIH1cbn1cblxuLyoqXG4qIFJlcHJlc2VudHMgYSB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9hd3MvNS44NC4wL2RvY3MvcmVzb3VyY2VzL2NoaW1lc2RrbWVkaWFwaXBlbGluZXNfbWVkaWFfaW5zaWdodHNfcGlwZWxpbmVfY29uZmlndXJhdGlvbiBhd3NfY2hpbWVzZGttZWRpYXBpcGVsaW5lc19tZWRpYV9pbnNpZ2h0c19waXBlbGluZV9jb25maWd1cmF0aW9ufVxuKi9cbmV4cG9ydCBjbGFzcyBDaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvbiBleHRlbmRzIGNka3RmLlRlcnJhZm9ybVJlc291cmNlIHtcblxuICAvLyA9PT09PT09PT09PT09PT09PVxuICAvLyBTVEFUSUMgUFJPUEVSVElFU1xuICAvLyA9PT09PT09PT09PT09PT09PVxuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHRmUmVzb3VyY2VUeXBlID0gXCJhd3NfY2hpbWVzZGttZWRpYXBpcGVsaW5lc19tZWRpYV9pbnNpZ2h0c19waXBlbGluZV9jb25maWd1cmF0aW9uXCI7XG5cbiAgLy8gPT09PT09PT09PT09PT1cbiAgLy8gU1RBVElDIE1ldGhvZHNcbiAgLy8gPT09PT09PT09PT09PT1cbiAgLyoqXG4gICogR2VuZXJhdGVzIENES1RGIGNvZGUgZm9yIGltcG9ydGluZyBhIENoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uIHJlc291cmNlIHVwb24gcnVubmluZyBcImNka3RmIHBsYW4gPHN0YWNrLW5hbWU+XCJcbiAgKiBAcGFyYW0gc2NvcGUgVGhlIHNjb3BlIGluIHdoaWNoIHRvIGRlZmluZSB0aGlzIGNvbnN0cnVjdFxuICAqIEBwYXJhbSBpbXBvcnRUb0lkIFRoZSBjb25zdHJ1Y3QgaWQgdXNlZCBpbiB0aGUgZ2VuZXJhdGVkIGNvbmZpZyBmb3IgdGhlIENoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uIHRvIGltcG9ydFxuICAqIEBwYXJhbSBpbXBvcnRGcm9tSWQgVGhlIGlkIG9mIHRoZSBleGlzdGluZyBDaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvbiB0aGF0IHNob3VsZCBiZSBpbXBvcnRlZC4gUmVmZXIgdG8gdGhlIHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F3cy81Ljg0LjAvZG9jcy9yZXNvdXJjZXMvY2hpbWVzZGttZWRpYXBpcGVsaW5lc19tZWRpYV9pbnNpZ2h0c19waXBlbGluZV9jb25maWd1cmF0aW9uI2ltcG9ydCBpbXBvcnQgc2VjdGlvbn0gaW4gdGhlIGRvY3VtZW50YXRpb24gb2YgdGhpcyByZXNvdXJjZSBmb3IgdGhlIGlkIHRvIHVzZVxuICAqIEBwYXJhbSBwcm92aWRlcj8gT3B0aW9uYWwgaW5zdGFuY2Ugb2YgdGhlIHByb3ZpZGVyIHdoZXJlIHRoZSBDaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvbiB0byBpbXBvcnQgaXMgZm91bmRcbiAgKi9cbiAgcHVibGljIHN0YXRpYyBnZW5lcmF0ZUNvbmZpZ0ZvckltcG9ydChzY29wZTogQ29uc3RydWN0LCBpbXBvcnRUb0lkOiBzdHJpbmcsIGltcG9ydEZyb21JZDogc3RyaW5nLCBwcm92aWRlcj86IGNka3RmLlRlcnJhZm9ybVByb3ZpZGVyKSB7XG4gICAgICAgIHJldHVybiBuZXcgY2RrdGYuSW1wb3J0YWJsZVJlc291cmNlKHNjb3BlLCBpbXBvcnRUb0lkLCB7IHRlcnJhZm9ybVJlc291cmNlVHlwZTogXCJhd3NfY2hpbWVzZGttZWRpYXBpcGVsaW5lc19tZWRpYV9pbnNpZ2h0c19waXBlbGluZV9jb25maWd1cmF0aW9uXCIsIGltcG9ydElkOiBpbXBvcnRGcm9tSWQsIHByb3ZpZGVyIH0pO1xuICAgICAgfVxuXG4gIC8vID09PT09PT09PT09XG4gIC8vIElOSVRJQUxJWkVSXG4gIC8vID09PT09PT09PT09XG5cbiAgLyoqXG4gICogQ3JlYXRlIGEgbmV3IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F3cy81Ljg0LjAvZG9jcy9yZXNvdXJjZXMvY2hpbWVzZGttZWRpYXBpcGVsaW5lc19tZWRpYV9pbnNpZ2h0c19waXBlbGluZV9jb25maWd1cmF0aW9uIGF3c19jaGltZXNka21lZGlhcGlwZWxpbmVzX21lZGlhX2luc2lnaHRzX3BpcGVsaW5lX2NvbmZpZ3VyYXRpb259IFJlc291cmNlXG4gICpcbiAgKiBAcGFyYW0gc2NvcGUgVGhlIHNjb3BlIGluIHdoaWNoIHRvIGRlZmluZSB0aGlzIGNvbnN0cnVjdFxuICAqIEBwYXJhbSBpZCBUaGUgc2NvcGVkIGNvbnN0cnVjdCBJRC4gTXVzdCBiZSB1bmlxdWUgYW1vbmdzdCBzaWJsaW5ncyBpbiB0aGUgc2FtZSBzY29wZVxuICAqIEBwYXJhbSBvcHRpb25zIENoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uQ29uZmlnXG4gICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBjb25maWc6IENoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uQ29uZmlnKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCB7XG4gICAgICB0ZXJyYWZvcm1SZXNvdXJjZVR5cGU6ICdhd3NfY2hpbWVzZGttZWRpYXBpcGVsaW5lc19tZWRpYV9pbnNpZ2h0c19waXBlbGluZV9jb25maWd1cmF0aW9uJyxcbiAgICAgIHRlcnJhZm9ybUdlbmVyYXRvck1ldGFkYXRhOiB7XG4gICAgICAgIHByb3ZpZGVyTmFtZTogJ2F3cycsXG4gICAgICAgIHByb3ZpZGVyVmVyc2lvbjogJzUuODQuMCcsXG4gICAgICAgIHByb3ZpZGVyVmVyc2lvbkNvbnN0cmFpbnQ6ICd+PiA1LjAnXG4gICAgICB9LFxuICAgICAgcHJvdmlkZXI6IGNvbmZpZy5wcm92aWRlcixcbiAgICAgIGRlcGVuZHNPbjogY29uZmlnLmRlcGVuZHNPbixcbiAgICAgIGNvdW50OiBjb25maWcuY291bnQsXG4gICAgICBsaWZlY3ljbGU6IGNvbmZpZy5saWZlY3ljbGUsXG4gICAgICBwcm92aXNpb25lcnM6IGNvbmZpZy5wcm92aXNpb25lcnMsXG4gICAgICBjb25uZWN0aW9uOiBjb25maWcuY29ubmVjdGlvbixcbiAgICAgIGZvckVhY2g6IGNvbmZpZy5mb3JFYWNoXG4gICAgfSk7XG4gICAgdGhpcy5fbmFtZSA9IGNvbmZpZy5uYW1lO1xuICAgIHRoaXMuX3Jlc291cmNlQWNjZXNzUm9sZUFybiA9IGNvbmZpZy5yZXNvdXJjZUFjY2Vzc1JvbGVBcm47XG4gICAgdGhpcy5fdGFncyA9IGNvbmZpZy50YWdzO1xuICAgIHRoaXMuX3RhZ3NBbGwgPSBjb25maWcudGFnc0FsbDtcbiAgICB0aGlzLl9lbGVtZW50cy5pbnRlcm5hbFZhbHVlID0gY29uZmlnLmVsZW1lbnRzO1xuICAgIHRoaXMuX3JlYWxUaW1lQWxlcnRDb25maWd1cmF0aW9uLmludGVybmFsVmFsdWUgPSBjb25maWcucmVhbFRpbWVBbGVydENvbmZpZ3VyYXRpb247XG4gICAgdGhpcy5fdGltZW91dHMuaW50ZXJuYWxWYWx1ZSA9IGNvbmZpZy50aW1lb3V0cztcbiAgfVxuXG4gIC8vID09PT09PT09PT1cbiAgLy8gQVRUUklCVVRFU1xuICAvLyA9PT09PT09PT09XG5cbiAgLy8gYXJuIC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHB1YmxpYyBnZXQgYXJuKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnYXJuJyk7XG4gIH1cblxuICAvLyBpZCAtIGNvbXB1dGVkOiB0cnVlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiBmYWxzZVxuICBwdWJsaWMgZ2V0IGlkKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnaWQnKTtcbiAgfVxuXG4gIC8vIG5hbWUgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfbmFtZT86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgbmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ25hbWUnKTtcbiAgfVxuICBwdWJsaWMgc2V0IG5hbWUodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX25hbWUgPSB2YWx1ZTtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgbmFtZUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9uYW1lO1xuICB9XG5cbiAgLy8gcmVzb3VyY2VfYWNjZXNzX3JvbGVfYXJuIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiB0cnVlXG4gIHByaXZhdGUgX3Jlc291cmNlQWNjZXNzUm9sZUFybj86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgcmVzb3VyY2VBY2Nlc3NSb2xlQXJuKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgncmVzb3VyY2VfYWNjZXNzX3JvbGVfYXJuJyk7XG4gIH1cbiAgcHVibGljIHNldCByZXNvdXJjZUFjY2Vzc1JvbGVBcm4odmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX3Jlc291cmNlQWNjZXNzUm9sZUFybiA9IHZhbHVlO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCByZXNvdXJjZUFjY2Vzc1JvbGVBcm5JbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcmVzb3VyY2VBY2Nlc3NSb2xlQXJuO1xuICB9XG5cbiAgLy8gdGFncyAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF90YWdzPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTsgXG4gIHB1YmxpYyBnZXQgdGFncygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdNYXBBdHRyaWJ1dGUoJ3RhZ3MnKTtcbiAgfVxuICBwdWJsaWMgc2V0IHRhZ3ModmFsdWU6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0pIHtcbiAgICB0aGlzLl90YWdzID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0VGFncygpIHtcbiAgICB0aGlzLl90YWdzID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCB0YWdzSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RhZ3M7XG4gIH1cblxuICAvLyB0YWdzX2FsbCAtIGNvbXB1dGVkOiB0cnVlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX3RhZ3NBbGw/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9OyBcbiAgcHVibGljIGdldCB0YWdzQWxsKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ01hcEF0dHJpYnV0ZSgndGFnc19hbGwnKTtcbiAgfVxuICBwdWJsaWMgc2V0IHRhZ3NBbGwodmFsdWU6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0pIHtcbiAgICB0aGlzLl90YWdzQWxsID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0VGFnc0FsbCgpIHtcbiAgICB0aGlzLl90YWdzQWxsID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCB0YWdzQWxsSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RhZ3NBbGw7XG4gIH1cblxuICAvLyBlbGVtZW50cyAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogdHJ1ZVxuICBwcml2YXRlIF9lbGVtZW50cyA9IG5ldyBDaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvbkVsZW1lbnRzTGlzdCh0aGlzLCBcImVsZW1lbnRzXCIsIGZhbHNlKTtcbiAgcHVibGljIGdldCBlbGVtZW50cygpIHtcbiAgICByZXR1cm4gdGhpcy5fZWxlbWVudHM7XG4gIH1cbiAgcHVibGljIHB1dEVsZW1lbnRzKHZhbHVlOiBDaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvbkVsZW1lbnRzW10gfCBjZGt0Zi5JUmVzb2x2YWJsZSkge1xuICAgIHRoaXMuX2VsZW1lbnRzLmludGVybmFsVmFsdWUgPSB2YWx1ZTtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgZWxlbWVudHNJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZWxlbWVudHMuaW50ZXJuYWxWYWx1ZTtcbiAgfVxuXG4gIC8vIHJlYWxfdGltZV9hbGVydF9jb25maWd1cmF0aW9uIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX3JlYWxUaW1lQWxlcnRDb25maWd1cmF0aW9uID0gbmV3IENoaW1lc2RrbWVkaWFwaXBlbGluZXNNZWRpYUluc2lnaHRzUGlwZWxpbmVDb25maWd1cmF0aW9uUmVhbFRpbWVBbGVydENvbmZpZ3VyYXRpb25PdXRwdXRSZWZlcmVuY2UodGhpcywgXCJyZWFsX3RpbWVfYWxlcnRfY29uZmlndXJhdGlvblwiKTtcbiAgcHVibGljIGdldCByZWFsVGltZUFsZXJ0Q29uZmlndXJhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5fcmVhbFRpbWVBbGVydENvbmZpZ3VyYXRpb247XG4gIH1cbiAgcHVibGljIHB1dFJlYWxUaW1lQWxlcnRDb25maWd1cmF0aW9uKHZhbHVlOiBDaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvblJlYWxUaW1lQWxlcnRDb25maWd1cmF0aW9uKSB7XG4gICAgdGhpcy5fcmVhbFRpbWVBbGVydENvbmZpZ3VyYXRpb24uaW50ZXJuYWxWYWx1ZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldFJlYWxUaW1lQWxlcnRDb25maWd1cmF0aW9uKCkge1xuICAgIHRoaXMuX3JlYWxUaW1lQWxlcnRDb25maWd1cmF0aW9uLmludGVybmFsVmFsdWUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHJlYWxUaW1lQWxlcnRDb25maWd1cmF0aW9uSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3JlYWxUaW1lQWxlcnRDb25maWd1cmF0aW9uLmludGVybmFsVmFsdWU7XG4gIH1cblxuICAvLyB0aW1lb3V0cyAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF90aW1lb3V0cyA9IG5ldyBDaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvblRpbWVvdXRzT3V0cHV0UmVmZXJlbmNlKHRoaXMsIFwidGltZW91dHNcIik7XG4gIHB1YmxpYyBnZXQgdGltZW91dHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RpbWVvdXRzO1xuICB9XG4gIHB1YmxpYyBwdXRUaW1lb3V0cyh2YWx1ZTogQ2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb25UaW1lb3V0cykge1xuICAgIHRoaXMuX3RpbWVvdXRzLmludGVybmFsVmFsdWUgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRUaW1lb3V0cygpIHtcbiAgICB0aGlzLl90aW1lb3V0cy5pbnRlcm5hbFZhbHVlID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCB0aW1lb3V0c0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl90aW1lb3V0cy5pbnRlcm5hbFZhbHVlO1xuICB9XG5cbiAgLy8gPT09PT09PT09XG4gIC8vIFNZTlRIRVNJU1xuICAvLyA9PT09PT09PT1cblxuICBwcm90ZWN0ZWQgc3ludGhlc2l6ZUF0dHJpYnV0ZXMoKTogeyBbbmFtZTogc3RyaW5nXTogYW55IH0ge1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiBjZGt0Zi5zdHJpbmdUb1RlcnJhZm9ybSh0aGlzLl9uYW1lKSxcbiAgICAgIHJlc291cmNlX2FjY2Vzc19yb2xlX2FybjogY2RrdGYuc3RyaW5nVG9UZXJyYWZvcm0odGhpcy5fcmVzb3VyY2VBY2Nlc3NSb2xlQXJuKSxcbiAgICAgIHRhZ3M6IGNka3RmLmhhc2hNYXBwZXIoY2RrdGYuc3RyaW5nVG9UZXJyYWZvcm0pKHRoaXMuX3RhZ3MpLFxuICAgICAgdGFnc19hbGw6IGNka3RmLmhhc2hNYXBwZXIoY2RrdGYuc3RyaW5nVG9UZXJyYWZvcm0pKHRoaXMuX3RhZ3NBbGwpLFxuICAgICAgZWxlbWVudHM6IGNka3RmLmxpc3RNYXBwZXIoY2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb25FbGVtZW50c1RvVGVycmFmb3JtLCB0cnVlKSh0aGlzLl9lbGVtZW50cy5pbnRlcm5hbFZhbHVlKSxcbiAgICAgIHJlYWxfdGltZV9hbGVydF9jb25maWd1cmF0aW9uOiBjaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvblJlYWxUaW1lQWxlcnRDb25maWd1cmF0aW9uVG9UZXJyYWZvcm0odGhpcy5fcmVhbFRpbWVBbGVydENvbmZpZ3VyYXRpb24uaW50ZXJuYWxWYWx1ZSksXG4gICAgICB0aW1lb3V0czogY2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb25UaW1lb3V0c1RvVGVycmFmb3JtKHRoaXMuX3RpbWVvdXRzLmludGVybmFsVmFsdWUpLFxuICAgIH07XG4gIH1cblxuICBwcm90ZWN0ZWQgc3ludGhlc2l6ZUhjbEF0dHJpYnV0ZXMoKTogeyBbbmFtZTogc3RyaW5nXTogYW55IH0ge1xuICAgIGNvbnN0IGF0dHJzID0ge1xuICAgICAgbmFtZToge1xuICAgICAgICB2YWx1ZTogY2RrdGYuc3RyaW5nVG9IY2xUZXJyYWZvcm0odGhpcy5fbmFtZSksXG4gICAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgICAgfSxcbiAgICAgIHJlc291cmNlX2FjY2Vzc19yb2xlX2Fybjoge1xuICAgICAgICB2YWx1ZTogY2RrdGYuc3RyaW5nVG9IY2xUZXJyYWZvcm0odGhpcy5fcmVzb3VyY2VBY2Nlc3NSb2xlQXJuKSxcbiAgICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgICB9LFxuICAgICAgdGFnczoge1xuICAgICAgICB2YWx1ZTogY2RrdGYuaGFzaE1hcHBlckhjbChjZGt0Zi5zdHJpbmdUb0hjbFRlcnJhZm9ybSkodGhpcy5fdGFncyksXG4gICAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgICB0eXBlOiBcIm1hcFwiLFxuICAgICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ01hcFwiLFxuICAgICAgfSxcbiAgICAgIHRhZ3NfYWxsOiB7XG4gICAgICAgIHZhbHVlOiBjZGt0Zi5oYXNoTWFwcGVySGNsKGNka3RmLnN0cmluZ1RvSGNsVGVycmFmb3JtKSh0aGlzLl90YWdzQWxsKSxcbiAgICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICAgIHR5cGU6IFwibWFwXCIsXG4gICAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nTWFwXCIsXG4gICAgICB9LFxuICAgICAgZWxlbWVudHM6IHtcbiAgICAgICAgdmFsdWU6IGNka3RmLmxpc3RNYXBwZXJIY2woY2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb25FbGVtZW50c1RvSGNsVGVycmFmb3JtLCB0cnVlKSh0aGlzLl9lbGVtZW50cy5pbnRlcm5hbFZhbHVlKSxcbiAgICAgICAgaXNCbG9jazogdHJ1ZSxcbiAgICAgICAgdHlwZTogXCJsaXN0XCIsXG4gICAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwiQ2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb25FbGVtZW50c0xpc3RcIixcbiAgICAgIH0sXG4gICAgICByZWFsX3RpbWVfYWxlcnRfY29uZmlndXJhdGlvbjoge1xuICAgICAgICB2YWx1ZTogY2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb25SZWFsVGltZUFsZXJ0Q29uZmlndXJhdGlvblRvSGNsVGVycmFmb3JtKHRoaXMuX3JlYWxUaW1lQWxlcnRDb25maWd1cmF0aW9uLmludGVybmFsVmFsdWUpLFxuICAgICAgICBpc0Jsb2NrOiB0cnVlLFxuICAgICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJDaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvblJlYWxUaW1lQWxlcnRDb25maWd1cmF0aW9uTGlzdFwiLFxuICAgICAgfSxcbiAgICAgIHRpbWVvdXRzOiB7XG4gICAgICAgIHZhbHVlOiBjaGltZXNka21lZGlhcGlwZWxpbmVzTWVkaWFJbnNpZ2h0c1BpcGVsaW5lQ29uZmlndXJhdGlvblRpbWVvdXRzVG9IY2xUZXJyYWZvcm0odGhpcy5fdGltZW91dHMuaW50ZXJuYWxWYWx1ZSksXG4gICAgICAgIGlzQmxvY2s6IHRydWUsXG4gICAgICAgIHR5cGU6IFwic3RydWN0XCIsXG4gICAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwiQ2hpbWVzZGttZWRpYXBpcGVsaW5lc01lZGlhSW5zaWdodHNQaXBlbGluZUNvbmZpZ3VyYXRpb25UaW1lb3V0c1wiLFxuICAgICAgfSxcbiAgICB9O1xuXG4gICAgLy8gcmVtb3ZlIHVuZGVmaW5lZCBhdHRyaWJ1dGVzXG4gICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhdHRycykuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWQgKSlcbiAgfVxufVxuIl19