// generated from terraform resource schema
import * as cdktf from 'cdktf';
export class CloudfrontDistributionTrustedKeyGroupsItems extends cdktf.ComplexComputedList {
    // key_group_id - computed: true, optional: false, required: false
    get keyGroupId() {
        return this.getStringAttribute('key_group_id');
    }
    // key_pair_ids - computed: true, optional: false, required: false
    get keyPairIds() {
        return cdktf.Fn.tolist(this.getListAttribute('key_pair_ids'));
    }
}
export class CloudfrontDistributionTrustedKeyGroups extends cdktf.ComplexComputedList {
    // enabled - computed: true, optional: false, required: false
    get enabled() {
        return this.getBooleanAttribute('enabled');
    }
    // items - computed: true, optional: false, required: false
    get items() {
        // Getting the computed value is not yet implemented
        return this.interpolationForAttribute('items');
    }
}
export class CloudfrontDistributionTrustedSignersItems extends cdktf.ComplexComputedList {
    // aws_account_number - computed: true, optional: false, required: false
    get awsAccountNumber() {
        return this.getStringAttribute('aws_account_number');
    }
    // key_pair_ids - computed: true, optional: false, required: false
    get keyPairIds() {
        return cdktf.Fn.tolist(this.getListAttribute('key_pair_ids'));
    }
}
export class CloudfrontDistributionTrustedSigners extends cdktf.ComplexComputedList {
    // enabled - computed: true, optional: false, required: false
    get enabled() {
        return this.getBooleanAttribute('enabled');
    }
    // items - computed: true, optional: false, required: false
    get items() {
        // Getting the computed value is not yet implemented
        return this.interpolationForAttribute('items');
    }
}
export function cloudfrontDistributionCustomErrorResponseToTerraform(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 {
        error_caching_min_ttl: cdktf.numberToTerraform(struct.errorCachingMinTtl),
        error_code: cdktf.numberToTerraform(struct.errorCode),
        response_code: cdktf.numberToTerraform(struct.responseCode),
        response_page_path: cdktf.stringToTerraform(struct.responsePagePath),
    };
}
export function cloudfrontDistributionDefaultCacheBehaviorForwardedValuesCookiesToTerraform(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 {
        forward: cdktf.stringToTerraform(struct.forward),
        whitelisted_names: cdktf.listMapper(cdktf.stringToTerraform)(struct.whitelistedNames),
    };
}
export class CloudfrontDistributionDefaultCacheBehaviorForwardedValuesCookiesOutputReference extends cdktf.ComplexObject {
    isEmptyObject = false;
    /**
    * @param terraformResource The parent resource
    * @param terraformAttribute The attribute on the parent resource this class is referencing
    * @param isSingleItem True if this is a block, false if it's a list
    */
    constructor(terraformResource, terraformAttribute, isSingleItem) {
        super(terraformResource, terraformAttribute, isSingleItem);
    }
    get internalValue() {
        let hasAnyValues = this.isEmptyObject;
        const internalValueResult = {};
        if (this._forward !== undefined) {
            hasAnyValues = true;
            internalValueResult.forward = this._forward;
        }
        if (this._whitelistedNames !== undefined) {
            hasAnyValues = true;
            internalValueResult.whitelistedNames = this._whitelistedNames;
        }
        return hasAnyValues ? internalValueResult : undefined;
    }
    set internalValue(value) {
        if (value === undefined) {
            this.isEmptyObject = false;
            this._forward = undefined;
            this._whitelistedNames = undefined;
        }
        else {
            this.isEmptyObject = Object.keys(value).length === 0;
            this._forward = value.forward;
            this._whitelistedNames = value.whitelistedNames;
        }
    }
    // forward - computed: false, optional: false, required: true
    _forward;
    get forward() {
        return this.getStringAttribute('forward');
    }
    set forward(value) {
        this._forward = value;
    }
    // Temporarily expose input value. Use with caution.
    get forwardInput() {
        return this._forward;
    }
    // whitelisted_names - computed: true, optional: true, required: false
    _whitelistedNames;
    get whitelistedNames() {
        return cdktf.Fn.tolist(this.getListAttribute('whitelisted_names'));
    }
    set whitelistedNames(value) {
        this._whitelistedNames = value;
    }
    resetWhitelistedNames() {
        this._whitelistedNames = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get whitelistedNamesInput() {
        return this._whitelistedNames;
    }
}
export function cloudfrontDistributionDefaultCacheBehaviorForwardedValuesToTerraform(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 {
        headers: cdktf.listMapper(cdktf.stringToTerraform)(struct.headers),
        query_string: cdktf.booleanToTerraform(struct.queryString),
        query_string_cache_keys: cdktf.listMapper(cdktf.stringToTerraform)(struct.queryStringCacheKeys),
        cookies: cloudfrontDistributionDefaultCacheBehaviorForwardedValuesCookiesToTerraform(struct.cookies),
    };
}
export class CloudfrontDistributionDefaultCacheBehaviorForwardedValuesOutputReference extends cdktf.ComplexObject {
    isEmptyObject = false;
    /**
    * @param terraformResource The parent resource
    * @param terraformAttribute The attribute on the parent resource this class is referencing
    * @param isSingleItem True if this is a block, false if it's a list
    */
    constructor(terraformResource, terraformAttribute, isSingleItem) {
        super(terraformResource, terraformAttribute, isSingleItem);
    }
    get internalValue() {
        let hasAnyValues = this.isEmptyObject;
        const internalValueResult = {};
        if (this._headers !== undefined) {
            hasAnyValues = true;
            internalValueResult.headers = this._headers;
        }
        if (this._queryString !== undefined) {
            hasAnyValues = true;
            internalValueResult.queryString = this._queryString;
        }
        if (this._queryStringCacheKeys !== undefined) {
            hasAnyValues = true;
            internalValueResult.queryStringCacheKeys = this._queryStringCacheKeys;
        }
        if (this._cookies?.internalValue !== undefined) {
            hasAnyValues = true;
            internalValueResult.cookies = this._cookies?.internalValue;
        }
        return hasAnyValues ? internalValueResult : undefined;
    }
    set internalValue(value) {
        if (value === undefined) {
            this.isEmptyObject = false;
            this._headers = undefined;
            this._queryString = undefined;
            this._queryStringCacheKeys = undefined;
            this._cookies.internalValue = undefined;
        }
        else {
            this.isEmptyObject = Object.keys(value).length === 0;
            this._headers = value.headers;
            this._queryString = value.queryString;
            this._queryStringCacheKeys = value.queryStringCacheKeys;
            this._cookies.internalValue = value.cookies;
        }
    }
    // headers - computed: true, optional: true, required: false
    _headers;
    get headers() {
        return cdktf.Fn.tolist(this.getListAttribute('headers'));
    }
    set headers(value) {
        this._headers = value;
    }
    resetHeaders() {
        this._headers = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get headersInput() {
        return this._headers;
    }
    // query_string - computed: false, optional: false, required: true
    _queryString;
    get queryString() {
        return this.getBooleanAttribute('query_string');
    }
    set queryString(value) {
        this._queryString = value;
    }
    // Temporarily expose input value. Use with caution.
    get queryStringInput() {
        return this._queryString;
    }
    // query_string_cache_keys - computed: true, optional: true, required: false
    _queryStringCacheKeys;
    get queryStringCacheKeys() {
        return this.getListAttribute('query_string_cache_keys');
    }
    set queryStringCacheKeys(value) {
        this._queryStringCacheKeys = value;
    }
    resetQueryStringCacheKeys() {
        this._queryStringCacheKeys = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get queryStringCacheKeysInput() {
        return this._queryStringCacheKeys;
    }
    // cookies - computed: false, optional: false, required: true
    _cookies = new CloudfrontDistributionDefaultCacheBehaviorForwardedValuesCookiesOutputReference(this, "cookies", true);
    get cookies() {
        return this._cookies;
    }
    putCookies(value) {
        this._cookies.internalValue = value;
    }
    // Temporarily expose input value. Use with caution.
    get cookiesInput() {
        return this._cookies.internalValue;
    }
}
export function cloudfrontDistributionDefaultCacheBehaviorFunctionAssociationToTerraform(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 {
        event_type: cdktf.stringToTerraform(struct.eventType),
        function_arn: cdktf.stringToTerraform(struct.functionArn),
    };
}
export function cloudfrontDistributionDefaultCacheBehaviorLambdaFunctionAssociationToTerraform(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 {
        event_type: cdktf.stringToTerraform(struct.eventType),
        include_body: cdktf.booleanToTerraform(struct.includeBody),
        lambda_arn: cdktf.stringToTerraform(struct.lambdaArn),
    };
}
export function cloudfrontDistributionDefaultCacheBehaviorToTerraform(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 {
        allowed_methods: cdktf.listMapper(cdktf.stringToTerraform)(struct.allowedMethods),
        cache_policy_id: cdktf.stringToTerraform(struct.cachePolicyId),
        cached_methods: cdktf.listMapper(cdktf.stringToTerraform)(struct.cachedMethods),
        compress: cdktf.booleanToTerraform(struct.compress),
        default_ttl: cdktf.numberToTerraform(struct.defaultTtl),
        field_level_encryption_id: cdktf.stringToTerraform(struct.fieldLevelEncryptionId),
        max_ttl: cdktf.numberToTerraform(struct.maxTtl),
        min_ttl: cdktf.numberToTerraform(struct.minTtl),
        origin_request_policy_id: cdktf.stringToTerraform(struct.originRequestPolicyId),
        realtime_log_config_arn: cdktf.stringToTerraform(struct.realtimeLogConfigArn),
        response_headers_policy_id: cdktf.stringToTerraform(struct.responseHeadersPolicyId),
        smooth_streaming: cdktf.booleanToTerraform(struct.smoothStreaming),
        target_origin_id: cdktf.stringToTerraform(struct.targetOriginId),
        trusted_key_groups: cdktf.listMapper(cdktf.stringToTerraform)(struct.trustedKeyGroups),
        trusted_signers: cdktf.listMapper(cdktf.stringToTerraform)(struct.trustedSigners),
        viewer_protocol_policy: cdktf.stringToTerraform(struct.viewerProtocolPolicy),
        forwarded_values: cloudfrontDistributionDefaultCacheBehaviorForwardedValuesToTerraform(struct.forwardedValues),
        function_association: cdktf.listMapper(cloudfrontDistributionDefaultCacheBehaviorFunctionAssociationToTerraform)(struct.functionAssociation),
        lambda_function_association: cdktf.listMapper(cloudfrontDistributionDefaultCacheBehaviorLambdaFunctionAssociationToTerraform)(struct.lambdaFunctionAssociation),
    };
}
export class CloudfrontDistributionDefaultCacheBehaviorOutputReference extends cdktf.ComplexObject {
    isEmptyObject = false;
    /**
    * @param terraformResource The parent resource
    * @param terraformAttribute The attribute on the parent resource this class is referencing
    * @param isSingleItem True if this is a block, false if it's a list
    */
    constructor(terraformResource, terraformAttribute, isSingleItem) {
        super(terraformResource, terraformAttribute, isSingleItem);
    }
    get internalValue() {
        let hasAnyValues = this.isEmptyObject;
        const internalValueResult = {};
        if (this._allowedMethods !== undefined) {
            hasAnyValues = true;
            internalValueResult.allowedMethods = this._allowedMethods;
        }
        if (this._cachePolicyId !== undefined) {
            hasAnyValues = true;
            internalValueResult.cachePolicyId = this._cachePolicyId;
        }
        if (this._cachedMethods !== undefined) {
            hasAnyValues = true;
            internalValueResult.cachedMethods = this._cachedMethods;
        }
        if (this._compress !== undefined) {
            hasAnyValues = true;
            internalValueResult.compress = this._compress;
        }
        if (this._defaultTtl !== undefined) {
            hasAnyValues = true;
            internalValueResult.defaultTtl = this._defaultTtl;
        }
        if (this._fieldLevelEncryptionId !== undefined) {
            hasAnyValues = true;
            internalValueResult.fieldLevelEncryptionId = this._fieldLevelEncryptionId;
        }
        if (this._maxTtl !== undefined) {
            hasAnyValues = true;
            internalValueResult.maxTtl = this._maxTtl;
        }
        if (this._minTtl !== undefined) {
            hasAnyValues = true;
            internalValueResult.minTtl = this._minTtl;
        }
        if (this._originRequestPolicyId !== undefined) {
            hasAnyValues = true;
            internalValueResult.originRequestPolicyId = this._originRequestPolicyId;
        }
        if (this._realtimeLogConfigArn !== undefined) {
            hasAnyValues = true;
            internalValueResult.realtimeLogConfigArn = this._realtimeLogConfigArn;
        }
        if (this._responseHeadersPolicyId !== undefined) {
            hasAnyValues = true;
            internalValueResult.responseHeadersPolicyId = this._responseHeadersPolicyId;
        }
        if (this._smoothStreaming !== undefined) {
            hasAnyValues = true;
            internalValueResult.smoothStreaming = this._smoothStreaming;
        }
        if (this._targetOriginId !== undefined) {
            hasAnyValues = true;
            internalValueResult.targetOriginId = this._targetOriginId;
        }
        if (this._trustedKeyGroups !== undefined) {
            hasAnyValues = true;
            internalValueResult.trustedKeyGroups = this._trustedKeyGroups;
        }
        if (this._trustedSigners !== undefined) {
            hasAnyValues = true;
            internalValueResult.trustedSigners = this._trustedSigners;
        }
        if (this._viewerProtocolPolicy !== undefined) {
            hasAnyValues = true;
            internalValueResult.viewerProtocolPolicy = this._viewerProtocolPolicy;
        }
        if (this._forwardedValues?.internalValue !== undefined) {
            hasAnyValues = true;
            internalValueResult.forwardedValues = this._forwardedValues?.internalValue;
        }
        if (this._functionAssociation !== undefined) {
            hasAnyValues = true;
            internalValueResult.functionAssociation = this._functionAssociation;
        }
        if (this._lambdaFunctionAssociation !== undefined) {
            hasAnyValues = true;
            internalValueResult.lambdaFunctionAssociation = this._lambdaFunctionAssociation;
        }
        return hasAnyValues ? internalValueResult : undefined;
    }
    set internalValue(value) {
        if (value === undefined) {
            this.isEmptyObject = false;
            this._allowedMethods = undefined;
            this._cachePolicyId = undefined;
            this._cachedMethods = undefined;
            this._compress = undefined;
            this._defaultTtl = undefined;
            this._fieldLevelEncryptionId = undefined;
            this._maxTtl = undefined;
            this._minTtl = undefined;
            this._originRequestPolicyId = undefined;
            this._realtimeLogConfigArn = undefined;
            this._responseHeadersPolicyId = undefined;
            this._smoothStreaming = undefined;
            this._targetOriginId = undefined;
            this._trustedKeyGroups = undefined;
            this._trustedSigners = undefined;
            this._viewerProtocolPolicy = undefined;
            this._forwardedValues.internalValue = undefined;
            this._functionAssociation = undefined;
            this._lambdaFunctionAssociation = undefined;
        }
        else {
            this.isEmptyObject = Object.keys(value).length === 0;
            this._allowedMethods = value.allowedMethods;
            this._cachePolicyId = value.cachePolicyId;
            this._cachedMethods = value.cachedMethods;
            this._compress = value.compress;
            this._defaultTtl = value.defaultTtl;
            this._fieldLevelEncryptionId = value.fieldLevelEncryptionId;
            this._maxTtl = value.maxTtl;
            this._minTtl = value.minTtl;
            this._originRequestPolicyId = value.originRequestPolicyId;
            this._realtimeLogConfigArn = value.realtimeLogConfigArn;
            this._responseHeadersPolicyId = value.responseHeadersPolicyId;
            this._smoothStreaming = value.smoothStreaming;
            this._targetOriginId = value.targetOriginId;
            this._trustedKeyGroups = value.trustedKeyGroups;
            this._trustedSigners = value.trustedSigners;
            this._viewerProtocolPolicy = value.viewerProtocolPolicy;
            this._forwardedValues.internalValue = value.forwardedValues;
            this._functionAssociation = value.functionAssociation;
            this._lambdaFunctionAssociation = value.lambdaFunctionAssociation;
        }
    }
    // allowed_methods - computed: false, optional: false, required: true
    _allowedMethods;
    get allowedMethods() {
        return cdktf.Fn.tolist(this.getListAttribute('allowed_methods'));
    }
    set allowedMethods(value) {
        this._allowedMethods = value;
    }
    // Temporarily expose input value. Use with caution.
    get allowedMethodsInput() {
        return this._allowedMethods;
    }
    // cache_policy_id - computed: false, optional: true, required: false
    _cachePolicyId;
    get cachePolicyId() {
        return this.getStringAttribute('cache_policy_id');
    }
    set cachePolicyId(value) {
        this._cachePolicyId = value;
    }
    resetCachePolicyId() {
        this._cachePolicyId = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get cachePolicyIdInput() {
        return this._cachePolicyId;
    }
    // cached_methods - computed: false, optional: false, required: true
    _cachedMethods;
    get cachedMethods() {
        return cdktf.Fn.tolist(this.getListAttribute('cached_methods'));
    }
    set cachedMethods(value) {
        this._cachedMethods = value;
    }
    // Temporarily expose input value. Use with caution.
    get cachedMethodsInput() {
        return this._cachedMethods;
    }
    // compress - computed: false, optional: true, required: false
    _compress;
    get compress() {
        return this.getBooleanAttribute('compress');
    }
    set compress(value) {
        this._compress = value;
    }
    resetCompress() {
        this._compress = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get compressInput() {
        return this._compress;
    }
    // default_ttl - computed: true, optional: true, required: false
    _defaultTtl;
    get defaultTtl() {
        return this.getNumberAttribute('default_ttl');
    }
    set defaultTtl(value) {
        this._defaultTtl = value;
    }
    resetDefaultTtl() {
        this._defaultTtl = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get defaultTtlInput() {
        return this._defaultTtl;
    }
    // field_level_encryption_id - computed: false, optional: true, required: false
    _fieldLevelEncryptionId;
    get fieldLevelEncryptionId() {
        return this.getStringAttribute('field_level_encryption_id');
    }
    set fieldLevelEncryptionId(value) {
        this._fieldLevelEncryptionId = value;
    }
    resetFieldLevelEncryptionId() {
        this._fieldLevelEncryptionId = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get fieldLevelEncryptionIdInput() {
        return this._fieldLevelEncryptionId;
    }
    // max_ttl - computed: true, optional: true, required: false
    _maxTtl;
    get maxTtl() {
        return this.getNumberAttribute('max_ttl');
    }
    set maxTtl(value) {
        this._maxTtl = value;
    }
    resetMaxTtl() {
        this._maxTtl = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get maxTtlInput() {
        return this._maxTtl;
    }
    // min_ttl - computed: false, optional: true, required: false
    _minTtl;
    get minTtl() {
        return this.getNumberAttribute('min_ttl');
    }
    set minTtl(value) {
        this._minTtl = value;
    }
    resetMinTtl() {
        this._minTtl = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get minTtlInput() {
        return this._minTtl;
    }
    // origin_request_policy_id - computed: false, optional: true, required: false
    _originRequestPolicyId;
    get originRequestPolicyId() {
        return this.getStringAttribute('origin_request_policy_id');
    }
    set originRequestPolicyId(value) {
        this._originRequestPolicyId = value;
    }
    resetOriginRequestPolicyId() {
        this._originRequestPolicyId = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get originRequestPolicyIdInput() {
        return this._originRequestPolicyId;
    }
    // realtime_log_config_arn - computed: false, optional: true, required: false
    _realtimeLogConfigArn;
    get realtimeLogConfigArn() {
        return this.getStringAttribute('realtime_log_config_arn');
    }
    set realtimeLogConfigArn(value) {
        this._realtimeLogConfigArn = value;
    }
    resetRealtimeLogConfigArn() {
        this._realtimeLogConfigArn = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get realtimeLogConfigArnInput() {
        return this._realtimeLogConfigArn;
    }
    // response_headers_policy_id - computed: false, optional: true, required: false
    _responseHeadersPolicyId;
    get responseHeadersPolicyId() {
        return this.getStringAttribute('response_headers_policy_id');
    }
    set responseHeadersPolicyId(value) {
        this._responseHeadersPolicyId = value;
    }
    resetResponseHeadersPolicyId() {
        this._responseHeadersPolicyId = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get responseHeadersPolicyIdInput() {
        return this._responseHeadersPolicyId;
    }
    // smooth_streaming - computed: false, optional: true, required: false
    _smoothStreaming;
    get smoothStreaming() {
        return this.getBooleanAttribute('smooth_streaming');
    }
    set smoothStreaming(value) {
        this._smoothStreaming = value;
    }
    resetSmoothStreaming() {
        this._smoothStreaming = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get smoothStreamingInput() {
        return this._smoothStreaming;
    }
    // target_origin_id - computed: false, optional: false, required: true
    _targetOriginId;
    get targetOriginId() {
        return this.getStringAttribute('target_origin_id');
    }
    set targetOriginId(value) {
        this._targetOriginId = value;
    }
    // Temporarily expose input value. Use with caution.
    get targetOriginIdInput() {
        return this._targetOriginId;
    }
    // trusted_key_groups - computed: true, optional: true, required: false
    _trustedKeyGroups;
    get trustedKeyGroups() {
        return this.getListAttribute('trusted_key_groups');
    }
    set trustedKeyGroups(value) {
        this._trustedKeyGroups = value;
    }
    resetTrustedKeyGroups() {
        this._trustedKeyGroups = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get trustedKeyGroupsInput() {
        return this._trustedKeyGroups;
    }
    // trusted_signers - computed: true, optional: true, required: false
    _trustedSigners;
    get trustedSigners() {
        return this.getListAttribute('trusted_signers');
    }
    set trustedSigners(value) {
        this._trustedSigners = value;
    }
    resetTrustedSigners() {
        this._trustedSigners = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get trustedSignersInput() {
        return this._trustedSigners;
    }
    // viewer_protocol_policy - computed: false, optional: false, required: true
    _viewerProtocolPolicy;
    get viewerProtocolPolicy() {
        return this.getStringAttribute('viewer_protocol_policy');
    }
    set viewerProtocolPolicy(value) {
        this._viewerProtocolPolicy = value;
    }
    // Temporarily expose input value. Use with caution.
    get viewerProtocolPolicyInput() {
        return this._viewerProtocolPolicy;
    }
    // forwarded_values - computed: false, optional: true, required: false
    _forwardedValues = new CloudfrontDistributionDefaultCacheBehaviorForwardedValuesOutputReference(this, "forwarded_values", true);
    get forwardedValues() {
        return this._forwardedValues;
    }
    putForwardedValues(value) {
        this._forwardedValues.internalValue = value;
    }
    resetForwardedValues() {
        this._forwardedValues.internalValue = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get forwardedValuesInput() {
        return this._forwardedValues.internalValue;
    }
    // function_association - computed: false, optional: true, required: false
    _functionAssociation;
    get functionAssociation() {
        // Getting the computed value is not yet implemented
        return cdktf.Token.asAny(cdktf.Fn.tolist(this.interpolationForAttribute('function_association')));
    }
    set functionAssociation(value) {
        this._functionAssociation = value;
    }
    resetFunctionAssociation() {
        this._functionAssociation = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get functionAssociationInput() {
        return this._functionAssociation;
    }
    // lambda_function_association - computed: false, optional: true, required: false
    _lambdaFunctionAssociation;
    get lambdaFunctionAssociation() {
        // Getting the computed value is not yet implemented
        return cdktf.Token.asAny(cdktf.Fn.tolist(this.interpolationForAttribute('lambda_function_association')));
    }
    set lambdaFunctionAssociation(value) {
        this._lambdaFunctionAssociation = value;
    }
    resetLambdaFunctionAssociation() {
        this._lambdaFunctionAssociation = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get lambdaFunctionAssociationInput() {
        return this._lambdaFunctionAssociation;
    }
}
export function cloudfrontDistributionLoggingConfigToTerraform(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 {
        bucket: cdktf.stringToTerraform(struct.bucket),
        include_cookies: cdktf.booleanToTerraform(struct.includeCookies),
        prefix: cdktf.stringToTerraform(struct.prefix),
    };
}
export class CloudfrontDistributionLoggingConfigOutputReference extends cdktf.ComplexObject {
    isEmptyObject = false;
    /**
    * @param terraformResource The parent resource
    * @param terraformAttribute The attribute on the parent resource this class is referencing
    * @param isSingleItem True if this is a block, false if it's a list
    */
    constructor(terraformResource, terraformAttribute, isSingleItem) {
        super(terraformResource, terraformAttribute, isSingleItem);
    }
    get internalValue() {
        let hasAnyValues = this.isEmptyObject;
        const internalValueResult = {};
        if (this._bucket !== undefined) {
            hasAnyValues = true;
            internalValueResult.bucket = this._bucket;
        }
        if (this._includeCookies !== undefined) {
            hasAnyValues = true;
            internalValueResult.includeCookies = this._includeCookies;
        }
        if (this._prefix !== undefined) {
            hasAnyValues = true;
            internalValueResult.prefix = this._prefix;
        }
        return hasAnyValues ? internalValueResult : undefined;
    }
    set internalValue(value) {
        if (value === undefined) {
            this.isEmptyObject = false;
            this._bucket = undefined;
            this._includeCookies = undefined;
            this._prefix = undefined;
        }
        else {
            this.isEmptyObject = Object.keys(value).length === 0;
            this._bucket = value.bucket;
            this._includeCookies = value.includeCookies;
            this._prefix = value.prefix;
        }
    }
    // bucket - computed: false, optional: false, required: true
    _bucket;
    get bucket() {
        return this.getStringAttribute('bucket');
    }
    set bucket(value) {
        this._bucket = value;
    }
    // Temporarily expose input value. Use with caution.
    get bucketInput() {
        return this._bucket;
    }
    // include_cookies - computed: false, optional: true, required: false
    _includeCookies;
    get includeCookies() {
        return this.getBooleanAttribute('include_cookies');
    }
    set includeCookies(value) {
        this._includeCookies = value;
    }
    resetIncludeCookies() {
        this._includeCookies = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get includeCookiesInput() {
        return this._includeCookies;
    }
    // prefix - computed: false, optional: true, required: false
    _prefix;
    get prefix() {
        return this.getStringAttribute('prefix');
    }
    set prefix(value) {
        this._prefix = value;
    }
    resetPrefix() {
        this._prefix = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get prefixInput() {
        return this._prefix;
    }
}
export function cloudfrontDistributionOrderedCacheBehaviorForwardedValuesCookiesToTerraform(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 {
        forward: cdktf.stringToTerraform(struct.forward),
        whitelisted_names: cdktf.listMapper(cdktf.stringToTerraform)(struct.whitelistedNames),
    };
}
export class CloudfrontDistributionOrderedCacheBehaviorForwardedValuesCookiesOutputReference extends cdktf.ComplexObject {
    isEmptyObject = false;
    /**
    * @param terraformResource The parent resource
    * @param terraformAttribute The attribute on the parent resource this class is referencing
    * @param isSingleItem True if this is a block, false if it's a list
    */
    constructor(terraformResource, terraformAttribute, isSingleItem) {
        super(terraformResource, terraformAttribute, isSingleItem);
    }
    get internalValue() {
        let hasAnyValues = this.isEmptyObject;
        const internalValueResult = {};
        if (this._forward !== undefined) {
            hasAnyValues = true;
            internalValueResult.forward = this._forward;
        }
        if (this._whitelistedNames !== undefined) {
            hasAnyValues = true;
            internalValueResult.whitelistedNames = this._whitelistedNames;
        }
        return hasAnyValues ? internalValueResult : undefined;
    }
    set internalValue(value) {
        if (value === undefined) {
            this.isEmptyObject = false;
            this._forward = undefined;
            this._whitelistedNames = undefined;
        }
        else {
            this.isEmptyObject = Object.keys(value).length === 0;
            this._forward = value.forward;
            this._whitelistedNames = value.whitelistedNames;
        }
    }
    // forward - computed: false, optional: false, required: true
    _forward;
    get forward() {
        return this.getStringAttribute('forward');
    }
    set forward(value) {
        this._forward = value;
    }
    // Temporarily expose input value. Use with caution.
    get forwardInput() {
        return this._forward;
    }
    // whitelisted_names - computed: false, optional: true, required: false
    _whitelistedNames;
    get whitelistedNames() {
        return cdktf.Fn.tolist(this.getListAttribute('whitelisted_names'));
    }
    set whitelistedNames(value) {
        this._whitelistedNames = value;
    }
    resetWhitelistedNames() {
        this._whitelistedNames = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get whitelistedNamesInput() {
        return this._whitelistedNames;
    }
}
export function cloudfrontDistributionOrderedCacheBehaviorForwardedValuesToTerraform(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 {
        headers: cdktf.listMapper(cdktf.stringToTerraform)(struct.headers),
        query_string: cdktf.booleanToTerraform(struct.queryString),
        query_string_cache_keys: cdktf.listMapper(cdktf.stringToTerraform)(struct.queryStringCacheKeys),
        cookies: cloudfrontDistributionOrderedCacheBehaviorForwardedValuesCookiesToTerraform(struct.cookies),
    };
}
export class CloudfrontDistributionOrderedCacheBehaviorForwardedValuesOutputReference extends cdktf.ComplexObject {
    isEmptyObject = false;
    /**
    * @param terraformResource The parent resource
    * @param terraformAttribute The attribute on the parent resource this class is referencing
    * @param isSingleItem True if this is a block, false if it's a list
    */
    constructor(terraformResource, terraformAttribute, isSingleItem) {
        super(terraformResource, terraformAttribute, isSingleItem);
    }
    get internalValue() {
        let hasAnyValues = this.isEmptyObject;
        const internalValueResult = {};
        if (this._headers !== undefined) {
            hasAnyValues = true;
            internalValueResult.headers = this._headers;
        }
        if (this._queryString !== undefined) {
            hasAnyValues = true;
            internalValueResult.queryString = this._queryString;
        }
        if (this._queryStringCacheKeys !== undefined) {
            hasAnyValues = true;
            internalValueResult.queryStringCacheKeys = this._queryStringCacheKeys;
        }
        if (this._cookies?.internalValue !== undefined) {
            hasAnyValues = true;
            internalValueResult.cookies = this._cookies?.internalValue;
        }
        return hasAnyValues ? internalValueResult : undefined;
    }
    set internalValue(value) {
        if (value === undefined) {
            this.isEmptyObject = false;
            this._headers = undefined;
            this._queryString = undefined;
            this._queryStringCacheKeys = undefined;
            this._cookies.internalValue = undefined;
        }
        else {
            this.isEmptyObject = Object.keys(value).length === 0;
            this._headers = value.headers;
            this._queryString = value.queryString;
            this._queryStringCacheKeys = value.queryStringCacheKeys;
            this._cookies.internalValue = value.cookies;
        }
    }
    // headers - computed: true, optional: true, required: false
    _headers;
    get headers() {
        return cdktf.Fn.tolist(this.getListAttribute('headers'));
    }
    set headers(value) {
        this._headers = value;
    }
    resetHeaders() {
        this._headers = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get headersInput() {
        return this._headers;
    }
    // query_string - computed: false, optional: false, required: true
    _queryString;
    get queryString() {
        return this.getBooleanAttribute('query_string');
    }
    set queryString(value) {
        this._queryString = value;
    }
    // Temporarily expose input value. Use with caution.
    get queryStringInput() {
        return this._queryString;
    }
    // query_string_cache_keys - computed: true, optional: true, required: false
    _queryStringCacheKeys;
    get queryStringCacheKeys() {
        return this.getListAttribute('query_string_cache_keys');
    }
    set queryStringCacheKeys(value) {
        this._queryStringCacheKeys = value;
    }
    resetQueryStringCacheKeys() {
        this._queryStringCacheKeys = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get queryStringCacheKeysInput() {
        return this._queryStringCacheKeys;
    }
    // cookies - computed: false, optional: false, required: true
    _cookies = new CloudfrontDistributionOrderedCacheBehaviorForwardedValuesCookiesOutputReference(this, "cookies", true);
    get cookies() {
        return this._cookies;
    }
    putCookies(value) {
        this._cookies.internalValue = value;
    }
    // Temporarily expose input value. Use with caution.
    get cookiesInput() {
        return this._cookies.internalValue;
    }
}
export function cloudfrontDistributionOrderedCacheBehaviorFunctionAssociationToTerraform(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 {
        event_type: cdktf.stringToTerraform(struct.eventType),
        function_arn: cdktf.stringToTerraform(struct.functionArn),
    };
}
export function cloudfrontDistributionOrderedCacheBehaviorLambdaFunctionAssociationToTerraform(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 {
        event_type: cdktf.stringToTerraform(struct.eventType),
        include_body: cdktf.booleanToTerraform(struct.includeBody),
        lambda_arn: cdktf.stringToTerraform(struct.lambdaArn),
    };
}
export function cloudfrontDistributionOrderedCacheBehaviorToTerraform(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 {
        allowed_methods: cdktf.listMapper(cdktf.stringToTerraform)(struct.allowedMethods),
        cache_policy_id: cdktf.stringToTerraform(struct.cachePolicyId),
        cached_methods: cdktf.listMapper(cdktf.stringToTerraform)(struct.cachedMethods),
        compress: cdktf.booleanToTerraform(struct.compress),
        default_ttl: cdktf.numberToTerraform(struct.defaultTtl),
        field_level_encryption_id: cdktf.stringToTerraform(struct.fieldLevelEncryptionId),
        max_ttl: cdktf.numberToTerraform(struct.maxTtl),
        min_ttl: cdktf.numberToTerraform(struct.minTtl),
        origin_request_policy_id: cdktf.stringToTerraform(struct.originRequestPolicyId),
        path_pattern: cdktf.stringToTerraform(struct.pathPattern),
        realtime_log_config_arn: cdktf.stringToTerraform(struct.realtimeLogConfigArn),
        response_headers_policy_id: cdktf.stringToTerraform(struct.responseHeadersPolicyId),
        smooth_streaming: cdktf.booleanToTerraform(struct.smoothStreaming),
        target_origin_id: cdktf.stringToTerraform(struct.targetOriginId),
        trusted_key_groups: cdktf.listMapper(cdktf.stringToTerraform)(struct.trustedKeyGroups),
        trusted_signers: cdktf.listMapper(cdktf.stringToTerraform)(struct.trustedSigners),
        viewer_protocol_policy: cdktf.stringToTerraform(struct.viewerProtocolPolicy),
        forwarded_values: cloudfrontDistributionOrderedCacheBehaviorForwardedValuesToTerraform(struct.forwardedValues),
        function_association: cdktf.listMapper(cloudfrontDistributionOrderedCacheBehaviorFunctionAssociationToTerraform)(struct.functionAssociation),
        lambda_function_association: cdktf.listMapper(cloudfrontDistributionOrderedCacheBehaviorLambdaFunctionAssociationToTerraform)(struct.lambdaFunctionAssociation),
    };
}
export function cloudfrontDistributionOriginCustomHeaderToTerraform(struct) {
    if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
        return struct;
    }
    if (cdktf.isComplexElement(struct)) {
        throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
    }
    return {
        name: cdktf.stringToTerraform(struct.name),
        value: cdktf.stringToTerraform(struct.value),
    };
}
export function cloudfrontDistributionOriginCustomOriginConfigToTerraform(struct) {
    if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
        return struct;
    }
    if (cdktf.isComplexElement(struct)) {
        throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
    }
    return {
        http_port: cdktf.numberToTerraform(struct.httpPort),
        https_port: cdktf.numberToTerraform(struct.httpsPort),
        origin_keepalive_timeout: cdktf.numberToTerraform(struct.originKeepaliveTimeout),
        origin_protocol_policy: cdktf.stringToTerraform(struct.originProtocolPolicy),
        origin_read_timeout: cdktf.numberToTerraform(struct.originReadTimeout),
        origin_ssl_protocols: cdktf.listMapper(cdktf.stringToTerraform)(struct.originSslProtocols),
    };
}
export class CloudfrontDistributionOriginCustomOriginConfigOutputReference extends cdktf.ComplexObject {
    isEmptyObject = false;
    /**
    * @param terraformResource The parent resource
    * @param terraformAttribute The attribute on the parent resource this class is referencing
    * @param isSingleItem True if this is a block, false if it's a list
    */
    constructor(terraformResource, terraformAttribute, isSingleItem) {
        super(terraformResource, terraformAttribute, isSingleItem);
    }
    get internalValue() {
        let hasAnyValues = this.isEmptyObject;
        const internalValueResult = {};
        if (this._httpPort !== undefined) {
            hasAnyValues = true;
            internalValueResult.httpPort = this._httpPort;
        }
        if (this._httpsPort !== undefined) {
            hasAnyValues = true;
            internalValueResult.httpsPort = this._httpsPort;
        }
        if (this._originKeepaliveTimeout !== undefined) {
            hasAnyValues = true;
            internalValueResult.originKeepaliveTimeout = this._originKeepaliveTimeout;
        }
        if (this._originProtocolPolicy !== undefined) {
            hasAnyValues = true;
            internalValueResult.originProtocolPolicy = this._originProtocolPolicy;
        }
        if (this._originReadTimeout !== undefined) {
            hasAnyValues = true;
            internalValueResult.originReadTimeout = this._originReadTimeout;
        }
        if (this._originSslProtocols !== undefined) {
            hasAnyValues = true;
            internalValueResult.originSslProtocols = this._originSslProtocols;
        }
        return hasAnyValues ? internalValueResult : undefined;
    }
    set internalValue(value) {
        if (value === undefined) {
            this.isEmptyObject = false;
            this._httpPort = undefined;
            this._httpsPort = undefined;
            this._originKeepaliveTimeout = undefined;
            this._originProtocolPolicy = undefined;
            this._originReadTimeout = undefined;
            this._originSslProtocols = undefined;
        }
        else {
            this.isEmptyObject = Object.keys(value).length === 0;
            this._httpPort = value.httpPort;
            this._httpsPort = value.httpsPort;
            this._originKeepaliveTimeout = value.originKeepaliveTimeout;
            this._originProtocolPolicy = value.originProtocolPolicy;
            this._originReadTimeout = value.originReadTimeout;
            this._originSslProtocols = value.originSslProtocols;
        }
    }
    // http_port - computed: false, optional: false, required: true
    _httpPort;
    get httpPort() {
        return this.getNumberAttribute('http_port');
    }
    set httpPort(value) {
        this._httpPort = value;
    }
    // Temporarily expose input value. Use with caution.
    get httpPortInput() {
        return this._httpPort;
    }
    // https_port - computed: false, optional: false, required: true
    _httpsPort;
    get httpsPort() {
        return this.getNumberAttribute('https_port');
    }
    set httpsPort(value) {
        this._httpsPort = value;
    }
    // Temporarily expose input value. Use with caution.
    get httpsPortInput() {
        return this._httpsPort;
    }
    // origin_keepalive_timeout - computed: false, optional: true, required: false
    _originKeepaliveTimeout;
    get originKeepaliveTimeout() {
        return this.getNumberAttribute('origin_keepalive_timeout');
    }
    set originKeepaliveTimeout(value) {
        this._originKeepaliveTimeout = value;
    }
    resetOriginKeepaliveTimeout() {
        this._originKeepaliveTimeout = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get originKeepaliveTimeoutInput() {
        return this._originKeepaliveTimeout;
    }
    // origin_protocol_policy - computed: false, optional: false, required: true
    _originProtocolPolicy;
    get originProtocolPolicy() {
        return this.getStringAttribute('origin_protocol_policy');
    }
    set originProtocolPolicy(value) {
        this._originProtocolPolicy = value;
    }
    // Temporarily expose input value. Use with caution.
    get originProtocolPolicyInput() {
        return this._originProtocolPolicy;
    }
    // origin_read_timeout - computed: false, optional: true, required: false
    _originReadTimeout;
    get originReadTimeout() {
        return this.getNumberAttribute('origin_read_timeout');
    }
    set originReadTimeout(value) {
        this._originReadTimeout = value;
    }
    resetOriginReadTimeout() {
        this._originReadTimeout = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get originReadTimeoutInput() {
        return this._originReadTimeout;
    }
    // origin_ssl_protocols - computed: false, optional: false, required: true
    _originSslProtocols;
    get originSslProtocols() {
        return cdktf.Fn.tolist(this.getListAttribute('origin_ssl_protocols'));
    }
    set originSslProtocols(value) {
        this._originSslProtocols = value;
    }
    // Temporarily expose input value. Use with caution.
    get originSslProtocolsInput() {
        return this._originSslProtocols;
    }
}
export function cloudfrontDistributionOriginOriginShieldToTerraform(struct) {
    if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
        return struct;
    }
    if (cdktf.isComplexElement(struct)) {
        throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
    }
    return {
        enabled: cdktf.booleanToTerraform(struct.enabled),
        origin_shield_region: cdktf.stringToTerraform(struct.originShieldRegion),
    };
}
export class CloudfrontDistributionOriginOriginShieldOutputReference extends cdktf.ComplexObject {
    isEmptyObject = false;
    /**
    * @param terraformResource The parent resource
    * @param terraformAttribute The attribute on the parent resource this class is referencing
    * @param isSingleItem True if this is a block, false if it's a list
    */
    constructor(terraformResource, terraformAttribute, isSingleItem) {
        super(terraformResource, terraformAttribute, isSingleItem);
    }
    get internalValue() {
        let hasAnyValues = this.isEmptyObject;
        const internalValueResult = {};
        if (this._enabled !== undefined) {
            hasAnyValues = true;
            internalValueResult.enabled = this._enabled;
        }
        if (this._originShieldRegion !== undefined) {
            hasAnyValues = true;
            internalValueResult.originShieldRegion = this._originShieldRegion;
        }
        return hasAnyValues ? internalValueResult : undefined;
    }
    set internalValue(value) {
        if (value === undefined) {
            this.isEmptyObject = false;
            this._enabled = undefined;
            this._originShieldRegion = undefined;
        }
        else {
            this.isEmptyObject = Object.keys(value).length === 0;
            this._enabled = value.enabled;
            this._originShieldRegion = value.originShieldRegion;
        }
    }
    // enabled - computed: false, optional: false, required: true
    _enabled;
    get enabled() {
        return this.getBooleanAttribute('enabled');
    }
    set enabled(value) {
        this._enabled = value;
    }
    // Temporarily expose input value. Use with caution.
    get enabledInput() {
        return this._enabled;
    }
    // origin_shield_region - computed: false, optional: false, required: true
    _originShieldRegion;
    get originShieldRegion() {
        return this.getStringAttribute('origin_shield_region');
    }
    set originShieldRegion(value) {
        this._originShieldRegion = value;
    }
    // Temporarily expose input value. Use with caution.
    get originShieldRegionInput() {
        return this._originShieldRegion;
    }
}
export function cloudfrontDistributionOriginS3OriginConfigToTerraform(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 {
        origin_access_identity: cdktf.stringToTerraform(struct.originAccessIdentity),
    };
}
export class CloudfrontDistributionOriginS3OriginConfigOutputReference extends cdktf.ComplexObject {
    isEmptyObject = false;
    /**
    * @param terraformResource The parent resource
    * @param terraformAttribute The attribute on the parent resource this class is referencing
    * @param isSingleItem True if this is a block, false if it's a list
    */
    constructor(terraformResource, terraformAttribute, isSingleItem) {
        super(terraformResource, terraformAttribute, isSingleItem);
    }
    get internalValue() {
        let hasAnyValues = this.isEmptyObject;
        const internalValueResult = {};
        if (this._originAccessIdentity !== undefined) {
            hasAnyValues = true;
            internalValueResult.originAccessIdentity = this._originAccessIdentity;
        }
        return hasAnyValues ? internalValueResult : undefined;
    }
    set internalValue(value) {
        if (value === undefined) {
            this.isEmptyObject = false;
            this._originAccessIdentity = undefined;
        }
        else {
            this.isEmptyObject = Object.keys(value).length === 0;
            this._originAccessIdentity = value.originAccessIdentity;
        }
    }
    // origin_access_identity - computed: false, optional: false, required: true
    _originAccessIdentity;
    get originAccessIdentity() {
        return this.getStringAttribute('origin_access_identity');
    }
    set originAccessIdentity(value) {
        this._originAccessIdentity = value;
    }
    // Temporarily expose input value. Use with caution.
    get originAccessIdentityInput() {
        return this._originAccessIdentity;
    }
}
export function cloudfrontDistributionOriginToTerraform(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 {
        connection_attempts: cdktf.numberToTerraform(struct.connectionAttempts),
        connection_timeout: cdktf.numberToTerraform(struct.connectionTimeout),
        domain_name: cdktf.stringToTerraform(struct.domainName),
        origin_id: cdktf.stringToTerraform(struct.originId),
        origin_path: cdktf.stringToTerraform(struct.originPath),
        custom_header: cdktf.listMapper(cloudfrontDistributionOriginCustomHeaderToTerraform)(struct.customHeader),
        custom_origin_config: cloudfrontDistributionOriginCustomOriginConfigToTerraform(struct.customOriginConfig),
        origin_shield: cloudfrontDistributionOriginOriginShieldToTerraform(struct.originShield),
        s3_origin_config: cloudfrontDistributionOriginS3OriginConfigToTerraform(struct.s3OriginConfig),
    };
}
export function cloudfrontDistributionOriginGroupFailoverCriteriaToTerraform(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 {
        status_codes: cdktf.listMapper(cdktf.numberToTerraform)(struct.statusCodes),
    };
}
export class CloudfrontDistributionOriginGroupFailoverCriteriaOutputReference extends cdktf.ComplexObject {
    isEmptyObject = false;
    /**
    * @param terraformResource The parent resource
    * @param terraformAttribute The attribute on the parent resource this class is referencing
    * @param isSingleItem True if this is a block, false if it's a list
    */
    constructor(terraformResource, terraformAttribute, isSingleItem) {
        super(terraformResource, terraformAttribute, isSingleItem);
    }
    get internalValue() {
        let hasAnyValues = this.isEmptyObject;
        const internalValueResult = {};
        if (this._statusCodes !== undefined) {
            hasAnyValues = true;
            internalValueResult.statusCodes = this._statusCodes;
        }
        return hasAnyValues ? internalValueResult : undefined;
    }
    set internalValue(value) {
        if (value === undefined) {
            this.isEmptyObject = false;
            this._statusCodes = undefined;
        }
        else {
            this.isEmptyObject = Object.keys(value).length === 0;
            this._statusCodes = value.statusCodes;
        }
    }
    // status_codes - computed: false, optional: false, required: true
    _statusCodes;
    get statusCodes() {
        return cdktf.Token.asNumberList(cdktf.Fn.tolist(this.getNumberListAttribute('status_codes')));
    }
    set statusCodes(value) {
        this._statusCodes = value;
    }
    // Temporarily expose input value. Use with caution.
    get statusCodesInput() {
        return this._statusCodes;
    }
}
export function cloudfrontDistributionOriginGroupMemberToTerraform(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 {
        origin_id: cdktf.stringToTerraform(struct.originId),
    };
}
export function cloudfrontDistributionOriginGroupToTerraform(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 {
        origin_id: cdktf.stringToTerraform(struct.originId),
        failover_criteria: cloudfrontDistributionOriginGroupFailoverCriteriaToTerraform(struct.failoverCriteria),
        member: cdktf.listMapper(cloudfrontDistributionOriginGroupMemberToTerraform)(struct.member),
    };
}
export function cloudfrontDistributionRestrictionsGeoRestrictionToTerraform(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 {
        locations: cdktf.listMapper(cdktf.stringToTerraform)(struct.locations),
        restriction_type: cdktf.stringToTerraform(struct.restrictionType),
    };
}
export class CloudfrontDistributionRestrictionsGeoRestrictionOutputReference extends cdktf.ComplexObject {
    isEmptyObject = false;
    /**
    * @param terraformResource The parent resource
    * @param terraformAttribute The attribute on the parent resource this class is referencing
    * @param isSingleItem True if this is a block, false if it's a list
    */
    constructor(terraformResource, terraformAttribute, isSingleItem) {
        super(terraformResource, terraformAttribute, isSingleItem);
    }
    get internalValue() {
        let hasAnyValues = this.isEmptyObject;
        const internalValueResult = {};
        if (this._locations !== undefined) {
            hasAnyValues = true;
            internalValueResult.locations = this._locations;
        }
        if (this._restrictionType !== undefined) {
            hasAnyValues = true;
            internalValueResult.restrictionType = this._restrictionType;
        }
        return hasAnyValues ? internalValueResult : undefined;
    }
    set internalValue(value) {
        if (value === undefined) {
            this.isEmptyObject = false;
            this._locations = undefined;
            this._restrictionType = undefined;
        }
        else {
            this.isEmptyObject = Object.keys(value).length === 0;
            this._locations = value.locations;
            this._restrictionType = value.restrictionType;
        }
    }
    // locations - computed: true, optional: true, required: false
    _locations;
    get locations() {
        return cdktf.Fn.tolist(this.getListAttribute('locations'));
    }
    set locations(value) {
        this._locations = value;
    }
    resetLocations() {
        this._locations = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get locationsInput() {
        return this._locations;
    }
    // restriction_type - computed: false, optional: false, required: true
    _restrictionType;
    get restrictionType() {
        return this.getStringAttribute('restriction_type');
    }
    set restrictionType(value) {
        this._restrictionType = value;
    }
    // Temporarily expose input value. Use with caution.
    get restrictionTypeInput() {
        return this._restrictionType;
    }
}
export function cloudfrontDistributionRestrictionsToTerraform(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 {
        geo_restriction: cloudfrontDistributionRestrictionsGeoRestrictionToTerraform(struct.geoRestriction),
    };
}
export class CloudfrontDistributionRestrictionsOutputReference extends cdktf.ComplexObject {
    isEmptyObject = false;
    /**
    * @param terraformResource The parent resource
    * @param terraformAttribute The attribute on the parent resource this class is referencing
    * @param isSingleItem True if this is a block, false if it's a list
    */
    constructor(terraformResource, terraformAttribute, isSingleItem) {
        super(terraformResource, terraformAttribute, isSingleItem);
    }
    get internalValue() {
        let hasAnyValues = this.isEmptyObject;
        const internalValueResult = {};
        if (this._geoRestriction?.internalValue !== undefined) {
            hasAnyValues = true;
            internalValueResult.geoRestriction = this._geoRestriction?.internalValue;
        }
        return hasAnyValues ? internalValueResult : undefined;
    }
    set internalValue(value) {
        if (value === undefined) {
            this.isEmptyObject = false;
            this._geoRestriction.internalValue = undefined;
        }
        else {
            this.isEmptyObject = Object.keys(value).length === 0;
            this._geoRestriction.internalValue = value.geoRestriction;
        }
    }
    // geo_restriction - computed: false, optional: false, required: true
    _geoRestriction = new CloudfrontDistributionRestrictionsGeoRestrictionOutputReference(this, "geo_restriction", true);
    get geoRestriction() {
        return this._geoRestriction;
    }
    putGeoRestriction(value) {
        this._geoRestriction.internalValue = value;
    }
    // Temporarily expose input value. Use with caution.
    get geoRestrictionInput() {
        return this._geoRestriction.internalValue;
    }
}
export function cloudfrontDistributionViewerCertificateToTerraform(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 {
        acm_certificate_arn: cdktf.stringToTerraform(struct.acmCertificateArn),
        cloudfront_default_certificate: cdktf.booleanToTerraform(struct.cloudfrontDefaultCertificate),
        iam_certificate_id: cdktf.stringToTerraform(struct.iamCertificateId),
        minimum_protocol_version: cdktf.stringToTerraform(struct.minimumProtocolVersion),
        ssl_support_method: cdktf.stringToTerraform(struct.sslSupportMethod),
    };
}
export class CloudfrontDistributionViewerCertificateOutputReference extends cdktf.ComplexObject {
    isEmptyObject = false;
    /**
    * @param terraformResource The parent resource
    * @param terraformAttribute The attribute on the parent resource this class is referencing
    * @param isSingleItem True if this is a block, false if it's a list
    */
    constructor(terraformResource, terraformAttribute, isSingleItem) {
        super(terraformResource, terraformAttribute, isSingleItem);
    }
    get internalValue() {
        let hasAnyValues = this.isEmptyObject;
        const internalValueResult = {};
        if (this._acmCertificateArn !== undefined) {
            hasAnyValues = true;
            internalValueResult.acmCertificateArn = this._acmCertificateArn;
        }
        if (this._cloudfrontDefaultCertificate !== undefined) {
            hasAnyValues = true;
            internalValueResult.cloudfrontDefaultCertificate = this._cloudfrontDefaultCertificate;
        }
        if (this._iamCertificateId !== undefined) {
            hasAnyValues = true;
            internalValueResult.iamCertificateId = this._iamCertificateId;
        }
        if (this._minimumProtocolVersion !== undefined) {
            hasAnyValues = true;
            internalValueResult.minimumProtocolVersion = this._minimumProtocolVersion;
        }
        if (this._sslSupportMethod !== undefined) {
            hasAnyValues = true;
            internalValueResult.sslSupportMethod = this._sslSupportMethod;
        }
        return hasAnyValues ? internalValueResult : undefined;
    }
    set internalValue(value) {
        if (value === undefined) {
            this.isEmptyObject = false;
            this._acmCertificateArn = undefined;
            this._cloudfrontDefaultCertificate = undefined;
            this._iamCertificateId = undefined;
            this._minimumProtocolVersion = undefined;
            this._sslSupportMethod = undefined;
        }
        else {
            this.isEmptyObject = Object.keys(value).length === 0;
            this._acmCertificateArn = value.acmCertificateArn;
            this._cloudfrontDefaultCertificate = value.cloudfrontDefaultCertificate;
            this._iamCertificateId = value.iamCertificateId;
            this._minimumProtocolVersion = value.minimumProtocolVersion;
            this._sslSupportMethod = value.sslSupportMethod;
        }
    }
    // acm_certificate_arn - computed: false, optional: true, required: false
    _acmCertificateArn;
    get acmCertificateArn() {
        return this.getStringAttribute('acm_certificate_arn');
    }
    set acmCertificateArn(value) {
        this._acmCertificateArn = value;
    }
    resetAcmCertificateArn() {
        this._acmCertificateArn = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get acmCertificateArnInput() {
        return this._acmCertificateArn;
    }
    // cloudfront_default_certificate - computed: false, optional: true, required: false
    _cloudfrontDefaultCertificate;
    get cloudfrontDefaultCertificate() {
        return this.getBooleanAttribute('cloudfront_default_certificate');
    }
    set cloudfrontDefaultCertificate(value) {
        this._cloudfrontDefaultCertificate = value;
    }
    resetCloudfrontDefaultCertificate() {
        this._cloudfrontDefaultCertificate = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get cloudfrontDefaultCertificateInput() {
        return this._cloudfrontDefaultCertificate;
    }
    // iam_certificate_id - computed: false, optional: true, required: false
    _iamCertificateId;
    get iamCertificateId() {
        return this.getStringAttribute('iam_certificate_id');
    }
    set iamCertificateId(value) {
        this._iamCertificateId = value;
    }
    resetIamCertificateId() {
        this._iamCertificateId = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get iamCertificateIdInput() {
        return this._iamCertificateId;
    }
    // minimum_protocol_version - computed: false, optional: true, required: false
    _minimumProtocolVersion;
    get minimumProtocolVersion() {
        return this.getStringAttribute('minimum_protocol_version');
    }
    set minimumProtocolVersion(value) {
        this._minimumProtocolVersion = value;
    }
    resetMinimumProtocolVersion() {
        this._minimumProtocolVersion = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get minimumProtocolVersionInput() {
        return this._minimumProtocolVersion;
    }
    // ssl_support_method - computed: false, optional: true, required: false
    _sslSupportMethod;
    get sslSupportMethod() {
        return this.getStringAttribute('ssl_support_method');
    }
    set sslSupportMethod(value) {
        this._sslSupportMethod = value;
    }
    resetSslSupportMethod() {
        this._sslSupportMethod = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get sslSupportMethodInput() {
        return this._sslSupportMethod;
    }
}
/**
* Represents a {@link https://www.terraform.io/docs/providers/aws/r/cloudfront_distribution aws_cloudfront_distribution}
*/
export class CloudfrontDistribution extends cdktf.TerraformResource {
    // =================
    // STATIC PROPERTIES
    // =================
    static tfResourceType = "aws_cloudfront_distribution";
    // ===========
    // INITIALIZER
    // ===========
    /**
    * Create a new {@link https://www.terraform.io/docs/providers/aws/r/cloudfront_distribution aws_cloudfront_distribution} 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 CloudfrontDistributionConfig
    */
    constructor(scope, id, config) {
        super(scope, id, {
            terraformResourceType: 'aws_cloudfront_distribution',
            terraformGeneratorMetadata: {
                providerName: 'aws'
            },
            provider: config.provider,
            dependsOn: config.dependsOn,
            count: config.count,
            lifecycle: config.lifecycle
        });
        this._aliases = config.aliases;
        this._comment = config.comment;
        this._defaultRootObject = config.defaultRootObject;
        this._enabled = config.enabled;
        this._httpVersion = config.httpVersion;
        this._isIpv6Enabled = config.isIpv6Enabled;
        this._priceClass = config.priceClass;
        this._retainOnDelete = config.retainOnDelete;
        this._tags = config.tags;
        this._tagsAll = config.tagsAll;
        this._waitForDeployment = config.waitForDeployment;
        this._webAclId = config.webAclId;
        this._customErrorResponse = config.customErrorResponse;
        this._defaultCacheBehavior.internalValue = config.defaultCacheBehavior;
        this._loggingConfig.internalValue = config.loggingConfig;
        this._orderedCacheBehavior = config.orderedCacheBehavior;
        this._origin = config.origin;
        this._originGroup = config.originGroup;
        this._restrictions.internalValue = config.restrictions;
        this._viewerCertificate.internalValue = config.viewerCertificate;
    }
    // ==========
    // ATTRIBUTES
    // ==========
    // aliases - computed: false, optional: true, required: false
    _aliases;
    get aliases() {
        return cdktf.Fn.tolist(this.getListAttribute('aliases'));
    }
    set aliases(value) {
        this._aliases = value;
    }
    resetAliases() {
        this._aliases = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get aliasesInput() {
        return this._aliases;
    }
    // arn - computed: true, optional: false, required: false
    get arn() {
        return this.getStringAttribute('arn');
    }
    // caller_reference - computed: true, optional: false, required: false
    get callerReference() {
        return this.getStringAttribute('caller_reference');
    }
    // comment - computed: false, optional: true, required: false
    _comment;
    get comment() {
        return this.getStringAttribute('comment');
    }
    set comment(value) {
        this._comment = value;
    }
    resetComment() {
        this._comment = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get commentInput() {
        return this._comment;
    }
    // default_root_object - computed: false, optional: true, required: false
    _defaultRootObject;
    get defaultRootObject() {
        return this.getStringAttribute('default_root_object');
    }
    set defaultRootObject(value) {
        this._defaultRootObject = value;
    }
    resetDefaultRootObject() {
        this._defaultRootObject = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get defaultRootObjectInput() {
        return this._defaultRootObject;
    }
    // domain_name - computed: true, optional: false, required: false
    get domainName() {
        return this.getStringAttribute('domain_name');
    }
    // enabled - computed: false, optional: false, required: true
    _enabled;
    get enabled() {
        return this.getBooleanAttribute('enabled');
    }
    set enabled(value) {
        this._enabled = value;
    }
    // Temporarily expose input value. Use with caution.
    get enabledInput() {
        return this._enabled;
    }
    // etag - computed: true, optional: false, required: false
    get etag() {
        return this.getStringAttribute('etag');
    }
    // hosted_zone_id - computed: true, optional: false, required: false
    get hostedZoneId() {
        return this.getStringAttribute('hosted_zone_id');
    }
    // http_version - computed: false, optional: true, required: false
    _httpVersion;
    get httpVersion() {
        return this.getStringAttribute('http_version');
    }
    set httpVersion(value) {
        this._httpVersion = value;
    }
    resetHttpVersion() {
        this._httpVersion = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get httpVersionInput() {
        return this._httpVersion;
    }
    // id - computed: true, optional: true, required: false
    get id() {
        return this.getStringAttribute('id');
    }
    // in_progress_validation_batches - computed: true, optional: false, required: false
    get inProgressValidationBatches() {
        return this.getNumberAttribute('in_progress_validation_batches');
    }
    // is_ipv6_enabled - computed: false, optional: true, required: false
    _isIpv6Enabled;
    get isIpv6Enabled() {
        return this.getBooleanAttribute('is_ipv6_enabled');
    }
    set isIpv6Enabled(value) {
        this._isIpv6Enabled = value;
    }
    resetIsIpv6Enabled() {
        this._isIpv6Enabled = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get isIpv6EnabledInput() {
        return this._isIpv6Enabled;
    }
    // last_modified_time - computed: true, optional: false, required: false
    get lastModifiedTime() {
        return this.getStringAttribute('last_modified_time');
    }
    // price_class - computed: false, optional: true, required: false
    _priceClass;
    get priceClass() {
        return this.getStringAttribute('price_class');
    }
    set priceClass(value) {
        this._priceClass = value;
    }
    resetPriceClass() {
        this._priceClass = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get priceClassInput() {
        return this._priceClass;
    }
    // retain_on_delete - computed: false, optional: true, required: false
    _retainOnDelete;
    get retainOnDelete() {
        return this.getBooleanAttribute('retain_on_delete');
    }
    set retainOnDelete(value) {
        this._retainOnDelete = value;
    }
    resetRetainOnDelete() {
        this._retainOnDelete = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get retainOnDeleteInput() {
        return this._retainOnDelete;
    }
    // status - computed: true, optional: false, required: false
    get status() {
        return this.getStringAttribute('status');
    }
    // tags - computed: false, optional: true, required: false
    _tags;
    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;
    }
    // tags_all - computed: true, optional: true, required: false
    _tagsAll;
    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;
    }
    // trusted_key_groups - computed: true, optional: false, required: false
    trustedKeyGroups(index) {
        return new CloudfrontDistributionTrustedKeyGroups(this, 'trusted_key_groups', index, false);
    }
    // trusted_signers - computed: true, optional: false, required: false
    trustedSigners(index) {
        return new CloudfrontDistributionTrustedSigners(this, 'trusted_signers', index, false);
    }
    // wait_for_deployment - computed: false, optional: true, required: false
    _waitForDeployment;
    get waitForDeployment() {
        return this.getBooleanAttribute('wait_for_deployment');
    }
    set waitForDeployment(value) {
        this._waitForDeployment = value;
    }
    resetWaitForDeployment() {
        this._waitForDeployment = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get waitForDeploymentInput() {
        return this._waitForDeployment;
    }
    // web_acl_id - computed: false, optional: true, required: false
    _webAclId;
    get webAclId() {
        return this.getStringAttribute('web_acl_id');
    }
    set webAclId(value) {
        this._webAclId = value;
    }
    resetWebAclId() {
        this._webAclId = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get webAclIdInput() {
        return this._webAclId;
    }
    // custom_error_response - computed: false, optional: true, required: false
    _customErrorResponse;
    get customErrorResponse() {
        // Getting the computed value is not yet implemented
        return cdktf.Token.asAny(cdktf.Fn.tolist(this.interpolationForAttribute('custom_error_response')));
    }
    set customErrorResponse(value) {
        this._customErrorResponse = value;
    }
    resetCustomErrorResponse() {
        this._customErrorResponse = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get customErrorResponseInput() {
        return this._customErrorResponse;
    }
    // default_cache_behavior - computed: false, optional: false, required: true
    _defaultCacheBehavior = new CloudfrontDistributionDefaultCacheBehaviorOutputReference(this, "default_cache_behavior", true);
    get defaultCacheBehavior() {
        return this._defaultCacheBehavior;
    }
    putDefaultCacheBehavior(value) {
        this._defaultCacheBehavior.internalValue = value;
    }
    // Temporarily expose input value. Use with caution.
    get defaultCacheBehaviorInput() {
        return this._defaultCacheBehavior.internalValue;
    }
    // logging_config - computed: false, optional: true, required: false
    _loggingConfig = new CloudfrontDistributionLoggingConfigOutputReference(this, "logging_config", true);
    get loggingConfig() {
        return this._loggingConfig;
    }
    putLoggingConfig(value) {
        this._loggingConfig.internalValue = value;
    }
    resetLoggingConfig() {
        this._loggingConfig.internalValue = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get loggingConfigInput() {
        return this._loggingConfig.internalValue;
    }
    // ordered_cache_behavior - computed: false, optional: true, required: false
    _orderedCacheBehavior;
    get orderedCacheBehavior() {
        // Getting the computed value is not yet implemented
        return this.interpolationForAttribute('ordered_cache_behavior');
    }
    set orderedCacheBehavior(value) {
        this._orderedCacheBehavior = value;
    }
    resetOrderedCacheBehavior() {
        this._orderedCacheBehavior = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get orderedCacheBehaviorInput() {
        return this._orderedCacheBehavior;
    }
    // origin - computed: false, optional: false, required: true
    _origin;
    get origin() {
        // Getting the computed value is not yet implemented
        return cdktf.Token.asAny(cdktf.Fn.tolist(this.interpolationForAttribute('origin')));
    }
    set origin(value) {
        this._origin = value;
    }
    // Temporarily expose input value. Use with caution.
    get originInput() {
        return this._origin;
    }
    // origin_group - computed: false, optional: true, required: false
    _originGroup;
    get originGroup() {
        // Getting the computed value is not yet implemented
        return cdktf.Token.asAny(cdktf.Fn.tolist(this.interpolationForAttribute('origin_group')));
    }
    set originGroup(value) {
        this._originGroup = value;
    }
    resetOriginGroup() {
        this._originGroup = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get originGroupInput() {
        return this._originGroup;
    }
    // restrictions - computed: false, optional: false, required: true
    _restrictions = new CloudfrontDistributionRestrictionsOutputReference(this, "restrictions", true);
    get restrictions() {
        return this._restrictions;
    }
    putRestrictions(value) {
        this._restrictions.internalValue = value;
    }
    // Temporarily expose input value. Use with caution.
    get restrictionsInput() {
        return this._restrictions.internalValue;
    }
    // viewer_certificate - computed: false, optional: false, required: true
    _viewerCertificate = new CloudfrontDistributionViewerCertificateOutputReference(this, "viewer_certificate", true);
    get viewerCertificate() {
        return this._viewerCertificate;
    }
    putViewerCertificate(value) {
        this._viewerCertificate.internalValue = value;
    }
    // Temporarily expose input value. Use with caution.
    get viewerCertificateInput() {
        return this._viewerCertificate.internalValue;
    }
    // =========
    // SYNTHESIS
    // =========
    synthesizeAttributes() {
        return {
            aliases: cdktf.listMapper(cdktf.stringToTerraform)(this._aliases),
            comment: cdktf.stringToTerraform(this._comment),
            default_root_object: cdktf.stringToTerraform(this._defaultRootObject),
            enabled: cdktf.booleanToTerraform(this._enabled),
            http_version: cdktf.stringToTerraform(this._httpVersion),
            is_ipv6_enabled: cdktf.booleanToTerraform(this._isIpv6Enabled),
            price_class: cdktf.stringToTerraform(this._priceClass),
            retain_on_delete: cdktf.booleanToTerraform(this._retainOnDelete),
            tags: cdktf.hashMapper(cdktf.stringToTerraform)(this._tags),
            tags_all: cdktf.hashMapper(cdktf.stringToTerraform)(this._tagsAll),
            wait_for_deployment: cdktf.booleanToTerraform(this._waitForDeployment),
            web_acl_id: cdktf.stringToTerraform(this._webAclId),
            custom_error_response: cdktf.listMapper(cloudfrontDistributionCustomErrorResponseToTerraform)(this._customErrorResponse),
            default_cache_behavior: cloudfrontDistributionDefaultCacheBehaviorToTerraform(this._defaultCacheBehavior.internalValue),
            logging_config: cloudfrontDistributionLoggingConfigToTerraform(this._loggingConfig.internalValue),
            ordered_cache_behavior: cdktf.listMapper(cloudfrontDistributionOrderedCacheBehaviorToTerraform)(this._orderedCacheBehavior),
            origin: cdktf.listMapper(cloudfrontDistributionOriginToTerraform)(this._origin),
            origin_group: cdktf.listMapper(cloudfrontDistributionOriginGroupToTerraform)(this._originGroup),
            restrictions: cloudfrontDistributionRestrictionsToTerraform(this._restrictions.internalValue),
            viewer_certificate: cloudfrontDistributionViewerCertificateToTerraform(this._viewerCertificate.internalValue),
        };
    }
}
//# sourceMappingURL=cloudfront-distribution.js.map